From 5fefd743a222e07c51d93de48c7fa05bddc53064 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Wed, 14 Aug 2024 13:02:40 +0200 Subject: [PATCH 001/187] Fix defines in MAP_NUM and MAP_GROUP --- data/maps/BirthIsland_Exterior/scripts.inc | 4 +- include/constants/maps.h | 4 +- src/battle_pyramid.c | 2 +- src/battle_setup.c | 158 +++++++++---------- src/braille_puzzles.c | 14 +- src/data/heal_locations.h | 44 +++--- src/data/map_group_count.h | 1 + src/data/wild_encounters.json.txt | 8 +- src/event_object_movement.c | 4 +- src/faraway_island.c | 12 +- src/field_control_avatar.c | 4 +- src/field_door.c | 4 +- src/field_player_avatar.c | 2 +- src/field_specials.c | 172 ++++++++++----------- src/frontier_pass.c | 54 +++---- src/match_call.c | 6 +- src/menu_helpers.c | 4 +- src/mirage_tower.c | 10 +- src/new_game.c | 2 +- src/overworld.c | 68 ++++---- src/party_menu.c | 4 +- src/pokedex_area_screen.c | 10 +- src/pokemon_storage_system.c | 8 +- src/region_map.c | 108 ++++++------- src/roamer.c | 44 +++--- src/rotating_gate.c | 8 +- src/scrcmd.c | 2 +- src/script.c | 10 +- src/secret_base.c | 54 +++---- src/trainer_hill.c | 12 +- src/tv.c | 38 ++--- src/union_room.c | 14 +- src/wild_encounter.c | 14 +- tools/trainerproc/trainerproc | Bin 0 -> 43472 bytes 34 files changed, 452 insertions(+), 451 deletions(-) create mode 100644 src/data/map_group_count.h create mode 100755 tools/trainerproc/trainerproc diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc index d2174eee99..0322c17c27 100644 --- a/data/maps/BirthIsland_Exterior/scripts.inc +++ b/data/maps/BirthIsland_Exterior/scripts.inc @@ -72,8 +72,8 @@ BirthIsland_Exterior_EventScript_Complete:: BirthIsland_Exterior_EventScript_Deoxys:: waitse setfieldeffectargument 0, LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK - setfieldeffectargument 1, MAP_NUM(BIRTH_ISLAND_EXTERIOR) - setfieldeffectargument 2, MAP_GROUP(BIRTH_ISLAND_EXTERIOR) + setfieldeffectargument 1, MAP_NUM(MAP_BIRTH_ISLAND_EXTERIOR) + setfieldeffectargument 2, MAP_GROUP(MAP_BIRTH_ISLAND_EXTERIOR) dofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK playbgm MUS_RG_ENCOUNTER_DEOXYS, FALSE waitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK diff --git a/include/constants/maps.h b/include/constants/maps.h index 1bf11fa5cc..d41f03c683 100644 --- a/include/constants/maps.h +++ b/include/constants/maps.h @@ -9,8 +9,8 @@ #define MAP_UNDEFINED (0xFF | (0xFF << 8)) -#define MAP_GROUP(map) (MAP_##map >> 8) -#define MAP_NUM(map) (MAP_##map & 0xFF) +#define MAP_GROUP(map) (map >> 8) +#define MAP_NUM(map) (map & 0xFF) // IDs for dynamic warps. Both are used in the dest_warp_id field for warp events, but they // are never read in practice. A dest_map of MAP_DYNAMIC is used to indicate that a diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index b4bb3cacca..9212dcfa6d 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1857,7 +1857,7 @@ static bool8 TrySetPyramidObjectEventPositionAtCoords(u8 objType, u8 x, u8 y, u8 const struct MapHeader *mapHeader; struct ObjectEventTemplate *floorEvents = gSaveBlock1Ptr->objectEventTemplates; - mapHeader = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(BATTLE_PYRAMID_SQUARE01), floorLayoutOffsets[squareId] + MAP_NUM(BATTLE_PYRAMID_SQUARE01)); + mapHeader = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(MAP_BATTLE_PYRAMID_SQUARE01), floorLayoutOffsets[squareId] + MAP_NUM(MAP_BATTLE_PYRAMID_SQUARE01)); for (i = 0; i < mapHeader->events->objectEventCount; i++) { if (mapHeader->events->objectEvents[i].x != x || mapHeader->events->objectEvents[i].y != y) diff --git a/src/battle_setup.c b/src/battle_setup.c index e87ce6dd27..d1bcd3deac 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -258,84 +258,84 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] = { - [REMATCH_ROSE] = REMATCH(TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5, ROUTE118), - [REMATCH_ANDRES] = REMATCH(TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5, ROUTE105), - [REMATCH_DUSTY] = REMATCH(TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5, ROUTE111), - [REMATCH_LOLA] = REMATCH(TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5, ROUTE109), - [REMATCH_RICKY] = REMATCH(TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5, ROUTE109), - [REMATCH_LILA_AND_ROY] = REMATCH(TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5, ROUTE124), - [REMATCH_CRISTIN] = REMATCH(TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5, ROUTE121), - [REMATCH_BROOKE] = REMATCH(TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5, ROUTE111), - [REMATCH_WILTON] = REMATCH(TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5, ROUTE111), - [REMATCH_VALERIE] = REMATCH(TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5, MT_PYRE_6F), - [REMATCH_CINDY] = REMATCH(TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6, ROUTE104), - [REMATCH_THALIA] = REMATCH(TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5, ABANDONED_SHIP_ROOMS_1F), - [REMATCH_JESSICA] = REMATCH(TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5, ROUTE121), - [REMATCH_WINSTON] = REMATCH(TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5, ROUTE104), - [REMATCH_STEVE] = REMATCH(TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5, ROUTE114), - [REMATCH_TONY] = REMATCH(TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5, ROUTE107), - [REMATCH_NOB] = REMATCH(TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5, ROUTE115), - [REMATCH_KOJI] = REMATCH(TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5, ROUTE127), - [REMATCH_FERNANDO] = REMATCH(TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5, ROUTE123), - [REMATCH_DALTON] = REMATCH(TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5, ROUTE118), - [REMATCH_BERNIE] = REMATCH(TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5, ROUTE114), - [REMATCH_ETHAN] = REMATCH(TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5, JAGGED_PASS), - [REMATCH_JOHN_AND_JAY] = REMATCH(TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5, METEOR_FALLS_1F_2R), - [REMATCH_JEFFREY] = REMATCH(TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5, ROUTE120), - [REMATCH_CAMERON] = REMATCH(TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5, ROUTE123), - [REMATCH_JACKI] = REMATCH(TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5, ROUTE123), - [REMATCH_WALTER] = REMATCH(TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5, ROUTE121), - [REMATCH_KAREN] = REMATCH(TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5, ROUTE116), - [REMATCH_JERRY] = REMATCH(TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5, ROUTE116), - [REMATCH_ANNA_AND_MEG] = REMATCH(TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5, ROUTE117), - [REMATCH_ISABEL] = REMATCH(TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5, ROUTE110), - [REMATCH_MIGUEL] = REMATCH(TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5, ROUTE103), - [REMATCH_TIMOTHY] = REMATCH(TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5, ROUTE115), - [REMATCH_SHELBY] = REMATCH(TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5, MT_CHIMNEY), - [REMATCH_CALVIN] = REMATCH(TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5, ROUTE102), - [REMATCH_ELLIOT] = REMATCH(TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5, ROUTE106), - [REMATCH_ISAIAH] = REMATCH(TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5, ROUTE128), - [REMATCH_MARIA] = REMATCH(TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5, ROUTE117), - [REMATCH_ABIGAIL] = REMATCH(TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5, ROUTE110), - [REMATCH_DYLAN] = REMATCH(TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5, ROUTE117), - [REMATCH_KATELYN] = REMATCH(TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5, ROUTE128), - [REMATCH_BENJAMIN] = REMATCH(TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5, ROUTE110), - [REMATCH_PABLO] = REMATCH(TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5, ROUTE126), - [REMATCH_NICOLAS] = REMATCH(TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5, METEOR_FALLS_1F_2R), - [REMATCH_ROBERT] = REMATCH(TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5, ROUTE120), - [REMATCH_LAO] = REMATCH(TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5, ROUTE113), - [REMATCH_CYNDY] = REMATCH(TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5, ROUTE115), - [REMATCH_MADELINE] = REMATCH(TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5, ROUTE113), - [REMATCH_JENNY] = REMATCH(TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5, ROUTE124), - [REMATCH_DIANA] = REMATCH(TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5, JAGGED_PASS), - [REMATCH_AMY_AND_LIV] = REMATCH(TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6, ROUTE103), - [REMATCH_ERNEST] = REMATCH(TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5, ROUTE125), - [REMATCH_CORY] = REMATCH(TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5, ROUTE108), - [REMATCH_EDWIN] = REMATCH(TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5, ROUTE110), - [REMATCH_LYDIA] = REMATCH(TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5, ROUTE117), - [REMATCH_ISAAC] = REMATCH(TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5, ROUTE117), - [REMATCH_GABRIELLE] = REMATCH(TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5, MT_PYRE_3F), - [REMATCH_CATHERINE] = REMATCH(TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5, ROUTE119), - [REMATCH_JACKSON] = REMATCH(TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5, ROUTE119), - [REMATCH_HALEY] = REMATCH(TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5, ROUTE104), - [REMATCH_JAMES] = REMATCH(TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5, PETALBURG_WOODS), - [REMATCH_TRENT] = REMATCH(TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5, ROUTE112), - [REMATCH_SAWYER] = REMATCH(TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5, MT_CHIMNEY), - [REMATCH_KIRA_AND_DAN] = REMATCH(TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5, ABANDONED_SHIP_ROOMS2_1F), - [REMATCH_WALLY_VR] = REMATCH(TRAINER_WALLY_VR_2, TRAINER_WALLY_VR_3, TRAINER_WALLY_VR_4, TRAINER_WALLY_VR_5, TRAINER_WALLY_VR_5, VICTORY_ROAD_1F), - [REMATCH_ROXANNE] = REMATCH(TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5, RUSTBORO_CITY), - [REMATCH_BRAWLY] = REMATCH(TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5, DEWFORD_TOWN), - [REMATCH_WATTSON] = REMATCH(TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5, MAUVILLE_CITY), - [REMATCH_FLANNERY] = REMATCH(TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5, LAVARIDGE_TOWN), - [REMATCH_NORMAN] = REMATCH(TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5, PETALBURG_CITY), - [REMATCH_WINONA] = REMATCH(TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5, FORTREE_CITY), - [REMATCH_TATE_AND_LIZA] = REMATCH(TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5, MOSSDEEP_CITY), - [REMATCH_JUAN] = REMATCH(TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5, SOOTOPOLIS_CITY), - [REMATCH_SIDNEY] = REMATCH(TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, EVER_GRANDE_CITY), - [REMATCH_PHOEBE] = REMATCH(TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, EVER_GRANDE_CITY), - [REMATCH_GLACIA] = REMATCH(TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, EVER_GRANDE_CITY), - [REMATCH_DRAKE] = REMATCH(TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, EVER_GRANDE_CITY), - [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, EVER_GRANDE_CITY), + [REMATCH_ROSE] = REMATCH(TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5, MAP_ROUTE118), + [REMATCH_ANDRES] = REMATCH(TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5, MAP_ROUTE105), + [REMATCH_DUSTY] = REMATCH(TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5, MAP_ROUTE111), + [REMATCH_LOLA] = REMATCH(TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5, MAP_ROUTE109), + [REMATCH_RICKY] = REMATCH(TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5, MAP_ROUTE109), + [REMATCH_LILA_AND_ROY] = REMATCH(TRAINER_LILA_AND_ROY_1, TRAINER_LILA_AND_ROY_2, TRAINER_LILA_AND_ROY_3, TRAINER_LILA_AND_ROY_4, TRAINER_LILA_AND_ROY_5, MAP_ROUTE124), + [REMATCH_CRISTIN] = REMATCH(TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5, MAP_ROUTE121), + [REMATCH_BROOKE] = REMATCH(TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5, MAP_ROUTE111), + [REMATCH_WILTON] = REMATCH(TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5, MAP_ROUTE111), + [REMATCH_VALERIE] = REMATCH(TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5, MAP_MT_PYRE_6F), + [REMATCH_CINDY] = REMATCH(TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6, MAP_ROUTE104), + [REMATCH_THALIA] = REMATCH(TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5, MAP_ABANDONED_SHIP_ROOMS_1F), + [REMATCH_JESSICA] = REMATCH(TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5, MAP_ROUTE121), + [REMATCH_WINSTON] = REMATCH(TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5, MAP_ROUTE104), + [REMATCH_STEVE] = REMATCH(TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5, MAP_ROUTE114), + [REMATCH_TONY] = REMATCH(TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5, MAP_ROUTE107), + [REMATCH_NOB] = REMATCH(TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5, MAP_ROUTE115), + [REMATCH_KOJI] = REMATCH(TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5, MAP_ROUTE127), + [REMATCH_FERNANDO] = REMATCH(TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5, MAP_ROUTE123), + [REMATCH_DALTON] = REMATCH(TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5, MAP_ROUTE118), + [REMATCH_BERNIE] = REMATCH(TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5, MAP_ROUTE114), + [REMATCH_ETHAN] = REMATCH(TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5, MAP_JAGGED_PASS), + [REMATCH_JOHN_AND_JAY] = REMATCH(TRAINER_JOHN_AND_JAY_1, TRAINER_JOHN_AND_JAY_2, TRAINER_JOHN_AND_JAY_3, TRAINER_JOHN_AND_JAY_4, TRAINER_JOHN_AND_JAY_5, MAP_METEOR_FALLS_1F_2R), + [REMATCH_JEFFREY] = REMATCH(TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5, MAP_ROUTE120), + [REMATCH_CAMERON] = REMATCH(TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5, MAP_ROUTE123), + [REMATCH_JACKI] = REMATCH(TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5, MAP_ROUTE123), + [REMATCH_WALTER] = REMATCH(TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5, MAP_ROUTE121), + [REMATCH_KAREN] = REMATCH(TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5, MAP_ROUTE116), + [REMATCH_JERRY] = REMATCH(TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5, MAP_ROUTE116), + [REMATCH_ANNA_AND_MEG] = REMATCH(TRAINER_ANNA_AND_MEG_1, TRAINER_ANNA_AND_MEG_2, TRAINER_ANNA_AND_MEG_3, TRAINER_ANNA_AND_MEG_4, TRAINER_ANNA_AND_MEG_5, MAP_ROUTE117), + [REMATCH_ISABEL] = REMATCH(TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5, MAP_ROUTE110), + [REMATCH_MIGUEL] = REMATCH(TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5, MAP_ROUTE103), + [REMATCH_TIMOTHY] = REMATCH(TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5, MAP_ROUTE115), + [REMATCH_SHELBY] = REMATCH(TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5, MAP_MT_CHIMNEY), + [REMATCH_CALVIN] = REMATCH(TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5, MAP_ROUTE102), + [REMATCH_ELLIOT] = REMATCH(TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5, MAP_ROUTE106), + [REMATCH_ISAIAH] = REMATCH(TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5, MAP_ROUTE128), + [REMATCH_MARIA] = REMATCH(TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5, MAP_ROUTE117), + [REMATCH_ABIGAIL] = REMATCH(TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5, MAP_ROUTE110), + [REMATCH_DYLAN] = REMATCH(TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5, MAP_ROUTE117), + [REMATCH_KATELYN] = REMATCH(TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5, MAP_ROUTE128), + [REMATCH_BENJAMIN] = REMATCH(TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5, MAP_ROUTE110), + [REMATCH_PABLO] = REMATCH(TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5, MAP_ROUTE126), + [REMATCH_NICOLAS] = REMATCH(TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5, MAP_METEOR_FALLS_1F_2R), + [REMATCH_ROBERT] = REMATCH(TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5, MAP_ROUTE120), + [REMATCH_LAO] = REMATCH(TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5, MAP_ROUTE113), + [REMATCH_CYNDY] = REMATCH(TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5, MAP_ROUTE115), + [REMATCH_MADELINE] = REMATCH(TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5, MAP_ROUTE113), + [REMATCH_JENNY] = REMATCH(TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5, MAP_ROUTE124), + [REMATCH_DIANA] = REMATCH(TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5, MAP_JAGGED_PASS), + [REMATCH_AMY_AND_LIV] = REMATCH(TRAINER_AMY_AND_LIV_1, TRAINER_AMY_AND_LIV_2, TRAINER_AMY_AND_LIV_4, TRAINER_AMY_AND_LIV_5, TRAINER_AMY_AND_LIV_6, MAP_ROUTE103), + [REMATCH_ERNEST] = REMATCH(TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5, MAP_ROUTE125), + [REMATCH_CORY] = REMATCH(TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5, MAP_ROUTE108), + [REMATCH_EDWIN] = REMATCH(TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5, MAP_ROUTE110), + [REMATCH_LYDIA] = REMATCH(TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5, MAP_ROUTE117), + [REMATCH_ISAAC] = REMATCH(TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5, MAP_ROUTE117), + [REMATCH_GABRIELLE] = REMATCH(TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5, MAP_MT_PYRE_3F), + [REMATCH_CATHERINE] = REMATCH(TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5, MAP_ROUTE119), + [REMATCH_JACKSON] = REMATCH(TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5, MAP_ROUTE119), + [REMATCH_HALEY] = REMATCH(TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5, MAP_ROUTE104), + [REMATCH_JAMES] = REMATCH(TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5, MAP_PETALBURG_WOODS), + [REMATCH_TRENT] = REMATCH(TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5, MAP_ROUTE112), + [REMATCH_SAWYER] = REMATCH(TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5, MAP_MT_CHIMNEY), + [REMATCH_KIRA_AND_DAN] = REMATCH(TRAINER_KIRA_AND_DAN_1, TRAINER_KIRA_AND_DAN_2, TRAINER_KIRA_AND_DAN_3, TRAINER_KIRA_AND_DAN_4, TRAINER_KIRA_AND_DAN_5, MAP_ABANDONED_SHIP_ROOMS2_1F), + [REMATCH_WALLY_VR] = REMATCH(TRAINER_WALLY_VR_2, TRAINER_WALLY_VR_3, TRAINER_WALLY_VR_4, TRAINER_WALLY_VR_5, TRAINER_WALLY_VR_5, MAP_VICTORY_ROAD_1F), + [REMATCH_ROXANNE] = REMATCH(TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5, MAP_RUSTBORO_CITY), + [REMATCH_BRAWLY] = REMATCH(TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5, MAP_DEWFORD_TOWN), + [REMATCH_WATTSON] = REMATCH(TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5, MAP_MAUVILLE_CITY), + [REMATCH_FLANNERY] = REMATCH(TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5, MAP_LAVARIDGE_TOWN), + [REMATCH_NORMAN] = REMATCH(TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5, MAP_PETALBURG_CITY), + [REMATCH_WINONA] = REMATCH(TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5, MAP_FORTREE_CITY), + [REMATCH_TATE_AND_LIZA] = REMATCH(TRAINER_TATE_AND_LIZA_1, TRAINER_TATE_AND_LIZA_2, TRAINER_TATE_AND_LIZA_3, TRAINER_TATE_AND_LIZA_4, TRAINER_TATE_AND_LIZA_5, MAP_MOSSDEEP_CITY), + [REMATCH_JUAN] = REMATCH(TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5, MAP_SOOTOPOLIS_CITY), + [REMATCH_SIDNEY] = REMATCH(TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, MAP_EVER_GRANDE_CITY), + [REMATCH_PHOEBE] = REMATCH(TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, MAP_EVER_GRANDE_CITY), + [REMATCH_GLACIA] = REMATCH(TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, MAP_EVER_GRANDE_CITY), + [REMATCH_DRAKE] = REMATCH(TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, MAP_EVER_GRANDE_CITY), + [REMATCH_WALLACE] = REMATCH(TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, MAP_EVER_GRANDE_CITY), }; static const u16 sBadgeFlags[NUM_BADGES] = @@ -684,7 +684,7 @@ u8 BattleSetup_GetTerrainId(void) if (MetatileBehavior_IsBridgeOverWater(tileBehavior) == TRUE) return BATTLE_TERRAIN_WATER; } - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE113) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE113)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE113) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE113)) return BATTLE_TERRAIN_SAND; if (GetSavedWeather() == WEATHER_SANDSTORM) return BATTLE_TERRAIN_SAND; diff --git a/src/braille_puzzles.c b/src/braille_puzzles.c index 7863f3cc11..28ed8cdf5f 100644 --- a/src/braille_puzzles.c +++ b/src/braille_puzzles.c @@ -61,8 +61,8 @@ static void DoBrailleRegisteelEffect(void); bool8 ShouldDoBrailleDigEffect(void) { if (!FlagGet(FLAG_SYS_BRAILLE_DIG) - && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEALED_CHAMBER_OUTER_ROOM) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEALED_CHAMBER_OUTER_ROOM))) + && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_SEALED_CHAMBER_OUTER_ROOM) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SEALED_CHAMBER_OUTER_ROOM))) { if (gSaveBlock1Ptr->pos.x == 10 && gSaveBlock1Ptr->pos.y == 3) return TRUE; @@ -167,8 +167,8 @@ static void Task_SealedChamberShakingEffect(u8 taskId) bool8 ShouldDoBrailleRegirockEffect(void) { if (!FlagGet(FLAG_SYS_REGIROCK_PUZZLE_COMPLETED) - && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(DESERT_RUINS) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(DESERT_RUINS)) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_DESERT_RUINS) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_DESERT_RUINS)) { if (gSaveBlock1Ptr->pos.x == 6 && gSaveBlock1Ptr->pos.y == 23) { @@ -218,7 +218,7 @@ static void DoBrailleRegirockEffect(void) bool8 ShouldDoBrailleRegisteelEffect(void) { - if (!FlagGet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED) && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ANCIENT_TOMB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ANCIENT_TOMB))) + if (!FlagGet(FLAG_SYS_REGISTEEL_PUZZLE_COMPLETED) && (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ANCIENT_TOMB) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ANCIENT_TOMB))) { if (gSaveBlock1Ptr->pos.x == 8 && gSaveBlock1Ptr->pos.y == 25) { @@ -284,8 +284,8 @@ bool8 ShouldDoBrailleRegicePuzzle(void) { u8 i; - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ISLAND_CAVE) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ISLAND_CAVE)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ISLAND_CAVE) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ISLAND_CAVE)) { if (FlagGet(FLAG_SYS_BRAILLE_REGICE_COMPLETED)) return FALSE; diff --git a/src/data/heal_locations.h b/src/data/heal_locations.h index 04530a1dbf..2aba995b43 100644 --- a/src/data/heal_locations.h +++ b/src/data/heal_locations.h @@ -1,25 +1,25 @@ static const struct HealLocation sHealLocations[] = { - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = {MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = {MAP_GROUP(LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, - [HEAL_LOCATION_PETALBURG_CITY - 1] = {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), 20, 17}, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), 19, 20}, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), 22, 6}, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), 16, 39}, - [HEAL_LOCATION_FORTREE_CITY - 1] = {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), 5, 7}, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), 24, 15}, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), 28, 17}, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), 43, 32}, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 27, 49}, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 5, 9}, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), 14, 9}, - [HEAL_LOCATION_OLDALE_TOWN - 1] = {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), 6, 17}, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), 2, 11}, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), 9, 7}, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), 14, 8}, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), 16, 4}, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), 8, 16}, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), 18, 6}, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = {MAP_GROUP(SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(SOUTHERN_ISLAND_EXTERIOR), 15, 20}, - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = {MAP_GROUP(BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST), 3, 52}, + [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, + [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, + [HEAL_LOCATION_PETALBURG_CITY - 1] = {MAP_GROUP(MAP_PETALBURG_CITY), MAP_NUM(MAP_PETALBURG_CITY), 20, 17}, + [HEAL_LOCATION_SLATEPORT_CITY - 1] = {MAP_GROUP(MAP_SLATEPORT_CITY), MAP_NUM(MAP_SLATEPORT_CITY), 19, 20}, + [HEAL_LOCATION_MAUVILLE_CITY - 1] = {MAP_GROUP(MAP_MAUVILLE_CITY), MAP_NUM(MAP_MAUVILLE_CITY), 22, 6}, + [HEAL_LOCATION_RUSTBORO_CITY - 1] = {MAP_GROUP(MAP_RUSTBORO_CITY), MAP_NUM(MAP_RUSTBORO_CITY), 16, 39}, + [HEAL_LOCATION_FORTREE_CITY - 1] = {MAP_GROUP(MAP_FORTREE_CITY), MAP_NUM(MAP_FORTREE_CITY), 5, 7}, + [HEAL_LOCATION_LILYCOVE_CITY - 1] = {MAP_GROUP(MAP_LILYCOVE_CITY), MAP_NUM(MAP_LILYCOVE_CITY), 24, 15}, + [HEAL_LOCATION_MOSSDEEP_CITY - 1] = {MAP_GROUP(MAP_MOSSDEEP_CITY), MAP_NUM(MAP_MOSSDEEP_CITY), 28, 17}, + [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = {MAP_GROUP(MAP_SOOTOPOLIS_CITY), MAP_NUM(MAP_SOOTOPOLIS_CITY), 43, 32}, + [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = {MAP_GROUP(MAP_EVER_GRANDE_CITY), MAP_NUM(MAP_EVER_GRANDE_CITY), 27, 49}, + [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN), MAP_NUM(MAP_LITTLEROOT_TOWN), 5, 9}, + [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN), MAP_NUM(MAP_LITTLEROOT_TOWN), 14, 9}, + [HEAL_LOCATION_OLDALE_TOWN - 1] = {MAP_GROUP(MAP_OLDALE_TOWN), MAP_NUM(MAP_OLDALE_TOWN), 6, 17}, + [HEAL_LOCATION_DEWFORD_TOWN - 1] = {MAP_GROUP(MAP_DEWFORD_TOWN), MAP_NUM(MAP_DEWFORD_TOWN), 2, 11}, + [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = {MAP_GROUP(MAP_LAVARIDGE_TOWN), MAP_NUM(MAP_LAVARIDGE_TOWN), 9, 7}, + [HEAL_LOCATION_FALLARBOR_TOWN - 1] = {MAP_GROUP(MAP_FALLARBOR_TOWN), MAP_NUM(MAP_FALLARBOR_TOWN), 14, 8}, + [HEAL_LOCATION_VERDANTURF_TOWN - 1] = {MAP_GROUP(MAP_VERDANTURF_TOWN), MAP_NUM(MAP_VERDANTURF_TOWN), 16, 4}, + [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = {MAP_GROUP(MAP_PACIFIDLOG_TOWN), MAP_NUM(MAP_PACIFIDLOG_TOWN), 8, 16}, + [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = {MAP_GROUP(MAP_EVER_GRANDE_CITY), MAP_NUM(MAP_EVER_GRANDE_CITY), 18, 6}, + [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = {MAP_GROUP(MAP_SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(MAP_SOUTHERN_ISLAND_EXTERIOR), 15, 20}, + [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = {MAP_GROUP(MAP_BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(MAP_BATTLE_FRONTIER_OUTSIDE_EAST), 3, 52}, }; diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h new file mode 100644 index 0000000000..4fe8a21b3b --- /dev/null +++ b/src/data/map_group_count.h @@ -0,0 +1 @@ +static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/src/data/wild_encounters.json.txt b/src/data/wild_encounters.json.txt index bf848249f0..74f9168b5e 100755 --- a/src/data/wild_encounters.json.txt +++ b/src/data/wild_encounters.json.txt @@ -70,8 +70,8 @@ const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = { ## for encounter in wild_encounter_group.encounters { - .mapGroup = {% if wild_encounter_group.for_maps %}MAP_GROUP({{ removePrefix(encounter.map, "MAP_") }}){% else %}0{% endif %}, - .mapNum = {% if wild_encounter_group.for_maps %}MAP_NUM({{ removePrefix(encounter.map, "MAP_") }}){% else %}{{ loop.index1 }}{% endif %}, + .mapGroup = {% if wild_encounter_group.for_maps %}MAP_GROUP(MAP_{{ removePrefix(encounter.map, "MAP_") }}){% else %}0{% endif %}, + .mapNum = {% if wild_encounter_group.for_maps %}MAP_NUM(MAP_{{ removePrefix(encounter.map, "MAP_") }}){% else %}{{ loop.index1 }}{% endif %}, .landMonsInfo = {% if existsIn(encounter, "land_mons") %}&{{ encounter.base_label }}_LandMonsInfo{% else %}NULL{% endif %}, .waterMonsInfo = {% if existsIn(encounter, "water_mons") %}&{{ encounter.base_label }}_WaterMonsInfo{% else %}NULL{% endif %}, .rockSmashMonsInfo = {% if existsIn(encounter, "rock_smash_mons") %}&{{ encounter.base_label }}_RockSmashMonsInfo{% else %}NULL{% endif %}, @@ -79,8 +79,8 @@ const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = }, ## endfor { - .mapGroup = MAP_GROUP(UNDEFINED), - .mapNum = MAP_NUM(UNDEFINED), + .mapGroup = MAP_GROUP(MAP_UNDEFINED), + .mapNum = MAP_NUM(MAP_UNDEFINED), .landMonsInfo = NULL, .waterMonsInfo = NULL, .rockSmashMonsInfo = NULL, diff --git a/src/event_object_movement.c b/src/event_object_movement.c index b3ffb76193..7b8d783c3c 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -1172,8 +1172,8 @@ static void ClearObjectEvent(struct ObjectEvent *objectEvent) { *objectEvent = (struct ObjectEvent){}; objectEvent->localId = OBJ_EVENT_ID_PLAYER; - objectEvent->mapNum = MAP_NUM(UNDEFINED); - objectEvent->mapGroup = MAP_GROUP(UNDEFINED); + objectEvent->mapNum = MAP_NUM(MAP_UNDEFINED); + objectEvent->mapGroup = MAP_GROUP(MAP_UNDEFINED); objectEvent->movementActionId = MOVEMENT_ACTION_NONE; } diff --git a/src/faraway_island.c b/src/faraway_island.c index 4f34cf30e6..fc3a714e5f 100755 --- a/src/faraway_island.c +++ b/src/faraway_island.c @@ -321,8 +321,8 @@ static u8 GetValidMewMoveDirection(u8 ignoredDir) 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)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)) { steps++; if (steps >= 9999) @@ -334,8 +334,8 @@ void UpdateFarawayIslandStepCounter(void) bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *objectEvent) { - if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR) - && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)) { if (objectEvent->graphicsId == OBJ_EVENT_GFX_MEW) return TRUE; @@ -346,8 +346,8 @@ bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *objectEvent) bool8 IsMewPlayingHideAndSeek(void) { - if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(FARAWAY_ISLAND_INTERIOR) - && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FARAWAY_ISLAND_INTERIOR)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)) { if (FlagGet(FLAG_CAUGHT_MEW) != TRUE && FlagGet(FLAG_HIDE_MEW) != TRUE) return TRUE; diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index 09d6ae7838..d094c8678b 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -814,7 +814,7 @@ static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPositi warpEvent = &gMapHeader.events->warps[warpEventId]; } - if (warpEvent->mapNum == MAP_NUM(DYNAMIC)) + if (warpEvent->mapNum == MAP_NUM(MAP_DYNAMIC)) { SetWarpDestinationToDynamicWarp(warpEvent->warpId); } @@ -825,7 +825,7 @@ static void SetupWarp(struct MapHeader *unused, s8 warpEventId, struct MapPositi 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)) + if (mapHeader->events->warps[warpEvent->warpId].mapNum == MAP_NUM(MAP_DYNAMIC)) SetDynamicWarp(mapHeader->events->warps[warpEventId].warpId, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, warpEventId); } } diff --git a/src/field_door.c b/src/field_door.c index 255233ec23..dc683a29b6 100644 --- a/src/field_door.c +++ b/src/field_door.c @@ -560,8 +560,8 @@ static bool8 ShouldUseMultiCorridorDoor(void) { if (FlagGet(FLAG_ENABLE_MULTI_CORRIDOR_DOOR)) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR)) { return TRUE; } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 1f0708af22..0f01aed246 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -777,7 +777,7 @@ bool8 IsPlayerCollidingWithFarawayIslandMew(u8 direction) playerY = object->currentCoords.y; MoveCoords(direction, &playerX, &playerY); - mewObjectId = GetObjectEventIdByLocalIdAndMap(1, MAP_NUM(FARAWAY_ISLAND_INTERIOR), MAP_GROUP(FARAWAY_ISLAND_INTERIOR)); + mewObjectId = GetObjectEventIdByLocalIdAndMap(1, MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR), MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)); if (mewObjectId == OBJECT_EVENTS_COUNT) return FALSE; diff --git a/src/field_specials.c b/src/field_specials.c index 7d20d3571d..e975e89e50 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -263,7 +263,7 @@ u16 GetRecordedCyclingRoadResults(void) void UpdateCyclingRoadState(void) { - if (gLastUsedWarp.mapNum == MAP_NUM(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) && gLastUsedWarp.mapGroup == MAP_GROUP(ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE)) + if (gLastUsedWarp.mapNum == MAP_NUM(MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE) && gLastUsedWarp.mapGroup == MAP_GROUP(MAP_ROUTE110_SEASIDE_CYCLING_ROAD_SOUTH_ENTRANCE)) return; if (VarGet(VAR_CYCLING_CHALLENGE_STATE) == 2 || VarGet(VAR_CYCLING_CHALLENGE_STATE) == 3) @@ -313,39 +313,39 @@ u8 GetSSTidalLocation(s8 *mapGroup, s8 *mapNum, s16 *x, s16 *y) case SS_TIDAL_DEPART_SLATEPORT: if (*varCruiseStepCount < 60) { - *mapNum = MAP_NUM(ROUTE134); + *mapNum = MAP_NUM(MAP_ROUTE134); *x = *varCruiseStepCount + 19; } else if (*varCruiseStepCount < 140) { - *mapNum = MAP_NUM(ROUTE133); + *mapNum = MAP_NUM(MAP_ROUTE133); *x = *varCruiseStepCount - 60; } else { - *mapNum = MAP_NUM(ROUTE132); + *mapNum = MAP_NUM(MAP_ROUTE132); *x = *varCruiseStepCount - 140; } break; case SS_TIDAL_HALFWAY_SLATEPORT: if (*varCruiseStepCount < 66) { - *mapNum = MAP_NUM(ROUTE132); + *mapNum = MAP_NUM(MAP_ROUTE132); *x = 65 - *varCruiseStepCount; } else if (*varCruiseStepCount < 146) { - *mapNum = MAP_NUM(ROUTE133); + *mapNum = MAP_NUM(MAP_ROUTE133); *x = 145 - *varCruiseStepCount; } else { - *mapNum = MAP_NUM(ROUTE134); + *mapNum = MAP_NUM(MAP_ROUTE134); *x = 224 - *varCruiseStepCount; } break; } - *mapGroup = MAP_GROUP(ROUTE132); + *mapGroup = MAP_GROUP(MAP_ROUTE132); *y = 20; return SS_TIDAL_LOCATION_CURRENTS; } @@ -927,9 +927,9 @@ u8 GetBattleOutcome(void) void CableCarWarp(void) { if (gSpecialVar_0x8004 != 0) - SetWarpDestination(MAP_GROUP(ROUTE112_CABLE_CAR_STATION), MAP_NUM(ROUTE112_CABLE_CAR_STATION), WARP_ID_NONE, 6, 4); + SetWarpDestination(MAP_GROUP(MAP_ROUTE112_CABLE_CAR_STATION), MAP_NUM(MAP_ROUTE112_CABLE_CAR_STATION), WARP_ID_NONE, 6, 4); else - SetWarpDestination(MAP_GROUP(MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MT_CHIMNEY_CABLE_CAR_STATION), WARP_ID_NONE, 6, 4); + SetWarpDestination(MAP_GROUP(MAP_MT_CHIMNEY_CABLE_CAR_STATION), MAP_NUM(MAP_MT_CHIMNEY_CABLE_CAR_STATION), WARP_ID_NONE, 6, 4); } void SetHiddenItemFlag(void) @@ -1398,8 +1398,8 @@ bool8 Special_AreLeadMonEVsMaxedOut(void) u8 TryUpdateRusturfTunnelState(void) { if (!FlagGet(FLAG_RUSTURF_TUNNEL_OPENED) - && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(RUSTURF_TUNNEL) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(RUSTURF_TUNNEL)) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_RUSTURF_TUNNEL) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_RUSTURF_TUNNEL)) { if (FlagGet(FLAG_HIDE_RUSTURF_TUNNEL_ROCK_1)) { @@ -1662,8 +1662,8 @@ bool8 IsBadEggInParty(void) bool8 InMultiPartnerRoom(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && VarGet(VAR_FRONTIER_BATTLE_MODE) == FRONTIER_MODE_MULTIS) return TRUE; return FALSE; @@ -1749,22 +1749,22 @@ void SetDeptStoreFloor(void) u8 deptStoreFloor; switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F): deptStoreFloor = DEPT_STORE_FLOORNUM_1F; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F): deptStoreFloor = DEPT_STORE_FLOORNUM_2F; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F): deptStoreFloor = DEPT_STORE_FLOORNUM_3F; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F): deptStoreFloor = DEPT_STORE_FLOORNUM_4F; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F): deptStoreFloor = DEPT_STORE_FLOORNUM_5F; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP): deptStoreFloor = DEPT_STORE_FLOORNUM_ROOFTOP; break; default: @@ -1779,27 +1779,27 @@ u16 GetDeptStoreDefaultFloorChoice(void) sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 0; - if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_1F)) + if (gSaveBlock1Ptr->dynamicWarp.mapGroup == MAP_GROUP(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F)) { switch (gSaveBlock1Ptr->dynamicWarp.mapNum) { - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_5F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_5F): sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 0; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_4F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_4F): sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 1; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_3F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_3F): sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 2; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_2F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_2F): sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 3; break; - case MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_1F): + case MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_1F): sLilycoveDeptStore_NeverRead = 0; sLilycoveDeptStore_DefaultFloorChoice = 4; break; @@ -2044,7 +2044,7 @@ bool8 UsedPokemonCenterWarp(void) bool32 PlayerNotAtTrainerHillEntrance(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_TRAINER_HILL_ENTRANCE)) return FALSE; return TRUE; @@ -3349,8 +3349,8 @@ static void ChangeDeoxysRockLevel(u8 rockLevel) CreateTask(WaitForDeoxysRockMovement, 8); gFieldEffectArguments[0] = LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK; - gFieldEffectArguments[1] = MAP_NUM(BIRTH_ISLAND_EXTERIOR); - gFieldEffectArguments[2] = MAP_GROUP(BIRTH_ISLAND_EXTERIOR); + gFieldEffectArguments[1] = MAP_NUM(MAP_BIRTH_ISLAND_EXTERIOR); + gFieldEffectArguments[2] = MAP_GROUP(MAP_BIRTH_ISLAND_EXTERIOR); gFieldEffectArguments[3] = sDeoxysRockCoords[rockLevel][0]; gFieldEffectArguments[4] = sDeoxysRockCoords[rockLevel][1]; @@ -3377,7 +3377,7 @@ static void WaitForDeoxysRockMovement(u8 taskId) void IncrementBirthIslandRockStepCount(void) { u16 stepCount = VarGet(VAR_DEOXYS_ROCK_STEP_COUNT); - if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_BIRTH_ISLAND_EXTERIOR)) { if (++stepCount > 99) VarSet(VAR_DEOXYS_ROCK_STEP_COUNT, 0); @@ -3470,22 +3470,22 @@ void CreateAbnormalWeatherEvent(void) bool32 GetAbnormalWeatherMapNameAndType(void) { static const u8 sAbnormalWeatherMapNumbers[] = { - MAP_NUM(ROUTE114), - MAP_NUM(ROUTE114), - MAP_NUM(ROUTE115), - MAP_NUM(ROUTE115), - MAP_NUM(ROUTE116), - MAP_NUM(ROUTE116), - MAP_NUM(ROUTE118), - MAP_NUM(ROUTE118), - MAP_NUM(ROUTE105), - MAP_NUM(ROUTE105), - MAP_NUM(ROUTE125), - MAP_NUM(ROUTE125), - MAP_NUM(ROUTE127), - MAP_NUM(ROUTE127), - MAP_NUM(ROUTE129), - MAP_NUM(ROUTE129) + MAP_NUM(MAP_ROUTE114), + MAP_NUM(MAP_ROUTE114), + MAP_NUM(MAP_ROUTE115), + MAP_NUM(MAP_ROUTE115), + MAP_NUM(MAP_ROUTE116), + MAP_NUM(MAP_ROUTE116), + MAP_NUM(MAP_ROUTE118), + MAP_NUM(MAP_ROUTE118), + MAP_NUM(MAP_ROUTE105), + MAP_NUM(MAP_ROUTE105), + MAP_NUM(MAP_ROUTE125), + MAP_NUM(MAP_ROUTE125), + MAP_NUM(MAP_ROUTE127), + MAP_NUM(MAP_ROUTE127), + MAP_NUM(MAP_ROUTE129), + MAP_NUM(MAP_ROUTE129) }; u16 abnormalWeather = VarGet(VAR_ABNORMAL_WEATHER_LOCATION); @@ -3503,22 +3503,22 @@ bool8 AbnormalWeatherHasExpired(void) // Duplicate array. static const u8 sAbnormalWeatherMapNumbers[] = { - MAP_NUM(ROUTE114), - MAP_NUM(ROUTE114), - MAP_NUM(ROUTE115), - MAP_NUM(ROUTE115), - MAP_NUM(ROUTE116), - MAP_NUM(ROUTE116), - MAP_NUM(ROUTE118), - MAP_NUM(ROUTE118), - MAP_NUM(ROUTE105), - MAP_NUM(ROUTE105), - MAP_NUM(ROUTE125), - MAP_NUM(ROUTE125), - MAP_NUM(ROUTE127), - MAP_NUM(ROUTE127), - MAP_NUM(ROUTE129), - MAP_NUM(ROUTE129) + MAP_NUM(MAP_ROUTE114), + MAP_NUM(MAP_ROUTE114), + MAP_NUM(MAP_ROUTE115), + MAP_NUM(MAP_ROUTE115), + MAP_NUM(MAP_ROUTE116), + MAP_NUM(MAP_ROUTE116), + MAP_NUM(MAP_ROUTE118), + MAP_NUM(MAP_ROUTE118), + MAP_NUM(MAP_ROUTE105), + MAP_NUM(MAP_ROUTE105), + MAP_NUM(MAP_ROUTE125), + MAP_NUM(MAP_ROUTE125), + MAP_NUM(MAP_ROUTE127), + MAP_NUM(MAP_ROUTE127), + MAP_NUM(MAP_ROUTE129), + MAP_NUM(MAP_ROUTE129) }; u16 steps = VarGet(VAR_ABNORMAL_WEATHER_STEP_COUNTER); @@ -3530,15 +3530,15 @@ bool8 AbnormalWeatherHasExpired(void) if (++steps > 999) { VarSet(VAR_ABNORMAL_WEATHER_STEP_COUNTER, 0); - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER_MARINE_CAVE)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_UNDERWATER_MARINE_CAVE)) { switch (gSaveBlock1Ptr->location.mapNum) { - case MAP_NUM(UNDERWATER_MARINE_CAVE): - case MAP_NUM(MARINE_CAVE_ENTRANCE): - case MAP_NUM(MARINE_CAVE_END): - case MAP_NUM(TERRA_CAVE_ENTRANCE): - case MAP_NUM(TERRA_CAVE_END): + case MAP_NUM(MAP_UNDERWATER_MARINE_CAVE): + case MAP_NUM(MAP_MARINE_CAVE_ENTRANCE): + case MAP_NUM(MAP_MARINE_CAVE_END): + case MAP_NUM(MAP_TERRA_CAVE_ENTRANCE): + case MAP_NUM(MAP_TERRA_CAVE_END): VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1); return FALSE; default: @@ -3546,14 +3546,14 @@ bool8 AbnormalWeatherHasExpired(void) } } - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNDERWATER_ROUTE127)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_UNDERWATER_ROUTE127)) { switch (gSaveBlock1Ptr->location.mapNum) { - case MAP_NUM(UNDERWATER_ROUTE127): - case MAP_NUM(UNDERWATER_ROUTE129): - case MAP_NUM(UNDERWATER_ROUTE105): - case MAP_NUM(UNDERWATER_ROUTE125): + case MAP_NUM(MAP_UNDERWATER_ROUTE127): + case MAP_NUM(MAP_UNDERWATER_ROUTE129): + case MAP_NUM(MAP_UNDERWATER_ROUTE105): + case MAP_NUM(MAP_UNDERWATER_ROUTE125): VarSet(VAR_SHOULD_END_ABNORMAL_WEATHER, 1); return FALSE; default: @@ -3589,18 +3589,18 @@ u32 GetMartEmployeeObjectEventId(void) { static const u8 sPokeMarts[][3] = { - { MAP_GROUP(OLDALE_TOWN_MART), MAP_NUM(OLDALE_TOWN_MART), LOCALID_OLDALE_MART_CLERK }, - { MAP_GROUP(LAVARIDGE_TOWN_MART), MAP_NUM(LAVARIDGE_TOWN_MART), LOCALID_LAVARIDGE_MART_CLERK }, - { MAP_GROUP(FALLARBOR_TOWN_MART), MAP_NUM(FALLARBOR_TOWN_MART), LOCALID_FALLARBOR_MART_CLERK }, - { MAP_GROUP(VERDANTURF_TOWN_MART), MAP_NUM(VERDANTURF_TOWN_MART), LOCALID_VERDANTURF_MART_CLERK }, - { MAP_GROUP(PETALBURG_CITY_MART), MAP_NUM(PETALBURG_CITY_MART), LOCALID_PETALBURG_MART_CLERK }, - { MAP_GROUP(SLATEPORT_CITY_MART), MAP_NUM(SLATEPORT_CITY_MART), LOCALID_SLATEPORT_MART_CLERK }, - { MAP_GROUP(MAUVILLE_CITY_MART), MAP_NUM(MAUVILLE_CITY_MART), LOCALID_MAUVILLE_MART_CLERK }, - { MAP_GROUP(RUSTBORO_CITY_MART), MAP_NUM(RUSTBORO_CITY_MART), LOCALID_RUSTBORO_MART_CLERK }, - { MAP_GROUP(FORTREE_CITY_MART), MAP_NUM(FORTREE_CITY_MART), LOCALID_FORTREE_MART_CLERK }, - { MAP_GROUP(MOSSDEEP_CITY_MART), MAP_NUM(MOSSDEEP_CITY_MART), LOCALID_MOSSDEEP_MART_CLERK }, - { MAP_GROUP(SOOTOPOLIS_CITY_MART), MAP_NUM(SOOTOPOLIS_CITY_MART), LOCALID_SOOTOPOLIS_MART_CLERK }, - { MAP_GROUP(BATTLE_FRONTIER_MART), MAP_NUM(BATTLE_FRONTIER_MART), LOCALID_BATTLE_FRONTIER_MART_CLERK } + { MAP_GROUP(MAP_OLDALE_TOWN_MART), MAP_NUM(MAP_OLDALE_TOWN_MART), LOCALID_OLDALE_MART_CLERK }, + { MAP_GROUP(MAP_LAVARIDGE_TOWN_MART), MAP_NUM(MAP_LAVARIDGE_TOWN_MART), LOCALID_LAVARIDGE_MART_CLERK }, + { MAP_GROUP(MAP_FALLARBOR_TOWN_MART), MAP_NUM(MAP_FALLARBOR_TOWN_MART), LOCALID_FALLARBOR_MART_CLERK }, + { MAP_GROUP(MAP_VERDANTURF_TOWN_MART), MAP_NUM(MAP_VERDANTURF_TOWN_MART), LOCALID_VERDANTURF_MART_CLERK }, + { MAP_GROUP(MAP_PETALBURG_CITY_MART), MAP_NUM(MAP_PETALBURG_CITY_MART), LOCALID_PETALBURG_MART_CLERK }, + { MAP_GROUP(MAP_SLATEPORT_CITY_MART), MAP_NUM(MAP_SLATEPORT_CITY_MART), LOCALID_SLATEPORT_MART_CLERK }, + { MAP_GROUP(MAP_MAUVILLE_CITY_MART), MAP_NUM(MAP_MAUVILLE_CITY_MART), LOCALID_MAUVILLE_MART_CLERK }, + { MAP_GROUP(MAP_RUSTBORO_CITY_MART), MAP_NUM(MAP_RUSTBORO_CITY_MART), LOCALID_RUSTBORO_MART_CLERK }, + { MAP_GROUP(MAP_FORTREE_CITY_MART), MAP_NUM(MAP_FORTREE_CITY_MART), LOCALID_FORTREE_MART_CLERK }, + { MAP_GROUP(MAP_MOSSDEEP_CITY_MART), MAP_NUM(MAP_MOSSDEEP_CITY_MART), LOCALID_MOSSDEEP_MART_CLERK }, + { MAP_GROUP(MAP_SOOTOPOLIS_CITY_MART), MAP_NUM(MAP_SOOTOPOLIS_CITY_MART), LOCALID_SOOTOPOLIS_MART_CLERK }, + { MAP_GROUP(MAP_BATTLE_FRONTIER_MART), MAP_NUM(MAP_BATTLE_FRONTIER_MART), LOCALID_BATTLE_FRONTIER_MART_CLERK } }; u8 i; @@ -3880,7 +3880,7 @@ void GetBattlePyramidHint(void) // Used to avoid a potential softlock if the player respawns on Dewford with no way off void ResetHealLocationFromDewford(void) { - if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(DEWFORD_TOWN)) + if (gSaveBlock1Ptr->lastHealLocation.mapGroup == MAP_GROUP(MAP_DEWFORD_TOWN) && gSaveBlock1Ptr->lastHealLocation.mapNum == MAP_NUM(MAP_DEWFORD_TOWN)) SetLastHealLocationWarp(HEAL_LOCATION_PETALBURG_CITY); } diff --git a/src/frontier_pass.c b/src/frontier_pass.c index 07e06ad3b9..756650cc59 100644 --- a/src/frontier_pass.c +++ b/src/frontier_pass.c @@ -1580,48 +1580,48 @@ static void Task_HandleFrontierMap(u8 taskId) static u8 MapNumToFrontierFacilityId(u16 mapNum) // id + 1, zero means not a frontier map number { // In Battle Tower - if ((mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_LOBBY) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM)) - || (mapNum >= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && mapNum <= MAP_NUM(BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM))) + if ((mapNum >= MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY) && mapNum <= MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM)) + || (mapNum >= MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_PARTNER_ROOM) && mapNum <= MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM))) return FRONTIER_FACILITY_TOWER + 1; // In Battle Dome - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM)) return FRONTIER_FACILITY_DOME + 1; // In Battle Palace - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM)) return FRONTIER_FACILITY_PALACE + 1; // In Battle Arena - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_ARENA_CORRIDOR) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM)) return FRONTIER_FACILITY_ARENA + 1; // In Battle Factory - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM)) return FRONTIER_FACILITY_FACTORY + 1; // In Battle Pike - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_CORRIDOR) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS)) return FRONTIER_FACILITY_PIKE + 1; // In Battle Pyramid - else if (mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) - || mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_TOP)) + else if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_FLOOR) + || mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_TOP)) return FRONTIER_FACILITY_PYRAMID + 1; else @@ -1657,8 +1657,8 @@ static void InitFrontierMapSprites(void) { s8 mapNum = gSaveBlock1Ptr->location.mapNum; - if (mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_WEST) - || (mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST) && (x = 55))) + if (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_OUTSIDE_WEST) + || (mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_OUTSIDE_EAST) && (x = 55))) { x += gSaveBlock1Ptr->pos.x; y = gSaveBlock1Ptr->pos.y; @@ -1679,7 +1679,7 @@ static void InitFrontierMapSprites(void) else { // Handle Artisan Cave. - if (gSaveBlock1Ptr->escapeWarp.mapNum == MAP_NUM(BATTLE_FRONTIER_OUTSIDE_EAST)) + if (gSaveBlock1Ptr->escapeWarp.mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_OUTSIDE_EAST)) x = gSaveBlock1Ptr->escapeWarp.x + 55; else x = gSaveBlock1Ptr->escapeWarp.x; diff --git a/src/match_call.c b/src/match_call.c index a9d18b3477..325fb01015 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1747,9 +1747,9 @@ static void PopulateSpeciesFromTrainerLocation(int matchCallId, u8 *destStr) u8 slot; int i = 0; - if (gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED)) // ??? This check is nonsense. + if (gWildMonHeaders[i].mapGroup != MAP_GROUP(MAP_UNDEFINED)) // ??? This check is nonsense. { - while (gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED)) + while (gWildMonHeaders[i].mapGroup != MAP_GROUP(MAP_UNDEFINED)) { if (gWildMonHeaders[i].mapGroup == gRematchTable[matchCallId].mapGroup && gWildMonHeaders[i].mapNum == gRematchTable[matchCallId].mapNum) @@ -1758,7 +1758,7 @@ static void PopulateSpeciesFromTrainerLocation(int matchCallId, u8 *destStr) i++; } - if (gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED)) + if (gWildMonHeaders[i].mapGroup != MAP_GROUP(MAP_UNDEFINED)) { numSpecies = 0; if (gWildMonHeaders[i].landMonsInfo) diff --git a/src/menu_helpers.c b/src/menu_helpers.c index d810508ae4..04e7f061b4 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -279,8 +279,8 @@ 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)) + && ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_TRADE_CENTER) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_TRADE_CENTER)) || InUnionRoom() == TRUE)) return FALSE; else diff --git a/src/mirage_tower.c b/src/mirage_tower.c index b1e2e5003b..816aefd2f3 100644 --- a/src/mirage_tower.c +++ b/src/mirage_tower.c @@ -265,7 +265,7 @@ static u16 sDebug_DisintegrationData[8]; bool8 IsMirageTowerVisible(void) { - if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111))) + if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE111) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE111))) return FALSE; return FlagGet(FLAG_MIRAGE_TOWER_VISIBLE); } @@ -288,8 +288,8 @@ void TryStartMirageTowerPulseBlendEffect(void) return; } - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111) - || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(MAP_ROUTE111) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(MAP_ROUTE111) || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE)) return; @@ -302,8 +302,8 @@ void TryStartMirageTowerPulseBlendEffect(void) void ClearMirageTowerPulseBlendEffect(void) { - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(ROUTE111) - || gSaveBlock1Ptr->location.mapNum != MAP_NUM(ROUTE111) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(MAP_ROUTE111) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(MAP_ROUTE111) || !FlagGet(FLAG_MIRAGE_TOWER_VISIBLE) || sMirageTowerPulseBlend == NULL) return; diff --git a/src/new_game.c b/src/new_game.c index ac3842e0ac..80746561b0 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -126,7 +126,7 @@ static void ClearFrontierRecord(void) static void WarpToTruck(void) { - SetWarpDestination(MAP_GROUP(INSIDE_OF_TRUCK), MAP_NUM(INSIDE_OF_TRUCK), WARP_ID_NONE, -1, -1); + SetWarpDestination(MAP_GROUP(MAP_INSIDE_OF_TRUCK), MAP_NUM(MAP_INSIDE_OF_TRUCK), WARP_ID_NONE, -1, -1); WarpIntoMap(); } diff --git a/src/overworld.c b/src/overworld.c index e1cb0a1cad..af07660de9 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -202,8 +202,8 @@ EWRAM_DATA struct LinkPlayerObjectEvent gLinkPlayerObjectEvents[4] = {0}; static const struct WarpData sDummyWarpData = { - .mapGroup = MAP_GROUP(UNDEFINED), - .mapNum = MAP_NUM(UNDEFINED), + .mapGroup = MAP_GROUP(MAP_UNDEFINED), + .mapNum = MAP_NUM(MAP_UNDEFINED), .warpId = WARP_ID_NONE, .x = -1, .y = -1, @@ -562,9 +562,9 @@ static void SetWarpData(struct WarpData *warp, s8 mapGroup, s8 mapNum, s8 warpId static bool32 IsDummyWarp(struct WarpData *warp) { - if (warp->mapGroup != (s8)MAP_GROUP(UNDEFINED)) + if (warp->mapGroup != (s8)MAP_GROUP(MAP_UNDEFINED)) return FALSE; - else if (warp->mapNum != (s8)MAP_NUM(UNDEFINED)) + else if (warp->mapNum != (s8)MAP_NUM(MAP_UNDEFINED)) return FALSE; else if (warp->warpId != WARP_ID_NONE) return FALSE; @@ -1015,24 +1015,24 @@ static bool16 ShouldLegendaryMusicPlayAtLocation(struct WarpData *warp) { switch (warp->mapNum) { - case MAP_NUM(LILYCOVE_CITY): - case MAP_NUM(MOSSDEEP_CITY): - case MAP_NUM(SOOTOPOLIS_CITY): - case MAP_NUM(EVER_GRANDE_CITY): - case MAP_NUM(ROUTE124): - case MAP_NUM(ROUTE125): - case MAP_NUM(ROUTE126): - case MAP_NUM(ROUTE127): - case MAP_NUM(ROUTE128): + case MAP_NUM(MAP_LILYCOVE_CITY): + case MAP_NUM(MAP_MOSSDEEP_CITY): + case MAP_NUM(MAP_SOOTOPOLIS_CITY): + case MAP_NUM(MAP_EVER_GRANDE_CITY): + case MAP_NUM(MAP_ROUTE124): + case MAP_NUM(MAP_ROUTE125): + case MAP_NUM(MAP_ROUTE126): + case MAP_NUM(MAP_ROUTE127): + case MAP_NUM(MAP_ROUTE128): return TRUE; default: if (VarGet(VAR_SOOTOPOLIS_CITY_STATE) < 4) return FALSE; switch (warp->mapNum) { - case MAP_NUM(ROUTE129): - case MAP_NUM(ROUTE130): - case MAP_NUM(ROUTE131): + case MAP_NUM(MAP_ROUTE129): + case MAP_NUM(MAP_ROUTE130): + case MAP_NUM(MAP_ROUTE131): return TRUE; } } @@ -1044,9 +1044,9 @@ static bool16 NoMusicInSotopolisWithLegendaries(struct WarpData *warp) { if (VarGet(VAR_SKY_PILLAR_STATE) != 1) return FALSE; - else if (warp->mapGroup != MAP_GROUP(SOOTOPOLIS_CITY)) + else if (warp->mapGroup != MAP_GROUP(MAP_SOOTOPOLIS_CITY)) return FALSE; - else if (warp->mapNum == MAP_NUM(SOOTOPOLIS_CITY)) + else if (warp->mapNum == MAP_NUM(MAP_SOOTOPOLIS_CITY)) return TRUE; else return FALSE; @@ -1056,10 +1056,10 @@ static bool16 IsInfiltratedWeatherInstitute(struct WarpData *warp) { if (VarGet(VAR_WEATHER_INSTITUTE_STATE)) return FALSE; - else if (warp->mapGroup != MAP_GROUP(ROUTE119_WEATHER_INSTITUTE_1F)) + else if (warp->mapGroup != MAP_GROUP(MAP_ROUTE119_WEATHER_INSTITUTE_1F)) return FALSE; - else if (warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_1F) - || warp->mapNum == MAP_NUM(ROUTE119_WEATHER_INSTITUTE_2F)) + else if (warp->mapNum == MAP_NUM(MAP_ROUTE119_WEATHER_INSTITUTE_1F) + || warp->mapNum == MAP_NUM(MAP_ROUTE119_WEATHER_INSTITUTE_2F)) return TRUE; else return FALSE; @@ -1071,10 +1071,10 @@ static bool16 IsInflitratedSpaceCenter(struct WarpData *warp) return FALSE; else if (VarGet(VAR_MOSSDEEP_CITY_STATE) > 2) return FALSE; - else if (warp->mapGroup != MAP_GROUP(MOSSDEEP_CITY_SPACE_CENTER_1F)) + else if (warp->mapGroup != MAP_GROUP(MAP_MOSSDEEP_CITY_SPACE_CENTER_1F)) return FALSE; - else if (warp->mapNum == MAP_NUM(MOSSDEEP_CITY_SPACE_CENTER_1F) - || warp->mapNum == MAP_NUM(MOSSDEEP_CITY_SPACE_CENTER_2F)) + else if (warp->mapNum == MAP_NUM(MAP_MOSSDEEP_CITY_SPACE_CENTER_1F) + || warp->mapNum == MAP_NUM(MAP_MOSSDEEP_CITY_SPACE_CENTER_2F)) return TRUE; return FALSE; } @@ -1098,8 +1098,8 @@ u16 GetCurrLocationDefaultMusic(void) u16 music; // Play the desert music only when the sandstorm is active on Route 111. - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE111) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE111) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE111) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE111) && GetSavedWeather() == WEATHER_SANDSTORM) return MUS_DESERT; @@ -1126,8 +1126,8 @@ u16 GetWarpDestinationMusic(void) } else { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAUVILLE_CITY) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAUVILLE_CITY)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_MAUVILLE_CITY) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_MAUVILLE_CITY)) return MUS_ROUTE110; else return MUS_ROUTE119; @@ -1221,10 +1221,10 @@ void TryFadeOutOldMapMusic(void) { if (currentMusic == MUS_SURF && VarGet(VAR_SKY_PILLAR_STATE) == 2 - && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SOOTOPOLIS_CITY) - && sWarpDestination.mapGroup == MAP_GROUP(SOOTOPOLIS_CITY) - && sWarpDestination.mapNum == MAP_NUM(SOOTOPOLIS_CITY) + && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_SOOTOPOLIS_CITY) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SOOTOPOLIS_CITY) + && sWarpDestination.mapGroup == MAP_GROUP(MAP_SOOTOPOLIS_CITY) + && sWarpDestination.mapNum == MAP_NUM(MAP_SOOTOPOLIS_CITY) && sWarpDestination.x == 29 && sWarpDestination.y == 53) return; @@ -1316,8 +1316,8 @@ void UpdateAmbientCry(s16 *state, u16 *delayCounter) static void ChooseAmbientCrySpecies(void) { - if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE130) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE130)) + if ((gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE130) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE130)) && !IsMirageIslandPresent()) { // Only play water PokΓ©mon cries on this route diff --git a/src/party_menu.c b/src/party_menu.c index adf833fe89..45a6c5f273 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5589,8 +5589,8 @@ static bool8 GetBattleEntryEligibility(struct Pokemon *mon) if (GetMonData(mon, MON_DATA_IS_EGG) || GetMonData(mon, MON_DATA_LEVEL) > GetBattleEntryLevelCap() - || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + || (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY) && GetMonData(mon, MON_DATA_HELD_ITEM) != ITEM_NONE)) { return FALSE; diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index f9181a985b..5a68dd6399 100755 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -29,9 +29,9 @@ // determined by the data for the corresponding MAPSEC in gRegionMapEntries. // Only maps in the following map groups have their encounters considered for the area screen -#define MAP_GROUP_TOWNS_AND_ROUTES MAP_GROUP(PETALBURG_CITY) -#define MAP_GROUP_DUNGEONS MAP_GROUP(METEOR_FALLS_1F_1R) -#define MAP_GROUP_SPECIAL_AREA MAP_GROUP(SAFARI_ZONE_NORTHWEST) +#define MAP_GROUP_TOWNS_AND_ROUTES MAP_GROUP(MAP_PETALBURG_CITY) +#define MAP_GROUP_DUNGEONS MAP_GROUP(MAP_METEOR_FALLS_1F_1R) +#define MAP_GROUP_SPECIAL_AREA MAP_GROUP(MAP_SAFARI_ZONE_NORTHWEST) #define AREA_SCREEN_WIDTH 32 #define AREA_SCREEN_HEIGHT 20 @@ -121,7 +121,7 @@ static const u16 sMovingRegionMapSections[3] = static const u16 sFeebasData[][3] = { - {SPECIES_FEEBAS, MAP_GROUP(ROUTE119), MAP_NUM(ROUTE119)}, + {SPECIES_FEEBAS, MAP_GROUP(MAP_ROUTE119), MAP_NUM(MAP_ROUTE119)}, {NUM_SPECIES} }; @@ -285,7 +285,7 @@ static void FindMapsWithMon(u16 species) } // Add regular species to the area map - for (i = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(UNDEFINED); i++) + for (i = 0; gWildMonHeaders[i].mapGroup != MAP_GROUP(MAP_UNDEFINED); i++) { if (MapHasSpecies(&gWildMonHeaders[i], species)) { diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index b398b88752..539f40ed53 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -6497,10 +6497,10 @@ struct { {MAP_GROUPS_COUNT, 0, MOVE_SURF}, {MAP_GROUPS_COUNT, 0, MOVE_DIVE}, - {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_STRENGTH}, - {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_ROCK_SMASH}, - {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_STRENGTH}, - {MAP_GROUP(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH}, + {MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_STRENGTH}, + {MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_1F), MOVE_ROCK_SMASH}, + {MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_STRENGTH}, + {MAP_GROUP(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MAP_NUM(MAP_EVER_GRANDE_CITY_POKEMON_LEAGUE_2F), MOVE_ROCK_SMASH}, }; static void GetRestrictedReleaseMoves(u16 *moves) diff --git a/src/region_map.c b/src/region_map.c index 21c6314d30..c9ab3f468e 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -288,56 +288,56 @@ static const u32 sFlyTargetIcons_Gfx[] = INCBIN_U32("graphics/pokenav/region_map static const u8 sMapHealLocations[][3] = { - [MAPSEC_LITTLEROOT_TOWN] = {MAP_GROUP(LITTLEROOT_TOWN), MAP_NUM(LITTLEROOT_TOWN), HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F}, - [MAPSEC_OLDALE_TOWN] = {MAP_GROUP(OLDALE_TOWN), MAP_NUM(OLDALE_TOWN), HEAL_LOCATION_OLDALE_TOWN}, - [MAPSEC_DEWFORD_TOWN] = {MAP_GROUP(DEWFORD_TOWN), MAP_NUM(DEWFORD_TOWN), HEAL_LOCATION_DEWFORD_TOWN}, - [MAPSEC_LAVARIDGE_TOWN] = {MAP_GROUP(LAVARIDGE_TOWN), MAP_NUM(LAVARIDGE_TOWN), HEAL_LOCATION_LAVARIDGE_TOWN}, - [MAPSEC_FALLARBOR_TOWN] = {MAP_GROUP(FALLARBOR_TOWN), MAP_NUM(FALLARBOR_TOWN), HEAL_LOCATION_FALLARBOR_TOWN}, - [MAPSEC_VERDANTURF_TOWN] = {MAP_GROUP(VERDANTURF_TOWN), MAP_NUM(VERDANTURF_TOWN), HEAL_LOCATION_VERDANTURF_TOWN}, - [MAPSEC_PACIFIDLOG_TOWN] = {MAP_GROUP(PACIFIDLOG_TOWN), MAP_NUM(PACIFIDLOG_TOWN), HEAL_LOCATION_PACIFIDLOG_TOWN}, - [MAPSEC_PETALBURG_CITY] = {MAP_GROUP(PETALBURG_CITY), MAP_NUM(PETALBURG_CITY), HEAL_LOCATION_PETALBURG_CITY}, - [MAPSEC_SLATEPORT_CITY] = {MAP_GROUP(SLATEPORT_CITY), MAP_NUM(SLATEPORT_CITY), HEAL_LOCATION_SLATEPORT_CITY}, - [MAPSEC_MAUVILLE_CITY] = {MAP_GROUP(MAUVILLE_CITY), MAP_NUM(MAUVILLE_CITY), HEAL_LOCATION_MAUVILLE_CITY}, - [MAPSEC_RUSTBORO_CITY] = {MAP_GROUP(RUSTBORO_CITY), MAP_NUM(RUSTBORO_CITY), HEAL_LOCATION_RUSTBORO_CITY}, - [MAPSEC_FORTREE_CITY] = {MAP_GROUP(FORTREE_CITY), MAP_NUM(FORTREE_CITY), HEAL_LOCATION_FORTREE_CITY}, - [MAPSEC_LILYCOVE_CITY] = {MAP_GROUP(LILYCOVE_CITY), MAP_NUM(LILYCOVE_CITY), HEAL_LOCATION_LILYCOVE_CITY}, - [MAPSEC_MOSSDEEP_CITY] = {MAP_GROUP(MOSSDEEP_CITY), MAP_NUM(MOSSDEEP_CITY), HEAL_LOCATION_MOSSDEEP_CITY}, - [MAPSEC_SOOTOPOLIS_CITY] = {MAP_GROUP(SOOTOPOLIS_CITY), MAP_NUM(SOOTOPOLIS_CITY), HEAL_LOCATION_SOOTOPOLIS_CITY}, - [MAPSEC_EVER_GRANDE_CITY] = {MAP_GROUP(EVER_GRANDE_CITY), MAP_NUM(EVER_GRANDE_CITY), HEAL_LOCATION_EVER_GRANDE_CITY}, - [MAPSEC_ROUTE_101] = {MAP_GROUP(ROUTE101), MAP_NUM(ROUTE101), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_102] = {MAP_GROUP(ROUTE102), MAP_NUM(ROUTE102), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_103] = {MAP_GROUP(ROUTE103), MAP_NUM(ROUTE103), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_104] = {MAP_GROUP(ROUTE104), MAP_NUM(ROUTE104), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_105] = {MAP_GROUP(ROUTE105), MAP_NUM(ROUTE105), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_106] = {MAP_GROUP(ROUTE106), MAP_NUM(ROUTE106), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_107] = {MAP_GROUP(ROUTE107), MAP_NUM(ROUTE107), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_108] = {MAP_GROUP(ROUTE108), MAP_NUM(ROUTE108), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_109] = {MAP_GROUP(ROUTE109), MAP_NUM(ROUTE109), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_110] = {MAP_GROUP(ROUTE110), MAP_NUM(ROUTE110), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_111] = {MAP_GROUP(ROUTE111), MAP_NUM(ROUTE111), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_112] = {MAP_GROUP(ROUTE112), MAP_NUM(ROUTE112), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_113] = {MAP_GROUP(ROUTE113), MAP_NUM(ROUTE113), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_114] = {MAP_GROUP(ROUTE114), MAP_NUM(ROUTE114), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_115] = {MAP_GROUP(ROUTE115), MAP_NUM(ROUTE115), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_116] = {MAP_GROUP(ROUTE116), MAP_NUM(ROUTE116), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_117] = {MAP_GROUP(ROUTE117), MAP_NUM(ROUTE117), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_118] = {MAP_GROUP(ROUTE118), MAP_NUM(ROUTE118), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_119] = {MAP_GROUP(ROUTE119), MAP_NUM(ROUTE119), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_120] = {MAP_GROUP(ROUTE120), MAP_NUM(ROUTE120), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_121] = {MAP_GROUP(ROUTE121), MAP_NUM(ROUTE121), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_122] = {MAP_GROUP(ROUTE122), MAP_NUM(ROUTE122), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_123] = {MAP_GROUP(ROUTE123), MAP_NUM(ROUTE123), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_124] = {MAP_GROUP(ROUTE124), MAP_NUM(ROUTE124), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_125] = {MAP_GROUP(ROUTE125), MAP_NUM(ROUTE125), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_126] = {MAP_GROUP(ROUTE126), MAP_NUM(ROUTE126), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_127] = {MAP_GROUP(ROUTE127), MAP_NUM(ROUTE127), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_128] = {MAP_GROUP(ROUTE128), MAP_NUM(ROUTE128), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_129] = {MAP_GROUP(ROUTE129), MAP_NUM(ROUTE129), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_130] = {MAP_GROUP(ROUTE130), MAP_NUM(ROUTE130), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_131] = {MAP_GROUP(ROUTE131), MAP_NUM(ROUTE131), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_132] = {MAP_GROUP(ROUTE132), MAP_NUM(ROUTE132), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_133] = {MAP_GROUP(ROUTE133), MAP_NUM(ROUTE133), HEAL_LOCATION_NONE}, - [MAPSEC_ROUTE_134] = {MAP_GROUP(ROUTE134), MAP_NUM(ROUTE134), HEAL_LOCATION_NONE}, + [MAPSEC_LITTLEROOT_TOWN] = {MAP_GROUP(MAP_LITTLEROOT_TOWN), MAP_NUM(MAP_LITTLEROOT_TOWN), HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F}, + [MAPSEC_OLDALE_TOWN] = {MAP_GROUP(MAP_OLDALE_TOWN), MAP_NUM(MAP_OLDALE_TOWN), HEAL_LOCATION_OLDALE_TOWN}, + [MAPSEC_DEWFORD_TOWN] = {MAP_GROUP(MAP_DEWFORD_TOWN), MAP_NUM(MAP_DEWFORD_TOWN), HEAL_LOCATION_DEWFORD_TOWN}, + [MAPSEC_LAVARIDGE_TOWN] = {MAP_GROUP(MAP_LAVARIDGE_TOWN), MAP_NUM(MAP_LAVARIDGE_TOWN), HEAL_LOCATION_LAVARIDGE_TOWN}, + [MAPSEC_FALLARBOR_TOWN] = {MAP_GROUP(MAP_FALLARBOR_TOWN), MAP_NUM(MAP_FALLARBOR_TOWN), HEAL_LOCATION_FALLARBOR_TOWN}, + [MAPSEC_VERDANTURF_TOWN] = {MAP_GROUP(MAP_VERDANTURF_TOWN), MAP_NUM(MAP_VERDANTURF_TOWN), HEAL_LOCATION_VERDANTURF_TOWN}, + [MAPSEC_PACIFIDLOG_TOWN] = {MAP_GROUP(MAP_PACIFIDLOG_TOWN), MAP_NUM(MAP_PACIFIDLOG_TOWN), HEAL_LOCATION_PACIFIDLOG_TOWN}, + [MAPSEC_PETALBURG_CITY] = {MAP_GROUP(MAP_PETALBURG_CITY), MAP_NUM(MAP_PETALBURG_CITY), HEAL_LOCATION_PETALBURG_CITY}, + [MAPSEC_SLATEPORT_CITY] = {MAP_GROUP(MAP_SLATEPORT_CITY), MAP_NUM(MAP_SLATEPORT_CITY), HEAL_LOCATION_SLATEPORT_CITY}, + [MAPSEC_MAUVILLE_CITY] = {MAP_GROUP(MAP_MAUVILLE_CITY), MAP_NUM(MAP_MAUVILLE_CITY), HEAL_LOCATION_MAUVILLE_CITY}, + [MAPSEC_RUSTBORO_CITY] = {MAP_GROUP(MAP_RUSTBORO_CITY), MAP_NUM(MAP_RUSTBORO_CITY), HEAL_LOCATION_RUSTBORO_CITY}, + [MAPSEC_FORTREE_CITY] = {MAP_GROUP(MAP_FORTREE_CITY), MAP_NUM(MAP_FORTREE_CITY), HEAL_LOCATION_FORTREE_CITY}, + [MAPSEC_LILYCOVE_CITY] = {MAP_GROUP(MAP_LILYCOVE_CITY), MAP_NUM(MAP_LILYCOVE_CITY), HEAL_LOCATION_LILYCOVE_CITY}, + [MAPSEC_MOSSDEEP_CITY] = {MAP_GROUP(MAP_MOSSDEEP_CITY), MAP_NUM(MAP_MOSSDEEP_CITY), HEAL_LOCATION_MOSSDEEP_CITY}, + [MAPSEC_SOOTOPOLIS_CITY] = {MAP_GROUP(MAP_SOOTOPOLIS_CITY), MAP_NUM(MAP_SOOTOPOLIS_CITY), HEAL_LOCATION_SOOTOPOLIS_CITY}, + [MAPSEC_EVER_GRANDE_CITY] = {MAP_GROUP(MAP_EVER_GRANDE_CITY), MAP_NUM(MAP_EVER_GRANDE_CITY), HEAL_LOCATION_EVER_GRANDE_CITY}, + [MAPSEC_ROUTE_101] = {MAP_GROUP(MAP_ROUTE101), MAP_NUM(MAP_ROUTE101), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_102] = {MAP_GROUP(MAP_ROUTE102), MAP_NUM(MAP_ROUTE102), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_103] = {MAP_GROUP(MAP_ROUTE103), MAP_NUM(MAP_ROUTE103), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_104] = {MAP_GROUP(MAP_ROUTE104), MAP_NUM(MAP_ROUTE104), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_105] = {MAP_GROUP(MAP_ROUTE105), MAP_NUM(MAP_ROUTE105), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_106] = {MAP_GROUP(MAP_ROUTE106), MAP_NUM(MAP_ROUTE106), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_107] = {MAP_GROUP(MAP_ROUTE107), MAP_NUM(MAP_ROUTE107), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_108] = {MAP_GROUP(MAP_ROUTE108), MAP_NUM(MAP_ROUTE108), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_109] = {MAP_GROUP(MAP_ROUTE109), MAP_NUM(MAP_ROUTE109), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_110] = {MAP_GROUP(MAP_ROUTE110), MAP_NUM(MAP_ROUTE110), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_111] = {MAP_GROUP(MAP_ROUTE111), MAP_NUM(MAP_ROUTE111), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_112] = {MAP_GROUP(MAP_ROUTE112), MAP_NUM(MAP_ROUTE112), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_113] = {MAP_GROUP(MAP_ROUTE113), MAP_NUM(MAP_ROUTE113), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_114] = {MAP_GROUP(MAP_ROUTE114), MAP_NUM(MAP_ROUTE114), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_115] = {MAP_GROUP(MAP_ROUTE115), MAP_NUM(MAP_ROUTE115), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_116] = {MAP_GROUP(MAP_ROUTE116), MAP_NUM(MAP_ROUTE116), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_117] = {MAP_GROUP(MAP_ROUTE117), MAP_NUM(MAP_ROUTE117), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_118] = {MAP_GROUP(MAP_ROUTE118), MAP_NUM(MAP_ROUTE118), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_119] = {MAP_GROUP(MAP_ROUTE119), MAP_NUM(MAP_ROUTE119), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_120] = {MAP_GROUP(MAP_ROUTE120), MAP_NUM(MAP_ROUTE120), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_121] = {MAP_GROUP(MAP_ROUTE121), MAP_NUM(MAP_ROUTE121), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_122] = {MAP_GROUP(MAP_ROUTE122), MAP_NUM(MAP_ROUTE122), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_123] = {MAP_GROUP(MAP_ROUTE123), MAP_NUM(MAP_ROUTE123), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_124] = {MAP_GROUP(MAP_ROUTE124), MAP_NUM(MAP_ROUTE124), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_125] = {MAP_GROUP(MAP_ROUTE125), MAP_NUM(MAP_ROUTE125), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_126] = {MAP_GROUP(MAP_ROUTE126), MAP_NUM(MAP_ROUTE126), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_127] = {MAP_GROUP(MAP_ROUTE127), MAP_NUM(MAP_ROUTE127), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_128] = {MAP_GROUP(MAP_ROUTE128), MAP_NUM(MAP_ROUTE128), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_129] = {MAP_GROUP(MAP_ROUTE129), MAP_NUM(MAP_ROUTE129), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_130] = {MAP_GROUP(MAP_ROUTE130), MAP_NUM(MAP_ROUTE130), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_131] = {MAP_GROUP(MAP_ROUTE131), MAP_NUM(MAP_ROUTE131), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_132] = {MAP_GROUP(MAP_ROUTE132), MAP_NUM(MAP_ROUTE132), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_133] = {MAP_GROUP(MAP_ROUTE133), MAP_NUM(MAP_ROUTE133), HEAL_LOCATION_NONE}, + [MAPSEC_ROUTE_134] = {MAP_GROUP(MAP_ROUTE134), MAP_NUM(MAP_ROUTE134), HEAL_LOCATION_NONE}, }; static const u8 *const sEverGrandeCityNames[] = @@ -976,10 +976,10 @@ static void InitMapBasedOnPlayerLocation(void) u16 xOnMap; struct WarpData *warp; - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SS_TIDAL_CORRIDOR) - && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_CORRIDOR) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_LOWER_DECK) - || gSaveBlock1Ptr->location.mapNum == MAP_NUM(SS_TIDAL_ROOMS))) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_SS_TIDAL_CORRIDOR) + && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SS_TIDAL_CORRIDOR) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SS_TIDAL_LOWER_DECK) + || gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SS_TIDAL_ROOMS))) { RegionMap_InitializeStateBasedOnSSTidalLocation(); return; diff --git a/src/roamer.c b/src/roamer.c index e9dc72a993..d5bba00e13 100644 --- a/src/roamer.c +++ b/src/roamer.c @@ -18,7 +18,7 @@ enum EWRAM_DATA static u8 sLocationHistory[3][2] = {0}; EWRAM_DATA static u8 sRoamerLocation[2] = {0}; -#define ___ MAP_NUM(UNDEFINED) // For empty spots in the location table +#define ___ MAP_NUM(MAP_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: @@ -34,26 +34,26 @@ EWRAM_DATA static u8 sRoamerLocation[2] = {0}; // from that map when it lands there. static const u8 sRoamerLocations[][6] = { - { MAP_NUM(ROUTE110), MAP_NUM(ROUTE111), MAP_NUM(ROUTE117), MAP_NUM(ROUTE118), MAP_NUM(ROUTE134), ___ }, - { MAP_NUM(ROUTE111), MAP_NUM(ROUTE110), MAP_NUM(ROUTE117), MAP_NUM(ROUTE118), ___, ___ }, - { MAP_NUM(ROUTE117), MAP_NUM(ROUTE111), MAP_NUM(ROUTE110), MAP_NUM(ROUTE118), ___, ___ }, - { MAP_NUM(ROUTE118), MAP_NUM(ROUTE117), MAP_NUM(ROUTE110), MAP_NUM(ROUTE111), MAP_NUM(ROUTE119), MAP_NUM(ROUTE123) }, - { MAP_NUM(ROUTE119), MAP_NUM(ROUTE118), MAP_NUM(ROUTE120), ___, ___, ___ }, - { MAP_NUM(ROUTE120), MAP_NUM(ROUTE119), MAP_NUM(ROUTE121), ___, ___, ___ }, - { MAP_NUM(ROUTE121), MAP_NUM(ROUTE120), MAP_NUM(ROUTE122), MAP_NUM(ROUTE123), ___, ___ }, - { MAP_NUM(ROUTE122), MAP_NUM(ROUTE121), MAP_NUM(ROUTE123), ___, ___, ___ }, - { MAP_NUM(ROUTE123), MAP_NUM(ROUTE122), MAP_NUM(ROUTE118), ___, ___, ___ }, - { MAP_NUM(ROUTE124), MAP_NUM(ROUTE121), MAP_NUM(ROUTE125), MAP_NUM(ROUTE126), ___, ___ }, - { MAP_NUM(ROUTE125), MAP_NUM(ROUTE124), MAP_NUM(ROUTE127), ___, ___, ___ }, - { MAP_NUM(ROUTE126), MAP_NUM(ROUTE124), MAP_NUM(ROUTE127), ___, ___, ___ }, - { MAP_NUM(ROUTE127), MAP_NUM(ROUTE125), MAP_NUM(ROUTE126), MAP_NUM(ROUTE128), ___, ___ }, - { MAP_NUM(ROUTE128), MAP_NUM(ROUTE127), MAP_NUM(ROUTE129), ___, ___, ___ }, - { MAP_NUM(ROUTE129), MAP_NUM(ROUTE128), MAP_NUM(ROUTE130), ___, ___, ___ }, - { MAP_NUM(ROUTE130), MAP_NUM(ROUTE129), MAP_NUM(ROUTE131), ___, ___, ___ }, - { MAP_NUM(ROUTE131), MAP_NUM(ROUTE130), MAP_NUM(ROUTE132), ___, ___, ___ }, - { MAP_NUM(ROUTE132), MAP_NUM(ROUTE131), MAP_NUM(ROUTE133), ___, ___, ___ }, - { MAP_NUM(ROUTE133), MAP_NUM(ROUTE132), MAP_NUM(ROUTE134), ___, ___, ___ }, - { MAP_NUM(ROUTE134), MAP_NUM(ROUTE133), MAP_NUM(ROUTE110), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE110), MAP_NUM(MAP_ROUTE111), MAP_NUM(MAP_ROUTE117), MAP_NUM(MAP_ROUTE118), MAP_NUM(MAP_ROUTE134), ___ }, + { MAP_NUM(MAP_ROUTE111), MAP_NUM(MAP_ROUTE110), MAP_NUM(MAP_ROUTE117), MAP_NUM(MAP_ROUTE118), ___, ___ }, + { MAP_NUM(MAP_ROUTE117), MAP_NUM(MAP_ROUTE111), MAP_NUM(MAP_ROUTE110), MAP_NUM(MAP_ROUTE118), ___, ___ }, + { MAP_NUM(MAP_ROUTE118), MAP_NUM(MAP_ROUTE117), MAP_NUM(MAP_ROUTE110), MAP_NUM(MAP_ROUTE111), MAP_NUM(MAP_ROUTE119), MAP_NUM(MAP_ROUTE123) }, + { MAP_NUM(MAP_ROUTE119), MAP_NUM(MAP_ROUTE118), MAP_NUM(MAP_ROUTE120), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE120), MAP_NUM(MAP_ROUTE119), MAP_NUM(MAP_ROUTE121), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE121), MAP_NUM(MAP_ROUTE120), MAP_NUM(MAP_ROUTE122), MAP_NUM(MAP_ROUTE123), ___, ___ }, + { MAP_NUM(MAP_ROUTE122), MAP_NUM(MAP_ROUTE121), MAP_NUM(MAP_ROUTE123), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE123), MAP_NUM(MAP_ROUTE122), MAP_NUM(MAP_ROUTE118), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE124), MAP_NUM(MAP_ROUTE121), MAP_NUM(MAP_ROUTE125), MAP_NUM(MAP_ROUTE126), ___, ___ }, + { MAP_NUM(MAP_ROUTE125), MAP_NUM(MAP_ROUTE124), MAP_NUM(MAP_ROUTE127), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE126), MAP_NUM(MAP_ROUTE124), MAP_NUM(MAP_ROUTE127), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE127), MAP_NUM(MAP_ROUTE125), MAP_NUM(MAP_ROUTE126), MAP_NUM(MAP_ROUTE128), ___, ___ }, + { MAP_NUM(MAP_ROUTE128), MAP_NUM(MAP_ROUTE127), MAP_NUM(MAP_ROUTE129), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE129), MAP_NUM(MAP_ROUTE128), MAP_NUM(MAP_ROUTE130), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE130), MAP_NUM(MAP_ROUTE129), MAP_NUM(MAP_ROUTE131), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE131), MAP_NUM(MAP_ROUTE130), MAP_NUM(MAP_ROUTE132), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE132), MAP_NUM(MAP_ROUTE131), MAP_NUM(MAP_ROUTE133), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE133), MAP_NUM(MAP_ROUTE132), MAP_NUM(MAP_ROUTE134), ___, ___, ___ }, + { MAP_NUM(MAP_ROUTE134), MAP_NUM(MAP_ROUTE133), MAP_NUM(MAP_ROUTE110), ___, ___, ___ }, { ___, ___, ___, ___, ___, ___ }, }; @@ -172,7 +172,7 @@ void RoamerMove(void) 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)) + && mapNum != MAP_NUM(MAP_UNDEFINED)) break; } sRoamerLocation[MAP_NUM] = mapNum; diff --git a/src/rotating_gate.c b/src/rotating_gate.c index 0b0c68a836..b248664db0 100644 --- a/src/rotating_gate.c +++ b/src/rotating_gate.c @@ -623,14 +623,14 @@ static EWRAM_DATA u8 sRotatingGate_PuzzleCount = 0; static s32 GetCurrentMapRotatingGatePuzzleType(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(FORTREE_CITY_GYM) && - gSaveBlock1Ptr->location.mapNum == MAP_NUM(FORTREE_CITY_GYM)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_FORTREE_CITY_GYM) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_FORTREE_CITY_GYM)) { return PUZZLE_FORTREE_CITY_GYM; } - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE110_TRICK_HOUSE_PUZZLE6) && - gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE110_TRICK_HOUSE_PUZZLE6)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE110_TRICK_HOUSE_PUZZLE6) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE110_TRICK_HOUSE_PUZZLE6)) { return PUZZLE_ROUTE110_TRICK_HOUSE_PUZZLE6; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 218be539f5..88c6ffefb7 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -786,7 +786,7 @@ bool8 ScrCmd_warphole(struct ScriptContext *ctx) u16 y; PlayerGetDestCoords(&x, &y); - if (mapGroup == MAP_GROUP(UNDEFINED) && mapNum == MAP_NUM(UNDEFINED)) + if (mapGroup == MAP_GROUP(MAP_UNDEFINED) && mapNum == MAP_NUM(MAP_UNDEFINED)) SetWarpDestinationToFixedHoleWarp(x - MAP_OFFSET, y - MAP_OFFSET); else SetWarpDestination(mapGroup, mapNum, WARP_ID_NONE, x - MAP_OFFSET, y - MAP_OFFSET); diff --git a/src/script.c b/src/script.c index c252c95f04..eb5dccb175 100644 --- a/src/script.c +++ b/src/script.c @@ -427,9 +427,9 @@ bool32 ValidateSavedRamScript(void) struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; if (scriptData->magic != RAM_SCRIPT_MAGIC) return FALSE; - if (scriptData->mapGroup != MAP_GROUP(UNDEFINED)) + if (scriptData->mapGroup != MAP_GROUP(MAP_UNDEFINED)) return FALSE; - if (scriptData->mapNum != MAP_NUM(UNDEFINED)) + if (scriptData->mapNum != MAP_NUM(MAP_UNDEFINED)) return FALSE; if (scriptData->objectId != NO_OBJECT) return FALSE; @@ -445,9 +445,9 @@ u8 *GetSavedRamScriptIfValid(void) return NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return NULL; - if (scriptData->mapGroup != MAP_GROUP(UNDEFINED)) + if (scriptData->mapGroup != MAP_GROUP(MAP_UNDEFINED)) return NULL; - if (scriptData->mapNum != MAP_NUM(UNDEFINED)) + if (scriptData->mapNum != MAP_NUM(MAP_UNDEFINED)) return NULL; if (scriptData->objectId != NO_OBJECT) return NULL; @@ -466,5 +466,5 @@ 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), NO_OBJECT); + InitRamScript(script, scriptSize, MAP_GROUP(MAP_UNDEFINED), MAP_NUM(MAP_UNDEFINED), NO_OBJECT); } diff --git a/src/secret_base.c b/src/secret_base.c index 9509cd0fc5..ec4550ce16 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -110,30 +110,30 @@ static const struct SecretBaseEntranceMetatiles sSecretBaseEntranceMetatiles[] = // x, y positions are for when the player warps in for the first time (in front of the computer) static const u8 sSecretBaseEntrancePositions[NUM_SECRET_BASE_GROUPS * 4] = { - [SECRET_BASE_RED_CAVE1] = MAP_NUM(SECRET_BASE_RED_CAVE1), 0, 1, 3, - [SECRET_BASE_RED_CAVE2] = MAP_NUM(SECRET_BASE_RED_CAVE2), 0, 5, 9, - [SECRET_BASE_RED_CAVE3] = MAP_NUM(SECRET_BASE_RED_CAVE3), 0, 1, 3, - [SECRET_BASE_RED_CAVE4] = MAP_NUM(SECRET_BASE_RED_CAVE4), 0, 7, 13, - [SECRET_BASE_BROWN_CAVE1] = MAP_NUM(SECRET_BASE_BROWN_CAVE1), 0, 2, 3, - [SECRET_BASE_BROWN_CAVE2] = MAP_NUM(SECRET_BASE_BROWN_CAVE2), 0, 9, 2, - [SECRET_BASE_BROWN_CAVE3] = MAP_NUM(SECRET_BASE_BROWN_CAVE3), 0, 13, 4, - [SECRET_BASE_BROWN_CAVE4] = MAP_NUM(SECRET_BASE_BROWN_CAVE4), 0, 1, 2, - [SECRET_BASE_BLUE_CAVE1] = MAP_NUM(SECRET_BASE_BLUE_CAVE1), 0, 1, 3, - [SECRET_BASE_BLUE_CAVE2] = MAP_NUM(SECRET_BASE_BLUE_CAVE2), 0, 1, 2, - [SECRET_BASE_BLUE_CAVE3] = MAP_NUM(SECRET_BASE_BLUE_CAVE3), 0, 3, 15, - [SECRET_BASE_BLUE_CAVE4] = MAP_NUM(SECRET_BASE_BLUE_CAVE4), 0, 3, 14, - [SECRET_BASE_YELLOW_CAVE1] = MAP_NUM(SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, - [SECRET_BASE_YELLOW_CAVE2] = MAP_NUM(SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, - [SECRET_BASE_YELLOW_CAVE3] = MAP_NUM(SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, - [SECRET_BASE_YELLOW_CAVE4] = MAP_NUM(SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, - [SECRET_BASE_TREE1] = MAP_NUM(SECRET_BASE_TREE1), 0, 2, 3, - [SECRET_BASE_TREE2] = MAP_NUM(SECRET_BASE_TREE2), 0, 5, 6, - [SECRET_BASE_TREE3] = MAP_NUM(SECRET_BASE_TREE3), 0, 15, 3, - [SECRET_BASE_TREE4] = MAP_NUM(SECRET_BASE_TREE4), 0, 4, 10, - [SECRET_BASE_SHRUB1] = MAP_NUM(SECRET_BASE_SHRUB1), 0, 3, 3, - [SECRET_BASE_SHRUB2] = MAP_NUM(SECRET_BASE_SHRUB2), 0, 1, 2, - [SECRET_BASE_SHRUB3] = MAP_NUM(SECRET_BASE_SHRUB3), 0, 7, 8, - [SECRET_BASE_SHRUB4] = MAP_NUM(SECRET_BASE_SHRUB4), 0, 9, 6, + [SECRET_BASE_RED_CAVE1] = MAP_NUM(MAP_SECRET_BASE_RED_CAVE1), 0, 1, 3, + [SECRET_BASE_RED_CAVE2] = MAP_NUM(MAP_SECRET_BASE_RED_CAVE2), 0, 5, 9, + [SECRET_BASE_RED_CAVE3] = MAP_NUM(MAP_SECRET_BASE_RED_CAVE3), 0, 1, 3, + [SECRET_BASE_RED_CAVE4] = MAP_NUM(MAP_SECRET_BASE_RED_CAVE4), 0, 7, 13, + [SECRET_BASE_BROWN_CAVE1] = MAP_NUM(MAP_SECRET_BASE_BROWN_CAVE1), 0, 2, 3, + [SECRET_BASE_BROWN_CAVE2] = MAP_NUM(MAP_SECRET_BASE_BROWN_CAVE2), 0, 9, 2, + [SECRET_BASE_BROWN_CAVE3] = MAP_NUM(MAP_SECRET_BASE_BROWN_CAVE3), 0, 13, 4, + [SECRET_BASE_BROWN_CAVE4] = MAP_NUM(MAP_SECRET_BASE_BROWN_CAVE4), 0, 1, 2, + [SECRET_BASE_BLUE_CAVE1] = MAP_NUM(MAP_SECRET_BASE_BLUE_CAVE1), 0, 1, 3, + [SECRET_BASE_BLUE_CAVE2] = MAP_NUM(MAP_SECRET_BASE_BLUE_CAVE2), 0, 1, 2, + [SECRET_BASE_BLUE_CAVE3] = MAP_NUM(MAP_SECRET_BASE_BLUE_CAVE3), 0, 3, 15, + [SECRET_BASE_BLUE_CAVE4] = MAP_NUM(MAP_SECRET_BASE_BLUE_CAVE4), 0, 3, 14, + [SECRET_BASE_YELLOW_CAVE1] = MAP_NUM(MAP_SECRET_BASE_YELLOW_CAVE1), 0, 9, 3, + [SECRET_BASE_YELLOW_CAVE2] = MAP_NUM(MAP_SECRET_BASE_YELLOW_CAVE2), 0, 8, 7, + [SECRET_BASE_YELLOW_CAVE3] = MAP_NUM(MAP_SECRET_BASE_YELLOW_CAVE3), 0, 3, 6, + [SECRET_BASE_YELLOW_CAVE4] = MAP_NUM(MAP_SECRET_BASE_YELLOW_CAVE4), 0, 5, 9, + [SECRET_BASE_TREE1] = MAP_NUM(MAP_SECRET_BASE_TREE1), 0, 2, 3, + [SECRET_BASE_TREE2] = MAP_NUM(MAP_SECRET_BASE_TREE2), 0, 5, 6, + [SECRET_BASE_TREE3] = MAP_NUM(MAP_SECRET_BASE_TREE3), 0, 15, 3, + [SECRET_BASE_TREE4] = MAP_NUM(MAP_SECRET_BASE_TREE4), 0, 4, 10, + [SECRET_BASE_SHRUB1] = MAP_NUM(MAP_SECRET_BASE_SHRUB1), 0, 3, 3, + [SECRET_BASE_SHRUB2] = MAP_NUM(MAP_SECRET_BASE_SHRUB2), 0, 1, 2, + [SECRET_BASE_SHRUB3] = MAP_NUM(MAP_SECRET_BASE_SHRUB3), 0, 7, 8, + [SECRET_BASE_SHRUB4] = MAP_NUM(MAP_SECRET_BASE_SHRUB4), 0, 9, 6, }; #define GET_BASE_MAP_NUM(group) (sSecretBaseEntrancePositions[(group) + 0]) @@ -412,7 +412,7 @@ void SetOccupiedSecretBaseEntranceMetatiles(struct MapEvents const *events) static void SetSecretBaseWarpDestination(void) { s8 secretBaseGroup = SECRET_BASE_ID_TO_GROUP(sCurSecretBaseId); - SetWarpDestinationToMapWarp(MAP_GROUP(SECRET_BASE_RED_CAVE1), GET_BASE_MAP_NUM(secretBaseGroup), GET_BASE_WARP_ID(secretBaseGroup)); + SetWarpDestinationToMapWarp(MAP_GROUP(MAP_SECRET_BASE_RED_CAVE1), GET_BASE_MAP_NUM(secretBaseGroup), GET_BASE_WARP_ID(secretBaseGroup)); } #define tState data[0] @@ -509,8 +509,8 @@ void EnterNewlyCreatedSecretBase(void) bool8 CurMapIsSecretBase(void) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SECRET_BASE_RED_CAVE1) - && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_NUM(SECRET_BASE_SHRUB4)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_SECRET_BASE_RED_CAVE1) + && (u8)gSaveBlock1Ptr->location.mapNum <= MAP_NUM(MAP_SECRET_BASE_SHRUB4)) return TRUE; else return FALSE; diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 018b9f14ba..8a03e8752a 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -259,10 +259,10 @@ static const struct ObjectEventTemplate sTrainerObjectEventTemplate = static const u32 sNextFloorMapNum[NUM_TRAINER_HILL_FLOORS] = { - [TRAINER_HILL_1F - 1] = MAP_NUM(TRAINER_HILL_2F), - [TRAINER_HILL_2F - 1] = MAP_NUM(TRAINER_HILL_3F), - [TRAINER_HILL_3F - 1] = MAP_NUM(TRAINER_HILL_4F), - [TRAINER_HILL_4F - 1] = MAP_NUM(TRAINER_HILL_ROOF) + [TRAINER_HILL_1F - 1] = MAP_NUM(MAP_TRAINER_HILL_2F), + [TRAINER_HILL_2F - 1] = MAP_NUM(MAP_TRAINER_HILL_3F), + [TRAINER_HILL_3F - 1] = MAP_NUM(MAP_TRAINER_HILL_4F), + [TRAINER_HILL_4F - 1] = MAP_NUM(MAP_TRAINER_HILL_ROOF) }; static const u8 sTrainerPartySlots[HILL_TRAINERS_PER_FLOOR][PARTY_SIZE / 2] = { @@ -783,7 +783,7 @@ static bool32 UNUSED OnTrainerHillRoof(void) const struct WarpEvent* SetWarpDestinationTrainerHill4F(void) { - const struct MapHeader *header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(TRAINER_HILL_4F), MAP_NUM(TRAINER_HILL_4F)); + const struct MapHeader *header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(MAP_TRAINER_HILL_4F), MAP_NUM(MAP_TRAINER_HILL_4F)); return &header->events->warps[1]; } @@ -802,7 +802,7 @@ const struct WarpEvent* SetWarpDestinationTrainerHillFinalFloor(u8 warpEventId) if (numFloors == 0 || numFloors > NUM_TRAINER_HILL_FLOORS) numFloors = NUM_TRAINER_HILL_FLOORS; - header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(TRAINER_HILL_4F), sNextFloorMapNum[numFloors - 1]); + header = Overworld_GetMapHeaderByGroupAndId(MAP_GROUP(MAP_TRAINER_HILL_4F), sNextFloorMapNum[numFloors - 1]); return &header->events->warps[0]; } diff --git a/src/tv.c b/src/tv.c index 0152dffa3e..8c70711dd2 100644 --- a/src/tv.c +++ b/src/tv.c @@ -199,31 +199,31 @@ static const struct { .species = SPECIES_SEEDOT, .moves = {MOVE_BIDE, MOVE_HARDEN, MOVE_LEECH_SEED}, .level = 3, - .location = MAP_NUM(ROUTE102) + .location = MAP_NUM(MAP_ROUTE102) }, { .species = SPECIES_NUZLEAF, .moves = {MOVE_HARDEN, MOVE_GROWTH, MOVE_NATURE_POWER, MOVE_LEECH_SEED}, .level = 15, - .location = MAP_NUM(ROUTE114), + .location = MAP_NUM(MAP_ROUTE114), }, { .species = SPECIES_SEEDOT, .moves = {MOVE_HARDEN, MOVE_GROWTH, MOVE_NATURE_POWER, MOVE_LEECH_SEED}, .level = 13, - .location = MAP_NUM(ROUTE117), + .location = MAP_NUM(MAP_ROUTE117), }, { .species = SPECIES_SEEDOT, .moves = {MOVE_GIGA_DRAIN, MOVE_FRUSTRATION, MOVE_SOLAR_BEAM, MOVE_LEECH_SEED}, .level = 25, - .location = MAP_NUM(ROUTE120), + .location = MAP_NUM(MAP_ROUTE120), }, { .species = SPECIES_SKITTY, .moves = {MOVE_GROWL, MOVE_TACKLE, MOVE_TAIL_WHIP, MOVE_ATTRACT}, .level = 8, - .location = MAP_NUM(ROUTE116), + .location = MAP_NUM(MAP_ROUTE116), } }; @@ -836,8 +836,8 @@ void UpdateTVScreensOnMap(int width, int height) break; // case PLAYERS_HOUSE_TV_NONE: default: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_COVE_LILY_MOTEL_1F) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_LILYCOVE_CITY_COVE_LILY_MOTEL_1F)) { // NPC in Lilycove Hotel is always watching TV SetTVMetatilesOnMap(width, height, METATILE_Building_TV_On); @@ -1503,8 +1503,8 @@ void TryPutSmartShopperOnAir(void) TVShow *show; u8 i; - if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(TRAINER_HILL_ENTRANCE)) - && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BATTLE_FRONTIER_MART)) + if (!(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_TRAINER_HILL_ENTRANCE) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_TRAINER_HILL_ENTRANCE)) + && !(gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_BATTLE_FRONTIER_MART) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_BATTLE_FRONTIER_MART)) && !rbernoulli(1, 3)) { sCurTVShowSlot = FindFirstEmptyRecordMixTVShowSlot(gSaveBlock1Ptr->tvShows); @@ -2678,14 +2678,14 @@ static bool8 ShouldApplyPokeNewsEffect(u8 newsKind) switch (newsKind) { case POKENEWS_SLATEPORT: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SLATEPORT_CITY) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SLATEPORT_CITY) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_SLATEPORT_CITY) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_SLATEPORT_CITY) && gSpecialVar_LastTalked == LOCALID_SLATEPORT_ENERGY_GURU) return TRUE; return FALSE; case POKENEWS_LILYCOVE: - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_LILYCOVE_CITY_DEPARTMENT_STORE_ROOFTOP)) return TRUE; return FALSE; } @@ -3357,18 +3357,18 @@ u32 GetPlayerIDAsU32(void) u8 CheckForPlayersHouseNews(void) { // Check if not in Littleroot house map group - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) return PLAYERS_HOUSE_TV_NONE; // Check if not in player's house (dependent on gender) if (gSaveBlock2Ptr->playerGender == MALE) { - if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) return PLAYERS_HOUSE_TV_NONE; } else { - if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapNum != MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F)) return PLAYERS_HOUSE_TV_NONE; } @@ -3384,11 +3384,11 @@ u8 CheckForPlayersHouseNews(void) void GetMomOrDadStringForTVMessage(void) { // If the player is checking the TV in their house it will only refer to their Mom. - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { if (gSaveBlock2Ptr->playerGender == MALE) { - if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); VarSet(VAR_TEMP_3, 1); @@ -3396,7 +3396,7 @@ void GetMomOrDadStringForTVMessage(void) } else { - if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(LITTLEROOT_TOWN_MAYS_HOUSE_1F)) + if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_1F)) { StringCopy(gStringVar1, gText_Mom); VarSet(VAR_TEMP_3, 1); diff --git a/src/union_room.c b/src/union_room.c index 1b29863183..ce594d8164 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1672,7 +1672,7 @@ static void Task_StartActivity(u8 taskId) HealPlayerParty(); SavePlayerParty(); LoadPlayerBag(); - WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); + WarpForCableClubActivity(MAP_GROUP(MAP_BATTLE_COLOSSEUM_2P), MAP_NUM(MAP_BATTLE_COLOSSEUM_2P), 6, 8, USING_SINGLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_DOUBLE: @@ -1681,7 +1681,7 @@ static void Task_StartActivity(u8 taskId) SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); - WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_2P), MAP_NUM(BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); + WarpForCableClubActivity(MAP_GROUP(MAP_BATTLE_COLOSSEUM_2P), MAP_NUM(MAP_BATTLE_COLOSSEUM_2P), 6, 8, USING_DOUBLE_BATTLE); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_BATTLE_MULTI: @@ -1690,19 +1690,19 @@ static void Task_StartActivity(u8 taskId) SavePlayerParty(); LoadPlayerBag(); CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); - WarpForCableClubActivity(MAP_GROUP(BATTLE_COLOSSEUM_4P), MAP_NUM(BATTLE_COLOSSEUM_4P), 5, 8, USING_MULTI_BATTLE); + WarpForCableClubActivity(MAP_GROUP(MAP_BATTLE_COLOSSEUM_4P), MAP_NUM(MAP_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); + WarpForCableClubActivity(MAP_GROUP(MAP_TRADE_CENTER), MAP_NUM(MAP_TRADE_CENTER), 5, 8, USING_TRADE_CENTER); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_RECORD_CORNER: CreateTrainerCardInBuffer(gBlockSendBuffer, TRUE); CleanupOverworldWindowsAndTilemaps(); - WarpForCableClubActivity(MAP_GROUP(RECORD_CORNER), MAP_NUM(RECORD_CORNER), 8, 9, USING_RECORD_CORNER); + WarpForCableClubActivity(MAP_GROUP(MAP_RECORD_CORNER), MAP_NUM(MAP_RECORD_CORNER), 8, 9, USING_RECORD_CORNER); SetMainCallback2(CB2_TransitionToCableClub); break; case ACTIVITY_TRADE | IN_UNION_ROOM: @@ -4306,8 +4306,8 @@ static bool32 PollPartnerYesNoResponse(struct WirelessLink_URoom *data) bool32 InUnionRoom(void) { - return gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(UNION_ROOM) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(UNION_ROOM) + return gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_UNION_ROOM) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_UNION_ROOM) ? TRUE : FALSE; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 11d01f04ea..9c74dfe965 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -118,8 +118,8 @@ static bool8 CheckFeebas(void) u8 route119Section = 0; u16 spotId; - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE119) - && gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE119)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ROUTE119) + && gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ROUTE119)) { GetXYCoordsOneStepInFrontOfPlayer(&x, &y); x -= MAP_OFFSET; @@ -309,14 +309,14 @@ static u16 GetCurrentMapWildMonHeaderId(void) for (i = 0; ; i++) { const struct WildPokemonHeader *wildHeader = &gWildMonHeaders[i]; - if (wildHeader->mapGroup == MAP_GROUP(UNDEFINED)) + if (wildHeader->mapGroup == MAP_GROUP(MAP_UNDEFINED)) break; if (gWildMonHeaders[i].mapGroup == gSaveBlock1Ptr->location.mapGroup && gWildMonHeaders[i].mapNum == gSaveBlock1Ptr->location.mapNum) { - if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ALTERING_CAVE) && - gSaveBlock1Ptr->location.mapNum == MAP_NUM(ALTERING_CAVE)) + if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(MAP_ALTERING_CAVE) && + gSaveBlock1Ptr->location.mapNum == MAP_NUM(MAP_ALTERING_CAVE)) { u16 alteringCaveId = VarGet(VAR_ALTERING_CAVE_WILD_SET); if (alteringCaveId >= NUM_ALTERING_CAVE_TABLES) @@ -540,8 +540,8 @@ static bool8 AllowWildCheckOnNewMetatile(void) static bool8 AreLegendariesInSootopolisPreventingEncounters(void) { - if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(SOOTOPOLIS_CITY) - || gSaveBlock1Ptr->location.mapNum != MAP_NUM(SOOTOPOLIS_CITY)) + if (gSaveBlock1Ptr->location.mapGroup != MAP_GROUP(MAP_SOOTOPOLIS_CITY) + || gSaveBlock1Ptr->location.mapNum != MAP_NUM(MAP_SOOTOPOLIS_CITY)) { return FALSE; } diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc new file mode 100755 index 0000000000000000000000000000000000000000..7b1d0ff3bfe9d52ced41a8ad32325d3f0d9fa52f GIT binary patch literal 43472 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 RIys%*D?h(;@$1gQ{|BeBG+h7y literal 0 HcmV?d00001 From 113226b03ad745183299dae1833f2a773b927cef Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Tue, 27 Aug 2024 21:45:09 -0700 Subject: [PATCH 002/187] Change metatile behaviors to enum (#2027) --- include/constants/metatile_behaviors.h | 487 +++++++++++++------------ 1 file changed, 244 insertions(+), 243 deletions(-) diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index 1f6d4e87cb..c5238e48ed 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -1,249 +1,250 @@ #ifndef GUARD_METATILE_BEHAVIORS_H #define GUARD_METATILE_BEHAVIORS_H -#define MB_NORMAL 0x00 -#define MB_SECRET_BASE_WALL 0x01 -#define MB_TALL_GRASS 0x02 -#define MB_LONG_GRASS 0x03 -#define MB_UNUSED_04 0x04 -#define MB_UNUSED_05 0x05 -#define MB_DEEP_SAND 0x06 -#define MB_SHORT_GRASS 0x07 -#define MB_CAVE 0x08 -#define MB_LONG_GRASS_SOUTH_EDGE 0x09 -#define MB_NO_RUNNING 0x0A -#define MB_INDOOR_ENCOUNTER 0x0B -#define MB_MOUNTAIN_TOP 0x0C -#define MB_BATTLE_PYRAMID_WARP 0x0D -#define MB_MOSSDEEP_GYM_WARP 0x0E -#define MB_MT_PYRE_HOLE 0x0F -#define MB_POND_WATER 0x10 -#define MB_INTERIOR_DEEP_WATER 0x11 // Used by interior maps; functionally the same as MB_DEEP_WATER -#define MB_DEEP_WATER 0x12 -#define MB_WATERFALL 0x13 -#define MB_SOOTOPOLIS_DEEP_WATER 0x14 -#define MB_OCEAN_WATER 0x15 -#define MB_PUDDLE 0x16 -#define MB_SHALLOW_WATER 0x17 -#define MB_UNUSED_SOOTOPOLIS_DEEP_WATER 0x18 -#define MB_NO_SURFACING 0x19 -#define MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2 0x1A -#define MB_STAIRS_OUTSIDE_ABANDONED_SHIP 0x1B -#define MB_SHOAL_CAVE_ENTRANCE 0x1C -#define MB_UNUSED_1D 0x1D -#define MB_UNUSED_1E 0x1E -#define MB_UNUSED_1F 0x1F -#define MB_ICE 0x20 -#define MB_SAND 0x21 -#define MB_SEAWEED 0x22 -#define MB_UNUSED_23 0x23 -#define MB_ASHGRASS 0x24 -#define MB_FOOTPRINTS 0x25 -#define MB_THIN_ICE 0x26 -#define MB_CRACKED_ICE 0x27 -#define MB_HOT_SPRINGS 0x28 -#define MB_LAVARIDGE_GYM_B1F_WARP 0x29 -#define MB_SEAWEED_NO_SURFACING 0x2A -#define MB_REFLECTION_UNDER_BRIDGE 0x2B -#define MB_UNUSED_2C 0x2C -#define MB_UNUSED_2D 0x2D -#define MB_UNUSED_2E 0x2E -#define MB_UNUSED_2F 0x2F -#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_JUMP_NORTHEAST 0x3C -#define MB_JUMP_NORTHWEST 0x3D -#define MB_JUMP_SOUTHEAST 0x3E -#define MB_JUMP_SOUTHWEST 0x3F -#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_UNUSED_49 0x49 -#define MB_UNUSED_4A 0x4A -#define MB_UNUSED_4B 0x4B -#define MB_UNUSED_4C 0x4C -#define MB_UNUSED_4D 0x4D -#define MB_UNUSED_4E 0x4E -#define MB_UNUSED_4F 0x4F -#define MB_EASTWARD_CURRENT 0x50 -#define MB_WESTWARD_CURRENT 0x51 -#define MB_NORTHWARD_CURRENT 0x52 -#define MB_SOUTHWARD_CURRENT 0x53 -#define MB_UNUSED_54 0x54 -#define MB_UNUSED_55 0x55 -#define MB_UNUSED_56 0x56 -#define MB_UNUSED_57 0x57 -#define MB_UNUSED_58 0x58 -#define MB_UNUSED_59 0x59 -#define MB_UNUSED_5A 0x5A -#define MB_UNUSED_5B 0x5B -#define MB_UNUSED_5C 0x5C -#define MB_UNUSED_5D 0x5D -#define MB_UNUSED_5E 0x5E -#define MB_UNUSED_5F 0x5F -#define MB_NON_ANIMATED_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_CRACKED_FLOOR_HOLE 0x66 -#define MB_AQUA_HIDEOUT_WARP 0x67 -#define MB_LAVARIDGE_GYM_1F_WARP 0x68 -#define MB_ANIMATED_DOOR 0x69 -#define MB_UP_ESCALATOR 0x6A -#define MB_DOWN_ESCALATOR 0x6B -#define MB_WATER_DOOR 0x6C -#define MB_WATER_SOUTH_ARROW_WARP 0x6D -#define MB_DEEP_SOUTH_WARP 0x6E -#define MB_UNUSED_6F 0x6F -#define MB_BRIDGE_OVER_OCEAN 0x70 -#define MB_BRIDGE_OVER_POND_LOW 0x71 -#define MB_BRIDGE_OVER_POND_MED 0x72 -#define MB_BRIDGE_OVER_POND_HIGH 0x73 -#define MB_PACIFIDLOG_VERTICAL_LOG_TOP 0x74 -#define MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM 0x75 -#define MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT 0x76 -#define MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT 0x77 -#define MB_FORTREE_BRIDGE 0x78 -#define MB_UNUSED_79 0x79 -#define MB_BRIDGE_OVER_POND_MED_EDGE_1 0x7A -#define MB_BRIDGE_OVER_POND_MED_EDGE_2 0x7B -#define MB_BRIDGE_OVER_POND_HIGH_EDGE_1 0x7C -#define MB_BRIDGE_OVER_POND_HIGH_EDGE_2 0x7D -#define MB_UNUSED_BRIDGE 0x7E -#define MB_BIKE_BRIDGE_OVER_BARRIER 0x7F -#define MB_COUNTER 0x80 -#define MB_UNUSED_81 0x81 -#define MB_UNUSED_82 0x82 -#define MB_PC 0x83 -#define MB_CABLE_BOX_RESULTS_1 0x84 -#define MB_REGION_MAP 0x85 -#define MB_TELEVISION 0x86 -#define MB_POKEBLOCK_FEEDER 0x87 -#define MB_UNUSED_88 0x88 -#define MB_SLOT_MACHINE 0x89 -#define MB_ROULETTE 0x8A -#define MB_CLOSED_SOOTOPOLIS_DOOR 0x8B -#define MB_TRICK_HOUSE_PUZZLE_DOOR 0x8C -#define MB_PETALBURG_GYM_DOOR 0x8D -#define MB_RUNNING_SHOES_INSTRUCTION 0x8E -#define MB_QUESTIONNAIRE 0x8F -#define MB_SECRET_BASE_SPOT_RED_CAVE 0x90 -#define MB_SECRET_BASE_SPOT_RED_CAVE_OPEN 0x91 -#define MB_SECRET_BASE_SPOT_BROWN_CAVE 0x92 -#define MB_SECRET_BASE_SPOT_BROWN_CAVE_OPEN 0x93 -#define MB_SECRET_BASE_SPOT_YELLOW_CAVE 0x94 -#define MB_SECRET_BASE_SPOT_YELLOW_CAVE_OPEN 0x95 -#define MB_SECRET_BASE_SPOT_TREE_LEFT 0x96 -#define MB_SECRET_BASE_SPOT_TREE_LEFT_OPEN 0x97 -#define MB_SECRET_BASE_SPOT_SHRUB 0x98 -#define MB_SECRET_BASE_SPOT_SHRUB_OPEN 0x99 -#define MB_SECRET_BASE_SPOT_BLUE_CAVE 0x9A -#define MB_SECRET_BASE_SPOT_BLUE_CAVE_OPEN 0x9B -#define MB_SECRET_BASE_SPOT_TREE_RIGHT 0x9C -#define MB_SECRET_BASE_SPOT_TREE_RIGHT_OPEN 0x9D -#define MB_UNUSED_9E 0x9E -#define MB_UNUSED_9F 0x9F -#define MB_BERRY_TREE_SOIL 0xA0 -#define MB_UNUSED_A1 0xA1 -#define MB_UNUSED_A2 0xA2 -#define MB_UNUSED_A3 0xA3 -#define MB_UNUSED_A4 0xA4 -#define MB_UNUSED_A5 0xA5 -#define MB_UNUSED_A6 0xA6 -#define MB_UNUSED_A7 0xA7 -#define MB_UNUSED_A8 0xA8 -#define MB_UNUSED_A9 0xA9 -#define MB_UNUSED_AA 0xAA -#define MB_UNUSED_AB 0xAB -#define MB_UNUSED_AC 0xAC -#define MB_UNUSED_AD 0xAD -#define MB_UNUSED_AE 0xAE -#define MB_UNUSED_AF 0xAF -#define MB_SECRET_BASE_PC 0xB0 -#define MB_SECRET_BASE_REGISTER_PC 0xB1 -#define MB_SECRET_BASE_SCENERY 0xB2 -#define MB_SECRET_BASE_TRAINER_SPOT 0xB3 -#define MB_SECRET_BASE_DECORATION 0xB4 -#define MB_HOLDS_SMALL_DECORATION 0xB5 -#define MB_UNUSED_B6 0xB6 -#define MB_SECRET_BASE_NORTH_WALL 0xB7 -#define MB_SECRET_BASE_BALLOON 0xB8 -#define MB_SECRET_BASE_IMPASSABLE 0xB9 -#define MB_SECRET_BASE_GLITTER_MAT 0xBA -#define MB_SECRET_BASE_JUMP_MAT 0xBB -#define MB_SECRET_BASE_SPIN_MAT 0xBC -#define MB_SECRET_BASE_SOUND_MAT 0xBD -#define MB_SECRET_BASE_BREAKABLE_DOOR 0xBE -#define MB_SECRET_BASE_SAND_ORNAMENT 0xBF -#define MB_IMPASSABLE_SOUTH_AND_NORTH 0xC0 -#define MB_IMPASSABLE_WEST_AND_EAST 0xC1 -#define MB_SECRET_BASE_HOLE 0xC2 -#define MB_HOLDS_LARGE_DECORATION 0xC3 -#define MB_SECRET_BASE_TV_SHIELD 0xC4 -#define MB_PLAYER_ROOM_PC_ON 0xC5 -#define MB_SECRET_BASE_DECORATION_BASE 0xC6 -#define MB_SECRET_BASE_POSTER 0xC7 -#define MB_UNUSED_C8 0xC8 -#define MB_UNUSED_C9 0xC9 -#define MB_UNUSED_CA 0xCA -#define MB_UNUSED_CB 0xCB -#define MB_UNUSED_CC 0xCC -#define MB_UNUSED_CD 0xCD -#define MB_UNUSED_CE 0xCE -#define MB_UNUSED_CF 0xCF -#define MB_MUDDY_SLOPE 0xD0 -#define MB_BUMPY_SLOPE 0xD1 -#define MB_CRACKED_FLOOR 0xD2 -#define MB_ISOLATED_VERTICAL_RAIL 0xD3 -#define MB_ISOLATED_HORIZONTAL_RAIL 0xD4 -#define MB_VERTICAL_RAIL 0xD5 -#define MB_HORIZONTAL_RAIL 0xD6 -#define MB_UNUSED_D7 0xD7 -#define MB_UNUSED_D8 0xD8 -#define MB_UNUSED_D9 0xD9 -#define MB_UNUSED_DA 0xDA -#define MB_UNUSED_DB 0xDB -#define MB_UNUSED_DC 0xDC -#define MB_UNUSED_DD 0xDD -#define MB_UNUSED_DE 0xDE -#define MB_UNUSED_DF 0xDF -#define MB_PICTURE_BOOK_SHELF 0xE0 -#define MB_BOOKSHELF 0xE1 -#define MB_POKEMON_CENTER_BOOKSHELF 0xE2 -#define MB_VASE 0xE3 -#define MB_TRASH_CAN 0xE4 -#define MB_SHOP_SHELF 0xE5 -#define MB_BLUEPRINT 0xE6 -#define MB_CABLE_BOX_RESULTS_2 0xE7 -#define MB_WIRELESS_BOX_RESULTS 0xE8 -#define MB_TRAINER_HILL_TIMER 0xE9 -#define MB_SKY_PILLAR_CLOSED_DOOR 0xEA -#define MB_UNUSED_EB 0xEB -#define MB_UNUSED_EC 0xEC -#define MB_UNUSED_ED 0xED -#define MB_UNUSED_EE 0xEE -#define MB_UNUSED_EF 0xEF +enum { + MB_NORMAL, + MB_SECRET_BASE_WALL, + MB_TALL_GRASS, + MB_LONG_GRASS, + MB_UNUSED_04, + MB_UNUSED_05, + MB_DEEP_SAND, + MB_SHORT_GRASS, + MB_CAVE, + MB_LONG_GRASS_SOUTH_EDGE, + MB_NO_RUNNING, + MB_INDOOR_ENCOUNTER, + MB_MOUNTAIN_TOP, + MB_BATTLE_PYRAMID_WARP, + MB_MOSSDEEP_GYM_WARP, + MB_MT_PYRE_HOLE, + MB_POND_WATER, + MB_INTERIOR_DEEP_WATER, // Used by interior maps; functionally the same as MB_DEEP_WATER + MB_DEEP_WATER, + MB_WATERFALL, + MB_SOOTOPOLIS_DEEP_WATER, + MB_OCEAN_WATER, + MB_PUDDLE, + MB_SHALLOW_WATER, + MB_UNUSED_SOOTOPOLIS_DEEP_WATER, + MB_NO_SURFACING, + MB_UNUSED_SOOTOPOLIS_DEEP_WATER_2, + MB_STAIRS_OUTSIDE_ABANDONED_SHIP, + MB_SHOAL_CAVE_ENTRANCE, + MB_UNUSED_1D, + MB_UNUSED_1E, + MB_UNUSED_1F, + MB_ICE, + MB_SAND, + MB_SEAWEED, + MB_UNUSED_23, + MB_ASHGRASS, + MB_FOOTPRINTS, + MB_THIN_ICE, + MB_CRACKED_ICE, + MB_HOT_SPRINGS, + MB_LAVARIDGE_GYM_B1F_WARP, + MB_SEAWEED_NO_SURFACING, + MB_REFLECTION_UNDER_BRIDGE, + MB_UNUSED_2C, + MB_UNUSED_2D, + MB_UNUSED_2E, + MB_UNUSED_2F, + MB_IMPASSABLE_EAST, + MB_IMPASSABLE_WEST, + MB_IMPASSABLE_NORTH, + MB_IMPASSABLE_SOUTH, + MB_IMPASSABLE_NORTHEAST, + MB_IMPASSABLE_NORTHWEST, + MB_IMPASSABLE_SOUTHEAST, + MB_IMPASSABLE_SOUTHWEST, + MB_JUMP_EAST, + MB_JUMP_WEST, + MB_JUMP_NORTH, + MB_JUMP_SOUTH, + MB_JUMP_NORTHEAST, + MB_JUMP_NORTHWEST, + MB_JUMP_SOUTHEAST, + MB_JUMP_SOUTHWEST, + MB_WALK_EAST, + MB_WALK_WEST, + MB_WALK_NORTH, + MB_WALK_SOUTH, + MB_SLIDE_EAST, + MB_SLIDE_WEST, + MB_SLIDE_NORTH, + MB_SLIDE_SOUTH, + MB_TRICK_HOUSE_PUZZLE_8_FLOOR, + MB_UNUSED_49, + MB_UNUSED_4A, + MB_UNUSED_4B, + MB_UNUSED_4C, + MB_UNUSED_4D, + MB_UNUSED_4E, + MB_UNUSED_4F, + MB_EASTWARD_CURRENT, + MB_WESTWARD_CURRENT, + MB_NORTHWARD_CURRENT, + MB_SOUTHWARD_CURRENT, + MB_UNUSED_54, + MB_UNUSED_55, + MB_UNUSED_56, + MB_UNUSED_57, + MB_UNUSED_58, + MB_UNUSED_59, + MB_UNUSED_5A, + MB_UNUSED_5B, + MB_UNUSED_5C, + MB_UNUSED_5D, + MB_UNUSED_5E, + MB_UNUSED_5F, + MB_NON_ANIMATED_DOOR, + MB_LADDER, + MB_EAST_ARROW_WARP, + MB_WEST_ARROW_WARP, + MB_NORTH_ARROW_WARP, + MB_SOUTH_ARROW_WARP, + MB_CRACKED_FLOOR_HOLE, + MB_AQUA_HIDEOUT_WARP, + MB_LAVARIDGE_GYM_1F_WARP, + MB_ANIMATED_DOOR, + MB_UP_ESCALATOR, + MB_DOWN_ESCALATOR, + MB_WATER_DOOR, + MB_WATER_SOUTH_ARROW_WARP, + MB_DEEP_SOUTH_WARP, + MB_UNUSED_6F, + MB_BRIDGE_OVER_OCEAN, + MB_BRIDGE_OVER_POND_LOW, + MB_BRIDGE_OVER_POND_MED, + MB_BRIDGE_OVER_POND_HIGH, + MB_PACIFIDLOG_VERTICAL_LOG_TOP, + MB_PACIFIDLOG_VERTICAL_LOG_BOTTOM, + MB_PACIFIDLOG_HORIZONTAL_LOG_LEFT, + MB_PACIFIDLOG_HORIZONTAL_LOG_RIGHT, + MB_FORTREE_BRIDGE, + MB_UNUSED_79, + MB_BRIDGE_OVER_POND_MED_EDGE_1, + MB_BRIDGE_OVER_POND_MED_EDGE_2, + MB_BRIDGE_OVER_POND_HIGH_EDGE_1, + MB_BRIDGE_OVER_POND_HIGH_EDGE_2, + MB_UNUSED_BRIDGE, + MB_BIKE_BRIDGE_OVER_BARRIER, + MB_COUNTER, + MB_UNUSED_81, + MB_UNUSED_82, + MB_PC, + MB_CABLE_BOX_RESULTS_1, + MB_REGION_MAP, + MB_TELEVISION, + MB_POKEBLOCK_FEEDER, + MB_UNUSED_88, + MB_SLOT_MACHINE, + MB_ROULETTE, + MB_CLOSED_SOOTOPOLIS_DOOR, + MB_TRICK_HOUSE_PUZZLE_DOOR, + MB_PETALBURG_GYM_DOOR, + MB_RUNNING_SHOES_INSTRUCTION, + MB_QUESTIONNAIRE, + MB_SECRET_BASE_SPOT_RED_CAVE, + MB_SECRET_BASE_SPOT_RED_CAVE_OPEN, + MB_SECRET_BASE_SPOT_BROWN_CAVE, + MB_SECRET_BASE_SPOT_BROWN_CAVE_OPEN, + MB_SECRET_BASE_SPOT_YELLOW_CAVE, + MB_SECRET_BASE_SPOT_YELLOW_CAVE_OPEN, + MB_SECRET_BASE_SPOT_TREE_LEFT, + MB_SECRET_BASE_SPOT_TREE_LEFT_OPEN, + MB_SECRET_BASE_SPOT_SHRUB, + MB_SECRET_BASE_SPOT_SHRUB_OPEN, + MB_SECRET_BASE_SPOT_BLUE_CAVE, + MB_SECRET_BASE_SPOT_BLUE_CAVE_OPEN, + MB_SECRET_BASE_SPOT_TREE_RIGHT, + MB_SECRET_BASE_SPOT_TREE_RIGHT_OPEN, + MB_UNUSED_9E, + MB_UNUSED_9F, + MB_BERRY_TREE_SOIL, + MB_UNUSED_A1, + MB_UNUSED_A2, + MB_UNUSED_A3, + MB_UNUSED_A4, + MB_UNUSED_A5, + MB_UNUSED_A6, + MB_UNUSED_A7, + MB_UNUSED_A8, + MB_UNUSED_A9, + MB_UNUSED_AA, + MB_UNUSED_AB, + MB_UNUSED_AC, + MB_UNUSED_AD, + MB_UNUSED_AE, + MB_UNUSED_AF, + MB_SECRET_BASE_PC, + MB_SECRET_BASE_REGISTER_PC, + MB_SECRET_BASE_SCENERY, + MB_SECRET_BASE_TRAINER_SPOT, + MB_SECRET_BASE_DECORATION, + MB_HOLDS_SMALL_DECORATION, + MB_UNUSED_B6, + MB_SECRET_BASE_NORTH_WALL, + MB_SECRET_BASE_BALLOON, + MB_SECRET_BASE_IMPASSABLE, + MB_SECRET_BASE_GLITTER_MAT, + MB_SECRET_BASE_JUMP_MAT, + MB_SECRET_BASE_SPIN_MAT, + MB_SECRET_BASE_SOUND_MAT, + MB_SECRET_BASE_BREAKABLE_DOOR, + MB_SECRET_BASE_SAND_ORNAMENT, + MB_IMPASSABLE_SOUTH_AND_NORTH, + MB_IMPASSABLE_WEST_AND_EAST, + MB_SECRET_BASE_HOLE, + MB_HOLDS_LARGE_DECORATION, + MB_SECRET_BASE_TV_SHIELD, + MB_PLAYER_ROOM_PC_ON, + MB_SECRET_BASE_DECORATION_BASE, + MB_SECRET_BASE_POSTER, + MB_UNUSED_C8, + MB_UNUSED_C9, + MB_UNUSED_CA, + MB_UNUSED_CB, + MB_UNUSED_CC, + MB_UNUSED_CD, + MB_UNUSED_CE, + MB_UNUSED_CF, + MB_MUDDY_SLOPE, + MB_BUMPY_SLOPE, + MB_CRACKED_FLOOR, + MB_ISOLATED_VERTICAL_RAIL, + MB_ISOLATED_HORIZONTAL_RAIL, + MB_VERTICAL_RAIL, + MB_HORIZONTAL_RAIL, + MB_UNUSED_D7, + MB_UNUSED_D8, + MB_UNUSED_D9, + MB_UNUSED_DA, + MB_UNUSED_DB, + MB_UNUSED_DC, + MB_UNUSED_DD, + MB_UNUSED_DE, + MB_UNUSED_DF, + MB_PICTURE_BOOK_SHELF, + MB_BOOKSHELF, + MB_POKEMON_CENTER_BOOKSHELF, + MB_VASE, + MB_TRASH_CAN, + MB_SHOP_SHELF, + MB_BLUEPRINT, + MB_CABLE_BOX_RESULTS_2, + MB_WIRELESS_BOX_RESULTS, + MB_TRAINER_HILL_TIMER, + MB_SKY_PILLAR_CLOSED_DOOR, + MB_UP_RIGHT_STAIR_WARP, + MB_UP_LEFT_STAIR_WARP, + MB_DOWN_RIGHT_STAIR_WARP, + MB_DOWN_LEFT_STAIR_WARP, + MB_UNUSED_EF, + NUM_METATILE_BEHAVIORS +}; -#define NUM_METATILE_BEHAVIORS 0xF0 - -#define MB_INVALID 0xFF +#define MB_INVALID UCHAR_MAX #endif // GUARD_METATILE_BEHAVIORS_H From 7532f8ddb8580c4ae7f1936c5c0786b137f3d7a1 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 28 Aug 2024 11:19:27 -0400 Subject: [PATCH 003/187] Revert MB name changes --- include/constants/metatile_behaviors.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/constants/metatile_behaviors.h b/include/constants/metatile_behaviors.h index c5238e48ed..4a11795ea9 100755 --- a/include/constants/metatile_behaviors.h +++ b/include/constants/metatile_behaviors.h @@ -237,10 +237,10 @@ enum { MB_WIRELESS_BOX_RESULTS, MB_TRAINER_HILL_TIMER, MB_SKY_PILLAR_CLOSED_DOOR, - MB_UP_RIGHT_STAIR_WARP, - MB_UP_LEFT_STAIR_WARP, - MB_DOWN_RIGHT_STAIR_WARP, - MB_DOWN_LEFT_STAIR_WARP, + MB_UNUSED_EB, + MB_UNUSED_EC, + MB_UNUSED_ED, + MB_UNUSED_EE, MB_UNUSED_EF, NUM_METATILE_BEHAVIORS }; From 49735754c3caea411eb88411952fc81267f4fbf8 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 19 Sep 2024 11:23:33 +0200 Subject: [PATCH 004/187] Remove accidental expansion leftovers --- src/data/map_group_count.h | 1 - tools/trainerproc/trainerproc | Bin 43472 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 src/data/map_group_count.h delete mode 100755 tools/trainerproc/trainerproc diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h deleted file mode 100644 index 4fe8a21b3b..0000000000 --- a/src/data/map_group_count.h +++ /dev/null @@ -1 +0,0 @@ -static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc deleted file mode 100755 index 7b1d0ff3bfe9d52ced41a8ad32325d3f0d9fa52f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43472 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 RIys%*D?h(;@$1gQ{|BeBG+h7y From cafeb3fa923985c0957ae7abaf85b38b21df2ba6 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 19 Sep 2024 11:27:02 +0200 Subject: [PATCH 005/187] Update wild encounters json template --- src/data/wild_encounters.json.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data/wild_encounters.json.txt b/src/data/wild_encounters.json.txt index 74f9168b5e..38df4dc712 100755 --- a/src/data/wild_encounters.json.txt +++ b/src/data/wild_encounters.json.txt @@ -70,8 +70,8 @@ const struct WildPokemonHeader {{ wild_encounter_group.label }}[] = { ## for encounter in wild_encounter_group.encounters { - .mapGroup = {% if wild_encounter_group.for_maps %}MAP_GROUP(MAP_{{ removePrefix(encounter.map, "MAP_") }}){% else %}0{% endif %}, - .mapNum = {% if wild_encounter_group.for_maps %}MAP_NUM(MAP_{{ removePrefix(encounter.map, "MAP_") }}){% else %}{{ loop.index1 }}{% endif %}, + .mapGroup = {% if wild_encounter_group.for_maps %}MAP_GROUP({{ encounter.map }}){% else %}0{% endif %}, + .mapNum = {% if wild_encounter_group.for_maps %}MAP_NUM({{ encounter.map }}){% else %}{{ loop.index1 }}{% endif %}, .landMonsInfo = {% if existsIn(encounter, "land_mons") %}&{{ encounter.base_label }}_LandMonsInfo{% else %}NULL{% endif %}, .waterMonsInfo = {% if existsIn(encounter, "water_mons") %}&{{ encounter.base_label }}_WaterMonsInfo{% else %}NULL{% endif %}, .rockSmashMonsInfo = {% if existsIn(encounter, "rock_smash_mons") %}&{{ encounter.base_label }}_RockSmashMonsInfo{% else %}NULL{% endif %}, From 091b7269df4cf232d81f5d3fecf8f7775ea1f181 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 11 Oct 2024 15:15:55 -0400 Subject: [PATCH 006/187] Move heal locations data to their associated map.json (#2034) --- data/maps/BattleFrontier_OutsideEast/map.json | 7 ++ data/maps/DewfordTown/map.json | 7 ++ data/maps/EverGrandeCity/map.json | 12 +++ data/maps/FallarborTown/map.json | 7 ++ data/maps/FortreeCity/map.json | 7 ++ data/maps/LavaridgeTown/map.json | 7 ++ data/maps/LilycoveCity/map.json | 7 ++ data/maps/LittlerootTown/map.json | 12 +++ .../LittlerootTown_BrendansHouse_2F/map.json | 7 ++ .../maps/LittlerootTown_MaysHouse_2F/map.json | 7 ++ data/maps/MauvilleCity/map.json | 7 ++ data/maps/MossdeepCity/map.json | 7 ++ data/maps/OldaleTown/map.json | 7 ++ data/maps/PacifidlogTown/map.json | 7 ++ data/maps/PetalburgCity/map.json | 7 ++ data/maps/RustboroCity/map.json | 7 ++ data/maps/SlateportCity/map.json | 7 ++ data/maps/SootopolisCity/map.json | 7 ++ data/maps/SouthernIsland_Exterior/map.json | 7 ++ data/maps/VerdanturfTown/map.json | 7 ++ include/constants/heal_locations.h | 48 ++++++----- include/heal_location.h | 4 +- map_data_rules.mk | 5 ++ src/data/.gitignore | 1 + src/data/heal_locations.h | 25 ------ src/heal_location.c | 2 +- src/overworld.c | 6 +- tools/mapjson/mapjson.cpp | 84 ++++++++++++++++++- 28 files changed, 267 insertions(+), 58 deletions(-) delete mode 100644 src/data/heal_locations.h diff --git a/data/maps/BattleFrontier_OutsideEast/map.json b/data/maps/BattleFrontier_OutsideEast/map.json index c99fe30474..959244d82b 100644 --- a/data/maps/BattleFrontier_OutsideEast/map.json +++ b/data/maps/BattleFrontier_OutsideEast/map.json @@ -525,5 +525,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Common_EventScript_ShowPokemonCenterSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST", + "x": 3, + "y": 52 + } ] } diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index f073a74368..26551e4efe 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -170,5 +170,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "DewfordTown_EventScript_HallSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_DEWFORD_TOWN", + "x": 2, + "y": 11 + } ] } diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index 58978b7ff8..ed2d9bb9ce 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -192,5 +192,17 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemonCenterSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_EVER_GRANDE_CITY", + "x": 27, + "y": 49 + }, + { + "id": "HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE", + "x": 18, + "y": 6 + } ] } diff --git a/data/maps/FallarborTown/map.json b/data/maps/FallarborTown/map.json index 4888640a59..41e55a3ce4 100644 --- a/data/maps/FallarborTown/map.json +++ b/data/maps/FallarborTown/map.json @@ -181,5 +181,12 @@ "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_FALLARBOR_TOWN", + "x": 14, + "y": 8 + } ] } diff --git a/data/maps/FortreeCity/map.json b/data/maps/FortreeCity/map.json index 007d8b22d7..39483a94b5 100644 --- a/data/maps/FortreeCity/map.json +++ b/data/maps/FortreeCity/map.json @@ -232,5 +232,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemartSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_FORTREE_CITY", + "x": 5, + "y": 7 + } ] } diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index ecf7c5b9f1..33c7ce3c08 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -258,5 +258,12 @@ "item": "ITEM_ICE_HEAL", "flag": "FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_LAVARIDGE_TOWN", + "x": 9, + "y": 7 + } ] } diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 398cf219ea..34bd8d1334 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -518,5 +518,12 @@ "item": "ITEM_POKE_BALL", "flag": "FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_LILYCOVE_CITY", + "x": 24, + "y": 15 + } ] } diff --git a/data/maps/LittlerootTown/map.json b/data/maps/LittlerootTown/map.json index 8311ffaa3c..4cff63da09 100644 --- a/data/maps/LittlerootTown/map.json +++ b/data/maps/LittlerootTown/map.json @@ -264,5 +264,17 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LittlerootTown_EventScript_MaysHouseSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE", + "x": 5, + "y": 9 + }, + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE", + "x": 14, + "y": 9 + } ] } diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/map.json b/data/maps/LittlerootTown_BrendansHouse_2F/map.json index e9b6834ee5..89869459c5 100644 --- a/data/maps/LittlerootTown_BrendansHouse_2F/map.json +++ b/data/maps/LittlerootTown_BrendansHouse_2F/map.json @@ -266,5 +266,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PlayersHouse_2F_EventScript_GameCube" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", + "x": 4, + "y": 2 + } ] } diff --git a/data/maps/LittlerootTown_MaysHouse_2F/map.json b/data/maps/LittlerootTown_MaysHouse_2F/map.json index ce3a5f5701..b852fc0400 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/map.json +++ b/data/maps/LittlerootTown_MaysHouse_2F/map.json @@ -266,5 +266,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LittlerootTown_MaysHouse_2F_EventScript_PC" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F", + "x": 4, + "y": 2 + } ] } diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index f4da4222b1..c123138dd5 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -296,5 +296,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "MauvilleCity_EventScript_GameCornerSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_MAUVILLE_CITY", + "x": 22, + "y": 6 + } ] } diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 3759694d88..232cbda814 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -481,5 +481,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "MossdeepCity_EventScript_WhiteRock" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_MOSSDEEP_CITY", + "x": 28, + "y": 17 + } ] } diff --git a/data/maps/OldaleTown/map.json b/data/maps/OldaleTown/map.json index 302ef5e9d0..4bb86784e9 100644 --- a/data/maps/OldaleTown/map.json +++ b/data/maps/OldaleTown/map.json @@ -192,5 +192,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemartSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_OLDALE_TOWN", + "x": 6, + "y": 17 + } ] } diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index 37cfe8ad08..e1f5700f17 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -135,5 +135,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemonCenterSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_PACIFIDLOG_TOWN", + "x": 8, + "y": 16 + } ] } diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index d653e46aec..63e02e8955 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -326,5 +326,12 @@ "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_PETALBURG_CITY", + "x": 20, + "y": 17 + } ] } diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 3d77404ee7..2d42b30850 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -597,5 +597,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "RustboroCity_EventScript_CuttersHouseSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_RUSTBORO_CITY", + "x": 16, + "y": 39 + } ] } diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index 972b51447e..b285f030ee 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -681,5 +681,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SlateportCity_EventScript_BerryCrushRankingsSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_SLATEPORT_CITY", + "x": 19, + "y": 20 + } ] } diff --git a/data/maps/SootopolisCity/map.json b/data/maps/SootopolisCity/map.json index c6a6757d23..a436d72cb3 100644 --- a/data/maps/SootopolisCity/map.json +++ b/data/maps/SootopolisCity/map.json @@ -392,5 +392,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SootopolisCity_EventScript_CitySign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_SOOTOPOLIS_CITY", + "x": 43, + "y": 32 + } ] } diff --git a/data/maps/SouthernIsland_Exterior/map.json b/data/maps/SouthernIsland_Exterior/map.json index 53a988398c..6912e3f4bd 100644 --- a/data/maps/SouthernIsland_Exterior/map.json +++ b/data/maps/SouthernIsland_Exterior/map.json @@ -67,5 +67,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SouthernIsland_Exterior_EventScript_Sign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR", + "x": 15, + "y": 20 + } ] } diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index ae40730c0e..c8395b10c0 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -195,5 +195,12 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VerdanturfTown_EventScript_RusturfTunnelSign" } + ], + "heal_locations": [ + { + "id": "HEAL_LOCATION_VERDANTURF_TOWN", + "x": 16, + "y": 4 + } ] } diff --git a/include/constants/heal_locations.h b/include/constants/heal_locations.h index d3dd8f1f17..4a9771d810 100644 --- a/include/constants/heal_locations.h +++ b/include/constants/heal_locations.h @@ -1,28 +1,30 @@ #ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H #define GUARD_CONSTANTS_HEAL_LOCATIONS_H -#define HEAL_LOCATION_NONE 0 -#define HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F 1 -#define HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F 2 -#define HEAL_LOCATION_PETALBURG_CITY 3 -#define HEAL_LOCATION_SLATEPORT_CITY 4 -#define HEAL_LOCATION_MAUVILLE_CITY 5 -#define HEAL_LOCATION_RUSTBORO_CITY 6 -#define HEAL_LOCATION_FORTREE_CITY 7 -#define HEAL_LOCATION_LILYCOVE_CITY 8 -#define HEAL_LOCATION_MOSSDEEP_CITY 9 -#define HEAL_LOCATION_SOOTOPOLIS_CITY 10 -#define HEAL_LOCATION_EVER_GRANDE_CITY 11 -#define HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE 12 -#define HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE 13 -#define HEAL_LOCATION_OLDALE_TOWN 14 -#define HEAL_LOCATION_DEWFORD_TOWN 15 -#define HEAL_LOCATION_LAVARIDGE_TOWN 16 -#define HEAL_LOCATION_FALLARBOR_TOWN 17 -#define HEAL_LOCATION_VERDANTURF_TOWN 18 -#define HEAL_LOCATION_PACIFIDLOG_TOWN 19 -#define HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE 20 -#define HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR 21 -#define HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST 22 +enum { + HEAL_LOCATION_NONE, + HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, + HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F, + HEAL_LOCATION_PETALBURG_CITY, + HEAL_LOCATION_SLATEPORT_CITY, + HEAL_LOCATION_MAUVILLE_CITY, + HEAL_LOCATION_RUSTBORO_CITY, + HEAL_LOCATION_FORTREE_CITY, + HEAL_LOCATION_LILYCOVE_CITY, + HEAL_LOCATION_MOSSDEEP_CITY, + HEAL_LOCATION_SOOTOPOLIS_CITY, + HEAL_LOCATION_EVER_GRANDE_CITY, + HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE, + HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE, + HEAL_LOCATION_OLDALE_TOWN, + HEAL_LOCATION_DEWFORD_TOWN, + HEAL_LOCATION_LAVARIDGE_TOWN, + HEAL_LOCATION_FALLARBOR_TOWN, + HEAL_LOCATION_VERDANTURF_TOWN, + HEAL_LOCATION_PACIFIDLOG_TOWN, + HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE, + HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR, + HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST, +}; #endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H diff --git a/include/heal_location.h b/include/heal_location.h index 46f0d785ab..c087cfb3cd 100644 --- a/include/heal_location.h +++ b/include/heal_location.h @@ -3,8 +3,8 @@ struct HealLocation { - s8 group; - s8 map; + s8 mapGroup; + s8 mapNum; u16 x; u16 y; }; diff --git a/map_data_rules.mk b/map_data_rules.mk index ed7c08edea..199991ad56 100755 --- a/map_data_rules.mk +++ b/map_data_rules.mk @@ -11,11 +11,13 @@ INCLUDECONSTS_OUTDIR := include/constants AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/map_groups.h AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/layouts.h +AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/heal_locations.h 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)) +MAP_JSONS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/map.json,$(MAP_DIRS)) $(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 - | $(PREPROC) -ie $< charmap.txt | $(AS) $(ASFLAGS) -o $@ @@ -31,3 +33,6 @@ $(MAPS_OUTDIR)/connections.inc $(MAPS_OUTDIR)/groups.inc $(MAPS_OUTDIR)/events.i $(LAYOUTS_OUTDIR)/layouts.inc $(LAYOUTS_OUTDIR)/layouts_table.inc $(INCLUDECONSTS_OUTDIR)/layouts.h: $(LAYOUTS_DIR)/layouts.json $(MAPJSON) layouts emerald $< $(LAYOUTS_OUTDIR) $(INCLUDECONSTS_OUTDIR) + +$(DATA_SRC_SUBDIR)/heal_locations.h: $(MAP_JSONS) + @$(MAPJSON) heal_locations emerald $^ $(DATA_SRC_SUBDIR)/heal_locations.h diff --git a/src/data/.gitignore b/src/data/.gitignore index f9205e5627..371e10c56e 100755 --- a/src/data/.gitignore +++ b/src/data/.gitignore @@ -1,3 +1,4 @@ +heal_locations.h wild_encounters.h region_map/region_map_entries.h region_map/porymap_config.json diff --git a/src/data/heal_locations.h b/src/data/heal_locations.h deleted file mode 100644 index 2aba995b43..0000000000 --- a/src/data/heal_locations.h +++ /dev/null @@ -1,25 +0,0 @@ -static const struct HealLocation sHealLocations[] = -{ - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), MAP_NUM(MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F), 4, 2}, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F), MAP_NUM(MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F), 4, 2}, - [HEAL_LOCATION_PETALBURG_CITY - 1] = {MAP_GROUP(MAP_PETALBURG_CITY), MAP_NUM(MAP_PETALBURG_CITY), 20, 17}, - [HEAL_LOCATION_SLATEPORT_CITY - 1] = {MAP_GROUP(MAP_SLATEPORT_CITY), MAP_NUM(MAP_SLATEPORT_CITY), 19, 20}, - [HEAL_LOCATION_MAUVILLE_CITY - 1] = {MAP_GROUP(MAP_MAUVILLE_CITY), MAP_NUM(MAP_MAUVILLE_CITY), 22, 6}, - [HEAL_LOCATION_RUSTBORO_CITY - 1] = {MAP_GROUP(MAP_RUSTBORO_CITY), MAP_NUM(MAP_RUSTBORO_CITY), 16, 39}, - [HEAL_LOCATION_FORTREE_CITY - 1] = {MAP_GROUP(MAP_FORTREE_CITY), MAP_NUM(MAP_FORTREE_CITY), 5, 7}, - [HEAL_LOCATION_LILYCOVE_CITY - 1] = {MAP_GROUP(MAP_LILYCOVE_CITY), MAP_NUM(MAP_LILYCOVE_CITY), 24, 15}, - [HEAL_LOCATION_MOSSDEEP_CITY - 1] = {MAP_GROUP(MAP_MOSSDEEP_CITY), MAP_NUM(MAP_MOSSDEEP_CITY), 28, 17}, - [HEAL_LOCATION_SOOTOPOLIS_CITY - 1] = {MAP_GROUP(MAP_SOOTOPOLIS_CITY), MAP_NUM(MAP_SOOTOPOLIS_CITY), 43, 32}, - [HEAL_LOCATION_EVER_GRANDE_CITY - 1] = {MAP_GROUP(MAP_EVER_GRANDE_CITY), MAP_NUM(MAP_EVER_GRANDE_CITY), 27, 49}, - [HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN), MAP_NUM(MAP_LITTLEROOT_TOWN), 5, 9}, - [HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE - 1] = {MAP_GROUP(MAP_LITTLEROOT_TOWN), MAP_NUM(MAP_LITTLEROOT_TOWN), 14, 9}, - [HEAL_LOCATION_OLDALE_TOWN - 1] = {MAP_GROUP(MAP_OLDALE_TOWN), MAP_NUM(MAP_OLDALE_TOWN), 6, 17}, - [HEAL_LOCATION_DEWFORD_TOWN - 1] = {MAP_GROUP(MAP_DEWFORD_TOWN), MAP_NUM(MAP_DEWFORD_TOWN), 2, 11}, - [HEAL_LOCATION_LAVARIDGE_TOWN - 1] = {MAP_GROUP(MAP_LAVARIDGE_TOWN), MAP_NUM(MAP_LAVARIDGE_TOWN), 9, 7}, - [HEAL_LOCATION_FALLARBOR_TOWN - 1] = {MAP_GROUP(MAP_FALLARBOR_TOWN), MAP_NUM(MAP_FALLARBOR_TOWN), 14, 8}, - [HEAL_LOCATION_VERDANTURF_TOWN - 1] = {MAP_GROUP(MAP_VERDANTURF_TOWN), MAP_NUM(MAP_VERDANTURF_TOWN), 16, 4}, - [HEAL_LOCATION_PACIFIDLOG_TOWN - 1] = {MAP_GROUP(MAP_PACIFIDLOG_TOWN), MAP_NUM(MAP_PACIFIDLOG_TOWN), 8, 16}, - [HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE - 1] = {MAP_GROUP(MAP_EVER_GRANDE_CITY), MAP_NUM(MAP_EVER_GRANDE_CITY), 18, 6}, - [HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR - 1] = {MAP_GROUP(MAP_SOUTHERN_ISLAND_EXTERIOR), MAP_NUM(MAP_SOUTHERN_ISLAND_EXTERIOR), 15, 20}, - [HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST - 1] = {MAP_GROUP(MAP_BATTLE_FRONTIER_OUTSIDE_EAST), MAP_NUM(MAP_BATTLE_FRONTIER_OUTSIDE_EAST), 3, 52}, -}; diff --git a/src/heal_location.c b/src/heal_location.c index 0ab5540346..a787b33590 100644 --- a/src/heal_location.c +++ b/src/heal_location.c @@ -10,7 +10,7 @@ u32 GetHealLocationIndexByMap(u16 mapGroup, u16 mapNum) for (i = 0; i < ARRAY_COUNT(sHealLocations); i++) { - if (sHealLocations[i].group == mapGroup && sHealLocations[i].map == mapNum) + if (sHealLocations[i].mapGroup == mapGroup && sHealLocations[i].mapNum == mapNum) return i + 1; } return HEAL_LOCATION_NONE; diff --git a/src/overworld.c b/src/overworld.c index af07660de9..43e49baee9 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -659,7 +659,7 @@ void SetWarpDestinationToHealLocation(u8 healLocationId) { const struct HealLocation *healLocation = GetHealLocation(healLocationId); if (healLocation) - SetWarpDestination(healLocation->group, healLocation->map, WARP_ID_NONE, healLocation->x, healLocation->y); + SetWarpDestination(healLocation->mapGroup, healLocation->mapNum, WARP_ID_NONE, healLocation->x, healLocation->y); } void SetWarpDestinationToLastHealLocation(void) @@ -671,7 +671,7 @@ void SetLastHealLocationWarp(u8 healLocationId) { const struct HealLocation *healLocation = GetHealLocation(healLocationId); if (healLocation) - SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->group, healLocation->map, WARP_ID_NONE, healLocation->x, healLocation->y); + SetWarpData(&gSaveBlock1Ptr->lastHealLocation, healLocation->mapGroup, healLocation->mapNum, WARP_ID_NONE, healLocation->x, healLocation->y); } void UpdateEscapeWarp(s16 x, s16 y) @@ -729,7 +729,7 @@ void SetContinueGameWarpToHealLocation(u8 healLocationId) { const struct HealLocation *healLocation = GetHealLocation(healLocationId); if (healLocation) - SetWarpData(&gSaveBlock1Ptr->continueGameWarp, healLocation->group, healLocation->map, WARP_ID_NONE, healLocation->x, healLocation->y); + SetWarpData(&gSaveBlock1Ptr->continueGameWarp, healLocation->mapGroup, healLocation->mapNum, WARP_ID_NONE, healLocation->x, healLocation->y); } void SetContinueGameWarpToDynamicWarp(int unused) diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 94328b4857..3a427f98c2 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -371,6 +371,69 @@ void process_map(string map_filepath, string layouts_filepath, string output_dir write_text_file(out_dir + "connections.inc", connections_text); } +void process_heal_locations(const vector &map_filepaths, string output_file) { + ostringstream heal_locations_text; + ostringstream respawn_maps_text; + ostringstream respawn_npcs_text; + + // Get heal location data from each map + for (const string &filepath : map_filepaths) { + string err; + string map_json_text = read_text_file(filepath); + Json map_data = Json::parse(map_json_text, err); + if (map_data == Json()) + FATAL_ERROR("Failed to read '%s' while generating '%s': %s\n", filepath.c_str(), output_file.c_str(), err.c_str()); + + // Skip if no heal locations present + if (map_data.object_items().find("heal_locations") == map_data.object_items().end() || map_data["heal_locations"].array_items().size() <= 0) + continue; + + string map_id = json_to_string(map_data, "id"); + for (auto &heal_location : map_data["heal_locations"].array_items()) { + // Each array is indexed with the heal location's ID, e.g. '[HEAL_LOCATION_NAME - 1] = ' + string index_text = "\t[" + json_to_string(heal_location, "id") + " - 1] ="; + + // Add element to main heal locations array + heal_locations_text << index_text << "\n\t{\n" + << "\t\t.mapGroup = MAP_GROUP(" << map_id << "),\n" + << "\t\t.mapNum = MAP_NUM(" << map_id << "),\n" + << "\t\t.x = " << json_to_string(heal_location, "x") << ",\n" + << "\t\t.y = " << json_to_string(heal_location, "y") << ",\n" + << "\t},\n"; + + // Add element to respawn map array (if field is present) + if (heal_location.object_items().find("respawn_map") != heal_location.object_items().end()) { + string respawn_map_id = json_to_string(heal_location, "respawn_map"); + respawn_maps_text << index_text << " {" + << "MAP_GROUP(" << respawn_map_id << "), " + << "MAP_NUM(" << respawn_map_id << ")" + << "},\n"; + } + + // Add element to respawn NPC array (if field is present) + if (heal_location.object_items().find("respawn_npc") != heal_location.object_items().end()) { + respawn_npcs_text << index_text << " " << json_to_string(heal_location, "respawn_npc") << ",\n"; + } + } + } + + ostringstream text; + text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/*/map.json\n//\n\n"; + + string arr_body = heal_locations_text.str(); + text << "static const struct HealLocation sHealLocations[] =\n{\n" << arr_body << "};\n\n"; + + arr_body = respawn_maps_text.str(); + if (!arr_body.empty()) + text << "static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n" << arr_body << "};\n\n"; + + arr_body = respawn_npcs_text.str(); + if (!arr_body.empty()) + text << "static const u8 sWhiteoutRespawnHealerNpcIds[] =\n{\n" << arr_body << "};\n\n"; + + write_text_file(output_file, text.str()); +} + string generate_groups_text(Json groups_data) { ostringstream text; @@ -627,9 +690,6 @@ int main(int argc, char *argv[]) { char *mode_arg = argv[1]; string mode(mode_arg); - if (mode != "layouts" && mode != "map" && mode != "groups") - FATAL_ERROR("ERROR: must be 'layouts', 'map', or 'groups'.\n"); - if (mode == "map") { if (argc != 6) FATAL_ERROR("USAGE: mapjson map \n"); @@ -663,8 +723,24 @@ int main(int argc, char *argv[]) { process_layouts(filepath, output_asm, output_c); } + else if (mode == "heal_locations") { + if (argc < 5) + FATAL_ERROR("USAGE: mapjson heal_locations [additional_map_files] "); + + infer_separator(argv[3]); + + vector filepaths; + const int firstMapFileArg = 3; + const int lastMapFileArg = argc - 2; + for (int i = firstMapFileArg; i <= lastMapFileArg; i++) { + filepaths.push_back(argv[i]); + } + string output_file(argv[argc - 1]); + + process_heal_locations(filepaths, output_file); + } else { - FATAL_ERROR("ERROR: must be 'layouts', 'map', or 'groups'.\n"); + FATAL_ERROR("ERROR: must be 'layouts', 'map', 'heal_locations', or 'groups'.\n"); } return 0; From 9f31b0fe90b30ff8f9af0894409286f0170571b2 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 11 Oct 2024 21:30:52 -0400 Subject: [PATCH 007/187] Generate local IDs from map.json files --- Makefile | 3 +- asm/macros/event.inc | 6 +- data/maps/AquaHideout_B2F/map.json | 2 + data/maps/AquaHideout_B2F/scripts.inc | 9 +- .../map.json | 1 + .../scripts.inc | 4 +- .../map.json | 1 + .../scripts.inc | 6 +- .../BattleFrontier_BattleTowerLobby/map.json | 2 + data/maps/BattleFrontier_Mart/map.json | 1 + data/maps/BattleFrontier_OutsideEast/map.json | 1 + .../BattleFrontier_OutsideEast/scripts.inc | 8 +- data/maps/BirthIsland_Exterior/map.json | 2 + data/maps/BirthIsland_Exterior/scripts.inc | 12 +- data/maps/BirthIsland_Harbor/map.json | 2 + data/maps/BirthIsland_Harbor/scripts.inc | 7 +- data/maps/CaveOfOrigin_B1F/map.json | 1 + data/maps/CaveOfOrigin_B1F/scripts.inc | 12 +- data/maps/ContestHall/map.json | 15 ++ .../DewfordTown_PokemonCenter_1F/map.json | 1 + .../DewfordTown_PokemonCenter_1F/scripts.inc | 4 +- data/maps/EverGrandeCity_HallOfFame/map.json | 1 + .../EverGrandeCity_HallOfFame/scripts.inc | 12 +- data/maps/FallarborTown_Mart/map.json | 1 + .../map.json | 1 + .../scripts.inc | 2 - .../FallarborTown_PokemonCenter_1F/map.json | 2 + .../scripts.inc | 11 +- data/maps/FarawayIsland_Entrance/map.json | 2 + data/maps/FarawayIsland_Entrance/scripts.inc | 7 +- data/maps/FarawayIsland_Interior/map.json | 1 + data/maps/FortreeCity_Mart/map.json | 1 + .../FortreeCity_PokemonCenter_1F/map.json | 1 + .../FortreeCity_PokemonCenter_1F/scripts.inc | 4 +- data/maps/GraniteCave_StevensRoom/map.json | 1 + data/maps/GraniteCave_StevensRoom/scripts.inc | 10 +- data/maps/InsideOfTruck/map.json | 3 + data/maps/JaggedPass/map.json | 1 + data/maps/JaggedPass/scripts.inc | 14 +- data/maps/LavaridgeTown_Gym_1F/map.json | 4 + data/maps/LavaridgeTown_Gym_1F/scripts.inc | 5 - data/maps/LavaridgeTown_Gym_B1F/map.json | 4 + data/maps/LavaridgeTown_Gym_B1F/scripts.inc | 5 - data/maps/LavaridgeTown_Mart/map.json | 1 + data/maps/LilycoveCity_ContestLobby/map.json | 10 + .../LilycoveCity_ContestLobby/scripts.inc | 62 +++--- .../LilycoveCity_DepartmentStore_1F/map.json | 1 + .../scripts.inc | 2 - .../LilycoveCity_MoveDeletersHouse/map.json | 1 + .../scripts.inc | 2 - .../LilycoveCity_PokemonCenter_1F/map.json | 3 + .../LilycoveCity_PokemonCenter_1F/scripts.inc | 4 +- .../map.json | 8 + .../scripts.inc | 35 ++-- data/maps/LittlerootTown/map.json | 4 + data/maps/LittlerootTown/scripts.inc | 149 +++++++------ .../LittlerootTown_BrendansHouse_1F/map.json | 4 + .../scripts.inc | 50 ++--- .../LittlerootTown_BrendansHouse_2F/map.json | 2 + .../scripts.inc | 30 ++- .../maps/LittlerootTown_MaysHouse_1F/map.json | 4 + .../LittlerootTown_MaysHouse_1F/scripts.inc | 50 ++--- .../maps/LittlerootTown_MaysHouse_2F/map.json | 1 + .../map.json | 6 + .../scripts.inc | 89 ++++---- data/maps/MauvilleCity/map.json | 3 + data/maps/MauvilleCity/scripts.inc | 68 +++--- data/maps/MauvilleCity_Mart/map.json | 1 + .../MauvilleCity_PokemonCenter_1F/map.json | 1 + .../MauvilleCity_PokemonCenter_1F/scripts.inc | 4 +- data/maps/MossdeepCity_Mart/map.json | 1 + .../MossdeepCity_PokemonCenter_1F/map.json | 1 + .../MossdeepCity_PokemonCenter_1F/scripts.inc | 4 +- .../maps/MossdeepCity_SpaceCenter_2F/map.json | 9 + .../MossdeepCity_SpaceCenter_2F/scripts.inc | 89 ++++---- data/maps/MossdeepCity_StevensHouse/map.json | 2 + .../MossdeepCity_StevensHouse/scripts.inc | 19 +- data/maps/MtChimney_CableCarStation/map.json | 1 + .../MtChimney_CableCarStation/scripts.inc | 14 +- data/maps/NavelRock_Bottom/map.json | 1 + data/maps/NavelRock_Bottom/scripts.inc | 4 +- data/maps/NavelRock_Top/map.json | 1 + data/maps/NavelRock_Top/scripts.inc | 10 +- data/maps/OldaleTown_Mart/map.json | 1 + .../maps/OldaleTown_PokemonCenter_1F/map.json | 1 + .../OldaleTown_PokemonCenter_1F/scripts.inc | 4 +- data/maps/PetalburgCity_Mart/map.json | 1 + data/maps/Route103/map.json | 1 + data/maps/Route103/scripts.inc | 28 ++- data/maps/Route110_TrickHouseEnd/map.json | 1 + data/maps/Route110_TrickHouseEnd/scripts.inc | 32 ++- .../maps/Route110_TrickHouseEntrance/map.json | 1 + .../Route110_TrickHouseEntrance/scripts.inc | 2 - data/maps/Route111/map.json | 15 +- data/maps/Route117/map.json | 1 + data/maps/Route117/scripts.inc | 2 - data/maps/Route117_PokemonDayCare/map.json | 1 + data/maps/Route118/map.json | 6 + data/maps/Route120/map.json | 4 + data/maps/Route128/map.json | 3 + data/maps/Route128/scripts.inc | 38 ++-- data/maps/RustboroCity_DevonCorp_1F/map.json | 1 + .../RustboroCity_DevonCorp_1F/scripts.inc | 6 +- data/maps/RustboroCity_Mart/map.json | 1 + .../RustboroCity_PokemonCenter_1F/map.json | 1 + .../RustboroCity_PokemonCenter_1F/scripts.inc | 4 +- data/maps/SkyPillar_Outside/map.json | 1 + data/maps/SkyPillar_Outside/scripts.inc | 14 +- data/maps/SlateportCity/map.json | 1 + data/maps/SlateportCity_Mart/map.json | 1 + .../SlateportCity_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/SootopolisCity_Mart/map.json | 1 + data/maps/TerraCave_End/map.json | 1 + data/maps/TerraCave_End/scripts.inc | 8 +- data/maps/UnionRoom/map.json | 8 + data/maps/UnionRoom/scripts.inc | 2 - data/maps/VerdanturfTown_Mart/map.json | 1 + data/maps/VictoryRoad_1F/map.json | 1 + data/maps/VictoryRoad_1F/scripts.inc | 20 +- data/scripts/apprentice.inc | 2 - data/scripts/berry_blender.inc | 20 +- data/scripts/contest_hall.inc | 100 ++++----- data/scripts/day_care.inc | 2 - data/scripts/gabby_and_ty.inc | 39 ++-- data/scripts/lilycove_lady.inc | 7 +- data/scripts/new_game.inc | 4 +- data/scripts/players_house.inc | 17 +- include/constants/.gitignore | 3 +- include/constants/event_objects.h | 45 ++-- include/constants/flags.h | 4 +- include/global.h | 2 +- map_data_rules.mk | 8 +- src/battle_pyramid.c | 4 +- src/battle_setup.c | 3 +- src/contest_util.c | 13 +- src/event_object_movement.c | 15 +- src/field_control_avatar.c | 2 +- src/field_player_avatar.c | 2 +- src/field_specials.c | 4 +- src/rotating_tile_puzzle.c | 2 +- src/scrcmd.c | 4 +- src/script.c | 12 +- src/trainer_hill.c | 4 +- src/tv.c | 34 +-- tools/mapjson/mapjson.cpp | 198 +++++++++++------- 146 files changed, 879 insertions(+), 834 deletions(-) diff --git a/Makefile b/Makefile index ee36562b13..c3739b8948 100644 --- a/Makefile +++ b/Makefile @@ -273,7 +273,8 @@ generated: $(AUTO_GEN_TARGETS) # NOTE: Tools must have been built prior (FIXME) generated: tools $(AUTO_GEN_TARGETS) clean-generated: - -rm -f $(AUTO_GEN_TARGETS) + @rm -f $(AUTO_GEN_TARGETS) + @echo "rm -f " ifeq ($(MODERN),0) $(C_BUILDDIR)/libc.o: CC1 := $(TOOLS_DIR)/agbcc/bin/old_agbcc$(EXE) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index b91ac68210..7b9f39d5f8 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -604,10 +604,10 @@ .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 localId is LOCALID_NONE (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 + .macro waitmovement localId=LOCALID_NONE, map .ifb \map .byte 0x51 .2byte \localId diff --git a/data/maps/AquaHideout_B2F/map.json b/data/maps/AquaHideout_B2F/map.json index bc58b8d6be..fb8bf6ed36 100644 --- a/data/maps/AquaHideout_B2F/map.json +++ b/data/maps/AquaHideout_B2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_AQUA_HIDEOUT_MATT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 23, "y": 19, @@ -54,6 +55,7 @@ "flag": "FLAG_ITEM_AQUA_HIDEOUT_B2F_NEST_BALL" }, { + "local_id": "LOCALID_AQUA_HIDEOUT_SUBMARINE", "graphics_id": "OBJ_EVENT_GFX_SUBMARINE_SHADOW", "x": 19, "y": 20, diff --git a/data/maps/AquaHideout_B2F/scripts.inc b/data/maps/AquaHideout_B2F/scripts.inc index 7dc34676b3..dab7a4d536 100644 --- a/data/maps/AquaHideout_B2F/scripts.inc +++ b/data/maps/AquaHideout_B2F/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_MATT, 1 -.set LOCALID_SUBMARINE, 4 - AquaHideout_B2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, AquaHideout_B2F_OnTransition .byte 0 @@ -15,7 +12,7 @@ AquaHideout_B2F_EventScript_PreventMattNoticing:: AquaHideout_B2F_EventScript_MattNoticePlayer:: lockall - setvar VAR_0x8008, LOCALID_MATT + setvar VAR_0x8008, LOCALID_AQUA_HIDEOUT_MATT playse SE_PIN applymovement VAR_0x8008, Common_Movement_ExclamationMark waitmovement 0 @@ -32,8 +29,8 @@ AquaHideout_B2F_EventScript_Matt:: end AquaHideout_B2F_EventScript_SubmarineEscape:: - setvar VAR_0x8008, LOCALID_MATT - setvar VAR_0x8009, LOCALID_SUBMARINE + setvar VAR_0x8008, LOCALID_AQUA_HIDEOUT_MATT + setvar VAR_0x8009, LOCALID_AQUA_HIDEOUT_SUBMARINE applymovement VAR_0x8008, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 20 diff --git a/data/maps/BattleFrontier_BattlePikeCorridor/map.json b/data/maps/BattleFrontier_BattlePikeCorridor/map.json index 1a5faadeab..5abcd44098 100644 --- a/data/maps/BattleFrontier_BattlePikeCorridor/map.json +++ b/data/maps/BattleFrontier_BattlePikeCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BATTLE_PIKE_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 6, "y": 6, diff --git a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc index fe2c6ed00f..b8b4097b83 100644 --- a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattlePikeCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePikeCorridor_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePikeCorridor_OnWarp @@ -15,7 +13,7 @@ BattleFrontier_BattlePikeCorridor_EventScript_EnterCorridor:: pike_cleartrainerids pike_nohealing TRUE applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerEnterCorridor - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePikeCorridor_Movement_AttendantEnterCorridor + applymovement LOCALID_BATTLE_PIKE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePikeCorridor_Movement_AttendantEnterCorridor waitmovement 0 lockall msgbox BattleFrontier_BattlePikeCorridor_Text_YourChallengeHasBegun, MSGBOX_DEFAULT diff --git a/data/maps/BattleFrontier_BattleTowerCorridor/map.json b/data/maps/BattleFrontier_BattleTowerCorridor/map.json index 10d5ca7f71..86c7d83957 100644 --- a/data/maps/BattleFrontier_BattleTowerCorridor/map.json +++ b/data/maps/BattleFrontier_BattleTowerCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 9, "y": 2, diff --git a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc index d0f3d487a8..1cbbf61fbb 100644 --- a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleTowerCorridor_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, BattleFrontier_BattleTowerCorridor_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleTowerCorridor_OnFrame @@ -23,13 +21,13 @@ BattleFrontier_BattleTowerCorridor_OnFrame: BattleFrontier_BattleTowerCorridor_EventScript_EnterCorridor:: setvar VAR_TEMP_0, 1 goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToDoor + applymovement LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToDoor waitmovement 0 goto BattleFrontier_BattleTowerCorridor_EventScript_WarpToBattleRoom BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToFarDoor + applymovement LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToFarDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToFarDoor waitmovement 0 diff --git a/data/maps/BattleFrontier_BattleTowerLobby/map.json b/data/maps/BattleFrontier_BattleTowerLobby/map.json index d672f07189..19790034fb 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/map.json +++ b/data/maps/BattleFrontier_BattleTowerLobby/map.json @@ -67,6 +67,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BATTLE_TOWER_LOBBY_REPORTER", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 11, "y": 9, @@ -80,6 +81,7 @@ "flag": "FLAG_HIDE_BATTLE_TOWER_REPORTER" }, { + "local_id": "LOCALID_APPRENTICE", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 1, "y": 5, diff --git a/data/maps/BattleFrontier_Mart/map.json b/data/maps/BattleFrontier_Mart/map.json index 28261958ab..7fab54636a 100644 --- a/data/maps/BattleFrontier_Mart/map.json +++ b/data/maps/BattleFrontier_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BATTLE_FRONTIER_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/BattleFrontier_OutsideEast/map.json b/data/maps/BattleFrontier_OutsideEast/map.json index 959244d82b..06cbfe2d36 100644 --- a/data/maps/BattleFrontier_OutsideEast/map.json +++ b/data/maps/BattleFrontier_OutsideEast/map.json @@ -190,6 +190,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_SUDOWOODO", "graphics_id": "OBJ_EVENT_GFX_SUDOWOODO", "x": 54, "y": 62, diff --git a/data/maps/BattleFrontier_OutsideEast/scripts.inc b/data/maps/BattleFrontier_OutsideEast/scripts.inc index e8eec6f160..ba9abd8d5d 100644 --- a/data/maps/BattleFrontier_OutsideEast/scripts.inc +++ b/data/maps/BattleFrontier_OutsideEast/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_SUDOWOODO, 14 - BattleFrontier_OutsideEast_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_OutsideEast_OnResume map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_OutsideEast_OnTransition @@ -108,7 +106,7 @@ BattleFrontier_OutsideEast_EventScript_Sudowoodo:: faceplayer waitse playse SE_SUDOWOODO_SHAKE - applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake + applymovement LOCALID_FRONTIER_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake waitmovement 0 release end @@ -120,7 +118,7 @@ BattleFrontier_OutsideEast_EventScript_WaterSudowoodo:: waitstate waitse playse SE_SUDOWOODO_SHAKE - applymovement LOCALID_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake + applymovement LOCALID_FRONTIER_SUDOWOODO, BattleFrontier_OutsideEast_Movement_SudowoodoShake waitmovement 0 msgbox gText_Sudowoodo_Attacked, MSGBOX_DEFAULT closemessage @@ -128,7 +126,7 @@ BattleFrontier_OutsideEast_EventScript_WaterSudowoodo:: playmoncry SPECIES_SUDOWOODO, CRY_MODE_ENCOUNTER delay 40 waitmoncry - setvar VAR_LAST_TALKED, LOCALID_SUDOWOODO + setvar VAR_LAST_TALKED, LOCALID_FRONTIER_SUDOWOODO setwildbattle SPECIES_SUDOWOODO, 40 setflag FLAG_SYS_CTRL_OBJ_DELETE dowildbattle diff --git a/data/maps/BirthIsland_Exterior/map.json b/data/maps/BirthIsland_Exterior/map.json index 3c5cc874cb..996fc0ca14 100644 --- a/data/maps/BirthIsland_Exterior/map.json +++ b/data/maps/BirthIsland_Exterior/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK", "graphics_id": "OBJ_EVENT_GFX_DEOXYS_TRIANGLE", "x": 15, "y": 12, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_BIRTH_ISLAND_DEOXYS_TRIANGLE" }, { + "local_id": "LOCALID_BIRTH_ISLAND_DEOXYS", "graphics_id": "OBJ_EVENT_GFX_DEOXYS", "x": 15, "y": 3, diff --git a/data/maps/BirthIsland_Exterior/scripts.inc b/data/maps/BirthIsland_Exterior/scripts.inc index 0322c17c27..7b09cb5f04 100644 --- a/data/maps/BirthIsland_Exterior/scripts.inc +++ b/data/maps/BirthIsland_Exterior/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_DEOXYS, 2 - -@ Note: LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK is a local id for this map used elsewhere. It's defined in event_objects.h - BirthIsland_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BirthIsland_Exterior_OnTransition map_script MAP_SCRIPT_ON_RESUME, BirthIsland_Exterior_OnResume @@ -39,7 +35,7 @@ BirthIsland_Exterior_OnResume: BirthIsland_Exterior_EventScript_TryRemoveDeoxys:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_DEOXYS + removeobject LOCALID_BIRTH_ISLAND_DEOXYS return BirthIsland_Exterior_EventScript_Triangle:: @@ -77,14 +73,14 @@ BirthIsland_Exterior_EventScript_Deoxys:: dofieldeffect FLDEFF_DESTROY_DEOXYS_ROCK playbgm MUS_RG_ENCOUNTER_DEOXYS, FALSE waitfieldeffect FLDEFF_DESTROY_DEOXYS_ROCK - addobject LOCALID_DEOXYS - applymovement LOCALID_DEOXYS, BirthIsland_Exterior_Movement_DeoxysApproach + addobject LOCALID_BIRTH_ISLAND_DEOXYS + applymovement LOCALID_BIRTH_ISLAND_DEOXYS, BirthIsland_Exterior_Movement_DeoxysApproach waitmovement 0 waitse playmoncry SPECIES_DEOXYS, CRY_MODE_ENCOUNTER delay 40 waitmoncry - setvar VAR_LAST_TALKED, LOCALID_DEOXYS + setvar VAR_LAST_TALKED, LOCALID_BIRTH_ISLAND_DEOXYS seteventmon SPECIES_DEOXYS, 30 setflag FLAG_SYS_CTRL_OBJ_DELETE special BattleSetup_StartLegendaryBattle diff --git a/data/maps/BirthIsland_Harbor/map.json b/data/maps/BirthIsland_Harbor/map.json index cce96bfc13..93f399963e 100644 --- a/data/maps/BirthIsland_Harbor/map.json +++ b/data/maps/BirthIsland_Harbor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BIRTH_ISLAND_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 5, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BIRTH_ISLAND_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 8, "y": 7, diff --git a/data/maps/BirthIsland_Harbor/scripts.inc b/data/maps/BirthIsland_Harbor/scripts.inc index e91238cbdc..988d11716b 100644 --- a/data/maps/BirthIsland_Harbor/scripts.inc +++ b/data/maps/BirthIsland_Harbor/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_SAILOR, 1 -.set LOCALID_SS_TIDAL, 2 - BirthIsland_Harbor_MapScripts:: .byte 0 @@ -14,8 +11,8 @@ BirthIsland_Harbor_EventScript_Sailor:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 - hideobjectat LOCALID_SAILOR, MAP_BIRTH_ISLAND_HARBOR - setvar VAR_0x8004, LOCALID_SS_TIDAL + hideobjectat LOCALID_BIRTH_ISLAND_SAILOR, MAP_BIRTH_ISLAND_HARBOR + setvar VAR_0x8004, LOCALID_BIRTH_ISLAND_SS_TIDAL call Common_EventScript_FerryDepartIsland warp MAP_LILYCOVE_CITY_HARBOR, 8, 11 waitstate diff --git a/data/maps/CaveOfOrigin_B1F/map.json b/data/maps/CaveOfOrigin_B1F/map.json index 166f79998b..5756705323 100644 --- a/data/maps/CaveOfOrigin_B1F/map.json +++ b/data/maps/CaveOfOrigin_B1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_CAVE_OF_ORIGIN_WALLACE", "graphics_id": "OBJ_EVENT_GFX_WALLACE", "x": 9, "y": 13, diff --git a/data/maps/CaveOfOrigin_B1F/scripts.inc b/data/maps/CaveOfOrigin_B1F/scripts.inc index 11ca66aab0..14dda1ad82 100644 --- a/data/maps/CaveOfOrigin_B1F/scripts.inc +++ b/data/maps/CaveOfOrigin_B1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALLACE, 1 - CaveOfOrigin_B1F_MapScripts:: .byte 0 @@ -8,16 +6,16 @@ CaveOfOrigin_B1F_EventScript_Wallace:: faceplayer msgbox CaveOfOrigin_B1F_Text_WallaceStory, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_CAVE_OF_ORIGIN_WALLACE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 60 playse SE_PIN - applymovement LOCALID_WALLACE, Common_Movement_ExclamationMark + applymovement LOCALID_CAVE_OF_ORIGIN_WALLACE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_WALLACE, Common_Movement_Delay48 + applymovement LOCALID_CAVE_OF_ORIGIN_WALLACE, Common_Movement_Delay48 waitmovement 0 delay 30 - applymovement LOCALID_WALLACE, Common_Movement_FacePlayer + applymovement LOCALID_CAVE_OF_ORIGIN_WALLACE, Common_Movement_FacePlayer waitmovement 0 message CaveOfOrigin_B1F_Text_WhereIsRayquaza waitmessage @@ -55,7 +53,7 @@ CaveOfOrigin_B1F_EventScript_AtSkyPillar:: fadescreenspeed FADE_TO_BLACK, 4 setflag FLAG_WALLACE_GOES_TO_SKY_PILLAR setvar VAR_SOOTOPOLIS_CITY_STATE, 3 - removeobject LOCALID_WALLACE + removeobject LOCALID_CAVE_OF_ORIGIN_WALLACE clearflag FLAG_HIDE_SKY_PILLAR_WALLACE fadescreen FADE_FROM_BLACK release diff --git a/data/maps/ContestHall/map.json b/data/maps/ContestHall/map.json index 842c57968d..2d5c0b7c0c 100644 --- a/data/maps/ContestHall/map.json +++ b/data/maps/ContestHall/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_CONTEST_MC", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 6, "y": 4, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_JUDGE", "graphics_id": "OBJ_EVENT_GFX_CONTEST_JUDGE", "x": 7, "y": 4, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTESTANT_1", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 4, "y": 7, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTESTANT_2", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 6, "y": 7, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTESTANT_3", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 8, "y": 7, @@ -80,6 +85,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_1", "graphics_id": "OBJ_EVENT_GFX_VAR_4", "x": 2, "y": 6, @@ -93,6 +99,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_3", "graphics_id": "OBJ_EVENT_GFX_VAR_6", "x": 4, "y": 2, @@ -106,6 +113,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_4", "graphics_id": "OBJ_EVENT_GFX_VAR_7", "x": 5, "y": 2, @@ -119,6 +127,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_5", "graphics_id": "OBJ_EVENT_GFX_VAR_8", "x": 9, "y": 2, @@ -132,6 +141,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_6", "graphics_id": "OBJ_EVENT_GFX_VAR_9", "x": 10, "y": 2, @@ -145,6 +155,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_7", "graphics_id": "OBJ_EVENT_GFX_VAR_A", "x": 12, "y": 5, @@ -158,6 +169,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_AUDIENCE_2", "graphics_id": "OBJ_EVENT_GFX_VAR_5", "x": 2, "y": 5, @@ -171,6 +183,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_POKEBALL", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 7, "y": 5, @@ -184,6 +197,7 @@ "flag": "FLAG_HIDE_CONTEST_POKE_BALL" }, { + "local_id": "LOCALID_CONTESTANT_4", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 10, "y": 7, @@ -197,6 +211,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_ARTIST", "graphics_id": "OBJ_EVENT_GFX_ARTIST", "x": 12, "y": 6, diff --git a/data/maps/DewfordTown_PokemonCenter_1F/map.json b/data/maps/DewfordTown_PokemonCenter_1F/map.json index 5e5c7b93e4..4993440839 100644 --- a/data/maps/DewfordTown_PokemonCenter_1F/map.json +++ b/data/maps/DewfordTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DEWFORD_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/DewfordTown_PokemonCenter_1F/scripts.inc b/data/maps/DewfordTown_PokemonCenter_1F/scripts.inc index dbd9e1c8d2..0fb429b992 100644 --- a/data/maps/DewfordTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/DewfordTown_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - DewfordTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, DewfordTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ DewfordTown_PokemonCenter_1F_OnTransition: end DewfordTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_DEWFORD_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/EverGrandeCity_HallOfFame/map.json b/data/maps/EverGrandeCity_HallOfFame/map.json index 82219dfd43..5f3f30c27d 100644 --- a/data/maps/EverGrandeCity_HallOfFame/map.json +++ b/data/maps/EverGrandeCity_HallOfFame/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_HALL_OF_FAME_WALLACE", "graphics_id": "OBJ_EVENT_GFX_WALLACE", "x": 6, "y": 16, diff --git a/data/maps/EverGrandeCity_HallOfFame/scripts.inc b/data/maps/EverGrandeCity_HallOfFame/scripts.inc index 92b01af970..ad588cdf3b 100644 --- a/data/maps/EverGrandeCity_HallOfFame/scripts.inc +++ b/data/maps/EverGrandeCity_HallOfFame/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALLACE, 1 - EverGrandeCity_HallOfFame_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, EverGrandeCity_HallOfFame_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, EverGrandeCity_HallOfFame_OnWarp @@ -19,24 +17,24 @@ EverGrandeCity_HallOfFame_OnFrame: EverGrandeCity_HallOfFame_EventScript_EnterHallOfFame:: lockall - applymovement LOCALID_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 + applymovement LOCALID_HALL_OF_FAME_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 waitmovement 0 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox EverGrandeCity_HallOfFame_Text_HereWeHonorLeagueChampions, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 + applymovement LOCALID_HALL_OF_FAME_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 waitmovement 0 delay 20 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox EverGrandeCity_HallOfFame_Text_LetsRecordYouAndYourPartnersNames, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 diff --git a/data/maps/FallarborTown_Mart/map.json b/data/maps/FallarborTown_Mart/map.json index c72605a36d..b4e4560577 100644 --- a/data/maps/FallarborTown_Mart/map.json +++ b/data/maps/FallarborTown_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FALLARBOR_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/FallarborTown_MoveRelearnersHouse/map.json b/data/maps/FallarborTown_MoveRelearnersHouse/map.json index 9479677200..9cde3440cb 100644 --- a/data/maps/FallarborTown_MoveRelearnersHouse/map.json +++ b/data/maps/FallarborTown_MoveRelearnersHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MOVE_RELEARNER", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "x": 4, "y": 4, diff --git a/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc b/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc index f17754328d..8dd70b9b04 100644 --- a/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc +++ b/data/maps/FallarborTown_MoveRelearnersHouse/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_MOVE_RELEARNER, 1 - FallarborTown_MoveRelearnersHouse_MapScripts:: .byte 0 diff --git a/data/maps/FallarborTown_PokemonCenter_1F/map.json b/data/maps/FallarborTown_PokemonCenter_1F/map.json index 93204a215a..32a29a758d 100644 --- a/data/maps/FallarborTown_PokemonCenter_1F/map.json +++ b/data/maps/FallarborTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FALLARBOR_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, @@ -54,6 +55,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FALLARBOR_LANETTE", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 10, "y": 2, diff --git a/data/maps/FallarborTown_PokemonCenter_1F/scripts.inc b/data/maps/FallarborTown_PokemonCenter_1F/scripts.inc index bc9e7c25f8..c9d4c04fa8 100644 --- a/data/maps/FallarborTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/FallarborTown_PokemonCenter_1F/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_NURSE, 1 -.set LOCALID_LANETTE, 4 - FallarborTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FallarborTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -12,7 +9,7 @@ FallarborTown_PokemonCenter_1F_OnTransition: end FallarborTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_FALLARBOR_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress @@ -38,20 +35,20 @@ FallarborTown_PokemonCenter_1F_EventScript_Lanette:: end FallarborTown_PokemonCenter_1F_EventScript_LanetteExitNorth:: - applymovement LOCALID_LANETTE, FallarborTown_PokemonCenter_1F_Movement_LanetteExitNorth + applymovement LOCALID_FALLARBOR_LANETTE, FallarborTown_PokemonCenter_1F_Movement_LanetteExitNorth waitmovement 0 goto FallarborTown_PokemonCenter_1F_EventScript_LanetteExited end FallarborTown_PokemonCenter_1F_EventScript_LanetteExitWest:: - applymovement LOCALID_LANETTE, FallarborTown_PokemonCenter_1F_Movement_LanetteExitWest + applymovement LOCALID_FALLARBOR_LANETTE, FallarborTown_PokemonCenter_1F_Movement_LanetteExitWest waitmovement 0 goto FallarborTown_PokemonCenter_1F_EventScript_LanetteExited end FallarborTown_PokemonCenter_1F_EventScript_LanetteExited:: playse SE_SLIDING_DOOR - removeobject LOCALID_LANETTE + removeobject LOCALID_FALLARBOR_LANETTE clearflag FLAG_HIDE_LANETTES_HOUSE_LANETTE release end diff --git a/data/maps/FarawayIsland_Entrance/map.json b/data/maps/FarawayIsland_Entrance/map.json index bd42f12953..bf3ea1d863 100644 --- a/data/maps/FarawayIsland_Entrance/map.json +++ b/data/maps/FarawayIsland_Entrance/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FARAWAY_ISLAND_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 13, "y": 39, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FARAWAY_ISLAND_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 13, "y": 41, diff --git a/data/maps/FarawayIsland_Entrance/scripts.inc b/data/maps/FarawayIsland_Entrance/scripts.inc index 504b0dc6a6..13d37f4710 100644 --- a/data/maps/FarawayIsland_Entrance/scripts.inc +++ b/data/maps/FarawayIsland_Entrance/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_SAILOR, 1 -.set LOCALID_SS_TIDAL, 2 - FarawayIsland_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FarawayIsland_Entrance_OnTransition .byte 0 @@ -29,8 +26,8 @@ FarawayIsland_Entrance_EventScript_Sailor:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 - hideobjectat LOCALID_SAILOR, MAP_FARAWAY_ISLAND_ENTRANCE - setvar VAR_0x8004, LOCALID_SS_TIDAL + hideobjectat LOCALID_FARAWAY_ISLAND_SAILOR, MAP_FARAWAY_ISLAND_ENTRANCE + setvar VAR_0x8004, LOCALID_FARAWAY_ISLAND_SS_TIDAL call Common_EventScript_FerryDepartIsland warp MAP_LILYCOVE_CITY_HARBOR, 8, 11 waitstate diff --git a/data/maps/FarawayIsland_Interior/map.json b/data/maps/FarawayIsland_Interior/map.json index 14850995ca..53be2ae914 100644 --- a/data/maps/FarawayIsland_Interior/map.json +++ b/data/maps/FarawayIsland_Interior/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FARAWAY_ISLAND_MEW", "graphics_id": "OBJ_EVENT_GFX_MEW", "x": 13, "y": 17, diff --git a/data/maps/FortreeCity_Mart/map.json b/data/maps/FortreeCity_Mart/map.json index 27a82e69f3..8620c47863 100644 --- a/data/maps/FortreeCity_Mart/map.json +++ b/data/maps/FortreeCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FORTREE_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/FortreeCity_PokemonCenter_1F/map.json b/data/maps/FortreeCity_PokemonCenter_1F/map.json index e28907ad4b..6b64978d15 100644 --- a/data/maps/FortreeCity_PokemonCenter_1F/map.json +++ b/data/maps/FortreeCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FORTREE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/FortreeCity_PokemonCenter_1F/scripts.inc b/data/maps/FortreeCity_PokemonCenter_1F/scripts.inc index d1ea3d8648..2cc62201e1 100644 --- a/data/maps/FortreeCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/FortreeCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - FortreeCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FortreeCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -10,7 +8,7 @@ FortreeCity_PokemonCenter_1F_OnTransition: end FortreeCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_FORTREE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/GraniteCave_StevensRoom/map.json b/data/maps/GraniteCave_StevensRoom/map.json index 280af56c81..9529a999e2 100644 --- a/data/maps/GraniteCave_StevensRoom/map.json +++ b/data/maps/GraniteCave_StevensRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_GRANITE_CAVE_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 7, "y": 8, diff --git a/data/maps/GraniteCave_StevensRoom/scripts.inc b/data/maps/GraniteCave_StevensRoom/scripts.inc index eb32c26293..f9d2908f8f 100644 --- a/data/maps/GraniteCave_StevensRoom/scripts.inc +++ b/data/maps/GraniteCave_StevensRoom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_STEVEN, 1 - GraniteCave_StevensRoom_MapScripts:: .byte 0 @@ -29,24 +27,24 @@ GraniteCave_StevensRoom_EventScript_Steven:: call_if_eq VAR_FACING, DIR_WEST, GraniteCave_StevensRoom_EventScript_StevenExitWestEast call_if_eq VAR_FACING, DIR_EAST, GraniteCave_StevensRoom_EventScript_StevenExitWestEast playse SE_EXIT - removeobject LOCALID_STEVEN + removeobject LOCALID_GRANITE_CAVE_STEVEN release end GraniteCave_StevensRoom_EventScript_StevenExitNorth:: - applymovement LOCALID_STEVEN, GraniteCave_StevensRoom_Movement_StevenExit + applymovement LOCALID_GRANITE_CAVE_STEVEN, GraniteCave_StevensRoom_Movement_StevenExit waitmovement 0 return GraniteCave_StevensRoom_EventScript_StevenExitWestEast:: applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit - applymovement LOCALID_STEVEN, GraniteCave_StevensRoom_Movement_StevenExit + applymovement LOCALID_GRANITE_CAVE_STEVEN, GraniteCave_StevensRoom_Movement_StevenExit waitmovement 0 return GraniteCave_StevensRoom_EventScript_StevenExitSouth:: applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit - applymovement LOCALID_STEVEN, GraniteCave_StevensRoom_Movement_StevenExitSouth + applymovement LOCALID_GRANITE_CAVE_STEVEN, GraniteCave_StevensRoom_Movement_StevenExitSouth waitmovement 0 return diff --git a/data/maps/InsideOfTruck/map.json b/data/maps/InsideOfTruck/map.json index 4b027853ad..f767ddf43f 100644 --- a/data/maps/InsideOfTruck/map.json +++ b/data/maps/InsideOfTruck/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRUCK_BOX_TOP", "graphics_id": "OBJ_EVENT_GFX_MOVING_BOX", "x": 0, "y": 0, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRUCK_BOX_BOTTOM_L", "graphics_id": "OBJ_EVENT_GFX_MOVING_BOX", "x": 0, "y": 3, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRUCK_BOX_BOTTOM_R", "graphics_id": "OBJ_EVENT_GFX_MOVING_BOX", "x": 2, "y": 3, diff --git a/data/maps/JaggedPass/map.json b/data/maps/JaggedPass/map.json index ba4cdf3e0e..59d0663574 100644 --- a/data/maps/JaggedPass/map.json +++ b/data/maps/JaggedPass/map.json @@ -67,6 +67,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_GUARD", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 16, "y": 19, diff --git a/data/maps/JaggedPass/scripts.inc b/data/maps/JaggedPass/scripts.inc index f969a4dec6..76cd9527b1 100644 --- a/data/maps/JaggedPass/scripts.inc +++ b/data/maps/JaggedPass/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_HIDEOUT_GUARD, 5 - JaggedPass_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, JaggedPass_OnResume map_script MAP_SCRIPT_ON_TRANSITION, JaggedPass_OnTransition @@ -69,27 +67,27 @@ JaggedPass_EventScript_MagmaHideoutGuard:: goto_if_set FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS, JaggedPass_EventScript_GuardDefeated waitse playse SE_PIN - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_ExclamationMark + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_Delay48 + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_FacePlayer + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_FacePlayer waitmovement 0 msgbox JaggedPass_Text_GruntIntro, MSGBOX_DEFAULT closemessage trainerbattle_no_intro TRAINER_GRUNT_JAGGED_PASS, JaggedPass_Text_GruntDefeat setflag FLAG_BEAT_MAGMA_GRUNT_JAGGED_PASS - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end JaggedPass_EventScript_GuardDefeated:: - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_FacePlayer + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_FacePlayer waitmovement 0 msgbox JaggedPass_Text_GoWhereverYouWant, MSGBOX_DEFAULT closemessage - applymovement LOCALID_HIDEOUT_GUARD, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MAGMA_HIDEOUT_GUARD, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end diff --git a/data/maps/LavaridgeTown_Gym_1F/map.json b/data/maps/LavaridgeTown_Gym_1F/map.json index dc30c6ea9c..5dc1ebeaa3 100644 --- a/data/maps/LavaridgeTown_Gym_1F/map.json +++ b/data/maps/LavaridgeTown_Gym_1F/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_COLE", "graphics_id": "OBJ_EVENT_GFX_MAN_5", "x": 3, "y": 14, @@ -41,6 +42,7 @@ "flag": "0" }, { + "local_id": "LOCALID_GERALD", "graphics_id": "OBJ_EVENT_GFX_MAN_3", "x": 2, "y": 15, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_AXLE", "graphics_id": "OBJ_EVENT_GFX_MAN_5", "x": 3, "y": 10, @@ -67,6 +70,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DANIELLE", "graphics_id": "OBJ_EVENT_GFX_GIRL_3", "x": 5, "y": 2, diff --git a/data/maps/LavaridgeTown_Gym_1F/scripts.inc b/data/maps/LavaridgeTown_Gym_1F/scripts.inc index b7db13f54a..e1b522214f 100644 --- a/data/maps/LavaridgeTown_Gym_1F/scripts.inc +++ b/data/maps/LavaridgeTown_Gym_1F/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_COLE, 2 -.set LOCALID_GERALD, 3 -.set LOCALID_AXLE, 4 -.set LOCALID_DANIELLE, 5 - LavaridgeTown_Gym_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavaridgeTown_Gym_1F_OnTransition .byte 0 diff --git a/data/maps/LavaridgeTown_Gym_B1F/map.json b/data/maps/LavaridgeTown_Gym_B1F/map.json index b90802b173..b7f29174c4 100644 --- a/data/maps/LavaridgeTown_Gym_B1F/map.json +++ b/data/maps/LavaridgeTown_Gym_B1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_JACE", "graphics_id": "OBJ_EVENT_GFX_MAN_5", "x": 4, "y": 18, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_KEEGAN", "graphics_id": "OBJ_EVENT_GFX_MAN_5", "x": 3, "y": 6, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_JEFF", "graphics_id": "OBJ_EVENT_GFX_MAN_5", "x": 13, "y": 17, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ELI", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 4, "y": 16, diff --git a/data/maps/LavaridgeTown_Gym_B1F/scripts.inc b/data/maps/LavaridgeTown_Gym_B1F/scripts.inc index 3a9165bb16..d6558a47a6 100644 --- a/data/maps/LavaridgeTown_Gym_B1F/scripts.inc +++ b/data/maps/LavaridgeTown_Gym_B1F/scripts.inc @@ -1,8 +1,3 @@ -.equ LOCALID_JACE, 1 -.equ LOCALID_KEEGAN, 2 -.equ LOCALID_JEFF, 3 -.equ LOCALID_ELI, 4 - LavaridgeTown_Gym_B1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavaridgeTown_Gym_B1F_OnTransition .byte 0 diff --git a/data/maps/LavaridgeTown_Mart/map.json b/data/maps/LavaridgeTown_Mart/map.json index 82078a3827..0105c0d560 100644 --- a/data/maps/LavaridgeTown_Mart/map.json +++ b/data/maps/LavaridgeTown_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_LAVARIDGE_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/LilycoveCity_ContestLobby/map.json b/data/maps/LilycoveCity_ContestLobby/map.json index 276b5a6c2c..220a4f8300 100644 --- a/data/maps/LilycoveCity_ContestLobby/map.json +++ b/data/maps/LilycoveCity_ContestLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_CONTEST_LOBBY_RECEPTIONIST", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 14, "y": 2, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 15, "y": 2, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_BLENDER_2_LEADER", "graphics_id": "OBJ_EVENT_GFX_MAN_4", "x": 26, "y": 9, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_ARTIST", "graphics_id": "OBJ_EVENT_GFX_ARTIST", "x": 9, "y": 1, @@ -119,6 +123,7 @@ "flag": "FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER" }, { + "local_id": "LOCALID_CONTEST_LOBBY_BLENDER_3_PARTICIPANT_1", "graphics_id": "OBJ_EVENT_GFX_BOY_1", "x": 23, "y": 8, @@ -132,6 +137,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_BLENDER_2_PARTICIPANT", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 28, "y": 9, @@ -145,6 +151,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_LINK_ARTIST", "graphics_id": "OBJ_EVENT_GFX_ARTIST", "x": 21, "y": 1, @@ -197,6 +204,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CONTEST_LOBBY_BLENDER_3_LEADER", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_F", "x": 22, "y": 9, @@ -210,6 +218,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BLEND_MASTER", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 26, "y": 5, @@ -223,6 +232,7 @@ "flag": "FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER_REPLACEMENT" }, { + "local_id": "LOCALID_CONTEST_LOBBY_BLENDER_3_PARTICIPANT_2", "graphics_id": "OBJ_EVENT_GFX_GIRL_1", "x": 24, "y": 9, diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index fa884a0966..4ea1b9eee9 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -1,9 +1,3 @@ -@ Note: data/scripts/berry_blender.inc is for the same map, so shares local IDs -.set LOCALID_RECEPTIONIST, 1 -.set LOCALID_LINK_RECEPTIONIST, 2 -.set LOCALID_ARTIST, 4 -.set LOCALID_ARTIST_LINK, 11 - LilycoveCity_ContestLobby_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LilycoveCity_ContestLobby_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, LilycoveCity_ContestLobby_OnFrame @@ -40,9 +34,9 @@ LilycoveCity_ContestLobby_EventScript_TryDoContestArtist:: LilycoveCity_ContestLobby_EventScript_ContestArtist:: lockall - addobject LOCALID_ARTIST - applymovement LOCALID_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistApproachPlayer - waitmovement LOCALID_ARTIST + addobject LOCALID_CONTEST_LOBBY_ARTIST + applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistApproachPlayer + waitmovement LOCALID_CONTEST_LOBBY_ARTIST applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceArtist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT @@ -63,9 +57,9 @@ LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseum:: setvar VAR_LILYCOVE_CONTEST_LOBBY_STATE, 0 specialvar VAR_RESULT, GiveMonArtistRibbon call_if_eq VAR_RESULT, TRUE, LilycoveCity_ContestLobby_EventScript_ReceivedArtistRibbon - applymovement LOCALID_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistExit + applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistExit waitmovement 0 - removeobject LOCALID_ARTIST + removeobject LOCALID_CONTEST_LOBBY_ARTIST call LilycoveCity_ContestLobby_EventScript_UpdateMuseumPatrons call LilycoveCity_ContestLobby_EventScript_SetPaintingFlag releaseall @@ -76,22 +70,22 @@ LilycoveCity_ContestLobby_EventScript_ConfirmDontTakePainting:: goto_if_eq VAR_RESULT, YES, LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseum msgbox LilycoveCity_ContestLobby_Text_FineThatsTheWayItIs, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistExit + applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistExit waitmovement 0 setvar VAR_LILYCOVE_CONTEST_LOBBY_STATE, 0 - removeobject LOCALID_ARTIST + removeobject LOCALID_CONTEST_LOBBY_ARTIST releaseall end LilycoveCity_ContestLobby_EventScript_ReceivedArtistRibbon:: incrementgamestat GAME_STAT_RECEIVED_RIBBONS special BufferContestWinnerMonName - applymovement LOCALID_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistBeginToExit + applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistBeginToExit waitmovement 0 playse SE_PIN - applymovement LOCALID_ARTIST, Common_Movement_ExclamationMark + applymovement LOCALID_CONTEST_LOBBY_ARTIST, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistReturnToPlayer + applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistReturnToPlayer waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_TakeMementoOfPainting, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_ITEM @@ -210,9 +204,9 @@ LilycoveCity_ContestLobby_EventScript_TryDoLinkContestArtist:: LilycoveCity_ContestLobby_EventScript_LinkContestArtist:: lockall - addobject LOCALID_ARTIST_LINK - applymovement LOCALID_ARTIST_LINK, LilycoveCity_ContestLobby_Movement_LinkArtistApproachPlayer - waitmovement LOCALID_ARTIST_LINK + addobject LOCALID_CONTEST_LOBBY_LINK_ARTIST + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistApproachPlayer + waitmovement LOCALID_CONTEST_LOBBY_LINK_ARTIST applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceLinkArtist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT @@ -231,9 +225,9 @@ LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseumLink:: setvar VAR_LILYCOVE_CONTEST_LOBBY_STATE, 0 specialvar VAR_RESULT, GiveMonArtistRibbon call_if_eq VAR_RESULT, TRUE, LilycoveCity_ContestLobby_EventScript_ReceivedLinkArtistRibbon - applymovement LOCALID_ARTIST_LINK, LilycoveCity_ContestLobby_Movement_LinkArtistExit + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistExit waitmovement 0 - removeobject LOCALID_ARTIST_LINK + removeobject LOCALID_CONTEST_LOBBY_LINK_ARTIST call LilycoveCity_ContestLobby_EventScript_UpdateMuseumPatrons call LilycoveCity_ContestLobby_EventScript_SetPaintingFlag releaseall @@ -244,10 +238,10 @@ LilycoveCity_ContestLobby_EventScript_ConfirmDontTakePaintingLink:: goto_if_eq VAR_RESULT, YES, LilycoveCity_ContestLobby_EventScript_TakePaintingToMuseumLink msgbox LilycoveCity_ContestLobby_Text_FineThatsTheWayItIs, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARTIST_LINK, LilycoveCity_ContestLobby_Movement_LinkArtistExit + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistExit waitmovement 0 setvar VAR_LILYCOVE_CONTEST_LOBBY_STATE, 0 - removeobject LOCALID_ARTIST_LINK + removeobject LOCALID_CONTEST_LOBBY_LINK_ARTIST releaseall end @@ -255,12 +249,12 @@ LilycoveCity_ContestLobby_EventScript_ReceivedLinkArtistRibbon:: incrementgamestat GAME_STAT_RECEIVED_RIBBONS setflag FLAG_SYS_RIBBON_GET special BufferContestWinnerMonName - applymovement LOCALID_ARTIST_LINK, LilycoveCity_ContestLobby_Movement_LinkArtistBeginExit + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistBeginExit waitmovement 0 playse SE_PIN - applymovement LOCALID_ARTIST_LINK, Common_Movement_ExclamationMark + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_ARTIST_LINK, LilycoveCity_ContestLobby_Movement_LinkArtistReturnToPlayer + applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistReturnToPlayer waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_TakeMementoOfPainting, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_ITEM @@ -405,26 +399,26 @@ LilycoveCity_ContestLobby_EventScript_WarpToToughContestHall:: LilycoveCity_ContestLobby_EventScript_LeadToContestHall:: lockall - applymovement LOCALID_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistApproachCounter + applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistApproachCounter waitmovement 0 playse SE_BRIDGE_WALK setmetatile 12, 2, METATILE_Contest_WallShadow, TRUE setmetatile 12, 3, METATILE_Contest_FloorShadow, TRUE special DrawWholeMapView - applymovement LOCALID_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistExitCounter + applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistExitCounter waitmovement 0 playse SE_BRIDGE_WALK setmetatile 12, 2, METATILE_Contest_CounterFlap_Top, TRUE setmetatile 12, 3, METATILE_Contest_CounterFlap_Bottom, TRUE special DrawWholeMapView delay 20 - applymovement LOCALID_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistFacePlayer + applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistFacePlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachReceptionist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_ComeThroughHere, MSGBOX_DEFAULT closemessage - applymovement LOCALID_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistWalkToContestHall + applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistWalkToContestHall applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToContestHall waitmovement 0 releaseall @@ -896,20 +890,20 @@ LilycoveCity_ContestLobby_EventScript_LeadToLinkContestHall:: waitmessage delay 20 closemessage - applymovement LOCALID_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistApproachCounter + applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistApproachCounter waitmovement 0 playse SE_BRIDGE_WALK setmetatile 17, 2, METATILE_Contest_WallShadow, TRUE setmetatile 17, 3, METATILE_Contest_FloorShadow, TRUE special DrawWholeMapView - applymovement LOCALID_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistExitCounter + applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistExitCounter waitmovement 0 playse SE_BRIDGE_WALK setmetatile 17, 2, METATILE_Contest_CounterFlap_Top, TRUE setmetatile 17, 3, METATILE_Contest_CounterFlap_Bottom, TRUE special DrawWholeMapView delay 20 - applymovement LOCALID_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistFacePlayer + applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistFacePlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachLinkReceptionist waitmovement 0 @@ -918,7 +912,7 @@ LilycoveCity_ContestLobby_EventScript_LeadToLinkContestHall:: delay 20 closemessage call LilycoveCity_ContestLobby_EventScript_DelayIfContestWithRSPlayer - applymovement LOCALID_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistWalkToContestHall + applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistWalkToContestHall applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToLinkContestHall waitmovement 0 release diff --git a/data/maps/LilycoveCity_DepartmentStore_1F/map.json b/data/maps/LilycoveCity_DepartmentStore_1F/map.json index 951777f8f4..98c58a1bad 100644 --- a/data/maps/LilycoveCity_DepartmentStore_1F/map.json +++ b/data/maps/LilycoveCity_DepartmentStore_1F/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LOTTERY_CLERK", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "x": 10, "y": 2, diff --git a/data/maps/LilycoveCity_DepartmentStore_1F/scripts.inc b/data/maps/LilycoveCity_DepartmentStore_1F/scripts.inc index b0656cfd4a..32b5f592f8 100644 --- a/data/maps/LilycoveCity_DepartmentStore_1F/scripts.inc +++ b/data/maps/LilycoveCity_DepartmentStore_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_LOTTERY_CLERK, 2 - LilycoveCity_DepartmentStore_1F_MapScripts:: .byte 0 diff --git a/data/maps/LilycoveCity_MoveDeletersHouse/map.json b/data/maps/LilycoveCity_MoveDeletersHouse/map.json index 29c6f3636e..f10630570a 100644 --- a/data/maps/LilycoveCity_MoveDeletersHouse/map.json +++ b/data/maps/LilycoveCity_MoveDeletersHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MOVE_DELETER", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 4, "y": 4, diff --git a/data/maps/LilycoveCity_MoveDeletersHouse/scripts.inc b/data/maps/LilycoveCity_MoveDeletersHouse/scripts.inc index db042653e1..b8d21d5e28 100644 --- a/data/maps/LilycoveCity_MoveDeletersHouse/scripts.inc +++ b/data/maps/LilycoveCity_MoveDeletersHouse/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_MOVE_DELETER, 1 - LilycoveCity_MoveDeletersHouse_MapScripts:: .byte 0 diff --git a/data/maps/LilycoveCity_PokemonCenter_1F/map.json b/data/maps/LilycoveCity_PokemonCenter_1F/map.json index 595b5af54b..8eb6312fb2 100644 --- a/data/maps/LilycoveCity_PokemonCenter_1F/map.json +++ b/data/maps/LilycoveCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_LILYCOVE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, @@ -54,6 +55,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LILYCOVE_LADY", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 1, "y": 3, @@ -67,6 +69,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LILYCOVE_LADYS_MON", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 2, "y": 3, diff --git a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc index a7f853afad..9273816d1f 100644 --- a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - LilycoveCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LilycoveCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -26,7 +24,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_ShowContestLadyMon:: end LilycoveCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_LILYCOVE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/LilycoveCity_PokemonTrainerFanClub/map.json b/data/maps/LilycoveCity_PokemonTrainerFanClub/map.json index ccd988bf3a..db0c31aa16 100644 --- a/data/maps/LilycoveCity_PokemonTrainerFanClub/map.json +++ b/data/maps/LilycoveCity_PokemonTrainerFanClub/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRAINER_FAN_CLUB_LASS", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 3, "y": 11, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_MAN", "graphics_id": "OBJ_EVENT_GFX_MAN_4", "x": 8, "y": 10, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_POKEFAN_M", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 6, "y": 11, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 5, "y": 8, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_NINJA_BOY", "graphics_id": "OBJ_EVENT_GFX_NINJA_BOY", "x": 7, "y": 11, @@ -80,6 +85,7 @@ "flag": "FLAG_HIDE_FANCLUB_LITTLE_BOY" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_BOY", "graphics_id": "OBJ_EVENT_GFX_BOY_2", "x": 1, "y": 9, @@ -93,6 +99,7 @@ "flag": "FLAG_HIDE_FANCLUB_BOY" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_WOMAN", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 3, "y": 10, @@ -106,6 +113,7 @@ "flag": "FLAG_HIDE_FANCLUB_LADY" }, { + "local_id": "LOCALID_TRAINER_FAN_CLUB_EXPERT_F", "graphics_id": "OBJ_EVENT_GFX_EXPERT_F", "x": 10, "y": 10, diff --git a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc index ba8001324a..27124b7f2d 100644 --- a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc +++ b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc @@ -1,12 +1,3 @@ -.set LOCALID_LASS, 1 -.set LOCALID_MAN, 2 -.set LOCALID_POKEFAN_M, 3 -.set LOCALID_LITTLE_GIRL, 4 -.set LOCALID_NINJA_BOY, 5 -.set LOCALID_BOY, 6 -.set LOCALID_WOMAN, 7 -.set LOCALID_EXPERT_F, 8 - LilycoveCity_PokemonTrainerFanClub_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, LilycoveCity_PokemonTrainerFanClub_OnFrame map_script MAP_SCRIPT_ON_TRANSITION, LilycoveCity_PokemonTrainerFanClub_OnTransition @@ -20,20 +11,20 @@ LilycoveCity_PokemonTrainerFanClub_OnFrame: LilycoveCity_PokemonTrainerFanClub_EventScript_MeetFirstFans:: lockall - applymovement LOCALID_LASS, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_TRAINER_FAN_CLUB_LASS, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox LilycoveCity_PokemonTrainerFanClub_Text_OhWowItsPlayer, MSGBOX_DEFAULT - applymovement LOCALID_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlWatchPlayer - applymovement LOCALID_MAN, LilycoveCity_PokemonTrainerFanClub_Movement_FanApproachPlayer + applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlWatchPlayer + applymovement LOCALID_TRAINER_FAN_CLUB_MAN, LilycoveCity_PokemonTrainerFanClub_Movement_FanApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox LilycoveCity_PokemonTrainerFanClub_Text_HeardAboutYouImYourFan, MSGBOX_DEFAULT - applymovement LOCALID_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlMoveCloserToPlayer + applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlMoveCloserToPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - applymovement LOCALID_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlHideFromPlayer + applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlHideFromPlayer waitmovement 0 setvar VAR_LILYCOVE_FAN_CLUB_STATE, 2 releaseall @@ -157,35 +148,35 @@ LilycoveCity_PokemonTrainerFanClub_EventScript_TrySetUpTVShow:: return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember1ToFarTable:: - setobjectxyperm LOCALID_LASS, 7, 5 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_LASS, 7, 5 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember2ToFarTable:: - setobjectxyperm LOCALID_POKEFAN_M, 3, 4 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_POKEFAN_M, 3, 4 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember3ToFarTable:: - setobjectxyperm LOCALID_LITTLE_GIRL, 7, 2 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, 7, 2 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember4ToFarTable:: - setobjectxyperm LOCALID_NINJA_BOY, 5, 5 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_NINJA_BOY, 5, 5 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember5ToFarTable:: - setobjectxyperm LOCALID_BOY, 5, 2 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_BOY, 5, 2 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember6ToFarTable:: - setobjectxyperm LOCALID_MAN, 8, 4 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_MAN, 8, 4 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember7ToFarTable:: - setobjectxyperm LOCALID_WOMAN, 3, 3 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_WOMAN, 3, 3 return LilycoveCity_PokemonTrainerFanClub_EventScript_MoveMember8ToFarTable:: - setobjectxyperm LOCALID_EXPERT_F, 8, 3 + setobjectxyperm LOCALID_TRAINER_FAN_CLUB_EXPERT_F, 8, 3 return LilycoveCity_PokemonTrainerFanClub_EventScript_SetFanMemberPositionsForFirstFanMeeting:: diff --git a/data/maps/LittlerootTown/map.json b/data/maps/LittlerootTown/map.json index 4cff63da09..e897b714a4 100644 --- a/data/maps/LittlerootTown/map.json +++ b/data/maps/LittlerootTown/map.json @@ -21,6 +21,7 @@ ], "object_events": [ { + "local_id": "LOCALID_LITTLEROOT_TWIN", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 16, "y": 10, @@ -60,6 +61,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LITTLEROOT_MOM", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 5, "y": 8, @@ -99,6 +101,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_TRUCK" }, { + "local_id": "LOCALID_LITTLEROOT_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 13, "y": 10, @@ -112,6 +115,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_RIVAL" }, { + "local_id": "LOCALID_LITTLEROOT_BIRCH", "graphics_id": "OBJ_EVENT_GFX_PROF_BIRCH", "x": 14, "y": 10, diff --git a/data/maps/LittlerootTown/scripts.inc b/data/maps/LittlerootTown/scripts.inc index 69961bf362..ed7caf127c 100644 --- a/data/maps/LittlerootTown/scripts.inc +++ b/data/maps/LittlerootTown/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_TWIN, 1 -.set LOCALID_MOM, 4 -.set LOCALID_RIVAL, 7 -.set LOCALID_BIRCH, 8 - LittlerootTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, LittlerootTown_OnFrame @@ -76,34 +71,34 @@ LittlerootTown_EventScript_SetExitedHouseAfterLatiSSTicketEvent:: return LittlerootTown_EventScript_MoveMomToMaysDoor:: - setobjectxyperm LOCALID_MOM, 14, 8 + setobjectxyperm LOCALID_LITTLEROOT_MOM, 14, 8 return LittlerootTown_EventScript_SetTwinPos:: goto_if_eq VAR_LITTLEROOT_TOWN_STATE, 0, LittlerootTown_EventScript_SetTwinGuardingRoutePos - setobjectxyperm LOCALID_TWIN, 10, 1 - setobjectmovementtype LOCALID_TWIN, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_LITTLEROOT_TWIN, 10, 1 + setobjectmovementtype LOCALID_LITTLEROOT_TWIN, MOVEMENT_TYPE_FACE_UP return LittlerootTown_EventScript_SetTwinGuardingRoutePos:: - setobjectxyperm LOCALID_TWIN, 7, 2 - setobjectmovementtype LOCALID_TWIN, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_LITTLEROOT_TWIN, 7, 2 + setobjectmovementtype LOCALID_LITTLEROOT_TWIN, MOVEMENT_TYPE_FACE_DOWN return LittlerootTown_EventScript_SetMomStandingInFrontOfDoorPos:: clearflag FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_DOWN + setobjectmovementtype LOCALID_LITTLEROOT_MOM, MOVEMENT_TYPE_FACE_DOWN checkplayergender call_if_eq VAR_RESULT, MALE, LittlerootTown_EventScript_SetMomInFrontOfDoorMale call_if_eq VAR_RESULT, FEMALE, LittlerootTown_EventScript_SetMomInFrontOfDoorFemale return LittlerootTown_EventScript_SetMomInFrontOfDoorMale:: - setobjectxyperm LOCALID_MOM, 5, 9 + setobjectxyperm LOCALID_LITTLEROOT_MOM, 5, 9 return LittlerootTown_EventScript_SetMomInFrontOfDoorFemale:: - setobjectxyperm LOCALID_MOM, 14, 9 + setobjectxyperm LOCALID_LITTLEROOT_MOM, 14, 9 return LittlerootTown_OnFrame: @@ -141,22 +136,22 @@ LittlerootTown_EventScript_GoInsideWithMom:: waitmovement 0 opendoor VAR_0x8004, VAR_0x8005 waitdooranim - addobject LOCALID_MOM - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitHouse + addobject LOCALID_LITTLEROOT_MOM + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitHouse waitmovement 0 closedoor VAR_0x8004, VAR_0x8005 waitdooranim delay 10 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerAtTruck + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerAtTruck waitmovement 0 msgbox LittlerootTown_Text_OurNewHomeLetsGoInside, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachDoor applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PlayerApproachDoor waitmovement 0 opendoor VAR_0x8004, VAR_0x8005 waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomEnterHouse + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomEnterHouse applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PlayerEnterHouse waitmovement 0 setflag FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE @@ -210,7 +205,7 @@ LittlerootTown_Movement_PlayerStepOffTruck: LittlerootTown_EventScript_BeginDexUpgradeScene:: lockall playse SE_PIN - applymovement LOCALID_BIRCH, Common_Movement_ExclamationMark + applymovement LOCALID_LITTLEROOT_BIRCH, Common_Movement_ExclamationMark waitmovement 0 delay 80 msgbox LittlerootTown_Text_BirchSomethingToShowYouAtLab, MSGBOX_DEFAULT @@ -229,21 +224,21 @@ LittlerootTown_OnWarp: .2byte 0 LittlerootTown_EventScript_SetRivalBirchPosForDexUpgrade:: - addobject LOCALID_BIRCH - addobject LOCALID_RIVAL + addobject LOCALID_LITTLEROOT_BIRCH + addobject LOCALID_LITTLEROOT_RIVAL checkplayergender goto_if_eq VAR_RESULT, MALE, LittlerootTown_EventScript_SetRivalBirchPosForDexUpgradeMale goto LittlerootTown_EventScript_SetRivalBirchPosForDexUpgradeFemale end LittlerootTown_EventScript_SetRivalBirchPosForDexUpgradeMale:: - setobjectxy LOCALID_RIVAL, 6, 10 - setobjectxy LOCALID_BIRCH, 5, 10 + setobjectxy LOCALID_LITTLEROOT_RIVAL, 6, 10 + setobjectxy LOCALID_LITTLEROOT_BIRCH, 5, 10 end LittlerootTown_EventScript_SetRivalBirchPosForDexUpgradeFemale:: - setobjectxy LOCALID_RIVAL, 13, 10 - setobjectxy LOCALID_BIRCH, 14, 10 + setobjectxy LOCALID_LITTLEROOT_RIVAL, 13, 10 + setobjectxy LOCALID_LITTLEROOT_BIRCH, 14, 10 end LittlerootTown_EventScript_FatMan:: @@ -268,7 +263,7 @@ LittlerootTown_EventScript_GoSaveBirch:: special GetPlayerBigGuyGirlString msgbox LittlerootTown_Text_CanYouGoSeeWhatsHappening, MSGBOX_DEFAULT closemessage - applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection + applymovement LOCALID_LITTLEROOT_TWIN, Common_Movement_FaceOriginalDirection waitmovement 0 setvar VAR_LITTLEROOT_TOWN_STATE, 2 release @@ -287,10 +282,10 @@ LittlerootTown_EventScript_GoodLuck:: LittlerootTown_EventScript_NeedPokemonTriggerLeft:: lockall - applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinApproachPlayerLeft + applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinApproachPlayerLeft waitmovement 0 call LittlerootTown_EventScript_DangerousWithoutPokemon - applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinReturnLeft + applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinReturnLeft waitmovement 0 releaseall end @@ -298,7 +293,7 @@ LittlerootTown_EventScript_NeedPokemonTriggerLeft:: LittlerootTown_EventScript_DangerousWithoutPokemon:: msgbox LittlerootTown_Text_IfYouGoInGrassPokemonWillJumpOut, MSGBOX_DEFAULT closemessage - applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinPushPlayerFromRoute + applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinPushPlayerFromRoute applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PushPlayerBackFromRoute waitmovement 0 msgbox LittlerootTown_Text_DangerousIfYouDontHavePokemon, MSGBOX_DEFAULT @@ -345,10 +340,10 @@ LittlerootTown_Movement_PushPlayerBackFromRoute: LittlerootTown_EventScript_NeedPokemonTriggerRight:: lockall - applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinApproachPlayerRight + applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinApproachPlayerRight waitmovement 0 call LittlerootTown_EventScript_DangerousWithoutPokemon - applymovement LOCALID_TWIN, LittlerootTown_Movement_TwinReturnRight + applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinReturnRight waitmovement 0 releaseall end @@ -379,14 +374,14 @@ LittlerootTown_Movement_TwinReturnRight: LittlerootTown_EventScript_GoSaveBirchTrigger:: lockall - applymovement LOCALID_TWIN, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_LITTLEROOT_TWIN, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 special GetPlayerBigGuyGirlString msgbox LittlerootTown_Text_CanYouGoSeeWhatsHappening, MSGBOX_DEFAULT closemessage - applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection + applymovement LOCALID_LITTLEROOT_TWIN, Common_Movement_FaceOriginalDirection waitmovement 0 setvar VAR_LITTLEROOT_TOWN_STATE, 2 releaseall @@ -435,14 +430,14 @@ LittlerootTown_EventScript_PlayersHouseSignFemale:: LittlerootTown_EventScript_GiveRunningShoesTrigger0:: lockall setvar VAR_0x8008, 0 - setobjectxy LOCALID_MOM, 10, 9 + setobjectxy LOCALID_LITTLEROOT_MOM, 10, 9 goto LittlerootTown_EventScript_GiveRunningShoesTrigger end LittlerootTown_EventScript_GiveRunningShoesTrigger1:: lockall setvar VAR_0x8008, 1 - setobjectxy LOCALID_MOM, 11, 9 + setobjectxy LOCALID_LITTLEROOT_MOM, 11, 9 goto LittlerootTown_EventScript_GiveRunningShoesTrigger end @@ -500,12 +495,12 @@ LittlerootTown_EventScript_SetHomeDoorCoordsFemale:: return LittlerootTown_EventScript_MomNoticePlayerMale:: - applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_LITTLEROOT_MOM, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return LittlerootTown_EventScript_MomNoticePlayerFemale:: - applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_LITTLEROOT_MOM, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return @@ -530,70 +525,70 @@ LittlerootTown_EventScript_MomApproachPlayerFemale:: LittlerootTown_EventScript_MomApproachPlayer0:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayer0 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayer0 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayer1:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayer1 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayer1 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale2:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerMale2 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale2 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale3:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerMale3 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale3 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale4:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerMale4 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale4 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale5:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerMale5 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale5 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale2:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerFemale2 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale2 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale3:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerFemale3 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale3 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale4:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerFemale4 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale4 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale5:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement LOCALID_MOM, LittlerootTown_Movement_MomApproachPlayerFemale5 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale5 waitmovement 0 return @@ -616,107 +611,107 @@ LittlerootTown_EventScript_MomReturnHomeFemale:: return LittlerootTown_EventScript_MomReturnHome0:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHome0 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHome0 waitmovement 0 return LittlerootTown_EventScript_MomReturnHome1:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHome1 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHome1 waitmovement 0 return LittlerootTown_EventScript_MomReturnHomeMale2:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeMale2 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeMale2 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeMale3:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeMale3 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeMale3 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeMale4:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeMale4 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeMale4 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeMale5:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeMale5 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeMale5 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeFemale2:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeFemale2 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeFemale2 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeFemale3:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeFemale3 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeFemale3 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeFemale4:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeFemale4 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeFemale4 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return LittlerootTown_EventScript_MomReturnHomeFemale5:: - applymovement LOCALID_MOM, LittlerootTown_Movement_MomReturnHomeFemale5 + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomReturnHomeFemale5 waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim return @@ -878,20 +873,20 @@ LittlerootTown_EventScript_Mom:: call_if_eq VAR_RESULT, MALE, LittlerootTown_EventScript_SetHomeDoorCoordsMale call_if_eq VAR_RESULT, FEMALE, LittlerootTown_EventScript_SetHomeDoorCoordsFemale call LittlerootTown_EventScript_GiveRunningShoes - applymovement LOCALID_MOM, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_LITTLEROOT_MOM, Common_Movement_WalkInPlaceFasterUp waitmovement 0 opendoor VAR_0x8009, VAR_0x800A waitdooranim - applymovement LOCALID_MOM, LittlerootTown_Movement_MomExitThroughDoor + applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomExitThroughDoor waitmovement 0 - hideobjectat LOCALID_MOM, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_LITTLEROOT_MOM, MAP_LITTLEROOT_TOWN closedoor VAR_0x8009, VAR_0x800A waitdooranim goto LittlerootTown_EventScript_SetReceivedRunningShoes end LittlerootTown_EventScript_SetReceivedRunningShoes:: - removeobject LOCALID_MOM + removeobject LOCALID_LITTLEROOT_MOM setflag FLAG_SYS_B_DASH setvar VAR_LITTLEROOT_TOWN_STATE, 4 release diff --git a/data/maps/LittlerootTown_BrendansHouse_1F/map.json b/data/maps/LittlerootTown_BrendansHouse_1F/map.json index 23b1bf28c6..d8f2f818e1 100644 --- a/data/maps/LittlerootTown_BrendansHouse_1F/map.json +++ b/data/maps/LittlerootTown_BrendansHouse_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PLAYERS_HOUSE_1F_MOM", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 2, "y": 6, @@ -54,6 +55,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_1" }, { + "local_id": "LOCALID_RIVALS_HOUSE_1F_MOM", "graphics_id": "OBJ_EVENT_GFX_WOMAN_4", "x": 2, "y": 7, @@ -67,6 +69,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_MOM" }, { + "local_id": "LOCALID_PLAYERS_HOUSE_1F_DAD", "graphics_id": "OBJ_EVENT_GFX_NORMAN", "x": 5, "y": 6, @@ -93,6 +96,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_SIBLING" }, { + "local_id": "LOCALID_RIVALS_HOUSE_1F_RIVAL", "graphics_id": "OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL", "x": 8, "y": 8, diff --git a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc index cce8cd59b9..7c98a43f23 100644 --- a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc +++ b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_MOM, 1 -.set LOCALID_RIVAL_MOM, 4 -.set LOCALID_RIVAL, 7 - LittlerootTown_BrendansHouse_1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, LittlerootTown_BrendansHouse_1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_BrendansHouse_1F_OnTransition @@ -34,18 +30,18 @@ LittlerootTown_BrendansHouse_1F_OnTransition: end LittlerootTown_BrendansHouse_1F_EventScript_MoveMomToStairs:: - setobjectxyperm LOCALID_MOM, 8, 4 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 8, 4 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return LittlerootTown_BrendansHouse_1F_EventScript_MoveMomToTV:: - setobjectxyperm LOCALID_MOM, 4, 5 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 4, 5 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return LittlerootTown_BrendansHouse_1F_EventScript_MoveMomToDoor:: - setobjectxyperm LOCALID_MOM, 9, 8 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 9, 8 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return @ Many of the below scripts have no gender check because they assume youre in the correct house @@ -63,7 +59,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_GoUpstairsToSetClock:: msgbox PlayersHouse_1F_Text_GoSetTheClock, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs - applymovement LOCALID_MOM, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs + applymovement LOCALID_PLAYERS_HOUSE_1F_MOM, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs waitmovement 0 warp MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 7, 1 waitstate @@ -76,7 +72,7 @@ LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs: LittlerootTown_BrendansHouse_1F_EventScript_EnterHouseMovingIn:: lockall - setvar VAR_0x8004, LOCALID_MOM + setvar VAR_0x8004, LOCALID_PLAYERS_HOUSE_1F_MOM setvar VAR_0x8005, MALE goto PlayersHouse_1F_EventScript_EnterHouseMovingIn end @@ -84,19 +80,19 @@ LittlerootTown_BrendansHouse_1F_EventScript_EnterHouseMovingIn:: LittlerootTown_BrendansHouse_1F_EventScript_PetalburgGymReport:: lockall setvar VAR_0x8004, MALE - setvar VAR_0x8005, LOCALID_MOM + setvar VAR_0x8005, LOCALID_PLAYERS_HOUSE_1F_MOM goto PlayersHouse_1F_EventScript_PetalburgGymReportMale end LittlerootTown_BrendansHouse_1F_EventScript_YoureNewNeighbor:: lockall playse SE_PIN - applymovement LOCALID_RIVAL_MOM, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL_MOM, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_RIVAL_MOM, LittlerootTown_BrendansHouse_1F_Movement_RivalMomApproach + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, LittlerootTown_BrendansHouse_1F_Movement_RivalMomApproach waitmovement 0 special GetRivalSonDaughterString msgbox RivalsHouse_1F_Text_OhYoureTheNewNeighbor, MSGBOX_DEFAULT @@ -116,7 +112,7 @@ LittlerootTown_BrendansHouse_1F_Movement_RivalMomApproach: LittlerootTown_BrendansHouse_1F_EventScript_GoSeeRoom:: lockall - setvar VAR_0x8004, LOCALID_MOM + setvar VAR_0x8004, LOCALID_PLAYERS_HOUSE_1F_MOM setvar VAR_0x8005, MALE applymovement VAR_0x8004, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 @@ -144,12 +140,12 @@ LittlerootTown_BrendansHouse_1F_EventScript_MeetRival2:: LittlerootTown_BrendansHouse_1F_EventScript_MeetRival:: playse SE_EXIT delay 10 - addobject LOCALID_RIVAL + addobject LOCALID_RIVALS_HOUSE_1F_RIVAL delay 30 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, Common_Movement_Delay48 waitmovement 0 call_if_ne VAR_0x8008, 1, LittlerootTown_BrendansHouse_1F_EventScript_PlayerFaceBrendan playbgm MUS_ENCOUNTER_BRENDAN, TRUE @@ -162,7 +158,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_MeetRival:: call_if_eq VAR_0x8008, 1, LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs1 call_if_eq VAR_0x8008, 2, LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs2 playse SE_EXIT - removeobject LOCALID_RIVAL + removeobject LOCALID_RIVALS_HOUSE_1F_RIVAL setflag FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_BRENDAN setflag FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F_POKE_BALL clearflag FLAG_HIDE_LITTLEROOT_TOWN_BRENDANS_HOUSE_RIVAL_BEDROOM @@ -180,17 +176,17 @@ LittlerootTown_BrendansHouse_1F_EventScript_PlayerFaceBrendan:: return LittlerootTown_BrendansHouse_1F_EventScript_BrendanApproachPlayer0:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer0 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer0 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanApproachPlayer1:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer1 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer1 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanApproachPlayer2:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer2 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer2 waitmovement 0 return @@ -222,19 +218,19 @@ LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer2: LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs0:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit0 - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs0 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs0 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs1:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit1 - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs1 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs1 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs2:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit2 - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs2 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs2 waitmovement 0 return diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/map.json b/data/maps/LittlerootTown_BrendansHouse_2F/map.json index 89869459c5..5bd46deeb9 100644 --- a/data/maps/LittlerootTown_BrendansHouse_2F/map.json +++ b/data/maps/LittlerootTown_BrendansHouse_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RIVALS_HOUSE_2F_RIVAL", "graphics_id": "OBJ_EVENT_GFX_RIVAL_BRENDAN_NORMAL", "x": 7, "y": 1, @@ -184,6 +185,7 @@ "flag": "FLAG_DECORATION_12" }, { + "local_id": "LOCALID_PLAYERS_HOUSE_2F_MOM", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 7, "y": 1, diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc index cd4d155192..abed328fba 100644 --- a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc +++ b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_RIVAL, 1 - LittlerootTown_BrendansHouse_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_BrendansHouse_2F_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, LittlerootTown_BrendansHouse_2F_OnWarp @@ -23,8 +21,8 @@ LittlerootTown_BrendansHouse_2F_EventScript_TryUpdateBrendanPos:: goto_if_eq VAR_RESULT, MALE, LittlerootTown_BrendansHouse_2F_EventScript_Ret @ Odd that the MaysHouse equivalent was used below instead goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 2, LittlerootTown_MaysHouse_2F_EventScript_Ret - setobjectxyperm LOCALID_RIVAL, 0, 2 - setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_RIVALS_HOUSE_2F_RIVAL, 0, 2 + setobjectmovementtype LOCALID_RIVALS_HOUSE_2F_RIVAL, MOVEMENT_TYPE_FACE_UP return LittlerootTown_BrendansHouse_2F_EventScript_Ret:: @@ -57,13 +55,13 @@ LittlerootTown_BrendansHouse_2F_EventScript_RivalsPokeBall:: LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendan:: delay 10 - addobject LOCALID_RIVAL - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanEnters + addobject LOCALID_RIVALS_HOUSE_2F_RIVAL + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanEnters waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, Common_Movement_Delay48 waitmovement 0 delay 10 playbgm MUS_ENCOUNTER_BRENDAN, TRUE @@ -81,49 +79,49 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendan:: end LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanNorth:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerNorth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanNorth - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCNorth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCNorth waitmovement 0 return LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanSouth:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerSouth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerSouth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanSouth - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCSouth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCSouth waitmovement 0 return LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanWest:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerWest + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerWest waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanWest - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCWest + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCWest waitmovement 0 return LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanEast:: - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerEast + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCEast + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCEast waitmovement 0 return diff --git a/data/maps/LittlerootTown_MaysHouse_1F/map.json b/data/maps/LittlerootTown_MaysHouse_1F/map.json index 4e4887003f..6fd26a9b96 100644 --- a/data/maps/LittlerootTown_MaysHouse_1F/map.json +++ b/data/maps/LittlerootTown_MaysHouse_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PLAYERS_HOUSE_1F_MOM", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 8, "y": 6, @@ -54,6 +55,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_PLAYERS_HOUSE_VIGOROTH_2" }, { + "local_id": "LOCALID_RIVALS_HOUSE_1F_MOM", "graphics_id": "OBJ_EVENT_GFX_WOMAN_4", "x": 8, "y": 7, @@ -67,6 +69,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_MOM" }, { + "local_id": "LOCALID_PLAYERS_HOUSE_1F_DAD", "graphics_id": "OBJ_EVENT_GFX_NORMAN", "x": 5, "y": 6, @@ -93,6 +96,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_SIBLING" }, { + "local_id": "LOCALID_RIVALS_HOUSE_1F_RIVAL", "graphics_id": "OBJ_EVENT_GFX_RIVAL_MAY_NORMAL", "x": 2, "y": 8, diff --git a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc index b4c4775c33..35feceefdf 100644 --- a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc +++ b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_MOM, 1 -.set LOCALID_RIVAL_MOM, 4 -.set LOCALID_RIVAL, 7 - LittlerootTown_MaysHouse_1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, LittlerootTown_MaysHouse_1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_MaysHouse_1F_OnTransition @@ -34,18 +30,18 @@ LittlerootTown_MaysHouse_1F_OnTransition: end LittlerootTown_MaysHouse_1F_EventScript_MoveMomToStairs:: - setobjectxyperm LOCALID_MOM, 2, 4 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 2, 4 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return LittlerootTown_MaysHouse_1F_EventScript_MoveMomToTV:: - setobjectxyperm LOCALID_MOM, 6, 5 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 6, 5 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return LittlerootTown_MaysHouse_1F_EventScript_MoveMomToDoor:: - setobjectxyperm LOCALID_MOM, 1, 8 - setobjectmovementtype LOCALID_MOM, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_PLAYERS_HOUSE_1F_MOM, 1, 8 + setobjectmovementtype LOCALID_PLAYERS_HOUSE_1F_MOM, MOVEMENT_TYPE_FACE_UP return @ Many of the below scripts have no gender check because they assume youre in the correct house @@ -62,7 +58,7 @@ LittlerootTown_MaysHouse_1F_EventScript_GoUpstairsToSetClock:: msgbox PlayersHouse_1F_Text_GoSetTheClock, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs - applymovement LOCALID_MOM, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs + applymovement LOCALID_PLAYERS_HOUSE_1F_MOM, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs waitmovement 0 warp MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 1, 1 waitstate @@ -75,7 +71,7 @@ LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs: LittlerootTown_MaysHouse_1F_EventScript_EnterHouseMovingIn:: lockall - setvar VAR_0x8004, LOCALID_MOM + setvar VAR_0x8004, LOCALID_PLAYERS_HOUSE_1F_MOM setvar VAR_0x8005, FEMALE goto PlayersHouse_1F_EventScript_EnterHouseMovingIn end @@ -83,19 +79,19 @@ LittlerootTown_MaysHouse_1F_EventScript_EnterHouseMovingIn:: LittlerootTown_MaysHouse_1F_EventScript_PetalburgGymReport:: lockall setvar VAR_0x8004, FEMALE - setvar VAR_0x8005, LOCALID_MOM + setvar VAR_0x8005, LOCALID_PLAYERS_HOUSE_1F_MOM goto PlayersHouse_1F_EventScript_PetalburgGymReportFemale end LittlerootTown_MaysHouse_1F_EventScript_YoureNewNeighbor:: lockall playse SE_PIN - applymovement LOCALID_RIVAL_MOM, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL_MOM, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_RIVAL_MOM, LittlerootTown_MaysHouse_1F_Movement_RivalMomApproach + applymovement LOCALID_RIVALS_HOUSE_1F_MOM, LittlerootTown_MaysHouse_1F_Movement_RivalMomApproach waitmovement 0 special GetRivalSonDaughterString msgbox RivalsHouse_1F_Text_OhYoureTheNewNeighbor, MSGBOX_DEFAULT @@ -149,7 +145,7 @@ RivalsHouse_1F_EventScript_RivalSibling:: LittlerootTown_MaysHouse_1F_EventScript_GoSeeRoom:: lockall - setvar VAR_0x8004, LOCALID_MOM + setvar VAR_0x8004, LOCALID_PLAYERS_HOUSE_1F_MOM setvar VAR_0x8005, FEMALE applymovement VAR_0x8004, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -177,12 +173,12 @@ LittlerootTown_MaysHouse_1F_EventScript_MeetRival2:: LittlerootTown_MaysHouse_1F_EventScript_MeetRival:: playse SE_EXIT delay 10 - addobject LOCALID_RIVAL + addobject LOCALID_RIVALS_HOUSE_1F_RIVAL delay 30 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, Common_Movement_Delay48 waitmovement 0 call_if_ne VAR_0x8008, 1, LittlerootTown_MaysHouse_1F_EventScript_PlayerFaceMay playbgm MUS_ENCOUNTER_MAY, TRUE @@ -195,7 +191,7 @@ LittlerootTown_MaysHouse_1F_EventScript_MeetRival:: call_if_eq VAR_0x8008, 1, LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs1 call_if_eq VAR_0x8008, 2, LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs2 playse SE_EXIT - removeobject LOCALID_RIVAL + removeobject LOCALID_RIVALS_HOUSE_1F_RIVAL setflag FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_MAY setflag FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_2F_POKE_BALL clearflag FLAG_HIDE_LITTLEROOT_TOWN_MAYS_HOUSE_RIVAL_BEDROOM @@ -213,17 +209,17 @@ LittlerootTown_MaysHouse_1F_EventScript_PlayerFaceMay:: return LittlerootTown_MaysHouse_1F_EventScript_MayApproachPlayer0:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer0 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer0 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayApproachPlayer1:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer1 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer1 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayApproachPlayer2:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer2 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer2 waitmovement 0 return @@ -255,19 +251,19 @@ LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer2: LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs0:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit0 - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs0 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs0 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs1:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit1 - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs1 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs1 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs2:: applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit2 - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs2 + applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs2 waitmovement 0 return diff --git a/data/maps/LittlerootTown_MaysHouse_2F/map.json b/data/maps/LittlerootTown_MaysHouse_2F/map.json index b852fc0400..8af2eae114 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/map.json +++ b/data/maps/LittlerootTown_MaysHouse_2F/map.json @@ -184,6 +184,7 @@ "flag": "FLAG_DECORATION_12" }, { + "local_id": "LOCALID_PLAYERS_HOUSE_2F_MOM", "graphics_id": "OBJ_EVENT_GFX_MOM", "x": 1, "y": 1, diff --git a/data/maps/LittlerootTown_ProfessorBirchsLab/map.json b/data/maps/LittlerootTown_ProfessorBirchsLab/map.json index d97c026bda..a701b4522d 100644 --- a/data/maps/LittlerootTown_ProfessorBirchsLab/map.json +++ b/data/maps/LittlerootTown_ProfessorBirchsLab/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BIRCHS_LAB_AIDE", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 9, "y": 8, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BIRCHS_LAB_BIRCH", "graphics_id": "OBJ_EVENT_GFX_PROF_BIRCH", "x": 6, "y": 4, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_BIRCH" }, { + "local_id": "LOCALID_BIRCHS_LAB_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 7, "y": 4, @@ -54,6 +57,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL" }, { + "local_id": "LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 6, "y": 8, @@ -67,6 +71,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_CYNDAQUIL" }, { + "local_id": "LOCALID_BIRCHS_LAB_TOTODILE_BALL", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 6, "y": 8, @@ -80,6 +85,7 @@ "flag": "FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_POKEBALL_TOTODILE" }, { + "local_id": "LOCALID_BIRCHS_LAB_CHIKORITA_BALL", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 6, "y": 8, diff --git a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc index 0c8a468ab0..22e5ac549e 100644 --- a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc +++ b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_AIDE, 1 -.set LOCALID_BIRCH, 2 -.set LOCALID_RIVAL, 3 -.set LOCALID_BALL_CYNDAQUIL, 4 -.set LOCALID_BALL_TOTODILE, 5 -.set LOCALID_BALL_CHIKORITA, 6 - LittlerootTown_ProfessorBirchsLab_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_ProfessorBirchsLab_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, LittlerootTown_ProfessorBirchsLab_OnWarp @@ -37,8 +30,8 @@ LittlerootTown_ProfessorBirchsLab_OnTransition: LittlerootTown_ProfessorBirchsLab_EventScript_CheckReadyForJohtoStarter:: specialvar VAR_RESULT, HasAllHoennMons goto_if_eq VAR_RESULT, TRUE, LittlerootTown_ProfessorBirchsLab_EventScript_SetReadyForJohtoStarter - setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_WANDER_UP_AND_DOWN - setobjectxyperm LOCALID_RIVAL, 5, 10 + setobjectmovementtype LOCALID_BIRCHS_LAB_RIVAL, MOVEMENT_TYPE_WANDER_UP_AND_DOWN + setobjectxyperm LOCALID_BIRCHS_LAB_RIVAL, 5, 10 end LittlerootTown_ProfessorBirchsLab_EventScript_SetReadyForJohtoStarter:: @@ -51,8 +44,8 @@ LittlerootTown_ProfessorBirchsLab_EventScript_SetJohtoStarterLayout:: LittlerootTown_ProfessorBirchsLab_EventScript_SetAfterJohtoStarterLayout:: setmaplayoutindex LAYOUT_LITTLEROOT_TOWN_PROFESSOR_BIRCHS_LAB_WITH_TABLE - setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_WANDER_UP_AND_DOWN - setobjectxyperm LOCALID_RIVAL, 5, 10 + setobjectmovementtype LOCALID_BIRCHS_LAB_RIVAL, MOVEMENT_TYPE_WANDER_UP_AND_DOWN + setobjectxyperm LOCALID_BIRCHS_LAB_RIVAL, 5, 10 end LittlerootTown_ProfessorBirchsLab_OnWarp: @@ -71,35 +64,35 @@ LittlerootTown_ProfessorBirchsLab_EventScript_SetPlayerPosForReceiveStarter:: LittlerootTown_ProfessorBirchsLab_EventScript_SetObjectPosForDexUpgrade:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH - addobject LOCALID_BIRCH - addobject LOCALID_RIVAL - turnobject LOCALID_RIVAL, DIR_NORTH - setobjectxy LOCALID_RIVAL, 5, 5 - turnobject LOCALID_BIRCH, DIR_SOUTH - setobjectxy LOCALID_BIRCH, 6, 4 - turnobject LOCALID_AIDE, DIR_EAST - setobjectxy LOCALID_AIDE, 10, 10 + addobject LOCALID_BIRCHS_LAB_BIRCH + addobject LOCALID_BIRCHS_LAB_RIVAL + turnobject LOCALID_BIRCHS_LAB_RIVAL, DIR_NORTH + setobjectxy LOCALID_BIRCHS_LAB_RIVAL, 5, 5 + turnobject LOCALID_BIRCHS_LAB_BIRCH, DIR_SOUTH + setobjectxy LOCALID_BIRCHS_LAB_BIRCH, 6, 4 + turnobject LOCALID_BIRCHS_LAB_AIDE, DIR_EAST + setobjectxy LOCALID_BIRCHS_LAB_AIDE, 10, 10 end LittlerootTown_ProfessorBirchsLab_EventScript_AddRivalObject:: - addobject LOCALID_RIVAL + addobject LOCALID_BIRCHS_LAB_RIVAL end LittlerootTown_ProfessorBirchsLab_EventScript_SetObjectPosForJohtoStarters:: - addobject LOCALID_BALL_CYNDAQUIL - addobject LOCALID_BALL_TOTODILE - addobject LOCALID_BALL_CHIKORITA - addobject LOCALID_RIVAL - turnobject LOCALID_BALL_CYNDAQUIL, DIR_SOUTH - setobjectxy LOCALID_BALL_CYNDAQUIL, 8, 4 - turnobject LOCALID_BALL_TOTODILE, DIR_SOUTH - setobjectxy LOCALID_BALL_TOTODILE, 9, 4 - turnobject LOCALID_BALL_CHIKORITA, DIR_SOUTH - setobjectxy LOCALID_BALL_CHIKORITA, 10, 4 - turnobject LOCALID_BIRCH, DIR_SOUTH - setobjectxy LOCALID_BIRCH, 6, 4 - turnobject LOCALID_RIVAL, DIR_EAST - setobjectxy LOCALID_RIVAL, 5, 5 + addobject LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL + addobject LOCALID_BIRCHS_LAB_TOTODILE_BALL + addobject LOCALID_BIRCHS_LAB_CHIKORITA_BALL + addobject LOCALID_BIRCHS_LAB_RIVAL + turnobject LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL, DIR_SOUTH + setobjectxy LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL, 8, 4 + turnobject LOCALID_BIRCHS_LAB_TOTODILE_BALL, DIR_SOUTH + setobjectxy LOCALID_BIRCHS_LAB_TOTODILE_BALL, 9, 4 + turnobject LOCALID_BIRCHS_LAB_CHIKORITA_BALL, DIR_SOUTH + setobjectxy LOCALID_BIRCHS_LAB_CHIKORITA_BALL, 10, 4 + turnobject LOCALID_BIRCHS_LAB_BIRCH, DIR_SOUTH + setobjectxy LOCALID_BIRCHS_LAB_BIRCH, 6, 4 + turnobject LOCALID_BIRCHS_LAB_RIVAL, DIR_EAST + setobjectxy LOCALID_BIRCHS_LAB_RIVAL, 5, 5 end LittlerootTown_ProfessorBirchsLab_OnFrame: @@ -170,7 +163,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_UpgradeToNationalDex:: delay 30 msgbox LittlerootTown_ProfessorBirchsLab_Text_OtherRegionsUpgradeToNational, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BIRCH, LittlerootTown_ProfessorBirchsLab_Movement_BirchRetrievePokedexes + applymovement LOCALID_BIRCHS_LAB_BIRCH, LittlerootTown_ProfessorBirchsLab_Movement_BirchRetrievePokedexes waitmovement 0 delay 20 playse SE_CLICK @@ -181,7 +174,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_UpgradeToNationalDex:: delay 10 playse SE_CLICK delay 20 - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_BIRCHS_LAB_RIVAL, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 checkplayergender @@ -190,9 +183,9 @@ LittlerootTown_ProfessorBirchsLab_EventScript_UpgradeToNationalDex:: playse SE_PC_ON waitse delay 20 - applymovement LOCALID_BIRCH, LittlerootTown_ProfessorBirchsLab_Movement_BirchReturnPokedex + applymovement LOCALID_BIRCHS_LAB_BIRCH, LittlerootTown_ProfessorBirchsLab_Movement_BirchReturnPokedex waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_BIRCHS_LAB_RIVAL, Common_Movement_WalkInPlaceFasterUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox LittlerootTown_ProfessorBirchsLab_Text_OkayAllDone, MSGBOX_DEFAULT @@ -296,7 +289,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_AideReceivedStarter:: LittlerootTown_ProfessorBirchsLab_EventScript_Cyndaquil:: release goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 6, LittlerootTown_ProfessorBirchsLab_EventScript_AlreadyChoseJohtoStarter - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_BIRCHS_LAB_BIRCH, Common_Movement_WalkInPlaceFasterRight waitmovement 0 showmonpic SPECIES_CYNDAQUIL, 10, 3 msgbox LittlerootTown_ProfessorBirchsLab_Text_YoullTakeCyndaquil, MSGBOX_YESNO @@ -307,7 +300,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_Cyndaquil:: LittlerootTown_ProfessorBirchsLab_EventScript_Totodile:: release goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 6, LittlerootTown_ProfessorBirchsLab_EventScript_AlreadyChoseJohtoStarter - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_BIRCHS_LAB_BIRCH, Common_Movement_WalkInPlaceFasterRight waitmovement 0 showmonpic SPECIES_TOTODILE, 10, 3 msgbox LittlerootTown_ProfessorBirchsLab_Text_YoullTakeTotodile, MSGBOX_YESNO @@ -318,7 +311,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_Totodile:: LittlerootTown_ProfessorBirchsLab_EventScript_Chikorita:: release goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 6, LittlerootTown_ProfessorBirchsLab_EventScript_AlreadyChoseJohtoStarter - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_BIRCHS_LAB_BIRCH, Common_Movement_WalkInPlaceFasterRight waitmovement 0 showmonpic SPECIES_CHIKORITA, 10, 3 msgbox LittlerootTown_ProfessorBirchsLab_Text_YoullTakeChikorita, MSGBOX_YESNO @@ -349,7 +342,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_GiveCyndaquil:: LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToParty:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_CYNDAQUIL + removeobject LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedCyndaquil call Common_EventScript_GetGiftMonPartySlot @@ -359,7 +352,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToParty:: LittlerootTown_ProfessorBirchsLab_EventScript_SendCyndaquilToPC:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_CYNDAQUIL + removeobject LOCALID_BIRCHS_LAB_CYNDAQUIL_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_CyndaquilTransferredToPC call Common_EventScript_NameReceivedBoxMon @@ -390,7 +383,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_GiveTotodile:: LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToParty:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_TOTODILE + removeobject LOCALID_BIRCHS_LAB_TOTODILE_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedTotodile call Common_EventScript_GetGiftMonPartySlot @@ -400,7 +393,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToParty:: LittlerootTown_ProfessorBirchsLab_EventScript_SendTotodileToPC:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_TOTODILE + removeobject LOCALID_BIRCHS_LAB_TOTODILE_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_TotodileTransferredToPC call Common_EventScript_NameReceivedBoxMon @@ -431,7 +424,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_GiveChikorita:: LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToParty:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_CHIKORITA + removeobject LOCALID_BIRCHS_LAB_CHIKORITA_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedChikorita call Common_EventScript_GetGiftMonPartySlot @@ -441,7 +434,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToParty:: LittlerootTown_ProfessorBirchsLab_EventScript_SendChikoritaToPC:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivedJohtoStarter - removeobject LOCALID_BALL_CHIKORITA + removeobject LOCALID_BIRCHS_LAB_CHIKORITA_BALL msgbox gText_NicknameThisPokemon, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, LittlerootTown_ProfessorBirchsLab_EventScript_ChikoritaTransferredToPC call Common_EventScript_NameReceivedBoxMon @@ -515,7 +508,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_GivePokedex:: call LittlerootTown_ProfessorBirchsLab_EventScript_ReceivePokedex msgbox LittlerootTown_ProfessorBirchsLab_Text_ExplainPokedex, MSGBOX_DEFAULT closemessage - applymovement LOCALID_RIVAL, LittlerootTown_ProfessorBirchsLab_Movement_RivalApproachPlayer + applymovement LOCALID_BIRCHS_LAB_RIVAL, LittlerootTown_ProfessorBirchsLab_Movement_RivalApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index c123138dd5..b6340a2715 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -101,6 +101,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MAUVILLE_WALLY", "graphics_id": "OBJ_EVENT_GFX_WALLY", "x": 8, "y": 6, @@ -114,6 +115,7 @@ "flag": "FLAG_HIDE_MAUVILLE_CITY_WALLY" }, { + "local_id": "LOCALID_MAUVILLE_WALLYS_UNCLE", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 9, "y": 6, @@ -166,6 +168,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MAUVILLE_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 12, "y": 14, diff --git a/data/maps/MauvilleCity/scripts.inc b/data/maps/MauvilleCity/scripts.inc index 9211402705..1b91ef609d 100644 --- a/data/maps/MauvilleCity/scripts.inc +++ b/data/maps/MauvilleCity/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_WALLY, 6 -.set LOCALID_WALLYS_UNCLE, 7 -.set LOCALID_SCOTT, 11 - MauvilleCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MauvilleCity_OnTransition .byte 0 @@ -74,7 +70,7 @@ MauvilleCity_EventScript_WallysUncle:: goto_if_set FLAG_DECLINED_WALLY_BATTLE_MAUVILLE, MauvilleCity_EventScript_UncleAskPlayerToBattleWally msgbox MauvilleCity_Text_UncleHesTooPeppy, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WALLYS_UNCLE, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -82,7 +78,7 @@ MauvilleCity_EventScript_WallysUncle:: MauvilleCity_EventScript_UncleAskPlayerToBattleWally:: msgbox MauvilleCity_Text_UncleCanYouBattleWally, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WALLYS_UNCLE, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -90,17 +86,17 @@ MauvilleCity_EventScript_UncleAskPlayerToBattleWally:: MauvilleCity_EventScript_Wally:: lockall goto_if_set FLAG_DECLINED_WALLY_BATTLE_MAUVILLE, MauvilleCity_EventScript_WallyRequestBattleAgain - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox MauvilleCity_Text_WallyWantToChallengeGym, MSGBOX_DEFAULT msgbox MauvilleCity_Text_UncleYourePushingIt, MSGBOX_DEFAULT msgbox MauvilleCity_Text_WallyWeCanBeatAnyone, MSGBOX_DEFAULT - applymovement LOCALID_WALLY, Common_Movement_FacePlayer + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_FacePlayer waitmovement 0 playse SE_PIN - applymovement LOCALID_WALLY, Common_Movement_ExclamationMark + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_WALLY, Common_Movement_Delay48 + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_Delay48 waitmovement 0 msgbox MauvilleCity_Text_WallyWillYouBattleMe, MSGBOX_YESNO goto MauvilleCity_EventScript_BattleWallyPrompt @@ -117,46 +113,46 @@ MauvilleCity_EventScript_BattleWallyPrompt:: MauvilleCity_EventScript_WallyAndUncleExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth1 - applymovement LOCALID_WALLY, MauvilleCity_Movement_WallyExitNorth1 - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth1 + applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitNorth1 + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth1 waitmovement 0 - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerFaceUncleNorth - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleApproachPlayerNorth + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleApproachPlayerNorth waitmovement 0 msgbox MauvilleCity_Text_UncleVisitUsSometime, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth2 - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth2 - applymovement LOCALID_WALLY, MauvilleCity_Movement_WallyExitNorth2 + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth2 + applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitNorth2 waitmovement 0 goto MauvilleCity_EventScript_DefeatedWally end MauvilleCity_EventScript_WallyAndUncleExitEast:: applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast1 - applymovement LOCALID_WALLY, MauvilleCity_Movement_WallyExitEast1 - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast1 + applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitEast1 + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast1 waitmovement 0 - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleApproachPlayerEast + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleApproachPlayerEast waitmovement 0 msgbox MauvilleCity_Text_UncleVisitUsSometime, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast2 - applymovement LOCALID_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast2 - applymovement LOCALID_WALLY, MauvilleCity_Movement_WallyExitEast2 + applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast2 + applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitEast2 waitmovement 0 goto MauvilleCity_EventScript_DefeatedWally end MauvilleCity_EventScript_DefeatedWally:: - removeobject LOCALID_WALLY - removeobject LOCALID_WALLYS_UNCLE + removeobject LOCALID_MAUVILLE_WALLY + removeobject LOCALID_MAUVILLE_WALLYS_UNCLE clearflag FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLY clearflag FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WALLYS_UNCLE setflag FLAG_DEFEATED_WALLY_MAUVILLE @@ -171,45 +167,45 @@ MauvilleCity_EventScript_DefeatedWally:: addvar VAR_SCOTT_STATE, 1 call_if_eq VAR_FACING, DIR_NORTH, MauvilleCity_EventScript_ScottExitNorth call_if_eq VAR_FACING, DIR_EAST, MauvilleCity_EventScript_ScottExitEast - removeobject LOCALID_SCOTT + removeobject LOCALID_MAUVILLE_SCOTT releaseall end MauvilleCity_EventScript_ScottApproachPlayerNorth:: - addobject LOCALID_SCOTT - applymovement LOCALID_SCOTT, MauvilleCity_Movement_ScottApproachPlayerNorth + addobject LOCALID_MAUVILLE_SCOTT + applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottApproachPlayerNorth waitmovement 0 return MauvilleCity_EventScript_ScottApproachPlayerEast:: - setobjectxyperm LOCALID_SCOTT, 12, 13 - addobject LOCALID_SCOTT - applymovement LOCALID_SCOTT, MauvilleCity_Movement_ScottApproachPlayerEast + setobjectxyperm LOCALID_MAUVILLE_SCOTT, 12, 13 + addobject LOCALID_MAUVILLE_SCOTT + applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottApproachPlayerEast waitmovement 0 return MauvilleCity_EventScript_ScottExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitNorth - applymovement LOCALID_SCOTT, MauvilleCity_Movement_ScottExitNorth + applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottExitNorth waitmovement 0 return MauvilleCity_EventScript_ScottExitEast:: applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitEast - applymovement LOCALID_SCOTT, MauvilleCity_Movement_ScottExitEast + applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottExitEast waitmovement 0 return MauvilleCity_EventScript_BattleWally:: msgbox MauvilleCity_Text_WallyHereICome, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_WALLY_MAUVILLE, MauvilleCity_Text_WallyDefeat - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox MauvilleCity_Text_WallyIllGoBackToVerdanturf, MSGBOX_DEFAULT - applymovement LOCALID_WALLY, Common_Movement_FacePlayer + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_FacePlayer waitmovement 0 msgbox MauvilleCity_Text_ThankYouNotEnoughToBattle, MSGBOX_DEFAULT - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox MauvilleCity_Text_UncleNoNeedToBeDown, MSGBOX_DEFAULT return @@ -221,7 +217,7 @@ MauvilleCity_EventScript_DeclineWallyBattle:: end MauvilleCity_EventScript_WallyRequestBattleAgain:: - applymovement LOCALID_WALLY, Common_Movement_FacePlayer + applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_FacePlayer waitmovement 0 msgbox MauvilleCity_Text_WallyPleaseBattleMe, MSGBOX_YESNO goto MauvilleCity_EventScript_BattleWallyPrompt diff --git a/data/maps/MauvilleCity_Mart/map.json b/data/maps/MauvilleCity_Mart/map.json index 53ab6ce227..d48970d9ea 100644 --- a/data/maps/MauvilleCity_Mart/map.json +++ b/data/maps/MauvilleCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MAUVILLE_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/MauvilleCity_PokemonCenter_1F/map.json b/data/maps/MauvilleCity_PokemonCenter_1F/map.json index 1b0a401b84..490dee9efe 100644 --- a/data/maps/MauvilleCity_PokemonCenter_1F/map.json +++ b/data/maps/MauvilleCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCAL_ID_MAUVILLE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc b/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc index 463d652b3b..1d4a52b58c 100644 --- a/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - MauvilleCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MauvilleCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -16,7 +14,7 @@ MauvilleCity_PokemonCenter_1F_EventScript_SetMauvilleOldManGfx:: end MauvilleCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCAL_ID_MAUVILLE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/MossdeepCity_Mart/map.json b/data/maps/MossdeepCity_Mart/map.json index 9679df7892..dce4f7576c 100644 --- a/data/maps/MossdeepCity_Mart/map.json +++ b/data/maps/MossdeepCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MOSSDEEP_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/MossdeepCity_PokemonCenter_1F/map.json b/data/maps/MossdeepCity_PokemonCenter_1F/map.json index 72863244c7..db1471925a 100644 --- a/data/maps/MossdeepCity_PokemonCenter_1F/map.json +++ b/data/maps/MossdeepCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MOSSDEEP_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/MossdeepCity_PokemonCenter_1F/scripts.inc b/data/maps/MossdeepCity_PokemonCenter_1F/scripts.inc index bfd3561d26..da597f43b2 100644 --- a/data/maps/MossdeepCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/MossdeepCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - MossdeepCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -10,7 +8,7 @@ MossdeepCity_PokemonCenter_1F_OnTransition: end MossdeepCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_MOSSDEEP_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/map.json b/data/maps/MossdeepCity_SpaceCenter_2F/map.json index f68b5bfd3e..74d83a905f 100644 --- a/data/maps/MossdeepCity_SpaceCenter_2F/map.json +++ b/data/maps/MossdeepCity_SpaceCenter_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SPACE_CENTER_2F_RICH_BOY", "graphics_id": "OBJ_EVENT_GFX_RICH_BOY", "x": 6, "y": 2, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_2F_GENTLEMAN", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 11, "y": 8, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_2F_SCIENTIST", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 5, "y": 6, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_2F_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 1, "y": 8, @@ -67,6 +71,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_STEVEN" }, { + "local_id": "LOCALID_SPACE_CENTER_GRUNT_6", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 12, "y": 2, @@ -80,6 +85,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA" }, { + "local_id": "LOCALID_SPACE_CENTER_GRUNT_5", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 13, "y": 3, @@ -93,6 +99,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA" }, { + "local_id": "LOCALID_SPACE_CENTER_GRUNT_7", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 14, "y": 2, @@ -106,6 +113,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA" }, { + "local_id": "LOCALID_SPACE_CENTER_TABITHA", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 0, "y": 8, @@ -119,6 +127,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA" }, { + "local_id": "LOCALID_SPACE_CENTER_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 1, "y": 9, diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc index c82a33e78d..07888c6e43 100644 --- a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc @@ -1,14 +1,3 @@ -.set LOCALID_RICH_BOY, 1 -.set LOCALID_GENTLEMAN, 2 -.set LOCALID_SCIENTIST, 3 -.set LOCALID_STEVEN, 4 -@ Grunt names numbered like their Trainer values (which are for the full Space Center) -.set LOCALID_GRUNT_6, 5 -.set LOCALID_GRUNT_5, 6 -.set LOCALID_GRUNT_7, 7 -.set LOCALID_TABITHA, 8 -.set LOCALID_MAXIE, 9 - MossdeepCity_SpaceCenter_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_SpaceCenter_2F_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, MossdeepCity_SpaceCenter_2F_OnFrame @@ -21,18 +10,18 @@ MossdeepCity_SpaceCenter_2F_OnTransition: MossdeepCity_SpaceCenter_2F_EventScript_MoveCivilians:: clearflag FLAG_INTERACTED_WITH_STEVEN_SPACE_CENTER - setobjectxyperm LOCALID_SCIENTIST, 5, 3 - setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT - setobjectxyperm LOCALID_RICH_BOY, 3, 2 - setobjectmovementtype LOCALID_RICH_BOY, MOVEMENT_TYPE_FACE_RIGHT - setobjectxyperm LOCALID_GENTLEMAN, 1, 3 - setobjectmovementtype LOCALID_GENTLEMAN, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_2F_SCIENTIST, 5, 3 + setobjectmovementtype LOCALID_SPACE_CENTER_2F_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_2F_RICH_BOY, 3, 2 + setobjectmovementtype LOCALID_SPACE_CENTER_2F_RICH_BOY, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_2F_GENTLEMAN, 1, 3 + setobjectmovementtype LOCALID_SPACE_CENTER_2F_GENTLEMAN, MOVEMENT_TYPE_FACE_RIGHT return MossdeepCity_SpaceCenter_2F_EventScript_MoveDefeatedGrunts:: - setobjectxyperm LOCALID_GRUNT_6, 11, 2 - setobjectxyperm LOCALID_GRUNT_7, 15, 2 - setobjectxyperm LOCALID_GRUNT_5, 13, 4 + setobjectxyperm LOCALID_SPACE_CENTER_GRUNT_6, 11, 2 + setobjectxyperm LOCALID_SPACE_CENTER_GRUNT_7, 15, 2 + setobjectxyperm LOCALID_SPACE_CENTER_GRUNT_5, 13, 4 return MossdeepCity_SpaceCenter_2F_OnFrame: @@ -63,24 +52,24 @@ MossdeepCity_SpaceCenter_2F_Movement_PlayerExit: MossdeepCity_SpaceCenter_2F_EventScript_BattleThreeMagmaGrunts:: msgbox MossdeepCity_SpaceCenter_2F_Text_Grunt5Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_5, MossdeepCity_SpaceCenter_2F_Text_Grunt5Defeat - applymovement LOCALID_GRUNT_5, MossdeepCity_SpaceCenter_2F_Movement_Grunt5Defeated + applymovement LOCALID_SPACE_CENTER_GRUNT_5, MossdeepCity_SpaceCenter_2F_Movement_Grunt5Defeated waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox MossdeepCity_SpaceCenter_2F_Text_Grunt6Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_6, MossdeepCity_SpaceCenter_2F_Text_Grunt6Defeat - applymovement LOCALID_GRUNT_6, MossdeepCity_SpaceCenter_2F_Movement_Grunt6Defeated + applymovement LOCALID_SPACE_CENTER_GRUNT_6, MossdeepCity_SpaceCenter_2F_Movement_Grunt6Defeated waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox MossdeepCity_SpaceCenter_2F_Text_Grunt7Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_7, MossdeepCity_SpaceCenter_2F_Text_Grunt7Defeat - applymovement LOCALID_GRUNT_7, MossdeepCity_SpaceCenter_2F_Movement_Grunt7Defeated + applymovement LOCALID_SPACE_CENTER_GRUNT_7, MossdeepCity_SpaceCenter_2F_Movement_Grunt7Defeated waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STATE, 2 - copyobjectxytoperm LOCALID_GRUNT_6 - copyobjectxytoperm LOCALID_GRUNT_7 - copyobjectxytoperm LOCALID_GRUNT_5 + copyobjectxytoperm LOCALID_SPACE_CENTER_GRUNT_6 + copyobjectxytoperm LOCALID_SPACE_CENTER_GRUNT_7 + copyobjectxytoperm LOCALID_SPACE_CENTER_GRUNT_5 releaseall end @@ -198,13 +187,13 @@ MossdeepCity_SpaceCenter_2F_EventScript_Steven:: playse SE_NOT_EFFECTIVE switch VAR_FACING case DIR_SOUTH, MossdeepCity_SpaceCenter_2F_EventScript_StevenFightMovementSouth - applymovement LOCALID_STEVEN, MossdeepCity_SpaceCenter_2F_Movement_StevenFight + applymovement LOCALID_SPACE_CENTER_2F_STEVEN, MossdeepCity_SpaceCenter_2F_Movement_StevenFight waitmovement 0 releaseall end MossdeepCity_SpaceCenter_2F_EventScript_StevenFightMovementSouth:: - applymovement LOCALID_STEVEN, MossdeepCity_SpaceCenter_2F_Movement_StevenFightSouth + applymovement LOCALID_SPACE_CENTER_2F_STEVEN, MossdeepCity_SpaceCenter_2F_Movement_StevenFightSouth waitmovement 0 releaseall end @@ -275,12 +264,12 @@ MossdeepCity_SpaceCenter_2F_EventScript_DefeatedMaxieTabitha:: msgbox MossdeepCity_SpaceCenter_2F_Text_MaxieWeFailedIsAquaAlsoMisguided, MSGBOX_DEFAULT closemessage delay 20 - applymovement LOCALID_MAXIE, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_TABITHA, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SPACE_CENTER_MAXIE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SPACE_CENTER_TABITHA, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 60 - applymovement LOCALID_MAXIE, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_TABITHA, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SPACE_CENTER_MAXIE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SPACE_CENTER_TABITHA, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 20 msgbox MossdeepCity_SpaceCenter_2F_Text_MaxieWeWillGiveUp, MSGBOX_DEFAULT @@ -292,17 +281,17 @@ MossdeepCity_SpaceCenter_2F_EventScript_DefeatedMaxieTabitha:: setflag FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA setflag FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_2F_TEAM_MAGMA setflag FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA - removeobject LOCALID_GRUNT_6 - removeobject LOCALID_GRUNT_7 - removeobject LOCALID_GRUNT_5 - removeobject LOCALID_TABITHA - removeobject LOCALID_MAXIE - setobjectxy LOCALID_SCIENTIST, 5, 6 - turnobject LOCALID_SCIENTIST, DIR_SOUTH - setobjectxy LOCALID_GENTLEMAN, 11, 8 - turnobject LOCALID_GENTLEMAN, DIR_NORTH - setobjectxy LOCALID_RICH_BOY, 6, 2 - turnobject LOCALID_RICH_BOY, DIR_NORTH + removeobject LOCALID_SPACE_CENTER_GRUNT_6 + removeobject LOCALID_SPACE_CENTER_GRUNT_7 + removeobject LOCALID_SPACE_CENTER_GRUNT_5 + removeobject LOCALID_SPACE_CENTER_TABITHA + removeobject LOCALID_SPACE_CENTER_MAXIE + setobjectxy LOCALID_SPACE_CENTER_2F_SCIENTIST, 5, 6 + turnobject LOCALID_SPACE_CENTER_2F_SCIENTIST, DIR_SOUTH + setobjectxy LOCALID_SPACE_CENTER_2F_GENTLEMAN, 11, 8 + turnobject LOCALID_SPACE_CENTER_2F_GENTLEMAN, DIR_NORTH + setobjectxy LOCALID_SPACE_CENTER_2F_RICH_BOY, 6, 2 + turnobject LOCALID_SPACE_CENTER_2F_RICH_BOY, DIR_NORTH call MossdeepCity_SpaceCenter_2F_EventScript_StevenFacePlayer fadescreen FADE_FROM_BLACK msgbox MossdeepCity_SpaceCenter_2F_Text_StevenThankYouComeSeeMeAtHome, MSGBOX_DEFAULT @@ -310,15 +299,15 @@ MossdeepCity_SpaceCenter_2F_EventScript_DefeatedMaxieTabitha:: fadescreen FADE_TO_BLACK setflag FLAG_DEFEATED_MAGMA_SPACE_CENTER setflag FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN - removeobject LOCALID_STEVEN + removeobject LOCALID_SPACE_CENTER_2F_STEVEN setflag FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_MAGMA_NOTE clearflag FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN setvar VAR_STEVENS_HOUSE_STATE, 1 setflag FLAG_HIDE_MOSSDEEP_CITY_SCOTT - removeobject LOCALID_SCIENTIST - setobjectxyperm LOCALID_SCIENTIST, 5, 6 - setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_WANDER_AROUND - addobject LOCALID_SCIENTIST + removeobject LOCALID_SPACE_CENTER_2F_SCIENTIST + setobjectxyperm LOCALID_SPACE_CENTER_2F_SCIENTIST, 5, 6 + setobjectmovementtype LOCALID_SPACE_CENTER_2F_SCIENTIST, MOVEMENT_TYPE_WANDER_AROUND + addobject LOCALID_SPACE_CENTER_2F_SCIENTIST fadescreen FADE_FROM_BLACK #ifdef BUGFIX releaseall @@ -332,11 +321,11 @@ MossdeepCity_SpaceCenter_2F_EventScript_StevenFacePlayer:: return MossdeepCity_SpaceCenter_2F_EventScript_StevenFacePlayerSouth:: - turnobject LOCALID_STEVEN, DIR_NORTH + turnobject LOCALID_SPACE_CENTER_2F_STEVEN, DIR_NORTH return MossdeepCity_SpaceCenter_2F_EventScript_StevenFacePlayerWest:: - turnobject LOCALID_STEVEN, DIR_EAST + turnobject LOCALID_SPACE_CENTER_2F_STEVEN, DIR_EAST return MossdeepCity_SpaceCenter_2F_EventScript_MaxieTrainer:: diff --git a/data/maps/MossdeepCity_StevensHouse/map.json b/data/maps/MossdeepCity_StevensHouse/map.json index 3a864a67c9..330e92b635 100644 --- a/data/maps/MossdeepCity_StevensHouse/map.json +++ b/data/maps/MossdeepCity_StevensHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_STEVENS_HOUSE_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 9, "y": 6, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_STEVENS_HOUSE_STEVEN" }, { + "local_id": "LOCALID_STEVENS_HOUSE_BALL", "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", "x": 4, "y": 3, diff --git a/data/maps/MossdeepCity_StevensHouse/scripts.inc b/data/maps/MossdeepCity_StevensHouse/scripts.inc index 0f9255e5b6..cf69bfe8a2 100644 --- a/data/maps/MossdeepCity_StevensHouse/scripts.inc +++ b/data/maps/MossdeepCity_StevensHouse/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_STEVEN, 1 -.set LOCALID_BELDUM_BALL, 2 - MossdeepCity_StevensHouse_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, MossdeepCity_StevensHouse_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_StevensHouse_OnTransition @@ -20,8 +17,8 @@ MossdeepCity_StevensHouse_OnTransition: end MossdeepCity_StevensHouse_EventScript_SetStevenPos:: - setobjectxyperm LOCALID_STEVEN, 6, 5 - setobjectmovementtype LOCALID_STEVEN, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_STEVENS_HOUSE_STEVEN, 6, 5 + setobjectmovementtype LOCALID_STEVENS_HOUSE_STEVEN, MOVEMENT_TYPE_FACE_UP return MossdeepCity_StevensHouse_OnFrame: @@ -30,14 +27,14 @@ MossdeepCity_StevensHouse_OnFrame: MossdeepCity_StevensHouse_EventScript_StevenGivesDive:: lockall - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_STEVENS_HOUSE_STEVEN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_STEVEN, Common_Movement_ExclamationMark + applymovement LOCALID_STEVENS_HOUSE_STEVEN, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_STEVEN, Common_Movement_Delay48 + applymovement LOCALID_STEVENS_HOUSE_STEVEN, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_STEVEN, MossdeepCity_StevensHouse_Movement_StevenApproachPlayer + applymovement LOCALID_STEVENS_HOUSE_STEVEN, MossdeepCity_StevensHouse_Movement_StevenApproachPlayer waitmovement 0 msgbox MossdeepCity_StevensHouse_Text_YouveEarnedHMDive, MSGBOX_DEFAULT giveitem ITEM_HM_DIVE @@ -46,7 +43,7 @@ MossdeepCity_StevensHouse_EventScript_StevenGivesDive:: msgbox MossdeepCity_StevensHouse_Text_ExplainDive, MSGBOX_DEFAULT closemessage delay 20 - applymovement LOCALID_STEVEN, MossdeepCity_StevensHouse_Movement_StevenReturn + applymovement LOCALID_STEVENS_HOUSE_STEVEN, MossdeepCity_StevensHouse_Movement_StevenReturn waitmovement 0 setflag FLAG_HIDE_MOSSDEEP_CITY_SCOTT setflag FLAG_HIDE_SEAFLOOR_CAVERN_ENTRANCE_AQUA_GRUNT @@ -116,7 +113,7 @@ MossdeepCity_StevensHouse_EventScript_BeldumTransferredToPC:: MossdeepCity_StevensHouse_EventScript_ReceivedBeldumFanfare:: bufferspeciesname STR_VAR_2, SPECIES_BELDUM - removeobject LOCALID_BELDUM_BALL + removeobject LOCALID_STEVENS_HOUSE_BALL playfanfare MUS_OBTAIN_ITEM message MossdeepCity_StevensHouse_Text_ObtainedBeldum waitmessage diff --git a/data/maps/MtChimney_CableCarStation/map.json b/data/maps/MtChimney_CableCarStation/map.json index 5fe36a3735..be716e5b75 100644 --- a/data/maps/MtChimney_CableCarStation/map.json +++ b/data/maps/MtChimney_CableCarStation/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "x": 6, "y": 6, diff --git a/data/maps/MtChimney_CableCarStation/scripts.inc b/data/maps/MtChimney_CableCarStation/scripts.inc index b3e36a496a..e662716f63 100644 --- a/data/maps/MtChimney_CableCarStation/scripts.inc +++ b/data/maps/MtChimney_CableCarStation/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - MtChimney_CableCarStation_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtChimney_CableCarStation_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, MtChimney_CableCarStation_OnFrame @@ -10,8 +8,8 @@ MtChimney_CableCarStation_OnTransition: end MtChimney_CableCarStation_EventScript_MoveAttendantAside:: - setobjectxyperm LOCALID_ATTENDANT, 5, 4 - setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, 5, 4 + setobjectmovementtype LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MOVEMENT_TYPE_FACE_RIGHT return MtChimney_CableCarStation_OnFrame: @@ -21,11 +19,11 @@ MtChimney_CableCarStation_OnFrame: MtChimney_CableCarStation_EventScript_ExitCableCar:: lockall applymovement OBJ_EVENT_ID_PLAYER, MtChimney_CableCarStation_Movement_ExitCableCar - applymovement LOCALID_ATTENDANT, MtChimney_CableCarStation_Movement_FollowPlayerOutFromCableCar + applymovement LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MtChimney_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 - setobjectxyperm LOCALID_ATTENDANT, 6, 7 - setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, 6, 7 + setobjectmovementtype LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN releaseall end @@ -40,7 +38,7 @@ MtChimney_CableCarStation_EventScript_Attendant:: MtChimney_CableCarStation_EventScript_RideCableCar:: msgbox MtChimney_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, MtChimney_CableCarStation_Movement_LeadPlayerToCableCar + applymovement LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MtChimney_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, MtChimney_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, TRUE @ Going down diff --git a/data/maps/NavelRock_Bottom/map.json b/data/maps/NavelRock_Bottom/map.json index bd7ce3ffec..695465e21d 100644 --- a/data/maps/NavelRock_Bottom/map.json +++ b/data/maps/NavelRock_Bottom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_NAVEL_ROCK_LUGIA", "graphics_id": "OBJ_EVENT_GFX_LUGIA", "x": 11, "y": 13, diff --git a/data/maps/NavelRock_Bottom/scripts.inc b/data/maps/NavelRock_Bottom/scripts.inc index 90cc229895..24c06bf1a0 100644 --- a/data/maps/NavelRock_Bottom/scripts.inc +++ b/data/maps/NavelRock_Bottom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_LUGIA, 1 - NavelRock_Bottom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Bottom_OnTransition map_script MAP_SCRIPT_ON_RESUME, NavelRock_Bottom_OnResume @@ -26,7 +24,7 @@ NavelRock_Bottom_OnResume: NavelRock_Bottom_EventScript_TryRemoveLugia:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_LUGIA + removeobject LOCALID_NAVEL_ROCK_LUGIA return NavelRock_Bottom_EventScript_Lugia:: diff --git a/data/maps/NavelRock_Top/map.json b/data/maps/NavelRock_Top/map.json index c818fc3994..f63c578405 100644 --- a/data/maps/NavelRock_Top/map.json +++ b/data/maps/NavelRock_Top/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCAL_ID_NAVEL_ROCK_HO_OH", "graphics_id": "OBJ_EVENT_GFX_HOOH", "x": 12, "y": 4, diff --git a/data/maps/NavelRock_Top/scripts.inc b/data/maps/NavelRock_Top/scripts.inc index 10969367a1..628f581e29 100644 --- a/data/maps/NavelRock_Top/scripts.inc +++ b/data/maps/NavelRock_Top/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_HO_OH, 1 - NavelRock_Top_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, NavelRock_Top_OnTransition map_script MAP_SCRIPT_ON_RESUME, NavelRock_Top_OnResume @@ -29,7 +27,7 @@ NavelRock_Top_OnResume: NavelRock_Top_EventScript_TryRemoveHoOh:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_HO_OH + removeobject LOCAL_ID_NAVEL_ROCK_HO_OH return NavelRock_Top_EventScript_HoOh:: @@ -39,7 +37,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8004, 3 @ num loops setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE - applymovement LOCALID_HO_OH, NavelRock_Top_Movement_HoOhAppear + applymovement LOCAL_ID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhAppear applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanUp waitmovement 0 delay 50 @@ -54,7 +52,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanDown - applymovement LOCALID_HO_OH, NavelRock_Top_Movement_HoOhApproach + applymovement LOCAL_ID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhApproach waitmovement 0 special RemoveCameraObject seteventmon SPECIES_HO_OH, 70 @@ -62,7 +60,7 @@ NavelRock_Top_EventScript_HoOh:: special BattleSetup_StartLegendaryBattle waitstate clearflag FLAG_SYS_CTRL_OBJ_DELETE - setvar VAR_LAST_TALKED, LOCALID_HO_OH + setvar VAR_LAST_TALKED, LOCAL_ID_NAVEL_ROCK_HO_OH specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Top_EventScript_DefeatedHoOh goto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Top_EventScript_RanFromHoOh diff --git a/data/maps/OldaleTown_Mart/map.json b/data/maps/OldaleTown_Mart/map.json index cfca496fd9..7ec9e7ab68 100644 --- a/data/maps/OldaleTown_Mart/map.json +++ b/data/maps/OldaleTown_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_OLDALE_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/OldaleTown_PokemonCenter_1F/map.json b/data/maps/OldaleTown_PokemonCenter_1F/map.json index d3f72b8492..123d371cf4 100644 --- a/data/maps/OldaleTown_PokemonCenter_1F/map.json +++ b/data/maps/OldaleTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_OLDALE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/OldaleTown_PokemonCenter_1F/scripts.inc b/data/maps/OldaleTown_PokemonCenter_1F/scripts.inc index 07549592f8..80f4ea359d 100644 --- a/data/maps/OldaleTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/OldaleTown_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - OldaleTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, OldaleTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ OldaleTown_PokemonCenter_1F_OnTransition: end OldaleTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_OLDALE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/PetalburgCity_Mart/map.json b/data/maps/PetalburgCity_Mart/map.json index 7c8a70b28e..884e25d3ea 100644 --- a/data/maps/PetalburgCity_Mart/map.json +++ b/data/maps/PetalburgCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PETALBURG_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/Route103/map.json b/data/maps/Route103/map.json index 9bc6fed67f..65e4a9014e 100644 --- a/data/maps/Route103/map.json +++ b/data/maps/Route103/map.json @@ -39,6 +39,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE103_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 10, "y": 3, diff --git a/data/maps/Route103/scripts.inc b/data/maps/Route103/scripts.inc index 557db64e29..5ab46fa7ec 100644 --- a/data/maps/Route103/scripts.inc +++ b/data/maps/Route103/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_RIVAL, 2 - Route103_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route103_OnTransition map_script MAP_SCRIPT_ON_LOAD, Route103_OnLoad @@ -30,11 +28,11 @@ Route103_EventScript_RivalMay:: msgbox Route103_Text_MayRoute103Pokemon, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_MAY, TRUE - applymovement LOCALID_RIVAL, Common_Movement_FacePlayer + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_FacePlayer waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_Delay48 waitmovement 0 msgbox Route103_Text_MayLetsBattle, MSGBOX_DEFAULT switch VAR_STARTER_MON @@ -47,11 +45,11 @@ Route103_EventScript_RivalBrendan:: msgbox Route103_Text_BrendanRoute103Pokemon, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_BRENDAN, TRUE - applymovement LOCALID_RIVAL, Common_Movement_FacePlayer + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_FacePlayer waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_ROUTE103_RIVAL, Common_Movement_Delay48 waitmovement 0 msgbox Route103_Text_BrendanLetsBattle, MSGBOX_DEFAULT switch VAR_STARTER_MON @@ -111,35 +109,35 @@ Route103_EventScript_RivalExit:: Route103_EventScript_RivalExitFacingNorth:: applymovement OBJ_EVENT_ID_PLAYER, Route103_Movement_WatchRivalExitFacingNorth - applymovement LOCALID_RIVAL, Route103_Movement_RivalExitFacingNorth1 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExitFacingNorth1 waitmovement 0 playse SE_LEDGE - applymovement LOCALID_RIVAL, Route103_Movement_RivalExitFacingNorth2 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExitFacingNorth2 waitmovement 0 goto Route103_EventScript_RivalEnd end Route103_EventScript_RivalExitFacingEastOrWest:: applymovement OBJ_EVENT_ID_PLAYER, Route103_Movement_WatchRivalExitFacingEastOrWest - applymovement LOCALID_RIVAL, Route103_Movement_RivalExit1 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExit1 waitmovement 0 playse SE_LEDGE - applymovement LOCALID_RIVAL, Route103_Movement_RivalExit2 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExit2 waitmovement 0 goto Route103_EventScript_RivalEnd end Route103_EventScript_RivalExitFacingSouth:: - applymovement LOCALID_RIVAL, Route103_Movement_RivalExit1 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExit1 waitmovement 0 playse SE_LEDGE - applymovement LOCALID_RIVAL, Route103_Movement_RivalExit2 + applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExit2 waitmovement 0 goto Route103_EventScript_RivalEnd end Route103_EventScript_RivalEnd:: - removeobject LOCALID_RIVAL + removeobject LOCALID_ROUTE103_RIVAL setvar VAR_BIRCH_LAB_STATE, 4 clearflag FLAG_HIDE_LITTLEROOT_TOWN_BIRCHS_LAB_RIVAL setflag FLAG_DEFEATED_RIVAL_ROUTE103 diff --git a/data/maps/Route110_TrickHouseEnd/map.json b/data/maps/Route110_TrickHouseEnd/map.json index 90d2285496..2a44e297c4 100644 --- a/data/maps/Route110_TrickHouseEnd/map.json +++ b/data/maps/Route110_TrickHouseEnd/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRICK_MASTER_END", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 4, "y": 5, diff --git a/data/maps/Route110_TrickHouseEnd/scripts.inc b/data/maps/Route110_TrickHouseEnd/scripts.inc index 9f31d89e4c..1649a11f60 100644 --- a/data/maps/Route110_TrickHouseEnd/scripts.inc +++ b/data/maps/Route110_TrickHouseEnd/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_TRICK_MASTER, 1 - Route110_TrickHouseEnd_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, Route110_TrickHouseEnd_OnResume map_script MAP_SCRIPT_ON_TRANSITION, Route110_TrickHouseEnd_OnTransition @@ -22,9 +20,9 @@ Route110_TrickHouseEnd_OnWarp: .2byte 0 Route110_TrickHouseEnd_EventScript_SetTrickMasterPos:: - addobject LOCALID_TRICK_MASTER - showobjectat LOCALID_TRICK_MASTER, MAP_ROUTE110_TRICK_HOUSE_END - turnobject LOCALID_TRICK_MASTER, DIR_EAST + addobject LOCALID_TRICK_MASTER_END + showobjectat LOCALID_TRICK_MASTER_END, MAP_ROUTE110_TRICK_HOUSE_END + turnobject LOCALID_TRICK_MASTER_END, DIR_EAST end Route110_TrickHouseEnd_OnFrame: @@ -151,7 +149,7 @@ Route110_TrickHouseEnd_EventScript_CompletedPuzzle8:: delay 30 msgbox Route110_TrickHouseEnd_Text_FountainOfIdeasRunDry, MSGBOX_DEFAULT closemessage - applymovement LOCALID_TRICK_MASTER, Common_Movement_FacePlayer + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_FacePlayer waitmovement 0 delay 30 msgbox Route110_TrickHouseEnd_Text_DefeatedMePreferWhichTent, MSGBOX_DEFAULT @@ -179,12 +177,12 @@ Route110_TrickHouseEnd_EventScript_GiveBlueTent:: return Route110_TrickHouseEnd_EventScript_TrickMasterExit:: - applymovement LOCALID_TRICK_MASTER, Route110_TrickHouse_Movement_TrickMasterSpin + applymovement LOCALID_TRICK_MASTER_END, Route110_TrickHouse_Movement_TrickMasterSpin waitmovement 0 playse SE_M_EXPLOSION - applymovement LOCALID_TRICK_MASTER, Route110_TrickHouse_Movement_TrickMasterJumpAway + applymovement LOCALID_TRICK_MASTER_END, Route110_TrickHouse_Movement_TrickMasterJumpAway waitmovement 0 - removeobject LOCALID_TRICK_MASTER + removeobject LOCALID_TRICK_MASTER_END addvar VAR_TRICK_HOUSE_LEVEL, 1 return @@ -201,33 +199,33 @@ Route110_TrickHouseEnd_EventScript_NoRoomForTent:: return Route110_TrickHouseEnd_EventScript_TrickMasterFaceAwaySouth:: - applymovement LOCALID_TRICK_MASTER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return Route110_TrickHouseEnd_EventScript_TrickMasterFaceAwayNorth:: - applymovement LOCALID_TRICK_MASTER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return Route110_TrickHouseEnd_EventScript_TrickMasterFaceAwayWest:: - applymovement LOCALID_TRICK_MASTER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return Route110_TrickHouseEnd_EventScript_TrickMasterFaceAwayEast:: - applymovement LOCALID_TRICK_MASTER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return Route110_TrickHouseEnd_EventScript_TrickMasterExitTrigger:: lockall - turnobject LOCALID_TRICK_MASTER, DIR_WEST + turnobject LOCALID_TRICK_MASTER_END, DIR_WEST playse SE_PIN - applymovement LOCALID_TRICK_MASTER, Common_Movement_ExclamationMark + applymovement LOCALID_TRICK_MASTER_END, Common_Movement_ExclamationMark waitmovement 0 delay 20 - applymovement LOCALID_TRICK_MASTER, Route110_TrickHouseEnd_Movement_TrickMasterSurprise + applymovement LOCALID_TRICK_MASTER_END, Route110_TrickHouseEnd_Movement_TrickMasterSurprise waitmovement 0 playse SE_M_EXPLOSION applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown @@ -237,7 +235,7 @@ Route110_TrickHouseEnd_EventScript_TrickMasterExitTrigger:: applymovement OBJ_EVENT_ID_PLAYER, Route110_TrickHouseEnd_Movement_KeepPlayerInRoom waitmovement 0 delay 4 - turnobject LOCALID_TRICK_MASTER, DIR_EAST + turnobject LOCALID_TRICK_MASTER_END, DIR_EAST releaseall end diff --git a/data/maps/Route110_TrickHouseEntrance/map.json b/data/maps/Route110_TrickHouseEntrance/map.json index 5584a534c3..60f2bec2a0 100644 --- a/data/maps/Route110_TrickHouseEntrance/map.json +++ b/data/maps/Route110_TrickHouseEntrance/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRICK_MASTER", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 6, "y": 2, diff --git a/data/maps/Route110_TrickHouseEntrance/scripts.inc b/data/maps/Route110_TrickHouseEntrance/scripts.inc index 51135ac339..5a020854db 100644 --- a/data/maps/Route110_TrickHouseEntrance/scripts.inc +++ b/data/maps/Route110_TrickHouseEntrance/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_TRICK_MASTER, 1 - Route110_TrickHouseEntrance_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route110_TrickHouseEntrance_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, Route110_TrickHouseEntrance_OnFrame diff --git a/data/maps/Route111/map.json b/data/maps/Route111/map.json index 6efa1770e2..054e846c4a 100644 --- a/data/maps/Route111/map.json +++ b/data/maps/Route111/map.json @@ -187,6 +187,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE111_TY_1", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 14, "y": 86, @@ -200,6 +201,7 @@ "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1" }, { + "local_id": "LOCALID_ROUTE111_GABBY_1", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 13, "y": 86, @@ -291,6 +293,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE111_GABBY_2", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 13, "y": 86, @@ -301,9 +304,10 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "GabbyAndTy_EventScript_GabbyBattle4", - "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3" + "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2" }, { + "local_id": "LOCALID_ROUTE111_TY_2", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 14, "y": 86, @@ -314,9 +318,10 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "GabbyAndTy_EventScript_TyBattle4", - "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3" + "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2" }, { + "local_id": "LOCALID_ROUTE111_GABBY_3", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 13, "y": 86, @@ -327,9 +332,10 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "GabbyAndTy_EventScript_GabbyBattle6", - "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2" + "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3" }, { + "local_id": "LOCALID_ROUTE111_TY_3", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 14, "y": 86, @@ -340,7 +346,7 @@ "trainer_type": "TRAINER_TYPE_NONE", "trainer_sight_or_berry_tree_id": "0", "script": "GabbyAndTy_EventScript_TyBattle6", - "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2" + "flag": "FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3" }, { "graphics_id": "OBJ_EVENT_GFX_ITEM_BALL", @@ -603,6 +609,7 @@ "flag": "FLAG_HIDE_ROUTE_111_DESERT_FOSSIL" }, { + "local_id": "LOCALID_ROUTE111_PLAYER_FALLING", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 19, "y": 53, diff --git a/data/maps/Route117/map.json b/data/maps/Route117/map.json index 80304ddf4b..07a08500c7 100644 --- a/data/maps/Route117/map.json +++ b/data/maps/Route117/map.json @@ -52,6 +52,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DAYCARE_MAN", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN", "x": 47, "y": 4, diff --git a/data/maps/Route117/scripts.inc b/data/maps/Route117/scripts.inc index 37d589ce31..8c8addc637 100644 --- a/data/maps/Route117/scripts.inc +++ b/data/maps/Route117/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_DAYCARE_MAN, 3 - Route117_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route117_OnTransition .byte 0 diff --git a/data/maps/Route117_PokemonDayCare/map.json b/data/maps/Route117_PokemonDayCare/map.json index 128c9f6e72..31849863de 100644 --- a/data/maps/Route117_PokemonDayCare/map.json +++ b/data/maps/Route117_PokemonDayCare/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DAYCARE_LADY", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "x": 2, "y": 2, diff --git a/data/maps/Route118/map.json b/data/maps/Route118/map.json index 1068e4a1a7..e1e2b288d6 100644 --- a/data/maps/Route118/map.json +++ b/data/maps/Route118/map.json @@ -83,6 +83,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE118_GABBY_1", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 33, "y": 8, @@ -96,6 +97,7 @@ "flag": "FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1" }, { + "local_id": "LOCALID_ROUTE118_TY_1", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 34, "y": 8, @@ -122,6 +124,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE118_GABBY_2", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 33, "y": 8, @@ -135,6 +138,7 @@ "flag": "FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2" }, { + "local_id": "LOCALID_ROUTE118_TY_2", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 34, "y": 8, @@ -148,6 +152,7 @@ "flag": "FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2" }, { + "local_id": "LOCALID_ROUTE118_GABBY_3", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 33, "y": 8, @@ -161,6 +166,7 @@ "flag": "FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3" }, { + "local_id": "LOCALID_ROUTE118_TY_3", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 34, "y": 8, diff --git a/data/maps/Route120/map.json b/data/maps/Route120/map.json index 6bb2c84c1a..f8799a74ef 100644 --- a/data/maps/Route120/map.json +++ b/data/maps/Route120/map.json @@ -234,6 +234,7 @@ "flag": "FLAG_ITEM_ROUTE_120_NUGGET" }, { + "local_id": "LOCALID_ROUTE120_TY_1", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 37, "y": 5, @@ -247,6 +248,7 @@ "flag": "FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1" }, { + "local_id": "LOCALID_ROUTE120_GABBY_1", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 36, "y": 5, @@ -260,6 +262,7 @@ "flag": "FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1" }, { + "local_id": "LOCALID_ROUTE120_GABBY_2", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 36, "y": 5, @@ -273,6 +276,7 @@ "flag": "FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2" }, { + "local_id": "LOCALID_ROUTE120_TY_2", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 37, "y": 5, diff --git a/data/maps/Route128/map.json b/data/maps/Route128/map.json index 464aa83fcc..6ca7fbc908 100644 --- a/data/maps/Route128/map.json +++ b/data/maps/Route128/map.json @@ -62,6 +62,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE128_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 40, "y": 22, @@ -75,6 +76,7 @@ "flag": "FLAG_HIDE_ROUTE_128_STEVEN" }, { + "local_id": "LOCALID_ROUTE128_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 37, "y": 22, @@ -88,6 +90,7 @@ "flag": "FLAG_HIDE_ROUTE_128_ARCHIE" }, { + "local_id": "LOCALID_ROUTE128_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 38, "y": 21, diff --git a/data/maps/Route128/scripts.inc b/data/maps/Route128/scripts.inc index d08605128a..5816d09df6 100644 --- a/data/maps/Route128/scripts.inc +++ b/data/maps/Route128/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_STEVEN, 3 -.set LOCALID_ARCHIE, 4 -.set LOCALID_MAXIE, 5 - Route128_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route128_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, Route128_OnFrame @@ -18,64 +14,64 @@ Route128_OnFrame: Route128_EventScript_KyogreAwakenedScene:: lockall delay 20 - applymovement LOCALID_ARCHIE, Route128_Movement_ArchieLookAround + applymovement LOCALID_ROUTE128_ARCHIE, Route128_Movement_ArchieLookAround waitmovement 0 msgbox Route128_Text_ArchieWhatHappened, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARCHIE, Route128_Movement_ArchieBackUp + applymovement LOCALID_ROUTE128_ARCHIE, Route128_Movement_ArchieBackUp waitmovement 0 msgbox Route128_Text_ArchieIOnlyWanted, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MAXIE, Route128_Movement_MaxieApproachArchie + applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieApproachArchie waitmovement 0 - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_ROUTE128_ARCHIE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route128_Text_MaxieDoYouUnderstandNow, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MAXIE, Route128_Movement_MaxieApproachPlayer + applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route128_Text_MaxieResposibilityFallsToArchieAndMe, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARCHIE, Route128_Movement_ArchieRunLeft + applymovement LOCALID_ROUTE128_ARCHIE, Route128_Movement_ArchieRunLeft applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_MAXIE, Route128_Movement_MaxieWalkLeft + applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieWalkLeft waitmovement 0 msgbox Route128_Text_MaxieThisDefiesBelief, MSGBOX_DEFAULT closemessage delay 40 - applymovement LOCALID_MAXIE, Route128_Movement_MaxieExit - applymovement LOCALID_ARCHIE, Route128_Movement_ArchieExit + applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieExit + applymovement LOCALID_ROUTE128_ARCHIE, Route128_Movement_ArchieExit waitmovement 0 - removeobject LOCALID_MAXIE - removeobject LOCALID_ARCHIE + removeobject LOCALID_ROUTE128_MAXIE + removeobject LOCALID_ROUTE128_ARCHIE delay 100 setfieldeffectargument 0, 1 dofieldeffect FLDEFF_NPCFLY_OUT waitfieldeffect FLDEFF_NPCFLY_OUT - addobject LOCALID_STEVEN - applymovement LOCALID_STEVEN, Route128_Movement_StevenApproachPlayer + addobject LOCALID_ROUTE128_STEVEN + applymovement LOCALID_ROUTE128_STEVEN, Route128_Movement_StevenApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox Route128_Text_StevenWhatIsHappening, MSGBOX_DEFAULT closemessage - applymovement LOCALID_STEVEN, Route128_Movement_StevenWalkUp + applymovement LOCALID_ROUTE128_STEVEN, Route128_Movement_StevenWalkUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route128_Text_StevenWholeWorldWillDrown, MSGBOX_DEFAULT - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE128_STEVEN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Route128_Text_StevenImGoingToSootopolis, MSGBOX_DEFAULT closemessage - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE128_STEVEN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 50 setfieldeffectargument 0, 1 dofieldeffect FLDEFF_NPCFLY_OUT delay 15 - removeobject LOCALID_STEVEN + removeobject LOCALID_ROUTE128_STEVEN waitfieldeffect FLDEFF_NPCFLY_OUT clearflag FLAG_HIDE_MAP_NAME_POPUP setvar VAR_ROUTE128_STATE, 2 diff --git a/data/maps/RustboroCity_DevonCorp_1F/map.json b/data/maps/RustboroCity_DevonCorp_1F/map.json index 64a8b917a1..ecbf542589 100644 --- a/data/maps/RustboroCity_DevonCorp_1F/map.json +++ b/data/maps/RustboroCity_DevonCorp_1F/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEVON_CORP_STAIR_GUARD", "graphics_id": "OBJ_EVENT_GFX_DEVON_EMPLOYEE", "x": 15, "y": 5, diff --git a/data/maps/RustboroCity_DevonCorp_1F/scripts.inc b/data/maps/RustboroCity_DevonCorp_1F/scripts.inc index 11953d3386..c9111d0e16 100644 --- a/data/maps/RustboroCity_DevonCorp_1F/scripts.inc +++ b/data/maps/RustboroCity_DevonCorp_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_STAIR_GUARD, 2 - RustboroCity_DevonCorp_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RustboroCity_DevonCorp_1F_OnTransition .byte 0 @@ -9,8 +7,8 @@ RustboroCity_DevonCorp_1F_OnTransition: end RustboroCity_DevonCorp_1F_EventScript_BlockStairs:: - setobjectxyperm LOCALID_STAIR_GUARD, 14, 2 - setobjectmovementtype LOCALID_STAIR_GUARD, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_DEVON_CORP_STAIR_GUARD, 14, 2 + setobjectmovementtype LOCALID_DEVON_CORP_STAIR_GUARD, MOVEMENT_TYPE_FACE_DOWN return RustboroCity_DevonCorp_1F_EventScript_Employee:: diff --git a/data/maps/RustboroCity_Mart/map.json b/data/maps/RustboroCity_Mart/map.json index 92a23b6bf0..886b500df6 100644 --- a/data/maps/RustboroCity_Mart/map.json +++ b/data/maps/RustboroCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RUSTBORO_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/RustboroCity_PokemonCenter_1F/map.json b/data/maps/RustboroCity_PokemonCenter_1F/map.json index d187d49a32..be36274d8f 100644 --- a/data/maps/RustboroCity_PokemonCenter_1F/map.json +++ b/data/maps/RustboroCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RUSTBORO_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/RustboroCity_PokemonCenter_1F/scripts.inc b/data/maps/RustboroCity_PokemonCenter_1F/scripts.inc index ff7d765682..363230eb41 100644 --- a/data/maps/RustboroCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/RustboroCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - RustboroCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RustboroCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ RustboroCity_PokemonCenter_1F_OnTransition: end RustboroCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_RUSTBORO_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/SkyPillar_Outside/map.json b/data/maps/SkyPillar_Outside/map.json index d72441266e..545ebcd25e 100644 --- a/data/maps/SkyPillar_Outside/map.json +++ b/data/maps/SkyPillar_Outside/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SKY_PILLAR_WALLACE", "graphics_id": "OBJ_EVENT_GFX_WALLACE", "x": 13, "y": 7, diff --git a/data/maps/SkyPillar_Outside/scripts.inc b/data/maps/SkyPillar_Outside/scripts.inc index f25c82df65..4309c3dd4d 100644 --- a/data/maps/SkyPillar_Outside/scripts.inc +++ b/data/maps/SkyPillar_Outside/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALLACE, 1 - SkyPillar_Outside_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SkyPillar_Outside_OnTransition map_script MAP_SCRIPT_ON_LOAD, SkyPillar_Outside_OnLoad @@ -34,7 +32,7 @@ SkyPillar_Outside_OnFrame: SkyPillar_Outside_EventScript_WallaceScene:: lockall - applymovement LOCALID_WALLACE, SkyPillar_Outside_Movement_WallaceApproachPlayer + applymovement LOCALID_SKY_PILLAR_WALLACE, SkyPillar_Outside_Movement_WallaceApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 @@ -51,7 +49,7 @@ SkyPillar_Outside_EventScript_WallaceScene:: msgbox SkyPillar_Outside_Text_EarthquakeNotMomentToWaste, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, SkyPillar_Outside_Movement_PlayerClimbSkyPillar - applymovement LOCALID_WALLACE, SkyPillar_Outside_Movement_WallaceClimbSkyPillar + applymovement LOCALID_SKY_PILLAR_WALLACE, SkyPillar_Outside_Movement_WallaceClimbSkyPillar waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 3 @ horizontal pan @@ -60,13 +58,13 @@ SkyPillar_Outside_EventScript_WallaceScene:: special ShakeCamera waitstate delay 20 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SKY_PILLAR_WALLACE, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 10 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SKY_PILLAR_WALLACE, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 20 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SKY_PILLAR_WALLACE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 msgbox SkyPillar_Outside_Text_SituationGettingWorse, MSGBOX_DEFAULT @@ -83,7 +81,7 @@ SkyPillar_Outside_EventScript_WallaceScene:: fadescreenswapbuffers FADE_TO_BLACK clearflag FLAG_HIDE_MAP_NAME_POPUP setvar VAR_SOOTOPOLIS_CITY_STATE, 4 - removeobject LOCALID_WALLACE + removeobject LOCALID_SKY_PILLAR_WALLACE clearflag FLAG_HIDE_SOOTOPOLIS_CITY_WALLACE fadescreenswapbuffers FADE_FROM_BLACK releaseall diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index b285f030ee..eb01d3c166 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -343,6 +343,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TM_SALESMAN" }, { + "local_id": "LOCALID_SLATEPORT_ENERGY_GURU", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 5, "y": 47, diff --git a/data/maps/SlateportCity_Mart/map.json b/data/maps/SlateportCity_Mart/map.json index a86614bd14..d0f698013e 100644 --- a/data/maps/SlateportCity_Mart/map.json +++ b/data/maps/SlateportCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SLATEPORT_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/SlateportCity_PokemonCenter_1F/map.json b/data/maps/SlateportCity_PokemonCenter_1F/map.json index 418210f0bd..458ab934e0 100644 --- a/data/maps/SlateportCity_PokemonCenter_1F/map.json +++ b/data/maps/SlateportCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SLATEPORT_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/SlateportCity_PokemonCenter_1F/scripts.inc b/data/maps/SlateportCity_PokemonCenter_1F/scripts.inc index 295409df81..76f9d58fd5 100644 --- a/data/maps/SlateportCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/SlateportCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - SlateportCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SlateportCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ SlateportCity_PokemonCenter_1F_OnTransition: end SlateportCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_SLATEPORT_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/SootopolisCity_Mart/map.json b/data/maps/SootopolisCity_Mart/map.json index 1f75af5de4..cf8dbae571 100644 --- a/data/maps/SootopolisCity_Mart/map.json +++ b/data/maps/SootopolisCity_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SOOTOPOLIS_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/TerraCave_End/map.json b/data/maps/TerraCave_End/map.json index 264b35af23..78cf26b168 100644 --- a/data/maps/TerraCave_End/map.json +++ b/data/maps/TerraCave_End/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TERRA_CAVE_GROUDON", "graphics_id": "OBJ_EVENT_GFX_GROUDON_FRONT", "x": 17, "y": 22, diff --git a/data/maps/TerraCave_End/scripts.inc b/data/maps/TerraCave_End/scripts.inc index 8b2732d45e..e635441e43 100644 --- a/data/maps/TerraCave_End/scripts.inc +++ b/data/maps/TerraCave_End/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_GROUDON, 1 - TerraCave_End_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TerraCave_End_OnResume map_script MAP_SCRIPT_ON_TRANSITION, TerraCave_End_OnTransition @@ -12,7 +10,7 @@ TerraCave_End_OnResume: TerraCave_End_EventScript_TryRemoveGroudon:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_GROUDON + removeobject LOCALID_TERRA_CAVE_GROUDON return TerraCave_End_OnTransition: @@ -28,13 +26,13 @@ TerraCave_End_EventScript_Groudon:: lockall applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp waitmovement 0 - applymovement LOCALID_GROUDON, TerraCave_End_Movement_GroudonApproach + applymovement LOCALID_TERRA_CAVE_GROUDON, TerraCave_End_Movement_GroudonApproach waitmovement 0 waitse playmoncry SPECIES_GROUDON, CRY_MODE_ENCOUNTER delay 40 waitmoncry - setvar VAR_LAST_TALKED, LOCALID_GROUDON + setvar VAR_LAST_TALKED, LOCALID_TERRA_CAVE_GROUDON setwildbattle SPECIES_GROUDON, 70 setflag FLAG_SYS_CTRL_OBJ_DELETE special BattleSetup_StartLegendaryBattle diff --git a/data/maps/UnionRoom/map.json b/data/maps/UnionRoom/map.json index 8c663eb42e..e54ac0c228 100644 --- a/data/maps/UnionRoom/map.json +++ b/data/maps/UnionRoom/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_4", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 1, "y": 8, @@ -41,6 +42,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_4" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_8", "graphics_id": "OBJ_EVENT_GFX_VAR_7", "x": 7, "y": 8, @@ -54,6 +56,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_8" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_7", "graphics_id": "OBJ_EVENT_GFX_VAR_6", "x": 1, "y": 4, @@ -67,6 +70,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_7" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_6", "graphics_id": "OBJ_EVENT_GFX_VAR_5", "x": 7, "y": 4, @@ -80,6 +84,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_6" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_5", "graphics_id": "OBJ_EVENT_GFX_VAR_4", "x": 13, "y": 4, @@ -93,6 +98,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_5" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_3", "graphics_id": "OBJ_EVENT_GFX_VAR_2", "x": 10, "y": 6, @@ -106,6 +112,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_3" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_2", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 13, "y": 8, @@ -119,6 +126,7 @@ "flag": "FLAG_HIDE_UNION_ROOM_PLAYER_2" }, { + "local_id": "LOCALID_UNION_ROOM_PLAYER_1", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 4, "y": 6, diff --git a/data/maps/UnionRoom/scripts.inc b/data/maps/UnionRoom/scripts.inc index 8a9e7682a5..3c73afd12e 100644 --- a/data/maps/UnionRoom/scripts.inc +++ b/data/maps/UnionRoom/scripts.inc @@ -1,5 +1,3 @@ -@ Note: LOCALID_UNION_ROOM_PLAYER_# are local ids for this map used elsewhere. They're defined in event_objects.h - UnionRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, UnionRoom_OnResume map_script MAP_SCRIPT_ON_TRANSITION, UnionRoom_OnTransition diff --git a/data/maps/VerdanturfTown_Mart/map.json b/data/maps/VerdanturfTown_Mart/map.json index 096d63552e..0faadcf266 100644 --- a/data/maps/VerdanturfTown_Mart/map.json +++ b/data/maps/VerdanturfTown_Mart/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_VERDANTURF_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, diff --git a/data/maps/VictoryRoad_1F/map.json b/data/maps/VictoryRoad_1F/map.json index 44a2bca660..469981cde0 100644 --- a/data/maps/VictoryRoad_1F/map.json +++ b/data/maps/VictoryRoad_1F/map.json @@ -54,6 +54,7 @@ "flag": "0" }, { + "local_id": "LOCALID_VICTORY_ROAD_ENTRANCE_WALLY", "graphics_id": "OBJ_EVENT_GFX_WALLY", "x": 12, "y": 25, diff --git a/data/maps/VictoryRoad_1F/scripts.inc b/data/maps/VictoryRoad_1F/scripts.inc index 4bce6b4c1d..4a069960ad 100644 --- a/data/maps/VictoryRoad_1F/scripts.inc +++ b/data/maps/VictoryRoad_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALLY_ENTRANCE, 4 - VictoryRoad_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VictoryRoad_1F_OnTransition .byte 0 @@ -10,20 +8,20 @@ VictoryRoad_1F_OnTransition: end VictoryRoad_1F_EventScript_SetEntranceWallyPos1:: - setobjectxyperm LOCALID_WALLY_ENTRANCE, 2, 24 - setobjectmovementtype LOCALID_WALLY_ENTRANCE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, 2, 24 + setobjectmovementtype LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, MOVEMENT_TYPE_FACE_DOWN return VictoryRoad_1F_EventScript_SetEntranceWallyPos2:: - setobjectxyperm LOCALID_WALLY_ENTRANCE, 3, 24 - setobjectmovementtype LOCALID_WALLY_ENTRANCE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, 3, 24 + setobjectmovementtype LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, MOVEMENT_TYPE_FACE_DOWN return VictoryRoad_1F_EventScript_WallyBattleTrigger1:: lockall setvar VAR_0x8008, 1 - addobject LOCALID_WALLY_ENTRANCE - applymovement LOCALID_WALLY_ENTRANCE, VictoryRoad_1F_Movement_WallyApproachPlayer1 + addobject LOCALID_VICTORY_ROAD_ENTRANCE_WALLY + applymovement LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, VictoryRoad_1F_Movement_WallyApproachPlayer1 waitmovement 0 goto VictoryRoad_1F_EventScript_WallyEntranceBattle end @@ -31,8 +29,8 @@ VictoryRoad_1F_EventScript_WallyBattleTrigger1:: VictoryRoad_1F_EventScript_WallyBattleTrigger2:: lockall setvar VAR_0x8008, 2 - addobject LOCALID_WALLY_ENTRANCE - applymovement LOCALID_WALLY_ENTRANCE, VictoryRoad_1F_Movement_WallyApproachPlayer2 + addobject LOCALID_VICTORY_ROAD_ENTRANCE_WALLY + applymovement LOCALID_VICTORY_ROAD_ENTRANCE_WALLY, VictoryRoad_1F_Movement_WallyApproachPlayer2 waitmovement 0 goto VictoryRoad_1F_EventScript_WallyEntranceBattle end @@ -44,7 +42,7 @@ VictoryRoad_1F_EventScript_WallyEntranceBattle:: trainerbattle_no_intro TRAINER_WALLY_VR_1, VictoryRoad_1F_Text_WallyEntranceDefeat msgbox VictoryRoad_1F_Text_WallyPostEntranceBattle, MSGBOX_DEFAULT clearflag FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY - copyobjectxytoperm LOCALID_WALLY_ENTRANCE + copyobjectxytoperm LOCALID_VICTORY_ROAD_ENTRANCE_WALLY setflag FLAG_DEFEATED_WALLY_VICTORY_ROAD copyvar VAR_VICTORY_ROAD_1F_STATE, VAR_0x8008 releaseall diff --git a/data/scripts/apprentice.inc b/data/scripts/apprentice.inc index 6b3a99e728..246922f7f2 100644 --- a/data/scripts/apprentice.inc +++ b/data/scripts/apprentice.inc @@ -1,5 +1,3 @@ -.set LOCALID_APPRENTICE, 6 - BattleFrontier_BattleTowerLobby_EventScript_Apprentice:: lock faceplayer diff --git a/data/scripts/berry_blender.inc b/data/scripts/berry_blender.inc index f860ef066c..3fab60a58b 100644 --- a/data/scripts/berry_blender.inc +++ b/data/scripts/berry_blender.inc @@ -1,11 +1,3 @@ -@ Note: local IDs shared with scripts.inc for LilycoveCity_ContestLobby -.set LOCALID_MAN, 3 -.set LOCALID_BOY, 9 -.set LOCALID_TWIN, 10 -.set LOCALID_POKEFAN_F, 15 -.set LOCALID_EXPERT_M, 16 -.set LOCALID_GIRL, 17 - .set NUM_OPPONENTS, VAR_0x8009 BerryBlender_Text_WantToMakePokeblocks: @@ -246,7 +238,7 @@ BerryBlender_EventScript_BerryBlender1:: lockall goto_if_unset FLAG_HIDE_LILYCOVE_CONTEST_HALL_BLEND_MASTER, BerryBlender_EventScript_BlendMasterPresent setvar NUM_OPPONENTS, 1 - applymovement LOCALID_EXPERT_M, BerryBlender_Movement_BlendLeaderWalkInPlace + applymovement LOCALID_BLEND_MASTER, BerryBlender_Movement_BlendLeaderWalkInPlace waitmovement 0 msgbox BerryBlender_Text_WantToMakePokeblocks, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, BerryBlender_EventScript_TryUseBerryBlender1 @@ -325,8 +317,8 @@ BerryBlender_EventScript_Blender1NoCase: BerryBlender_EventScript_BerryBlender2:: lockall setvar NUM_OPPONENTS, 2 - applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection - applymovement LOCALID_MAN, BerryBlender_Movement_BlendLeaderWalkInPlace + applymovement LOCALID_CONTEST_LOBBY_BLENDER_2_PARTICIPANT, Common_Movement_FaceOriginalDirection + applymovement LOCALID_CONTEST_LOBBY_BLENDER_2_LEADER, BerryBlender_Movement_BlendLeaderWalkInPlace waitmovement 0 msgbox BerryBlender_Text_WantToBlendPokeblocksWithUs, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, BerryBlender_EventScript_TryUseBerryBlender2 @@ -382,10 +374,10 @@ BerryBlender_EventScript_Blender2NoCase: BerryBlender_EventScript_BerryBlender3:: lockall - setvar VAR_0x8008, LOCALID_POKEFAN_F + setvar VAR_0x8008, LOCALID_CONTEST_LOBBY_BLENDER_3_LEADER setvar NUM_OPPONENTS, 3 - applymovement LOCALID_BOY, Common_Movement_FaceOriginalDirection - applymovement LOCALID_GIRL, Common_Movement_FaceOriginalDirection + applymovement LOCALID_CONTEST_LOBBY_BLENDER_3_PARTICIPANT_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_CONTEST_LOBBY_BLENDER_3_PARTICIPANT_2, Common_Movement_FaceOriginalDirection applymovement VAR_0x8008, BerryBlender_Movement_BlendLeaderWalkInPlace waitmovement 0 msgbox BerryBlender_Text_LookGoodAtBlendingJoinUs, MSGBOX_YESNO diff --git a/data/scripts/contest_hall.inc b/data/scripts/contest_hall.inc index 04c62a6de3..61beb94a12 100644 --- a/data/scripts/contest_hall.inc +++ b/data/scripts/contest_hall.inc @@ -1,19 +1,3 @@ -.set LOCALID_MC, 1 -.set LOCALID_JUDGE, 2 -.set LOCALID_CONTESTANT_1, 3 -.set LOCALID_CONTESTANT_2, 4 -.set LOCALID_CONTESTANT_3, 5 -.set LOCALID_AUDIENCE_1, 6 -.set LOCALID_AUDIENCE_3, 7 -.set LOCALID_AUDIENCE_4, 8 -.set LOCALID_AUDIENCE_5, 9 -.set LOCALID_AUDIENCE_6, 10 -.set LOCALID_AUDIENCE_7, 11 -.set LOCALID_AUDIENCE_2, 12 -.set LOCALID_POKEBALL, 13 -.set LOCALID_CONTESTANT_4, 14 -.set LOCALID_ARTIST, 15 - @ Either ends or returns to EventScript_ContestReceptionist after submitting a contest entry LilycoveCity_ContestLobby_EventScript_SpeakToContestReceptionist:: lock @@ -203,7 +187,7 @@ ContestHall_EventScript_DoContest:: lockall applymovement LOCALID_CONTESTANT_4, ContestHall_Movement_Player4FaceUp waitmovement 0 - applymovement LOCALID_MC, ContestHall_Movement_MCWalkDown + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCWalkDown waitmovement 0 releaseall call ContestHall_EventScript_TryWaitForLink @@ -279,7 +263,7 @@ ContestHall_EventScript_ContestGettingStarted:: bufferstdstring STR_VAR_3, VAR_0x8009 call ContestHall_EventScript_GettingStarted lockall - applymovement LOCALID_MC, ContestHall_Movement_MCBackUp + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCBackUp waitmovement 0 releaseall return @@ -384,7 +368,7 @@ ContestHall_EventScript_ShowContestMonPic:: releaseall call ContestHall_EventScript_TryWaitForLink call ContestHall_EventScript_CheckIfContestWithRSPlayer - addobject LOCALID_POKEBALL + addobject LOCALID_CONTEST_POKEBALL playse SE_LEDGE lockall applymovement VAR_0x800B, ContestHall_Movement_ContestantDelay32 @@ -413,13 +397,13 @@ ContestHall_EventScript_AudienceVote:: playse SE_M_ENCORE2 waitmessage call ContestHall_EventScript_AudienceLookAround - applymovement LOCALID_MC, ContestHall_Movement_MCFaceJudge2 + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCFaceJudge2 waitmovement 0 - applymovement LOCALID_JUDGE, ContestHall_Movement_JudgeFaceMC + applymovement LOCALID_CONTEST_JUDGE, ContestHall_Movement_JudgeFaceMC waitmovement 0 delay 20 - applymovement LOCALID_MC, ContestHall_Movement_FaceContestants - applymovement LOCALID_JUDGE, ContestHall_Movement_FaceContestants + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_FaceContestants + applymovement LOCALID_CONTEST_JUDGE, ContestHall_Movement_FaceContestants waitmovement 0 return @@ -459,25 +443,25 @@ ContestHall_EventScript_VotingUnderWayLink:: ContestHall_EventScript_AudienceReactToContestant:: call ContestHall_EventScript_TryWaitForLink - applymovement LOCALID_MC, ContestHall_Movement_AudienceMemberLookLeft + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_AudienceMemberLookLeft waitmovement 0 playse SE_M_ENCORE2 call ContestHall_EventScript_VObjectAudienceLookAround - applymovement LOCALID_AUDIENCE_5, ContestHall_Movement_AudienceMemberLookRight - applymovement LOCALID_AUDIENCE_2, ContestHall_Movement_AudienceMemberLookDown - applymovement LOCALID_AUDIENCE_3, ContestHall_Movement_AudienceMemberLookRight + applymovement LOCALID_CONTEST_AUDIENCE_5, ContestHall_Movement_AudienceMemberLookRight + applymovement LOCALID_CONTEST_AUDIENCE_2, ContestHall_Movement_AudienceMemberLookDown + applymovement LOCALID_CONTEST_AUDIENCE_3, ContestHall_Movement_AudienceMemberLookRight waitmovement 0 - applymovement LOCALID_MC, ContestHall_Movement_AudienceMemberLookRight + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_AudienceMemberLookRight waitmovement 0 - applymovement LOCALID_AUDIENCE_6, ContestHall_Movement_AudienceMemberLookLeft - applymovement LOCALID_AUDIENCE_7, ContestHall_Movement_AudienceMemberLookDown - applymovement LOCALID_AUDIENCE_1, ContestHall_Movement_AudienceMemberLookUp - applymovement LOCALID_AUDIENCE_4, ContestHall_Movement_AudienceMemberLookLeft + applymovement LOCALID_CONTEST_AUDIENCE_6, ContestHall_Movement_AudienceMemberLookLeft + applymovement LOCALID_CONTEST_AUDIENCE_7, ContestHall_Movement_AudienceMemberLookDown + applymovement LOCALID_CONTEST_AUDIENCE_1, ContestHall_Movement_AudienceMemberLookUp + applymovement LOCALID_CONTEST_AUDIENCE_4, ContestHall_Movement_AudienceMemberLookLeft waitmovement 0 - applymovement LOCALID_MC, ContestHall_Movement_MCLookAtJudge + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCLookAtJudge waitmovement 0 - applymovement LOCALID_MC, ContestHall_Movement_MCWalkInPlaceDown - applymovement LOCALID_JUDGE, ContestHall_Movement_JudgeLookAtMC + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCWalkInPlaceDown + applymovement LOCALID_CONTEST_JUDGE, ContestHall_Movement_JudgeLookAtMC waitmovement 0 releaseall call ContestHall_EventScript_TryWaitForLink @@ -623,7 +607,7 @@ ContestHall_EventScript_Set8Hearts:: ContestHall_EventScript_TryDisplayHeartAudienceMember1:: goto_if_eq VAR_TEMP_1, 1, ContestHall_EventScript_AudienceMember1AlreadyEmoted - applymovement LOCALID_AUDIENCE_1, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_1, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_1, 1 @@ -635,7 +619,7 @@ ContestHall_EventScript_AudienceMember1AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember2:: goto_if_eq VAR_TEMP_2, 1, ContestHall_EventScript_AudienceMember2AlreadyEmoted - applymovement LOCALID_AUDIENCE_2, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_2, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_2, 1 @@ -647,7 +631,7 @@ ContestHall_EventScript_AudienceMember2AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember3:: goto_if_eq VAR_TEMP_3, 1, ContestHall_EventScript_AudienceMember3AlreadyEmoted - applymovement LOCALID_AUDIENCE_3, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_3, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_3, 1 @@ -659,7 +643,7 @@ ContestHall_EventScript_AudienceMember3AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember4:: goto_if_eq VAR_TEMP_4, 1, ContestHall_EventScript_Audience4MemberAlreadyEmoted - applymovement LOCALID_AUDIENCE_4, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_4, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_4, 1 @@ -671,7 +655,7 @@ ContestHall_EventScript_Audience4MemberAlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember5:: goto_if_eq VAR_TEMP_5, 1, ContestHall_EventScript_AudienceMember5AlreadyEmoted - applymovement LOCALID_AUDIENCE_5, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_5, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_5, 1 @@ -683,7 +667,7 @@ ContestHall_EventScript_AudienceMember5AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember6:: goto_if_eq VAR_TEMP_6, 1, ContestHall_EventScript_AudienceMember6AlreadyEmoted - applymovement LOCALID_AUDIENCE_6, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_6, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_6, 1 @@ -695,7 +679,7 @@ ContestHall_EventScript_AudienceMember6AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember7:: goto_if_eq VAR_TEMP_7, 1, ContestHall_EventScript_AudienceMember7AlreadyEmoted - applymovement LOCALID_AUDIENCE_7, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_AUDIENCE_7, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_7, 1 @@ -707,7 +691,7 @@ ContestHall_EventScript_AudienceMember7AlreadyEmoted:: ContestHall_EventScript_TryDisplayHeartAudienceMember8:: goto_if_eq VAR_TEMP_8, 1, ContestHall_EventScript_AudienceMember8AlreadyEmoted - applymovement LOCALID_ARTIST, ContestHall_Movement_Heart + applymovement LOCALID_CONTEST_ARTIST, ContestHall_Movement_Heart playse SE_PIN delay 14 setvar VAR_TEMP_8, 1 @@ -720,7 +704,7 @@ ContestHall_EventScript_AudienceMember8AlreadyEmoted:: ContestHall_EventScript_ContestantReturn:: closemessage release - removeobject LOCALID_POKEBALL + removeobject LOCALID_CONTEST_POKEBALL special HideContestEntryMonPic call ContestHall_EventScript_TryWaitForLink switch VAR_0x8006 @@ -764,13 +748,13 @@ ContestHall_EventScript_Player4WalkBack:: ContestHall_EventScript_DoContestAppeals:: lockall - applymovement LOCALID_MC, ContestHall_Movement_FaceContestants2 + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_FaceContestants2 waitmovement 0 call ContestHall_EventScript_TryWaitForLink call ContestHall_EventScript_LetsAppeal waitmessage - applymovement LOCALID_MC, ContestHall_Movement_WalkStageLeft - applymovement LOCALID_JUDGE, ContestHall_Movement_WalkStageRight + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_WalkStageLeft + applymovement LOCALID_CONTEST_JUDGE, ContestHall_Movement_WalkStageRight waitmovement 0 releaseall call ContestHall_EventScript_TryWaitForLink @@ -780,8 +764,8 @@ ContestHall_EventScript_DoContestAppeals:: special LinkContestTryShowWirelessIndicator setvar VAR_TEMP_9, 0 lockall - applymovement LOCALID_MC, ContestHall_Movement_WalkStageRight - applymovement LOCALID_JUDGE, ContestHall_Movement_WalkStageLeft + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_WalkStageRight + applymovement LOCALID_CONTEST_JUDGE, ContestHall_Movement_WalkStageLeft waitmovement 0 releaseall return @@ -817,13 +801,13 @@ ContestHall_EventScript_ContestResults:: call ContestHall_EventScript_TryWaitForLink call ContestHall_EventScript_ThankYouForAppeals call ContestHall_EventScript_TryWaitForLink - applymovement LOCALID_MC, ContestHall_Movement_MCFaceJudge + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_MCFaceJudge waitmovement 0 call ContestHall_EventScript_JudgeLooksReady call ContestHall_EventScript_TryWaitForLink call ContestHall_EventScript_WeWillDeclareWinner call ContestHall_EventScript_TryWaitForLink - applymovement LOCALID_MC, ContestHall_Movement_FaceContestants + applymovement LOCALID_CONTEST_MC, ContestHall_Movement_FaceContestants waitmovement 0 closemessage releaseall @@ -934,14 +918,14 @@ ContestHall_EventScript_AudienceLookAround:: addvar VAR_TEMP_1, 1 lockall call_if_gt VAR_CONTEST_TYPE, CONTEST_TYPE_NPC_NORMAL, ContestHall_EventScript_VObjectAudienceLookAround - applymovement LOCALID_AUDIENCE_5, ContestHall_Movement_AudienceMemberLookRight - applymovement LOCALID_AUDIENCE_2, ContestHall_Movement_AudienceMemberLookDown - applymovement LOCALID_AUDIENCE_3, ContestHall_Movement_AudienceMemberLookRight + applymovement LOCALID_CONTEST_AUDIENCE_5, ContestHall_Movement_AudienceMemberLookRight + applymovement LOCALID_CONTEST_AUDIENCE_2, ContestHall_Movement_AudienceMemberLookDown + applymovement LOCALID_CONTEST_AUDIENCE_3, ContestHall_Movement_AudienceMemberLookRight delay 30 - applymovement LOCALID_AUDIENCE_6, ContestHall_Movement_AudienceMemberLookLeft - applymovement LOCALID_AUDIENCE_7, ContestHall_Movement_AudienceMemberLookDown - applymovement LOCALID_AUDIENCE_1, ContestHall_Movement_AudienceMemberLookUp - applymovement LOCALID_AUDIENCE_4, ContestHall_Movement_AudienceMemberLookLeft + applymovement LOCALID_CONTEST_AUDIENCE_6, ContestHall_Movement_AudienceMemberLookLeft + applymovement LOCALID_CONTEST_AUDIENCE_7, ContestHall_Movement_AudienceMemberLookDown + applymovement LOCALID_CONTEST_AUDIENCE_1, ContestHall_Movement_AudienceMemberLookUp + applymovement LOCALID_CONTEST_AUDIENCE_4, ContestHall_Movement_AudienceMemberLookLeft goto_if_ne VAR_TEMP_1, 4, ContestHall_EventScript_AudienceLookAround delay 30 return diff --git a/data/scripts/day_care.inc b/data/scripts/day_care.inc index cb053f2c40..c9af7f5a3a 100644 --- a/data/scripts/day_care.inc +++ b/data/scripts/day_care.inc @@ -1,5 +1,3 @@ -.set LOCALID_DAYCARE_LADY, 1 - Route117_EventScript_DaycareMan:: lock faceplayer diff --git a/data/scripts/gabby_and_ty.inc b/data/scripts/gabby_and_ty.inc index 260526c4b6..06e1010589 100644 --- a/data/scripts/gabby_and_ty.inc +++ b/data/scripts/gabby_and_ty.inc @@ -1,8 +1,15 @@ -@ Gabby and Ty always move to the same spots for the first 5 battles -@ From the 6th battle onwards, they move randomly between locations 6-8 -@ Note: The local IDs of Gabby and Ty are hard-coded in GetGabbyAndTyLocalIds +@ Gabby and Ty can appear in a fixed location on 3 different routes. +@ Each time they are battled they will disappear from the route they're on +@ and relocate to the next one, in the order Route 111 -> Route 118 -> Route 120. +@ Gabby and Ty have 6 different parties which will get cycled on each appearance. +@ After they're defeated 6 times they will stick to their 6th party but continue +@ cycling between the 3 routes. To determine which trainer party gets used GF created +@ multiple object events for Gabby and Ty on each of the 3 routes. The scripts below +@ handle hiding and showing these objects so the correct party appears on the correct route. +@ Route 111 and Route 118 have 3 object events each (parties 1,4,6 and 2,5,6 respectively) +@ and Route 120 has 2 object events each (parties 3 and 6). GabbyAndTy_EventScript_UpdateLocation:: - cleartrainerflag TRAINER_GABBY_AND_TY_6 + cleartrainerflag TRAINER_GABBY_AND_TY_6 @ Clear flag for their final party to allow infinite rematches. specialvar VAR_RESULT, GabbyAndTyGetBattleNum switch VAR_RESULT case 0, GabbyAndTy_EventScript_MoveForBattle1 @@ -31,13 +38,13 @@ GabbyAndTy_EventScript_MoveForBattle3:: return GabbyAndTy_EventScript_MoveForBattle4:: - call GabbyAndTy_EventScript_ShowAtRoute111_3 + call GabbyAndTy_EventScript_ShowAtRoute111_2 call GabbyAndTy_EventScript_HideAtRoute120_1 return GabbyAndTy_EventScript_MoveForBattle5:: call GabbyAndTy_EventScript_ShowAtRoute118_2 - call GabbyAndTy_EventScript_HideAtRoute111_3 + call GabbyAndTy_EventScript_HideAtRoute111_2 return GabbyAndTy_EventScript_MoveForBattle6:: @@ -46,13 +53,13 @@ GabbyAndTy_EventScript_MoveForBattle6:: return GabbyAndTy_EventScript_MoveForBattle7:: - call GabbyAndTy_EventScript_ShowAtRoute111_2 + call GabbyAndTy_EventScript_ShowAtRoute111_3 call GabbyAndTy_EventScript_HideAtRoute120_2 return GabbyAndTy_EventScript_MoveForBattle8:: call GabbyAndTy_EventScript_ShowAtRoute118_3 - call GabbyAndTy_EventScript_HideAtRoute111_2 + call GabbyAndTy_EventScript_HideAtRoute111_3 return GabbyAndTy_EventScript_MoveForBattle9:: @@ -84,12 +91,12 @@ GabbyAndTy_EventScript_ShowAtRoute120_1:: clearflag FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1 return -GabbyAndTy_EventScript_HideAtRoute111_3:: - setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 +GabbyAndTy_EventScript_HideAtRoute111_2:: + setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 return -GabbyAndTy_EventScript_ShowAtRoute111_3:: - clearflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 +GabbyAndTy_EventScript_ShowAtRoute111_2:: + clearflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 return GabbyAndTy_EventScript_HideAtRoute118_2:: @@ -108,12 +115,12 @@ GabbyAndTy_EventScript_ShowAtRoute120_2:: clearflag FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2 return -GabbyAndTy_EventScript_HideAtRoute111_2:: - setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 +GabbyAndTy_EventScript_HideAtRoute111_3:: + setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 return -GabbyAndTy_EventScript_ShowAtRoute111_2:: - clearflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 +GabbyAndTy_EventScript_ShowAtRoute111_3:: + clearflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 return GabbyAndTy_EventScript_HideAtRoute118_3:: diff --git a/data/scripts/lilycove_lady.inc b/data/scripts/lilycove_lady.inc index 5519de9791..0eb8be19ba 100644 --- a/data/scripts/lilycove_lady.inc +++ b/data/scripts/lilycove_lady.inc @@ -1,6 +1,3 @@ -.set LOCALID_LILYCOVE_LADY, 4 -.set LOCALID_LADYS_MON, 5 - LilycoveCity_PokemonCenter_1F_EventScript_LilycoveLady:: special Script_GetLilycoveLadyId switch VAR_RESULT @@ -390,7 +387,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_FeedPokeblock:: applymovement LOCALID_LILYCOVE_LADY, LilycoveCity_PokemonCenter_1F_Movement_LadyFaceMon waitmovement 0 delay 60 - applymovement LOCALID_LADYS_MON, LilycoveCity_PokemonCenter_1F_Movement_MonFaceLady + applymovement LOCALID_LILYCOVE_LADYS_MON, LilycoveCity_PokemonCenter_1F_Movement_MonFaceLady waitmovement 0 delay 60 waitse @@ -403,7 +400,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_FeedPokeblock:: @ VAR_0x8004 here is the return value from GivePokeblockToContestLady LilycoveCity_PokemonCenter_1F_EventScript_MonEnjoyPokeblock:: - applymovement LOCALID_LADYS_MON, LilycoveCity_PokemonCenter_1F_Movement_MonJump + applymovement LOCALID_LILYCOVE_LADYS_MON, LilycoveCity_PokemonCenter_1F_Movement_MonJump waitmovement 0 delay 60 LilycoveCity_PokemonCenter_1F_EventScript_FinishFeedPokeblock:: diff --git a/data/scripts/new_game.inc b/data/scripts/new_game.inc index e9c8dd8d56..1803199e42 100644 --- a/data/scripts/new_game.inc +++ b/data/scripts/new_game.inc @@ -161,10 +161,10 @@ EventScript_ResetAllMapFlags:: setflag FLAG_HIDE_LILYCOVE_FAN_CLUB_INTERVIEWER setflag FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1 setflag FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1 - setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 + setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 setflag FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2 setflag FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2 - setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 + setflag FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 setflag FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3 setflag FLAG_HIDE_SLATEPORT_CITY_CONTEST_REPORTER setflag FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER diff --git a/data/scripts/players_house.inc b/data/scripts/players_house.inc index caa4e69551..2d906e5705 100644 --- a/data/scripts/players_house.inc +++ b/data/scripts/players_house.inc @@ -1,8 +1,3 @@ -@ Local IDs are the same for both players houses -.set LOCALID_MOM, 1 -.set LOCALID_DAD, 5 -.set LOCALID_MOM_2F, 14 - PlayersHouse_2F_EventScript_BlockStairsUntilClockIsSet:: setvar VAR_LITTLEROOT_INTRO_STATE, 5 return @@ -75,7 +70,7 @@ PlayersHouse_2F_EventScript_WallClock:: end PlayersHouse_2F_EventScript_MomComesUpstairsMale:: - setvar VAR_0x8008, LOCALID_MOM_2F + setvar VAR_0x8008, LOCALID_PLAYERS_HOUSE_2F_MOM addobject VAR_0x8008 applymovement VAR_0x8008, PlayersHouse_2F_Movement_MomEntersMale waitmovement 0 @@ -88,7 +83,7 @@ PlayersHouse_2F_EventScript_MomComesUpstairsMale:: return PlayersHouse_2F_EventScript_MomComesUpstairsFemale:: - setvar VAR_0x8008, LOCALID_MOM_2F + setvar VAR_0x8008, LOCALID_PLAYERS_HOUSE_2F_MOM addobject VAR_0x8008 applymovement VAR_0x8008, PlayersHouse_2F_Movement_MomEntersFemale waitmovement 0 @@ -492,14 +487,14 @@ PlayersHouse_1F_EventScript_AirLatiBroadcast:: PlayersHouse_1F_EventScript_SetUpObjectEventVarsMale:: setvar VAR_0x8008, MALE - setvar VAR_0x8009, LOCALID_DAD - setvar VAR_0x800A, LOCALID_MOM + setvar VAR_0x8009, LOCALID_PLAYERS_HOUSE_1F_DAD + setvar VAR_0x800A, LOCALID_PLAYERS_HOUSE_1F_MOM return PlayersHouse_1F_EventScript_SetUpObjectEventVarsFemale:: setvar VAR_0x8008, FEMALE - setvar VAR_0x8009, LOCALID_DAD - setvar VAR_0x800A, LOCALID_MOM + setvar VAR_0x8009, LOCALID_PLAYERS_HOUSE_1F_DAD + setvar VAR_0x800A, LOCALID_PLAYERS_HOUSE_1F_MOM return PlayersHouse_1F_EventScript_DadApproachPlayerMale:: diff --git a/include/constants/.gitignore b/include/constants/.gitignore index 761af9db76..87f4babc61 100644 --- a/include/constants/.gitignore +++ b/include/constants/.gitignore @@ -1,3 +1,4 @@ # Will be moved to build/ eventually map_groups.h -layouts.h \ No newline at end of file +layouts.h +map_event_ids.h diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index c8fa942655..8ede403c15 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -1,6 +1,9 @@ #ifndef GUARD_CONSTANTS_EVENT_OBJECTS_H #define GUARD_CONSTANTS_EVENT_OBJECTS_H +#include "constants/global.h" +#include "constants/map_event_ids.h" + #define OBJ_EVENT_GFX_BRENDAN_NORMAL 0 #define OBJ_EVENT_GFX_BRENDAN_MACH_BIKE 1 #define OBJ_EVENT_GFX_BRENDAN_SURFING 2 @@ -291,38 +294,14 @@ #define OBJ_KIND_NORMAL 0 #define OBJ_KIND_CLONE 255 // Exclusive to FRLG -// 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_ROUTE111_PLAYER_FALLING 45 -#define LOCALID_BIRTH_ISLAND_EXTERIOR_ROCK 1 -#define LOCALID_FARAWAY_ISLAND_MEW 1 -#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 -#define LOCALID_BATTLE_TOWER_LOBBY_REPORTER 5 -#define LOCALID_TRUCK_BOX_TOP 1 -#define LOCALID_TRUCK_BOX_BOTTOM_L 2 -#define LOCALID_TRUCK_BOX_BOTTOM_R 3 -#define LOCALID_OLDALE_MART_CLERK 1 -#define LOCALID_LAVARIDGE_MART_CLERK 1 -#define LOCALID_FALLARBOR_MART_CLERK 1 -#define LOCALID_VERDANTURF_MART_CLERK 1 -#define LOCALID_PETALBURG_MART_CLERK 1 -#define LOCALID_SLATEPORT_MART_CLERK 1 -#define LOCALID_MAUVILLE_MART_CLERK 1 -#define LOCALID_RUSTBORO_MART_CLERK 1 -#define LOCALID_FORTREE_MART_CLERK 1 -#define LOCALID_MOSSDEEP_MART_CLERK 1 -#define LOCALID_SOOTOPOLIS_MART_CLERK 1 -#define LOCALID_BATTLE_FRONTIER_MART_CLERK 1 -#define LOCALID_SLATEPORT_ENERGY_GURU 25 +// Each object event template gets an ID that can be used to refer to it in scripts and elsewhere. +// This is referred to as the "local id" (and it's really just 1 + its index in the templates array). +// There are a few special IDs reserved for objects that don't have a templates in the map data -- one for the player +// in regular offline play, five for linked players while playing Berry Blender, and one for an invisible object that +// can be spawned for the camera to track instead of the player. Additionally, the value 0 is reserved as an "empty" indicator. +#define LOCALID_NONE 0 +#define OBJ_EVENT_ID_CAMERA 127 +#define LOCALID_BERRY_BLENDER_PLAYER_END 240 // This will use 5 (MAX_RFU_PLAYERS) IDs ending at 240, i.e. 236-240 +#define OBJ_EVENT_ID_PLAYER 255 #endif // GUARD_CONSTANTS_EVENT_OBJECTS_H diff --git a/include/constants/flags.h b/include/constants/flags.h index 5b1b5efd19..d973705f30 100644 --- a/include/constants/flags.h +++ b/include/constants/flags.h @@ -847,7 +847,7 @@ #define FLAG_HIDE_ROUTE_111_GABBY_AND_TY_1 0x31C #define FLAG_HIDE_ROUTE_118_GABBY_AND_TY_1 0x31D #define FLAG_HIDE_ROUTE_120_GABBY_AND_TY_1 0x31E -#define FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 0x31F +#define FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 0x31F #define FLAG_HIDE_LUGIA 0x320 #define FLAG_HIDE_HO_OH 0x321 #define FLAG_HIDE_LILYCOVE_CONTEST_HALL_REPORTER 0x322 @@ -951,7 +951,7 @@ #define FLAG_HIDE_ROUTE_110_TEAM_AQUA 0x384 #define FLAG_HIDE_ROUTE_118_GABBY_AND_TY_2 0x385 #define FLAG_HIDE_ROUTE_120_GABBY_AND_TY_2 0x386 -#define FLAG_HIDE_ROUTE_111_GABBY_AND_TY_2 0x387 +#define FLAG_HIDE_ROUTE_111_GABBY_AND_TY_3 0x387 #define FLAG_HIDE_ROUTE_118_GABBY_AND_TY_3 0x388 #define FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS 0x389 #define FLAG_HIDE_ROUTE_104_WHITE_HERB_FLORIST 0x38A diff --git a/include/global.h b/include/global.h index 00d608e672..1005862d54 100644 --- a/include/global.h +++ b/include/global.h @@ -618,7 +618,7 @@ struct RamScriptData u8 magic; u8 mapGroup; u8 mapNum; - u8 objectId; + u8 localId; u8 script[995]; //u8 padding; }; diff --git a/map_data_rules.mk b/map_data_rules.mk index 199991ad56..7c26c1f769 100755 --- a/map_data_rules.mk +++ b/map_data_rules.mk @@ -11,6 +11,7 @@ INCLUDECONSTS_OUTDIR := include/constants AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/map_groups.h AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/layouts.h +AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/map_event_ids.h AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/heal_locations.h MAP_DIRS := $(dir $(wildcard $(MAPS_DIR)/*/map.json)) @@ -34,5 +35,8 @@ $(MAPS_OUTDIR)/connections.inc $(MAPS_OUTDIR)/groups.inc $(MAPS_OUTDIR)/events.i $(LAYOUTS_OUTDIR)/layouts.inc $(LAYOUTS_OUTDIR)/layouts_table.inc $(INCLUDECONSTS_OUTDIR)/layouts.h: $(LAYOUTS_DIR)/layouts.json $(MAPJSON) layouts emerald $< $(LAYOUTS_OUTDIR) $(INCLUDECONSTS_OUTDIR) -$(DATA_SRC_SUBDIR)/heal_locations.h: $(MAP_JSONS) - @$(MAPJSON) heal_locations emerald $^ $(DATA_SRC_SUBDIR)/heal_locations.h +# Generate files that depends on data that's distributed across the map.json files. +# There's a lot of map.json files, so we print an abbreviated output with echo. +$(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h: $(MAP_JSONS) + @$(MAPJSON) event_constants emerald $^ $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h + @echo "$(MAPJSON) event_constants emerald $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h" diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index 9212dcfa6d..c675a5e600 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -1023,7 +1023,7 @@ static void HidePyramidItem(void) break; } i++; - if (events[i].localId == 0) + if (events[i].localId == LOCALID_NONE) break; } } @@ -1934,7 +1934,7 @@ u8 GetNumBattlePyramidObjectEvents(void) for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { - if (events[i].localId == 0) + if (events[i].localId == LOCALID_NONE) break; } diff --git a/src/battle_setup.c b/src/battle_setup.c index cf91131993..21a9ff3ec8 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -39,6 +39,7 @@ #include "data.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" +#include "constants/event_objects.h" #include "constants/game_stat.h" #include "constants/items.h" #include "constants/songs.h" @@ -1092,7 +1093,7 @@ static void TrainerBattleLoadArgs(const struct TrainerBattleParameter *specs, co void SetMapVarsToTrainer(void) { - if (sTrainerObjectEventLocalId != 0) + if (sTrainerObjectEventLocalId != LOCALID_NONE) { gSpecialVar_LastTalked = sTrainerObjectEventLocalId; gSelectedObjectEvent = GetObjectEventIdByLocalIdAndMap(sTrainerObjectEventLocalId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); diff --git a/src/contest_util.c b/src/contest_util.c index e0e80a7091..7e49ce33c6 100644 --- a/src/contest_util.c +++ b/src/contest_util.c @@ -2306,13 +2306,13 @@ void GetNpcContestantLocalId(void) switch (contestant) { case 0: - localId = 3; + localId = LOCALID_CONTESTANT_1; break; case 1: - localId = 4; + localId = LOCALID_CONTESTANT_2; break; case 2: - localId = 5; + localId = LOCALID_CONTESTANT_3; break; default: // Invalid localId = 100; @@ -2512,7 +2512,12 @@ void LoadLinkContestPlayerPalettes(void) u8 objectEventId; int version; struct Sprite *sprite; - static const u8 sContestantLocalIds[CONTESTANT_COUNT] = { 3, 4, 5, 14 }; + static const u8 sContestantLocalIds[CONTESTANT_COUNT] = { + LOCALID_CONTESTANT_1, + LOCALID_CONTESTANT_2, + LOCALID_CONTESTANT_3, + LOCALID_CONTESTANT_4, + }; gReservedSpritePaletteCount = 12; if (gLinkContestFlags & LINK_CONTEST_FLAG_IS_LINK) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 7b8d783c3c..df399d2c23 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -30,6 +30,17 @@ #include "constants/trainer_types.h" #include "constants/union_room.h" +#define SPECIAL_LOCALIDS_START (min(OBJ_EVENT_ID_CAMERA, \ + min(OBJ_EVENT_ID_PLAYER, \ + LOCALID_BERRY_BLENDER_PLAYER_END - MAX_RFU_PLAYERS + 1))) + +// The object event templates on a map cannot use the special IDs listed above or they can behave unexpectedly. +// For more details on these special IDs see their definitions in 'include/constants/event_objects.h'. +// OBJECT_EVENT_TEMPLATES_COUNT should always be low enough that it doesn't overlap with these IDs. +#if OBJECT_EVENT_TEMPLATES_COUNT >= SPECIAL_LOCALIDS_START +#error "OBJECT_EVENT_TEMPLATES_COUNT is too large. Object event local IDs may overlap with reserved IDs." +#endif + // this file was known as evobjmv.c in Game Freak's original source enum { @@ -8814,7 +8825,7 @@ u8 MovementAction_LockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprite bool32 found = FALSE; for (i = 0; i < OBJECT_EVENTS_COUNT; i++) { - if (firstFreeSlot == OBJECT_EVENTS_COUNT && sLockedAnimObjectEvents->localIds[i] == 0) + if (firstFreeSlot == OBJECT_EVENTS_COUNT && sLockedAnimObjectEvents->localIds[i] == LOCALID_NONE) firstFreeSlot = i; if (sLockedAnimObjectEvents->localIds[i] == objectEvent->localId) @@ -8854,7 +8865,7 @@ u8 MovementAction_UnlockAnim_Step0(struct ObjectEvent *objectEvent, struct Sprit index = FindLockedObjectEventIndex(objectEvent); if (index != OBJECT_EVENTS_COUNT) { - sLockedAnimObjectEvents->localIds[index] = 0; + sLockedAnimObjectEvents->localIds[index] = LOCALID_NONE; sLockedAnimObjectEvents->count--; ableToStore = TRUE; } diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index d094c8678b..db362179dd 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -137,7 +137,7 @@ int ProcessPlayerFieldInput(struct FieldInput *input) u8 playerDirection; u16 metatileBehavior; - gSpecialVar_LastTalked = 0; + gSpecialVar_LastTalked = LOCALID_NONE; gSelectedObjectEvent = 0; playerDirection = GetPlayerFacingDirection(); diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 0f01aed246..9636a2f5ad 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -777,7 +777,7 @@ bool8 IsPlayerCollidingWithFarawayIslandMew(u8 direction) playerY = object->currentCoords.y; MoveCoords(direction, &playerX, &playerY); - mewObjectId = GetObjectEventIdByLocalIdAndMap(1, MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR), MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)); + mewObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_FARAWAY_ISLAND_MEW, MAP_NUM(MAP_FARAWAY_ISLAND_INTERIOR), MAP_GROUP(MAP_FARAWAY_ISLAND_INTERIOR)); if (mewObjectId == OBJECT_EVENTS_COUNT) return FALSE; diff --git a/src/field_specials.c b/src/field_specials.c index f50309849b..5d52e5542e 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -563,8 +563,8 @@ void SpawnLinkPartnerObjectEvent(void) linkSpriteId = OBJ_EVENT_GFX_RIVAL_MAY_NORMAL; break; } - SpawnSpecialObjectEventParameterized(linkSpriteId, movementTypes[j], 240 - i, coordOffsets[j][0] + x + MAP_OFFSET, coordOffsets[j][1] + y + MAP_OFFSET, 0); - LoadLinkPartnerObjectEventSpritePalette(linkSpriteId, 240 - i, i); + SpawnSpecialObjectEventParameterized(linkSpriteId, movementTypes[j], LOCALID_BERRY_BLENDER_PLAYER_END - i, coordOffsets[j][0] + x + MAP_OFFSET, coordOffsets[j][1] + y + MAP_OFFSET, 0); + LoadLinkPartnerObjectEventSpritePalette(linkSpriteId, LOCALID_BERRY_BLENDER_PLAYER_END - i, i); j++; if (j == MAX_LINK_PLAYERS) j = 0; diff --git a/src/rotating_tile_puzzle.c b/src/rotating_tile_puzzle.c index 7581b81072..65ef687fdb 100644 --- a/src/rotating_tile_puzzle.c +++ b/src/rotating_tile_puzzle.c @@ -109,7 +109,7 @@ u16 MoveRotatingTileObjects(u8 puzzleNumber) { u8 i; struct ObjectEventTemplate *objectEvents = gSaveBlock1Ptr->objectEventTemplates; - u16 localId = 0; + u16 localId = LOCALID_NONE; for (i = 0; i < OBJECT_EVENT_TEMPLATES_COUNT; i++) { diff --git a/src/scrcmd.c b/src/scrcmd.c index 88c6ffefb7..bc741b3e43 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1020,7 +1020,7 @@ bool8 ScrCmd_waitmovement(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); - if (localId != 0) + if (localId != LOCALID_NONE) sMovingNpcId = localId; sMovingNpcMapGroup = gSaveBlock1Ptr->location.mapGroup; sMovingNpcMapNum = gSaveBlock1Ptr->location.mapNum; @@ -1034,7 +1034,7 @@ bool8 ScrCmd_waitmovementat(struct ScriptContext *ctx) u8 mapGroup; u8 mapNum; - if (localId != 0) + if (localId != LOCALID_NONE) sMovingNpcId = localId; mapGroup = ScriptReadByte(ctx); mapNum = ScriptReadByte(ctx); diff --git a/src/script.c b/src/script.c index eb5dccb175..1f70bf37da 100644 --- a/src/script.c +++ b/src/script.c @@ -378,7 +378,7 @@ void ClearRamScript(void) CpuFill32(0, &gSaveBlock1Ptr->ramScript, sizeof(struct RamScript)); } -bool8 InitRamScript(const u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 objectId) +bool8 InitRamScript(const u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 localId) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; @@ -390,13 +390,13 @@ bool8 InitRamScript(const u8 *script, u16 scriptSize, u8 mapGroup, u8 mapNum, u8 scriptData->magic = RAM_SCRIPT_MAGIC; scriptData->mapGroup = mapGroup; scriptData->mapNum = mapNum; - scriptData->objectId = objectId; + scriptData->localId = localId; memcpy(scriptData->script, script, scriptSize); gSaveBlock1Ptr->ramScript.checksum = CalculateRamScriptChecksum(); return TRUE; } -const u8 *GetRamScript(u8 objectId, const u8 *script) +const u8 *GetRamScript(u8 localId, const u8 *script) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; gRamScriptRetAddr = NULL; @@ -406,7 +406,7 @@ const u8 *GetRamScript(u8 objectId, const u8 *script) return script; if (scriptData->mapNum != gSaveBlock1Ptr->location.mapNum) return script; - if (scriptData->objectId != objectId) + if (scriptData->localId != localId) return script; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) { @@ -431,7 +431,7 @@ bool32 ValidateSavedRamScript(void) return FALSE; if (scriptData->mapNum != MAP_NUM(MAP_UNDEFINED)) return FALSE; - if (scriptData->objectId != NO_OBJECT) + if (scriptData->localId != NO_OBJECT) return FALSE; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) return FALSE; @@ -449,7 +449,7 @@ u8 *GetSavedRamScriptIfValid(void) return NULL; if (scriptData->mapNum != MAP_NUM(MAP_UNDEFINED)) return NULL; - if (scriptData->objectId != NO_OBJECT) + if (scriptData->localId != NO_OBJECT) return NULL; if (CalculateRamScriptChecksum() != gSaveBlock1Ptr->ramScript.checksum) { diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 8a03e8752a..0dbef13995 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -366,13 +366,13 @@ static void FreeDataStruct(void) TRY_FREE_AND_SET_NULL(sHillData); } -void CopyTrainerHillTrainerText(u8 which, u16 trainerId) +void CopyTrainerHillTrainerText(u8 which, u16 localId) { u8 id, floorId; SetUpDataStruct(); floorId = GetFloorId(); - id = trainerId - 1; + id = localId - 1; switch (which) { diff --git a/src/tv.c b/src/tv.c index 8c70711dd2..e802a32458 100644 --- a/src/tv.c +++ b/src/tv.c @@ -992,6 +992,7 @@ static void TakeGabbyAndTyOffTheAir(void) gSaveBlock1Ptr->gabbyAndTyData.onAir = FALSE; } +// See gabby_and_ty.inc for details u8 GabbyAndTyGetBattleNum(void) { if (gSaveBlock1Ptr->gabbyAndTyData.battleNum > 5) @@ -1033,41 +1034,42 @@ u8 GabbyAndTyGetLastBattleTrivia(void) return 0; } +// See gabby_and_ty.inc for details void GetGabbyAndTyLocalIds(void) { switch (GabbyAndTyGetBattleNum()) { case 1: - gSpecialVar_0x8004 = 14; - gSpecialVar_0x8005 = 13; + gSpecialVar_0x8004 = LOCALID_ROUTE111_GABBY_1; + gSpecialVar_0x8005 = LOCALID_ROUTE111_TY_1; break; case 2: - gSpecialVar_0x8004 = 5; - gSpecialVar_0x8005 = 6; + gSpecialVar_0x8004 = LOCALID_ROUTE118_GABBY_1; + gSpecialVar_0x8005 = LOCALID_ROUTE118_TY_1; break; case 3: - gSpecialVar_0x8004 = 18; - gSpecialVar_0x8005 = 17; + gSpecialVar_0x8004 = LOCALID_ROUTE120_GABBY_1; + gSpecialVar_0x8005 = LOCALID_ROUTE120_TY_1; break; case 4: - gSpecialVar_0x8004 = 21; - gSpecialVar_0x8005 = 22; + gSpecialVar_0x8004 = LOCALID_ROUTE111_GABBY_2; + gSpecialVar_0x8005 = LOCALID_ROUTE111_TY_2; break; case 5: - gSpecialVar_0x8004 = 8; - gSpecialVar_0x8005 = 9; + gSpecialVar_0x8004 = LOCALID_ROUTE118_GABBY_2; + gSpecialVar_0x8005 = LOCALID_ROUTE118_TY_2; break; case 6: - gSpecialVar_0x8004 = 19; - gSpecialVar_0x8005 = 20; + gSpecialVar_0x8004 = LOCALID_ROUTE120_GABBY_2; + gSpecialVar_0x8005 = LOCALID_ROUTE120_TY_2; break; case 7: - gSpecialVar_0x8004 = 23; - gSpecialVar_0x8005 = 24; + gSpecialVar_0x8004 = LOCALID_ROUTE111_GABBY_3; + gSpecialVar_0x8005 = LOCALID_ROUTE111_TY_3; break; case 8: - gSpecialVar_0x8004 = 10; - gSpecialVar_0x8005 = 11; + gSpecialVar_0x8004 = LOCALID_ROUTE118_GABBY_3; + gSpecialVar_0x8005 = LOCALID_ROUTE118_TY_3; break; } } diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 3a427f98c2..597118db8e 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -96,6 +96,29 @@ string json_to_string(const Json &data, const string &field = "", bool silent = return output; } +string get_generated_warning(const string &filename, bool isAsm) { + string comment = isAsm ? "@" : "//"; + + ostringstream warning; + warning << comment << "\n" + << comment << " DO NOT MODIFY THIS FILE! It is auto-generated from " << filename << "\n" + << comment << "\n\n"; + return warning.str(); +} + +string get_include_guard_start(const string &name) { + ostringstream guard; + guard << "#ifndef GUARD_" << name << "_H\n" + << "#define GUARD_" << name << "_H\n\n"; + return guard.str(); +} + +string get_include_guard_end(const string &name) { + ostringstream guard; + guard << "#endif // GUARD_" << name << "_H\n"; + return guard.str(); +} + string generate_map_header_text(Json map_data, Json layouts_data) { string map_layout_id = json_to_string(map_data, "layout"); @@ -114,8 +137,7 @@ string generate_map_header_text(Json map_data, Json layouts_data) { ostringstream text; string mapName = json_to_string(map_data, "name"); - - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/" << mapName << "/map.json\n@\n\n"; + text << get_generated_warning("data/maps/" + mapName + "/map.json", true); text << mapName << ":\n" << "\t.4byte " << json_to_string(layout, "name") << "\n"; @@ -167,12 +189,10 @@ string generate_map_connections_text(Json map_data) { if (map_data["connections"] == Json()) return string("\n"); - ostringstream text; - string mapName = json_to_string(map_data, "name"); - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/" << mapName << "/map.json\n@\n\n"; - + ostringstream text; + text << get_generated_warning("data/maps/" + mapName + "/map.json", true); text << mapName << "_MapConnectionsList:\n"; for (auto &connection : map_data["connections"].array_items()) { @@ -193,11 +213,11 @@ string generate_map_events_text(Json map_data) { if (map_data.object_items().find("shared_events_map") != map_data.object_items().end()) return string("\n"); - ostringstream text; - string mapName = json_to_string(map_data, "name"); - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/" << mapName << "/map.json\n@\n\n\t.align 2\n\n"; + ostringstream text; + text << get_generated_warning("data/maps/" + mapName + "/map.json", true); + text << "\t.align 2\n\n"; string objects_label, warps_label, coords_label, bgs_label; @@ -371,10 +391,16 @@ void process_map(string map_filepath, string layouts_filepath, string output_dir write_text_file(out_dir + "connections.inc", connections_text); } -void process_heal_locations(const vector &map_filepaths, string output_file) { - ostringstream heal_locations_text; - ostringstream respawn_maps_text; - ostringstream respawn_npcs_text; +void process_event_constants(const vector &map_filepaths, string output_ids_file, string output_heal_locations_file) { + string warning = get_generated_warning("data/maps/*/map.json", false); + + ostringstream heal_locations_arr_text; + ostringstream respawn_maps_arr_text; + ostringstream respawn_npcs_arr_text; + + string guard_name = "CONSTANTS_MAP_EVENT_IDS"; + ostringstream ids_file_text; + ids_file_text << get_include_guard_start(guard_name) << warning; // Get heal location data from each map for (const string &filepath : map_filepaths) { @@ -382,62 +408,91 @@ void process_heal_locations(const vector &map_filepaths, string output_f string map_json_text = read_text_file(filepath); Json map_data = Json::parse(map_json_text, err); if (map_data == Json()) - FATAL_ERROR("Failed to read '%s' while generating '%s': %s\n", filepath.c_str(), output_file.c_str(), err.c_str()); - - // Skip if no heal locations present - if (map_data.object_items().find("heal_locations") == map_data.object_items().end() || map_data["heal_locations"].array_items().size() <= 0) - continue; + FATAL_ERROR("Failed to read '%s' while generating map event constants: %s\n", filepath.c_str(), err.c_str()); string map_id = json_to_string(map_data, "id"); - for (auto &heal_location : map_data["heal_locations"].array_items()) { - // Each array is indexed with the heal location's ID, e.g. '[HEAL_LOCATION_NAME - 1] = ' - string index_text = "\t[" + json_to_string(heal_location, "id") + " - 1] ="; - - // Add element to main heal locations array - heal_locations_text << index_text << "\n\t{\n" - << "\t\t.mapGroup = MAP_GROUP(" << map_id << "),\n" - << "\t\t.mapNum = MAP_NUM(" << map_id << "),\n" - << "\t\t.x = " << json_to_string(heal_location, "x") << ",\n" - << "\t\t.y = " << json_to_string(heal_location, "y") << ",\n" - << "\t},\n"; - - // Add element to respawn map array (if field is present) - if (heal_location.object_items().find("respawn_map") != heal_location.object_items().end()) { - string respawn_map_id = json_to_string(heal_location, "respawn_map"); - respawn_maps_text << index_text << " {" - << "MAP_GROUP(" << respawn_map_id << "), " - << "MAP_NUM(" << respawn_map_id << ")" - << "},\n"; + + // Get IDs from the object/clone events. + ostringstream map_ids_text; + auto obj_events = map_data["object_events"].array_items(); + for (unsigned int i = 0; i < obj_events.size(); i++) { + auto obj_event = obj_events[i]; + if (obj_event.object_items().find("local_id") != obj_event.object_items().end()) + map_ids_text << "#define " << json_to_string(obj_event, "local_id") << " " << i + 1 << "\n"; + } + // Get IDs from the warp events. + auto warp_events = map_data["warp_events"].array_items(); + if (warp_events.size()) { + for (unsigned int i = 0; i < warp_events.size(); i++) { + auto warp_event = warp_events[i]; + if (warp_event.object_items().find("warp_id") != warp_event.object_items().end()) + map_ids_text << "#define " << json_to_string(warp_event, "warp_id") << " " << i << "\n"; } + } + // Only output if we found any IDs + string temp = map_ids_text.str(); + if (!temp.empty()) { + ids_file_text << "// " << map_id << "\n" << temp << "\n"; + } + + // Process heal locations. Maps are not required to have a heal locations array, so we check if it exists first. + if (map_data.object_items().find("heal_locations") != map_data.object_items().end()) { + for (auto &heal_location : map_data["heal_locations"].array_items()) { + // Each array is indexed with the heal location's ID, e.g. '[HEAL_LOCATION_NAME - 1] = ' + string index_text = "\t[" + json_to_string(heal_location, "id") + " - 1] ="; + + // Add element to main heal locations array + heal_locations_arr_text << index_text << "\n\t{\n" + << "\t\t.mapGroup = MAP_GROUP(" << map_id << "),\n" + << "\t\t.mapNum = MAP_NUM(" << map_id << "),\n" + << "\t\t.x = " << json_to_string(heal_location, "x") << ",\n" + << "\t\t.y = " << json_to_string(heal_location, "y") << ",\n" + << "\t},\n"; + + // Add element to respawn map array (if field is present) + if (heal_location.object_items().find("respawn_map") != heal_location.object_items().end()) { + string respawn_map_id = json_to_string(heal_location, "respawn_map"); + respawn_maps_arr_text << index_text << " {" + << "MAP_GROUP(" << respawn_map_id << "), " + << "MAP_NUM(" << respawn_map_id << ")" + << "},\n"; + } - // Add element to respawn NPC array (if field is present) - if (heal_location.object_items().find("respawn_npc") != heal_location.object_items().end()) { - respawn_npcs_text << index_text << " " << json_to_string(heal_location, "respawn_npc") << ",\n"; + // Add element to respawn NPC array (if field is present) + if (heal_location.object_items().find("respawn_npc") != heal_location.object_items().end()) { + respawn_npcs_arr_text << index_text << " " << json_to_string(heal_location, "respawn_npc") << ",\n"; + } } } } - ostringstream text; - text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/*/map.json\n//\n\n"; + // Write event ids file + ids_file_text << get_include_guard_end(guard_name); + write_text_file(output_ids_file, ids_file_text.str()); + - string arr_body = heal_locations_text.str(); - text << "static const struct HealLocation sHealLocations[] =\n{\n" << arr_body << "};\n\n"; + // Write heal locations data file + ostringstream heal_locations_file_text; + heal_locations_file_text << warning; - arr_body = respawn_maps_text.str(); + string arr_body = heal_locations_arr_text.str(); + heal_locations_file_text << "static const struct HealLocation sHealLocations[] =\n{\n" << arr_body << "};\n\n"; + + arr_body = respawn_maps_arr_text.str(); if (!arr_body.empty()) - text << "static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n" << arr_body << "};\n\n"; + heal_locations_file_text << "static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n" << arr_body << "};\n\n"; - arr_body = respawn_npcs_text.str(); + arr_body = respawn_npcs_arr_text.str(); if (!arr_body.empty()) - text << "static const u8 sWhiteoutRespawnHealerNpcIds[] =\n{\n" << arr_body << "};\n\n"; + heal_locations_file_text << "static const u8 sWhiteoutRespawnHealerNpcIds[] =\n{\n" << arr_body << "};\n\n"; - write_text_file(output_file, text.str()); + write_text_file(output_heal_locations_file, heal_locations_file_text.str()); } string generate_groups_text(Json groups_data) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n"; + text << get_generated_warning("data/maps/map_groups.json", true); for (auto &key : groups_data["group_order"].array_items()) { string group = json_to_string(key); @@ -478,7 +533,7 @@ string generate_connections_text(Json groups_data, string include_path) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n"; + text << get_generated_warning("data/maps/map_groups.json", true); for (Json map_name : map_names) text << "\t.include \"" << include_path << "/" << json_to_string(map_name) << "/connections.inc\"\n"; @@ -495,7 +550,7 @@ string generate_headers_text(Json groups_data, string include_path) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n@\n\n"; + text << get_generated_warning("data/maps/map_groups.json", true); for (string map_name : map_names) text << "\t.include \"" << include_path << "/" << map_name << "/header.inc\"\n"; @@ -512,7 +567,7 @@ string generate_events_text(Json groups_data, string include_path) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from " << include_path << "/map_groups.json\n@\n\n"; + text << get_generated_warning(include_path + "/map_groups.json", true); for (string map_name : map_names) text << "\t.include \"" << include_path << "/" << map_name << "/events.inc\"\n"; @@ -523,12 +578,9 @@ string generate_events_text(Json groups_data, string include_path) { string generate_map_constants_text(string groups_filepath, Json groups_data) { string file_dir = file_parent(groups_filepath) + sep; + string guard_name = "CONSTANTS_MAP_GROUPS"; ostringstream text; - - text << "#ifndef GUARD_CONSTANTS_MAP_GROUPS_H\n" - << "#define GUARD_CONSTANTS_MAP_GROUPS_H\n\n"; - - text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/maps/map_groups.json\n//\n\n"; + text << get_include_guard_start(guard_name) << get_generated_warning("data/maps/map_groups.json", false); int group_num = 0; @@ -561,7 +613,7 @@ string generate_map_constants_text(string groups_filepath, Json groups_data) { } text << "#define MAP_GROUPS_COUNT " << group_num << "\n\n"; - text << "#endif // GUARD_CONSTANTS_MAP_GROUPS_H\n"; + text << get_include_guard_end(guard_name); return text.str(); } @@ -593,7 +645,7 @@ void process_groups(string groups_filepath, string output_asm, string output_c) string generate_layout_headers_text(Json layouts_data) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n@\n\n"; + text << get_generated_warning("data/layouts/layouts.json", true); for (auto &layout : layouts_data["layouts"].array_items()) { if (layout == Json::object()) continue; @@ -626,7 +678,7 @@ string generate_layout_headers_text(Json layouts_data) { string generate_layouts_table_text(Json layouts_data) { ostringstream text; - text << "@\n@ DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n@\n\n"; + text << get_generated_warning("data/layouts/layouts.json", true); text << "\t.align 2\n" << json_to_string(layouts_data, "layouts_table_label") << "::\n"; @@ -641,12 +693,9 @@ string generate_layouts_table_text(Json layouts_data) { } string generate_layouts_constants_text(Json layouts_data) { + string guard_name = "CONSTANTS_LAYOUTS"; ostringstream text; - - text << "#ifndef GUARD_CONSTANTS_LAYOUTS_H\n" - << "#define GUARD_CONSTANTS_LAYOUTS_H\n\n"; - - text << "//\n// DO NOT MODIFY THIS FILE! It is auto-generated from data/layouts/layouts.json\n//\n\n"; + text << get_include_guard_start(guard_name) << get_generated_warning("data/layouts/layouts.json", false); int i = 1; for (auto &layout : layouts_data["layouts"].array_items()) { @@ -655,7 +704,7 @@ string generate_layouts_constants_text(Json layouts_data) { i++; } - text << "\n#endif // GUARD_CONSTANTS_LAYOUTS_H\n"; + text << get_include_guard_end(guard_name); return text.str(); } @@ -723,24 +772,25 @@ int main(int argc, char *argv[]) { process_layouts(filepath, output_asm, output_c); } - else if (mode == "heal_locations") { - if (argc < 5) - FATAL_ERROR("USAGE: mapjson heal_locations [additional_map_files] "); + else if (mode == "event_constants") { + if (argc < 6) + FATAL_ERROR("USAGE: mapjson event_constants [additional_map_files] "); infer_separator(argv[3]); vector filepaths; const int firstMapFileArg = 3; - const int lastMapFileArg = argc - 2; + const int lastMapFileArg = argc - 3; for (int i = firstMapFileArg; i <= lastMapFileArg; i++) { filepaths.push_back(argv[i]); } - string output_file(argv[argc - 1]); + string output_ids_file(argv[argc - 2]); + string output_heal_locations_file(argv[argc - 1]); - process_heal_locations(filepaths, output_file); + process_event_constants(filepaths, output_ids_file, output_heal_locations_file); } else { - FATAL_ERROR("ERROR: must be 'layouts', 'map', 'heal_locations', or 'groups'.\n"); + FATAL_ERROR("ERROR: must be 'layouts', 'map', 'event_constants', or 'groups'.\n"); } return 0; From a2a3255bddaf1c1afae350c811d6f266bffdaabe Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 12 Oct 2024 03:30:35 -0400 Subject: [PATCH 008/187] Fix typo, remove old size check --- include/constants/event_objects.h | 2 +- tools/mapjson/mapjson.cpp | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 8ede403c15..3efcf1d989 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -296,7 +296,7 @@ // Each object event template gets an ID that can be used to refer to it in scripts and elsewhere. // This is referred to as the "local id" (and it's really just 1 + its index in the templates array). -// There are a few special IDs reserved for objects that don't have a templates in the map data -- one for the player +// There are a few special IDs reserved for objects that don't have templates in the map data -- one for the player // in regular offline play, five for linked players while playing Berry Blender, and one for an invisible object that // can be spawned for the camera to track instead of the player. Additionally, the value 0 is reserved as an "empty" indicator. #define LOCALID_NONE 0 diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 597118db8e..99b67d82ea 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -422,12 +422,10 @@ void process_event_constants(const vector &map_filepaths, string output_ } // Get IDs from the warp events. auto warp_events = map_data["warp_events"].array_items(); - if (warp_events.size()) { - for (unsigned int i = 0; i < warp_events.size(); i++) { - auto warp_event = warp_events[i]; - if (warp_event.object_items().find("warp_id") != warp_event.object_items().end()) - map_ids_text << "#define " << json_to_string(warp_event, "warp_id") << " " << i << "\n"; - } + for (unsigned int i = 0; i < warp_events.size(); i++) { + auto warp_event = warp_events[i]; + if (warp_event.object_items().find("warp_id") != warp_event.object_items().end()) + map_ids_text << "#define " << json_to_string(warp_event, "warp_id") << " " << i << "\n"; } // Only output if we found any IDs string temp = map_ids_text.str(); From cb66ea665338a9bdf0908d938e22cdf9500a92be Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 12 Oct 2024 09:59:56 -0400 Subject: [PATCH 009/187] Continue adding local IDs to map.json files --- data/event_scripts.s | 4 +- .../BattleFrontier_BattlePikeLobby/map.json | 1 + .../scripts.inc | 4 +- .../map.json | 1 + .../scripts.inc | 6 +- data/maps/BattleFrontier_Mart/map.json | 3 +- data/maps/BattleFrontier_Mart/scripts.inc | 4 +- .../BattleFrontier_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/BattleFrontier_ScottsHouse/map.json | 1 + .../BattleFrontier_ScottsHouse/scripts.inc | 12 +- data/maps/DesertUnderpass/map.json | 1 + data/maps/DesertUnderpass/scripts.inc | 6 +- data/maps/DewfordTown/map.json | 2 + data/maps/DewfordTown/scripts.inc | 46 ++-- data/maps/DewfordTown_Hall/map.json | 4 + data/maps/DewfordTown_Hall/scripts.inc | 13 +- .../EverGrandeCity_ChampionsRoom/map.json | 3 + .../EverGrandeCity_ChampionsRoom/scripts.inc | 34 ++- .../EverGrandeCity_PokemonCenter_1F/map.json | 2 + .../scripts.inc | 11 +- .../EverGrandeCity_PokemonLeague_1F/map.json | 3 + .../scripts.inc | 18 +- .../FallarborTown_BattleTentLobby/map.json | 1 + .../FallarborTown_BattleTentLobby/scripts.inc | 6 +- data/maps/FarawayIsland_Interior/scripts.inc | 2 - data/maps/FortreeCity_House4/map.json | 1 + data/maps/FortreeCity_House4/scripts.inc | 6 +- data/maps/LavaridgeTown/map.json | 2 + data/maps/LavaridgeTown/scripts.inc | 39 ++-- .../LavaridgeTown_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/LilycoveCity/map.json | 2 + data/maps/LilycoveCity/scripts.inc | 7 +- data/maps/LilycoveCity_ContestHall/map.json | 27 +++ .../maps/LilycoveCity_ContestHall/scripts.inc | 33 +-- .../LilycoveCity_CoveLilyMotel_1F/map.json | 1 + .../LilycoveCity_CoveLilyMotel_1F/scripts.inc | 22 +- .../LilycoveCity_DepartmentStore_5F/map.json | 1 + .../scripts.inc | 10 +- data/maps/LilycoveCity_Harbor/map.json | 4 + data/maps/LilycoveCity_Harbor/scripts.inc | 55 +++-- .../LilycoveCity_LilycoveMuseum_1F/map.json | 2 + .../scripts.inc | 11 +- .../LilycoveCity_LilycoveMuseum_2F/map.json | 1 + .../scripts.inc | 14 +- .../maps/LittlerootTown_MaysHouse_2F/map.json | 1 + .../LittlerootTown_MaysHouse_2F/scripts.inc | 30 ++- data/maps/MagmaHideout_4F/map.json | 7 + data/maps/MagmaHideout_4F/scripts.inc | 32 +-- data/maps/MarineCave_End/map.json | 1 + data/maps/MarineCave_End/scripts.inc | 8 +- data/maps/MeteorFalls_1F_1R/map.json | 5 + data/maps/MeteorFalls_1F_1R/scripts.inc | 68 +++--- data/maps/MeteorFalls_StevensCave/map.json | 1 + data/maps/MeteorFalls_StevensCave/scripts.inc | 10 +- data/maps/MirageTower_4F/map.json | 2 + data/maps/MirageTower_4F/scripts.inc | 7 +- data/maps/MossdeepCity/map.json | 6 + data/maps/MossdeepCity/scripts.inc | 43 ++-- data/maps/MossdeepCity_House2/map.json | 1 + data/maps/MossdeepCity_House2/scripts.inc | 8 +- .../maps/MossdeepCity_SpaceCenter_1F/map.json | 6 + .../MossdeepCity_SpaceCenter_1F/scripts.inc | 39 ++-- data/maps/MtChimney/map.json | 5 + data/maps/MtChimney/scripts.inc | 37 ++-- data/maps/MtPyre_Summit/map.json | 7 + data/maps/MtPyre_Summit/scripts.inc | 82 ++++--- data/maps/NavelRock_Harbor/map.json | 2 + data/maps/NavelRock_Harbor/scripts.inc | 7 +- data/maps/OldaleTown/map.json | 3 + data/maps/OldaleTown/scripts.inc | 30 ++- .../PacifidlogTown_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/PetalburgCity/map.json | 5 + data/maps/PetalburgCity/scripts.inc | 56 +++-- data/maps/PetalburgCity_Gym/map.json | 3 + data/maps/PetalburgCity_Gym/scripts.inc | 98 ++++----- .../PetalburgCity_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/PetalburgCity_WallysHouse/map.json | 1 + .../PetalburgCity_WallysHouse/scripts.inc | 4 +- data/maps/PetalburgWoods/map.json | 2 + data/maps/PetalburgWoods/scripts.inc | 43 ++-- data/maps/Route101/map.json | 2 + data/maps/Route101/scripts.inc | 25 +-- data/maps/Route104/map.json | 3 + data/maps/Route104/scripts.inc | 58 +++-- data/maps/Route104_MrBrineysHouse/map.json | 2 + data/maps/Route104_MrBrineysHouse/scripts.inc | 11 +- .../Route104_PrettyPetalFlowerShop/map.json | 1 + .../scripts.inc | 4 +- data/maps/Route109/map.json | 2 + data/maps/Route109/scripts.inc | 24 +- data/maps/Route110/map.json | 4 + data/maps/Route110/scripts.inc | 71 +++--- data/maps/Route110_TrickHousePuzzle5/map.json | 5 + .../Route110_TrickHousePuzzle5/scripts.inc | 6 - data/maps/Route111/map.json | 5 + data/maps/Route111/scripts.inc | 48 ++-- .../Route111_WinstrateFamilysHouse/map.json | 4 + .../scripts.inc | 13 +- data/maps/Route112/map.json | 2 + data/maps/Route112/scripts.inc | 19 +- data/maps/Route112_CableCarStation/map.json | 1 + .../maps/Route112_CableCarStation/scripts.inc | 14 +- .../Route114_FossilManiacsTunnel/map.json | 1 + .../Route114_FossilManiacsTunnel/scripts.inc | 2 - data/maps/Route116/map.json | 2 + data/maps/Route116/scripts.inc | 7 +- data/maps/Route118/map.json | 1 + data/maps/Route118/scripts.inc | 16 +- data/maps/Route119/map.json | 3 + data/maps/Route119/scripts.inc | 46 ++-- .../Route119_WeatherInstitute_1F/map.json | 1 + .../Route119_WeatherInstitute_1F/scripts.inc | 6 +- .../Route119_WeatherInstitute_2F/map.json | 6 + .../Route119_WeatherInstitute_2F/scripts.inc | 41 ++-- data/maps/Route120/map.json | 3 + data/maps/Route120/scripts.inc | 13 +- data/maps/Route121/map.json | 3 + data/maps/Route121/scripts.inc | 18 +- data/maps/RustboroCity/map.json | 6 + data/maps/RustboroCity/scripts.inc | 205 +++++++++--------- data/maps/RustboroCity_DevonCorp_2F/map.json | 1 + .../RustboroCity_DevonCorp_2F/scripts.inc | 2 - data/maps/RustboroCity_DevonCorp_3F/map.json | 1 + .../RustboroCity_DevonCorp_3F/scripts.inc | 14 +- data/maps/RustboroCity_Flat1_2F/map.json | 1 + data/maps/RustboroCity_Flat1_2F/scripts.inc | 2 - data/maps/RusturfTunnel/map.json | 5 + data/maps/RusturfTunnel/scripts.inc | 66 +++--- data/maps/SSTidalCorridor/map.json | 2 + data/maps/SSTidalCorridor/scripts.inc | 13 +- data/maps/SafariZone_South/map.json | 1 + data/maps/SafariZone_South/scripts.inc | 12 +- data/maps/SeafloorCavern_Entrance/map.json | 1 + data/maps/SeafloorCavern_Entrance/scripts.inc | 18 +- data/maps/SeafloorCavern_Room9/map.json | 6 + data/maps/SeafloorCavern_Room9/scripts.inc | 33 ++- data/maps/SkyPillar_Top/map.json | 1 + data/maps/SkyPillar_Top/scripts.inc | 2 - data/maps/SlateportCity/map.json | 20 ++ data/maps/SlateportCity/scripts.inc | 159 ++++++-------- data/maps/SlateportCity_Harbor/map.json | 5 + data/maps/SlateportCity_Harbor/scripts.inc | 38 ++-- .../SlateportCity_OceanicMuseum_1F/map.json | 1 + .../scripts.inc | 14 +- .../SlateportCity_OceanicMuseum_2F/map.json | 4 + .../scripts.inc | 47 ++-- .../SlateportCity_SternsShipyard_1F/map.json | 1 + .../scripts.inc | 2 - data/maps/SootopolisCity/map.json | 17 ++ data/maps/SootopolisCity/scripts.inc | 198 ++++++++--------- .../map.json | 1 + .../scripts.inc | 14 +- .../SootopolisCity_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- data/maps/SouthernIsland_Exterior/map.json | 2 + data/maps/SouthernIsland_Exterior/scripts.inc | 7 +- data/maps/SouthernIsland_Interior/map.json | 1 + data/maps/SouthernIsland_Interior/scripts.inc | 10 +- data/maps/TrainerHill_Elevator/map.json | 1 + data/maps/TrainerHill_Elevator/scripts.inc | 6 +- data/maps/VerdanturfTown/map.json | 1 + data/maps/VerdanturfTown/scripts.inc | 6 +- .../VerdanturfTown_PokemonCenter_1F/map.json | 1 + .../scripts.inc | 4 +- src/field_specials.c | 2 +- 169 files changed, 1233 insertions(+), 1325 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 55720a6add..f18aae0b3a 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -774,8 +774,8 @@ EventScript_HideMrBriney:: return RusturfTunnel_EventScript_SetRusturfTunnelOpen:: - removeobject LOCALID_WANDAS_BF - removeobject LOCALID_WANDA + removeobject LOCALID_RUSTURF_TUNNEL_WANDAS_BF + removeobject LOCALID_RUSTURF_TUNNEL_WANDA clearflag FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDAS_BOYFRIEND clearflag FLAG_HIDE_VERDANTURF_TOWN_WANDAS_HOUSE_WANDA setvar VAR_RUSTURF_TUNNEL_STATE, 6 diff --git a/data/maps/BattleFrontier_BattlePikeLobby/map.json b/data/maps/BattleFrontier_BattlePikeLobby/map.json index 0faca2e94f..5698b00826 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/map.json +++ b/data/maps/BattleFrontier_BattlePikeLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BATTLE_PIKE_LOBBY_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 5, "y": 5, diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index faba545f0e..09806cf503 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattlePikeLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePikeLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePikeLobby_OnWarp @@ -198,7 +196,7 @@ BattleFrontier_BattlePikeLobby_EventScript_ShowResults:: end BattleFrontier_BattlePikeLobby_EventScript_WalkToCorridor:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePikeLobby_Movement_AttendantWalkToCorridor + applymovement LOCALID_BATTLE_PIKE_LOBBY_ATTENDANT, BattleFrontier_BattlePikeLobby_Movement_AttendantWalkToCorridor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeLobby_Movement_PlayerWalkToCorridor waitmovement 0 return diff --git a/data/maps/BattleFrontier_BattleTowerElevator/map.json b/data/maps/BattleFrontier_BattleTowerElevator/map.json index f74dce2336..d571ee6c12 100644 --- a/data/maps/BattleFrontier_BattleTowerElevator/map.json +++ b/data/maps/BattleFrontier_BattleTowerElevator/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 5, diff --git a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc index 06f4ff0a70..d14e1898d0 100644 --- a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleTowerElevator_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleTowerElevator_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleTowerElevator_OnWarp @@ -11,7 +9,7 @@ BattleFrontier_BattleTowerElevator_OnFrame: BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantEnter + applymovement LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantEnter applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerEnter waitmovement 0 special BufferBattleTowerElevatorFloors @@ -19,7 +17,7 @@ BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: special MoveElevator waitstate delay 48 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantExit + applymovement LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantExit applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerExit waitmovement 0 call BattleFrontier_BattleTowerElevator_EventScript_WarpToNextRoom diff --git a/data/maps/BattleFrontier_Mart/map.json b/data/maps/BattleFrontier_Mart/map.json index 7fab54636a..1f182365e1 100644 --- a/data/maps/BattleFrontier_Mart/map.json +++ b/data/maps/BattleFrontier_Mart/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCALID_BATTLE_FRONTIER_MART_CLERK", + "local_id": "LOCALID_FRONTIER_MART_CLERK", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 1, "y": 3, @@ -29,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_MART_OLD_WOMAN", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "x": 5, "y": 4, diff --git a/data/maps/BattleFrontier_Mart/scripts.inc b/data/maps/BattleFrontier_Mart/scripts.inc index 6afe6a0186..e019d4ecc9 100644 --- a/data/maps/BattleFrontier_Mart/scripts.inc +++ b/data/maps/BattleFrontier_Mart/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_OLD_WOMAN, 2 - BattleFrontier_Mart_MapScripts:: .byte 0 @@ -38,7 +36,7 @@ BattleFrontier_Mart_EventScript_OldMan:: BattleFrontier_Mart_EventScript_OldWoman:: lock - applymovement LOCALID_OLD_WOMAN, Common_Movement_FaceDown + applymovement LOCALID_FRONTIER_MART_OLD_WOMAN, Common_Movement_FaceDown waitmovement 0 msgbox BattleFrontier_Mart_Text_ProteinMakeNiceGift, MSGBOX_DEFAULT release diff --git a/data/maps/BattleFrontier_PokemonCenter_1F/map.json b/data/maps/BattleFrontier_PokemonCenter_1F/map.json index b993e92777..b44bd4b379 100644 --- a/data/maps/BattleFrontier_PokemonCenter_1F/map.json +++ b/data/maps/BattleFrontier_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FRONTIER_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc b/data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc index 44806858fb..02201af8e5 100644 --- a/data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc +++ b/data/maps/BattleFrontier_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - BattleFrontier_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -10,7 +8,7 @@ BattleFrontier_PokemonCenter_1F_OnTransition: end BattleFrontier_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_FRONTIER_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/BattleFrontier_ScottsHouse/map.json b/data/maps/BattleFrontier_ScottsHouse/map.json index 7a6de715ab..60d7f4ccfc 100644 --- a/data/maps/BattleFrontier_ScottsHouse/map.json +++ b/data/maps/BattleFrontier_ScottsHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SCOTTS_HOUSE_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 2, "y": 3, diff --git a/data/maps/BattleFrontier_ScottsHouse/scripts.inc b/data/maps/BattleFrontier_ScottsHouse/scripts.inc index affd05d349..8a818222b7 100644 --- a/data/maps/BattleFrontier_ScottsHouse/scripts.inc +++ b/data/maps/BattleFrontier_ScottsHouse/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_SCOTT, 1 - BattleFrontier_ScottsHouse_MapScripts:: .byte 0 @@ -149,7 +147,7 @@ BattleFrontier_ScottsHouse_EventScript_WelcomeToFrontier:: call_if_eq VAR_FACING, DIR_EAST, BattleFrontier_ScottsHouse_EventScript_ScottFaceAwayEast call_if_eq VAR_FACING, DIR_WEST, BattleFrontier_ScottsHouse_EventScript_ScottFaceAwayWest msgbox BattleFrontier_ScottsHouse_Text_HowMuchEffortItTookToMakeReal, MSGBOX_DEFAULT - applymovement LOCALID_SCOTT, Common_Movement_FacePlayer + applymovement LOCALID_SCOTTS_HOUSE_SCOTT, Common_Movement_FacePlayer waitmovement 0 msgbox BattleFrontier_ScottsHouse_Text_HaveThisAsMementoOfOurPathsCrossing, MSGBOX_DEFAULT goto_if_eq VAR_SCOTT_STATE, 13, BattleFrontier_ScottsHouse_EventScript_Give4BattlePoints @@ -192,22 +190,22 @@ BattleFrontier_ScottsHouse_EventScript_GiveBattlePoints:: end BattleFrontier_ScottsHouse_EventScript_ScottFaceAwayNorth:: - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SCOTTS_HOUSE_SCOTT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return BattleFrontier_ScottsHouse_EventScript_ScottFaceAwaySouth:: - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SCOTTS_HOUSE_SCOTT, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return BattleFrontier_ScottsHouse_EventScript_ScottFaceAwayEast:: - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SCOTTS_HOUSE_SCOTT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return BattleFrontier_ScottsHouse_EventScript_ScottFaceAwayWest:: - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SCOTTS_HOUSE_SCOTT, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/maps/DesertUnderpass/map.json b/data/maps/DesertUnderpass/map.json index 152d32a794..386c28b2af 100644 --- a/data/maps/DesertUnderpass/map.json +++ b/data/maps/DesertUnderpass/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_UNDERPASS_FOSSIL", "graphics_id": "OBJ_EVENT_GFX_FOSSIL", "x": 132, "y": 10, diff --git a/data/maps/DesertUnderpass/scripts.inc b/data/maps/DesertUnderpass/scripts.inc index 518d988832..a241724e51 100644 --- a/data/maps/DesertUnderpass/scripts.inc +++ b/data/maps/DesertUnderpass/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_FOSSIL, 1 - DesertUnderpass_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, DesertUnderpass_OnTransition .byte 0 @@ -18,13 +16,13 @@ DesertUnderpass_EventScript_Fossil:: DesertUnderpass_EventScript_GiveClawFossil:: giveitem ITEM_CLAW_FOSSIL - removeobject LOCALID_FOSSIL + removeobject LOCALID_UNDERPASS_FOSSIL release end DesertUnderpass_EventScript_GiveRootFossil:: giveitem ITEM_ROOT_FOSSIL - removeobject LOCALID_FOSSIL + removeobject LOCALID_UNDERPASS_FOSSIL release end diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index 26551e4efe..ec2e879561 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -39,6 +39,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 12, "y": 9, @@ -65,6 +66,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_BOAT", "graphics_id": "OBJ_EVENT_GFX_MR_BRINEYS_BOAT", "x": 12, "y": 8, diff --git a/data/maps/DewfordTown/scripts.inc b/data/maps/DewfordTown/scripts.inc index 1250c2d767..30c7639003 100644 --- a/data/maps/DewfordTown/scripts.inc +++ b/data/maps/DewfordTown/scripts.inc @@ -1,15 +1,3 @@ -@ Sailing to and from Dewford uses local IDs from different maps -@ e.g. Route 104's sail to Dewford script references local IDs from Dewford's map -@ All of these local IDs are labeled here -.equ LOCALID_BRINEY_DEWFORD, 2 -.equ LOCALID_BOAT_DEWFORD, 4 - -.equ LOCALID_BOAT_R109, 1 -.equ LOCALID_BRINEY_R109, 2 - -.equ LOCALID_BOAT_R104, 7 -.equ LOCALID_BRINEY_R104, 8 - DewfordTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, DewfordTown_OnTransition .byte 0 @@ -123,16 +111,16 @@ DewfordTown_EventScript_FishingNotSoGood:: DewfordTown_EventScript_SailToPetalburg:: call EventScript_BackupMrBrineyLocation - setobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN, 0 + setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN, 0 - applymovement LOCALID_BRINEY_DEWFORD, DewfordTown_Movement_BrineyBoardBoat + applymovement LOCALID_DEWFORD_BRINEY, DewfordTown_Movement_BrineyBoardBoat waitmovement 0 - removeobject LOCALID_BRINEY_DEWFORD + removeobject LOCALID_DEWFORD_BRINEY applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_PlayerBoardBoat waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN call Common_EventScript_PlayBrineysBoatMusic - applymovement LOCALID_BOAT_DEWFORD, DewfordTown_Movement_SailToPetalburg + applymovement LOCALID_DEWFORD_BOAT, DewfordTown_Movement_SailToPetalburg applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_SailToPetalburg waitmovement 0 showobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 @@ -144,7 +132,7 @@ DewfordTown_EventScript_SailToPetalburg:: clearflag FLAG_HIDE_BRINEYS_HOUSE_PEEKO clearflag FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT setflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN - hideobjectat LOCALID_BOAT_DEWFORD, MAP_DEWFORD_TOWN + hideobjectat LOCALID_DEWFORD_BOAT, MAP_DEWFORD_TOWN setvar VAR_BOARD_BRINEY_BOAT_STATE, 2 resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN warp MAP_ROUTE104_MR_BRINEYS_HOUSE, 5, 4 @@ -155,39 +143,39 @@ DewfordTown_EventScript_SailToPetalburg:: DewfordTown_EventScript_SailToSlateport:: call EventScript_BackupMrBrineyLocation - setobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN, 0 + setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN, 1 - applymovement LOCALID_BRINEY_DEWFORD, DewfordTown_Movement_BrineyBoardBoat + applymovement LOCALID_DEWFORD_BRINEY, DewfordTown_Movement_BrineyBoardBoat waitmovement 0 - removeobject LOCALID_BRINEY_DEWFORD + removeobject LOCALID_DEWFORD_BRINEY applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_PlayerBoardBoat waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN call Common_EventScript_PlayBrineysBoatMusic - applymovement LOCALID_BOAT_DEWFORD, DewfordTown_Movement_SailToSlateport + applymovement LOCALID_DEWFORD_BOAT, DewfordTown_Movement_SailToSlateport applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_SailToSlateport waitmovement 0 call Common_EventScript_StopBrineysBoatMusic showobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_ExitBoatSlateport waitmovement 0 - setobjectxyperm LOCALID_BRINEY_R109, 21, 26 - addobject LOCALID_BRINEY_R109 - setobjectsubpriority LOCALID_BRINEY_R109, MAP_ROUTE109, 0 - applymovement LOCALID_BRINEY_R109, DewfordTown_Movement_BrineyExitBoat + setobjectxyperm LOCALID_ROUTE109_BRINEY, 21, 26 + addobject LOCALID_ROUTE109_BRINEY + setobjectsubpriority LOCALID_ROUTE109_BRINEY, MAP_ROUTE109, 0 + applymovement LOCALID_ROUTE109_BRINEY, DewfordTown_Movement_BrineyExitBoat waitmovement 0 clearflag FLAG_HIDE_ROUTE_109_MR_BRINEY - addobject LOCALID_BOAT_R109 + addobject LOCALID_ROUTE109_BOAT clearflag FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT setflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN - hideobjectat LOCALID_BOAT_DEWFORD, MAP_DEWFORD_TOWN + hideobjectat LOCALID_DEWFORD_BOAT, MAP_DEWFORD_TOWN call_if_unset FLAG_DELIVERED_DEVON_GOODS, DewfordTown_EventScript_LandedSlateportDeliverGoods call_if_set FLAG_DELIVERED_DEVON_GOODS, DewfordTown_EventScript_LandedSlateport closemessage copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN - resetobjectsubpriority LOCALID_BRINEY_R109, MAP_ROUTE109 - copyobjectxytoperm LOCALID_BRINEY_R109 + resetobjectsubpriority LOCALID_ROUTE109_BRINEY, MAP_ROUTE109 + copyobjectxytoperm LOCALID_ROUTE109_BRINEY release end diff --git a/data/maps/DewfordTown_Hall/map.json b/data/maps/DewfordTown_Hall/map.json index 9489a3d1ee..c253d16a61 100644 --- a/data/maps/DewfordTown_Hall/map.json +++ b/data/maps/DewfordTown_Hall/map.json @@ -54,6 +54,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_HALL_EXPERT_M", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 9, "y": 3, @@ -67,6 +68,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_HALL_TWIN", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 5, "y": 2, @@ -93,6 +95,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_HALL_SCHOOL_KID_M", "graphics_id": "OBJ_EVENT_GFX_SCHOOL_KID_M", "x": 12, "y": 3, @@ -106,6 +109,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEWFORD_HALL_PSYCHIC_M", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 15, "y": 3, diff --git a/data/maps/DewfordTown_Hall/scripts.inc b/data/maps/DewfordTown_Hall/scripts.inc index 1472bebb24..c5a1ea4b82 100644 --- a/data/maps/DewfordTown_Hall/scripts.inc +++ b/data/maps/DewfordTown_Hall/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_EXPERT_M, 4 -.set LOCALID_TWIN, 5 -.set LOCALID_SCHOOL_KID_M, 7 -.set LOCALID_PSYCHIC_M, 8 - DewfordTown_Hall_MapScripts:: .byte 0 @@ -55,7 +50,7 @@ DewfordTown_Hall_EventScript_ExpertM:: call Common_EventScript_BufferTrendyPhrase msgbox DewfordTown_Hall_Text_TVShowAboutTrend, MSGBOX_DEFAULT closemessage - applymovement LOCALID_EXPERT_M, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_DEWFORD_HALL_EXPERT_M, Common_Movement_WalkInPlaceFasterUp waitmovement 0 release end @@ -66,7 +61,7 @@ DewfordTown_Hall_EventScript_Twin:: call Common_EventScript_BufferTrendyPhrase msgbox DewfordTown_Hall_Text_IsTrendMorePopularAcrossSea, MSGBOX_DEFAULT closemessage - applymovement LOCALID_TWIN, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_DEWFORD_HALL_TWIN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 release end @@ -191,7 +186,7 @@ DewfordTown_Hall_EventScript_DontMovePlayer1:: return DewfordTown_Hall_EventScript_DebateReact1:: - applymovement LOCALID_PSYCHIC_M, DewfordTown_Hall_Movement_PsychicWalkInPlaceLeft + applymovement LOCALID_DEWFORD_HALL_PSYCHIC_M, DewfordTown_Hall_Movement_PsychicWalkInPlaceLeft waitmovement 0 goto_if_eq VAR_0x8008, 0, DewfordTown_Hall_EventScript_PlayerReactWest goto_if_eq VAR_0x8008, 1, DewfordTown_Hall_EventScript_DontMovePlayer2 @@ -207,7 +202,7 @@ DewfordTown_Hall_EventScript_DontMovePlayer2:: return DewfordTown_Hall_EventScript_DebateReact2:: - applymovement LOCALID_SCHOOL_KID_M, DewfordTown_Hall_Movement_SchoolKidWalkInPlaceRight + applymovement LOCALID_DEWFORD_HALL_SCHOOL_KID_M, DewfordTown_Hall_Movement_SchoolKidWalkInPlaceRight waitmovement 0 goto_if_eq VAR_0x8008, 0, DewfordTown_Hall_EventScript_PlayerReactNorthSouth goto_if_eq VAR_0x8008, 1, DewfordTown_Hall_EventScript_PlayerReactEast diff --git a/data/maps/EverGrandeCity_ChampionsRoom/map.json b/data/maps/EverGrandeCity_ChampionsRoom/map.json index 305a1f16f7..abd9c2e6cf 100644 --- a/data/maps/EverGrandeCity_ChampionsRoom/map.json +++ b/data/maps/EverGrandeCity_ChampionsRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_CHAMPIONS_ROOM_WALLACE", "graphics_id": "OBJ_EVENT_GFX_WALLACE", "x": 6, "y": 5, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CHAMPIONS_ROOM_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 6, "y": 12, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_CHAMPIONS_ROOM_RIVAL" }, { + "local_id": "LOCALID_CHAMPIONS_ROOM_BIRCH", "graphics_id": "OBJ_EVENT_GFX_PROF_BIRCH", "x": 6, "y": 12, diff --git a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc index f9723ffa0f..b1f0e973b0 100644 --- a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc +++ b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_WALLACE, 1 -.set LOCALID_RIVAL, 2 -.set LOCALID_BIRCH, 3 - EverGrandeCity_ChampionsRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, EverGrandeCity_ChampionsRoom_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, EverGrandeCity_ChampionsRoom_OnWarp @@ -59,7 +55,7 @@ EverGrandeCity_ChampionsRoom_EventScript_Defeated:: checkplayergender call_if_eq VAR_RESULT, MALE, EverGrandeCity_ChampionsRoom_EventScript_PlayMayMusic call_if_eq VAR_RESULT, FEMALE, EverGrandeCity_ChampionsRoom_EventScript_PlayBrendanMusic - addobject LOCALID_RIVAL + addobject LOCALID_CHAMPIONS_ROOM_RIVAL call EverGrandeCity_ChampionsRoom_EventScript_RivalApproachPlayer checkplayergender goto_if_eq VAR_RESULT, MALE, EverGrandeCity_ChampionsRoom_EventScript_MayAdvice @@ -78,9 +74,9 @@ EverGrandeCity_ChampionsRoom_EventScript_MayAdvice:: msgbox EverGrandeCity_ChampionsRoom_Text_MayAdvice, MSGBOX_DEFAULT delay 40 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, Common_Movement_Delay48 waitmovement 0 call EverGrandeCity_ChampionsRoom_EventScript_RivalLookBackAndForth msgbox EverGrandeCity_ChampionsRoom_Text_MayItsAlreadyOver, MSGBOX_DEFAULT @@ -91,9 +87,9 @@ EverGrandeCity_ChampionsRoom_EventScript_BrendanAdvice:: msgbox EverGrandeCity_ChampionsRoom_Text_BrendanAdvice, MSGBOX_DEFAULT delay 40 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, Common_Movement_Delay48 waitmovement 0 call EverGrandeCity_ChampionsRoom_EventScript_RivalLookBackAndForth msgbox EverGrandeCity_ChampionsRoom_Text_BrendanYouveWon, MSGBOX_DEFAULT @@ -102,26 +98,26 @@ EverGrandeCity_ChampionsRoom_EventScript_BrendanAdvice:: EverGrandeCity_ChampionsRoom_EventScript_BirchArrivesExitForHoF:: closemessage - addobject LOCALID_BIRCH - applymovement LOCALID_BIRCH, EverGrandeCity_ChampionsRoom_Movement_BirchArrives + addobject LOCALID_CHAMPIONS_ROOM_BIRCH + applymovement LOCALID_CHAMPIONS_ROOM_BIRCH, EverGrandeCity_ChampionsRoom_Movement_BirchArrives waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox EverGrandeCity_ChampionsRoom_Text_BirchArriveRatePokedex, MSGBOX_DEFAULT call ProfBirch_EventScript_RatePokedex msgbox EverGrandeCity_ChampionsRoom_Text_BirchCongratulations, MSGBOX_DEFAULT - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 - applymovement LOCALID_WALLACE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox EverGrandeCity_ChampionsRoom_Text_WallaceComeWithMe, MSGBOX_DEFAULT closemessage delay 30 - applymovement LOCALID_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExitStart + applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExitStart applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExitStart - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalFollows + applymovement LOCALID_CHAMPIONS_ROOM_BIRCH, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalFollows waitmovement 0 delay 20 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown @@ -131,7 +127,7 @@ EverGrandeCity_ChampionsRoom_EventScript_BirchArrivesExitForHoF:: call_if_eq VAR_RESULT, MALE, EverGrandeCity_ChampionsRoom_EventScript_MayCongratulations call_if_eq VAR_RESULT, FEMALE, EverGrandeCity_ChampionsRoom_EventScript_BrendanCongratulations closemessage - applymovement LOCALID_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExit + applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExit applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExit waitmovement 0 setflag FLAG_HIDE_PETALBURG_GYM_GREETER @@ -149,14 +145,14 @@ EverGrandeCity_ChampionsRoom_EventScript_BrendanCongratulations:: return EverGrandeCity_ChampionsRoom_EventScript_RivalApproachPlayer:: - applymovement LOCALID_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalApproachPlayer + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return EverGrandeCity_ChampionsRoom_EventScript_RivalLookBackAndForth:: - applymovement LOCALID_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalLookBackAndForth + applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalLookBackAndForth waitmovement 0 return diff --git a/data/maps/EverGrandeCity_PokemonCenter_1F/map.json b/data/maps/EverGrandeCity_PokemonCenter_1F/map.json index a146dc11a2..b74207871d 100644 --- a/data/maps/EverGrandeCity_PokemonCenter_1F/map.json +++ b/data/maps/EverGrandeCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_EVER_GRANDE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, @@ -54,6 +55,7 @@ "flag": "0" }, { + "local_id": "LOCALID_EVER_GRANDE_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 9, "y": 4, diff --git a/data/maps/EverGrandeCity_PokemonCenter_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonCenter_1F/scripts.inc index ec45732e8c..0bdd847658 100644 --- a/data/maps/EverGrandeCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonCenter_1F/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_NURSE, 1 -.set LOCALID_SCOTT, 4 - EverGrandeCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, EverGrandeCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -17,7 +14,7 @@ EverGrandeCity_PokemonCenter_1F_EventScript_TryShowScott:: return EverGrandeCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_EVER_GRANDE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress @@ -44,17 +41,17 @@ EverGrandeCity_PokemonCenter_1F_EventScript_Scott:: setflag FLAG_MET_SCOTT_IN_EVERGRANDE playse SE_EXIT waitse - removeobject LOCALID_SCOTT + removeobject LOCALID_EVER_GRANDE_SCOTT release end EverGrandeCity_PokemonCenter_1F_EventScript_ScottExitNorth:: - applymovement LOCALID_SCOTT, EverGrandeCity_PokemonCenter_1F_Movement_ScottExitNorth + applymovement LOCALID_EVER_GRANDE_SCOTT, EverGrandeCity_PokemonCenter_1F_Movement_ScottExitNorth waitmovement 0 return EverGrandeCity_PokemonCenter_1F_EventScript_ScottExit:: - applymovement LOCALID_SCOTT, EverGrandeCity_PokemonCenter_1F_Movement_ScottExit + applymovement LOCALID_EVER_GRANDE_SCOTT, EverGrandeCity_PokemonCenter_1F_Movement_ScottExit waitmovement 0 return diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/map.json b/data/maps/EverGrandeCity_PokemonLeague_1F/map.json index 6dd97c0b72..e599b815b6 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/map.json +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_LEAGUE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 3, "y": 2, @@ -41,6 +42,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LEAGUE_GUARD_1", "graphics_id": "OBJ_EVENT_GFX_MAN_3", "x": 8, "y": 2, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LEAGUE_GUARD_2", "graphics_id": "OBJ_EVENT_GFX_MAN_3", "x": 11, "y": 2, diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index c13e716975..4b3c05848e 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_NURSE, 1 -.set LOCALID_GUARD_1, 3 -.set LOCALID_GUARD_2, 4 - EverGrandeCity_PokemonLeague_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, EverGrandeCity_PokemonLeague_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -14,12 +10,12 @@ EverGrandeCity_PokemonLeague_1F_OnTransition: end EverGrandeCity_PokemonLeague_1F_EventScript_GuardsBlockDoor:: - setobjectxyperm LOCALID_GUARD_1, 9, 2 - setobjectxyperm LOCALID_GUARD_2, 10, 2 + setobjectxyperm LOCALID_LEAGUE_GUARD_1, 9, 2 + setobjectxyperm LOCALID_LEAGUE_GUARD_2, 10, 2 return EverGrandeCity_PokemonLeague_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_LEAGUE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress @@ -62,8 +58,8 @@ EverGrandeCity_PokemonLeague_1F_EventScript_DoorGuard:: delay 120 goto_if_unset FLAG_BADGE06_GET, EverGrandeCity_PokemonLeague_1F_EventScript_NotAllBadges closemessage - applymovement LOCALID_GUARD_1, EverGrandeCity_PokemonLeague_1F_Movement_LeftGuardOutOfWay - applymovement LOCALID_GUARD_2, EverGrandeCity_PokemonLeague_1F_Movement_RightGuardOutOfWay + applymovement LOCALID_LEAGUE_GUARD_1, EverGrandeCity_PokemonLeague_1F_Movement_LeftGuardOutOfWay + applymovement LOCALID_LEAGUE_GUARD_2, EverGrandeCity_PokemonLeague_1F_Movement_RightGuardOutOfWay waitmovement 0 delay 10 playfanfare MUS_OBTAIN_BADGE @@ -71,8 +67,8 @@ EverGrandeCity_PokemonLeague_1F_EventScript_DoorGuard:: waitmessage waitfanfare closemessage - copyobjectxytoperm LOCALID_GUARD_1 - copyobjectxytoperm LOCALID_GUARD_2 + copyobjectxytoperm LOCALID_LEAGUE_GUARD_1 + copyobjectxytoperm LOCALID_LEAGUE_GUARD_2 setflag FLAG_ENTERED_ELITE_FOUR releaseall end diff --git a/data/maps/FallarborTown_BattleTentLobby/map.json b/data/maps/FallarborTown_BattleTentLobby/map.json index b8f274df31..16a0b81dfa 100644 --- a/data/maps/FallarborTown_BattleTentLobby/map.json +++ b/data/maps/FallarborTown_BattleTentLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FALLARBOR_TENT_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 6, "y": 5, diff --git a/data/maps/FallarborTown_BattleTentLobby/scripts.inc b/data/maps/FallarborTown_BattleTentLobby/scripts.inc index 8f705075c7..c8253eea49 100644 --- a/data/maps/FallarborTown_BattleTentLobby/scripts.inc +++ b/data/maps/FallarborTown_BattleTentLobby/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - FallarborTown_BattleTentLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, FallarborTown_BattleTentLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, FallarborTown_BattleTentLobby_OnWarp @@ -191,12 +189,12 @@ FallarborTown_BattleTentLobby_EventScript_EndCancelChallenge:: end FallarborTown_BattleTentLobby_EventScript_WalkToDoor:: - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantWalkToDoor + applymovement LOCALID_FALLARBOR_TENT_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantWalkToDoor applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerWalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantEnterDoor + applymovement LOCALID_FALLARBOR_TENT_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 diff --git a/data/maps/FarawayIsland_Interior/scripts.inc b/data/maps/FarawayIsland_Interior/scripts.inc index d3d519ed15..fe6d35df8a 100644 --- a/data/maps/FarawayIsland_Interior/scripts.inc +++ b/data/maps/FarawayIsland_Interior/scripts.inc @@ -1,5 +1,3 @@ -@ Note: LOCALID_FARAWAY_ISLAND_MEW is a local id for this map used elsewhere. It's defined in event_objects.h - FarawayIsland_Interior_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, FarawayIsland_Interior_OnResume map_script MAP_SCRIPT_ON_TRANSITION, FarawayIsland_Interior_OnTransition diff --git a/data/maps/FortreeCity_House4/map.json b/data/maps/FortreeCity_House4/map.json index 8123d2c4d7..778f0d7465 100644 --- a/data/maps/FortreeCity_House4/map.json +++ b/data/maps/FortreeCity_House4/map.json @@ -41,6 +41,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FORTREE_HOUSE_WINGULL", "graphics_id": "OBJ_EVENT_GFX_WINGULL", "x": 2, "y": 3, diff --git a/data/maps/FortreeCity_House4/scripts.inc b/data/maps/FortreeCity_House4/scripts.inc index ed91674173..8b10494571 100644 --- a/data/maps/FortreeCity_House4/scripts.inc +++ b/data/maps/FortreeCity_House4/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WINGULL, 3 - FortreeCity_House4_MapScripts:: .byte 0 @@ -16,9 +14,9 @@ FortreeCity_House4_EventScript_Boy:: closemessage setflag FLAG_WINGULL_SENT_ON_ERRAND clearflag FLAG_HIDE_MOSSDEEP_CITY_HOUSE_2_WINGULL - applymovement LOCALID_WINGULL, FortreeCity_House4_Movement_WingullExit + applymovement LOCALID_FORTREE_HOUSE_WINGULL, FortreeCity_House4_Movement_WingullExit waitmovement 0 - removeobject LOCALID_WINGULL + removeobject LOCALID_FORTREE_HOUSE_WINGULL releaseall end diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index 33c7ce3c08..f039af170c 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -99,6 +99,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LAVARIDGE_RIVAL_ON_BIKE", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 6, "y": 16, @@ -112,6 +113,7 @@ "flag": "FLAG_HIDE_LAVARIDGE_TOWN_RIVAL_ON_BIKE" }, { + "local_id": "LOCALID_LAVARIDGE_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 12, "y": 15, diff --git a/data/maps/LavaridgeTown/scripts.inc b/data/maps/LavaridgeTown/scripts.inc index 3ce226c4c1..40639a1a86 100644 --- a/data/maps/LavaridgeTown/scripts.inc +++ b/data/maps/LavaridgeTown/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_RIVAL_ON_BIKE, 7 -.set LOCALID_RIVAL, 8 - LavaridgeTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavaridgeTown_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, LavaridgeTown_OnFrame @@ -26,9 +23,9 @@ LavaridgeTown_EventScript_CheckSetRivalPos:: return LavaridgeTown_EventScript_SetRivalPos:: - setobjectxyperm LOCALID_RIVAL, 11, 9 - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 9, 8 - setobjectmovementtype LOCALID_RIVAL_ON_BIKE, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_LAVARIDGE_RIVAL, 11, 9 + setobjectxyperm LOCALID_LAVARIDGE_RIVAL_ON_BIKE, 9, 8 + setobjectmovementtype LOCALID_LAVARIDGE_RIVAL_ON_BIKE, MOVEMENT_TYPE_FACE_UP clearflag FLAG_HIDE_LAVARIDGE_TOWN_RIVAL return @@ -78,12 +75,12 @@ LavaridgeTown_EventScript_BrendanGiveGoGoggles:: LavaridgeTown_EventScript_RivalExit:: closemessage - removeobject LOCALID_RIVAL - addobject LOCALID_RIVAL_ON_BIKE + removeobject LOCALID_LAVARIDGE_RIVAL + addobject LOCALID_LAVARIDGE_RIVAL_ON_BIKE delay 30 call_if_eq VAR_0x8008, 9, LavaridgeTown_EventScript_RivalExit1 call_if_ne VAR_0x8008, 9, LavaridgeTown_EventScript_RivalExit2 - removeobject LOCALID_RIVAL_ON_BIKE + removeobject LOCALID_LAVARIDGE_RIVAL_ON_BIKE setvar VAR_LAVARIDGE_TOWN_STATE, 2 clearflag FLAG_HIDE_MAP_NAME_POPUP savebgm MUS_DUMMY @@ -100,52 +97,52 @@ LavaridgeTown_EventScript_PlayBrendanMusic:: return LavaridgeTown_EventScript_RivalNoticePlayer:: - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_Delay48 waitmovement 0 return LavaridgeTown_EventScript_RivalExitHerbShop:: opendoor 12, 15 waitdooranim - addobject LOCALID_RIVAL - applymovement LOCALID_RIVAL, LavaridgeTown_Movement_RivalExitHerbShop + addobject LOCALID_LAVARIDGE_RIVAL + applymovement LOCALID_LAVARIDGE_RIVAL, LavaridgeTown_Movement_RivalExitHerbShop waitmovement 0 closedoor 12, 15 waitdooranim - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return LavaridgeTown_EventScript_RivalApproachPlayer1:: - applymovement LOCALID_RIVAL, LavaridgeTown_Movement_RivalApproachPlayer1 + applymovement LOCALID_LAVARIDGE_RIVAL, LavaridgeTown_Movement_RivalApproachPlayer1 waitmovement 0 return LavaridgeTown_EventScript_RivalApproachPlayer2:: - applymovement LOCALID_RIVAL, LavaridgeTown_Movement_RivalApproachPlayer2 + applymovement LOCALID_LAVARIDGE_RIVAL, LavaridgeTown_Movement_RivalApproachPlayer2 waitmovement 0 return LavaridgeTown_EventScript_RivalExit1:: applymovement OBJ_EVENT_ID_PLAYER, LavaridgeTown_Movement_PlayerWatchRivalExit - applymovement LOCALID_RIVAL_ON_BIKE, LavaridgeTown_Movement_RivalExit1 + applymovement LOCALID_LAVARIDGE_RIVAL_ON_BIKE, LavaridgeTown_Movement_RivalExit1 waitmovement 0 return LavaridgeTown_EventScript_RivalExit2:: - applymovement LOCALID_RIVAL_ON_BIKE, LavaridgeTown_Movement_RivalExit2 + applymovement LOCALID_LAVARIDGE_RIVAL_ON_BIKE, LavaridgeTown_Movement_RivalExit2 waitmovement 0 return diff --git a/data/maps/LavaridgeTown_PokemonCenter_1F/map.json b/data/maps/LavaridgeTown_PokemonCenter_1F/map.json index 8cbeae0923..2d9372d1d1 100644 --- a/data/maps/LavaridgeTown_PokemonCenter_1F/map.json +++ b/data/maps/LavaridgeTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_LAVARIDGE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/LavaridgeTown_PokemonCenter_1F/scripts.inc b/data/maps/LavaridgeTown_PokemonCenter_1F/scripts.inc index 9ff72aa812..fa67064252 100644 --- a/data/maps/LavaridgeTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/LavaridgeTown_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - LavaridgeTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LavaridgeTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ LavaridgeTown_PokemonCenter_1F_OnTransition: end LavaridgeTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_LAVARIDGE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 34bd8d1334..4115e31fe3 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -260,6 +260,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LILYCOVE_WOMAN_1", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 41, "y": 25, @@ -273,6 +274,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LILYCOVE_MAN_1", "graphics_id": "OBJ_EVENT_GFX_MAN_2", "x": 40, "y": 25, diff --git a/data/maps/LilycoveCity/scripts.inc b/data/maps/LilycoveCity/scripts.inc index 094592d646..0424202355 100644 --- a/data/maps/LilycoveCity/scripts.inc +++ b/data/maps/LilycoveCity/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_WOMAN_1, 19 -.set LOCALID_MAN_1, 20 - LilycoveCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LilycoveCity_OnTransition map_script MAP_SCRIPT_ON_LOAD, LilycoveCity_OnLoad @@ -136,13 +133,13 @@ LilycoveCity_EventScript_FatMan:: LilycoveCity_EventScript_Man1:: lockall msgbox LilycoveCity_Text_JustArrivedAndSawRarePokemon, MSGBOX_NPC - applymovement LOCALID_MAN_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_LILYCOVE_MAN_1, Common_Movement_FaceOriginalDirection end LilycoveCity_EventScript_Woman1:: lockall msgbox LilycoveCity_Text_HoneymoonVowToSeeRarePokemon, MSGBOX_NPC - applymovement LOCALID_WOMAN_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_LILYCOVE_WOMAN_1, Common_Movement_FaceOriginalDirection end LilycoveCity_EventScript_CitySign:: diff --git a/data/maps/LilycoveCity_ContestHall/map.json b/data/maps/LilycoveCity_ContestHall/map.json index a55d214988..9979ca34bc 100644 --- a/data/maps/LilycoveCity_ContestHall/map.json +++ b/data/maps/LilycoveCity_ContestHall/map.json @@ -54,6 +54,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_MC", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 12, "y": 22, @@ -67,6 +68,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_JUDGE", "graphics_id": "OBJ_EVENT_GFX_CONTEST_JUDGE", "x": 15, "y": 22, @@ -80,6 +82,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_CONTESTANT_1", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 10, "y": 25, @@ -93,6 +96,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_CONTESTANT_2", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 12, "y": 25, @@ -106,6 +110,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_CONTESTANT_3", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 14, "y": 25, @@ -119,6 +124,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_CONTESTANT_4", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 16, "y": 25, @@ -145,6 +151,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_AUDIENCE_4", "graphics_id": "OBJ_EVENT_GFX_WOMAN_5", "x": 18, "y": 24, @@ -158,6 +165,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_AUDIENCE_2", "graphics_id": "OBJ_EVENT_GFX_BOY_1", "x": 8, "y": 22, @@ -171,6 +179,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_MC", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 24, "y": 10, @@ -184,6 +193,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_JUDGE", "graphics_id": "OBJ_EVENT_GFX_CONTEST_JUDGE", "x": 27, "y": 10, @@ -197,6 +207,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_CONTESTANT_1", "graphics_id": "OBJ_EVENT_GFX_WOMAN_4", "x": 22, "y": 13, @@ -210,6 +221,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_CONTESTANT_2", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 24, "y": 13, @@ -223,6 +235,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_CONTESTANT_3", "graphics_id": "OBJ_EVENT_GFX_PSYCHIC_M", "x": 26, "y": 13, @@ -236,6 +249,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_CONTESTANT_4", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_F", "x": 28, "y": 13, @@ -249,6 +263,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_AUDIENCE_1", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 20, "y": 10, @@ -262,6 +277,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_AUDIENCE_3", "graphics_id": "OBJ_EVENT_GFX_WOMAN_1", "x": 30, "y": 11, @@ -275,6 +291,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BEAUTY_AUDIENCE_2", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 26, "y": 8, @@ -288,6 +305,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SMART_AUDIENCE_3", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "x": 13, "y": 20, @@ -301,6 +319,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_MC", "graphics_id": "OBJ_EVENT_GFX_WOMAN_3", "x": 36, "y": 22, @@ -314,6 +333,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_JUDGE", "graphics_id": "OBJ_EVENT_GFX_CONTEST_JUDGE", "x": 39, "y": 22, @@ -327,6 +347,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_CONTESTANT_1", "graphics_id": "OBJ_EVENT_GFX_BOY_2", "x": 34, "y": 25, @@ -340,6 +361,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_CONTESTANT_2", "graphics_id": "OBJ_EVENT_GFX_GIRL_2", "x": 36, "y": 25, @@ -353,6 +375,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_CONTESTANT_3", "graphics_id": "OBJ_EVENT_GFX_BOY_3", "x": 38, "y": 25, @@ -366,6 +389,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_CONTESTANT_4", "graphics_id": "OBJ_EVENT_GFX_EXPERT_F", "x": 40, "y": 25, @@ -379,6 +403,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_AUDIENCE_1", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 32, "y": 23, @@ -392,6 +417,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_AUDIENCE_3", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 37, "y": 20, @@ -405,6 +431,7 @@ "flag": "0" }, { + "local_id": "LOCALID_CUTE_AUDIENCE_2", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 42, "y": 24, diff --git a/data/maps/LilycoveCity_ContestHall/scripts.inc b/data/maps/LilycoveCity_ContestHall/scripts.inc index 610611358d..b1c59c8922 100644 --- a/data/maps/LilycoveCity_ContestHall/scripts.inc +++ b/data/maps/LilycoveCity_ContestHall/scripts.inc @@ -1,32 +1,7 @@ -@ VAR_LAST_TALKED would have made all these direct references unnecessary -.set LOCALID_SMART_MC, 4 -.set LOCALID_SMART_JUDGE, 5 -.set LOCALID_SMART_CONTESTANT_1, 6 -.set LOCALID_SMART_CONTESTANT_2, 7 -.set LOCALID_SMART_CONTESTANT_3, 8 -.set LOCALID_SMART_CONTESTANT_4, 9 -.set LOCALID_SMART_AUDIENCE_4, 11 -.set LOCALID_SMART_AUDIENCE_2, 12 -.set LOCALID_BEAUTY_MC, 13 -.set LOCALID_BEAUTY_JUDGE, 14 -.set LOCALID_BEAUTY_CONTESTANT_1, 15 -.set LOCALID_BEAUTY_CONTESTANT_2, 16 -.set LOCALID_BEAUTY_CONTESTANT_3, 17 -.set LOCALID_BEAUTY_CONTESTANT_4, 18 -.set LOCALID_BEAUTY_AUDIENCE_1, 19 -.set LOCALID_BEAUTY_AUDIENCE_3, 20 -.set LOCALID_BEAUTY_AUDIENCE_2, 21 -.set LOCALID_SMART_AUDIENCE_3, 22 -.set LOCALID_CUTE_MC, 23 -.set LOCALID_CUTE_JUDGE, 24 -.set LOCALID_CUTE_CONTESTANT_1, 25 -.set LOCALID_CUTE_CONTESTANT_2, 26 -.set LOCALID_CUTE_CONTESTANT_3, 27 -.set LOCALID_CUTE_CONTESTANT_4, 28 -.set LOCALID_CUTE_AUDIENCE_1, 29 -.set LOCALID_CUTE_AUDIENCE_3, 30 -.set LOCALID_CUTE_AUDIENCE_2, 31 - +@ All the LOCALID constants used in this file are essentially redundant. +@ They're all used to have the NPC the player talked to turn back so they're facing +@ their original direction (because they're watching/participating in the contests). +@ They could all be substituted for VAR_LAST_TALKED. LilycoveCity_ContestHall_MapScripts:: .byte 0 diff --git a/data/maps/LilycoveCity_CoveLilyMotel_1F/map.json b/data/maps/LilycoveCity_CoveLilyMotel_1F/map.json index 098b533360..859b0f11b6 100644 --- a/data/maps/LilycoveCity_CoveLilyMotel_1F/map.json +++ b/data/maps/LilycoveCity_CoveLilyMotel_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MOTEL_OWNER", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 10, "y": 3, diff --git a/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc b/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc index 796645f47f..076228ae6e 100644 --- a/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc +++ b/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_OWNER, 1 - LilycoveCity_CoveLilyMotel_1F_MapScripts:: .byte 0 @@ -8,33 +6,33 @@ LilycoveCity_CoveLilyMotel_1F_EventScript_MotelOwner:: goto_if_set FLAG_SYS_GAME_CLEAR, LilycoveCity_CoveLilyMotel_1F_EventScript_GameClear goto_if_set FLAG_BADGE07_GET, LilycoveCity_CoveLilyMotel_1F_EventScript_AquaHideoutBusted msgbox LilycoveCity_CoveLilyMotel_1F_Text_GuestsDoubledByMascot, MSGBOX_DEFAULT - applymovement LOCALID_OWNER, Common_Movement_FacePlayer + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FacePlayer waitmovement 0 msgbox LilycoveCity_CoveLilyMotel_1F_Text_NoGuestsWithTeamAqua, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OWNER, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end LilycoveCity_CoveLilyMotel_1F_EventScript_AquaHideoutBusted:: msgbox LilycoveCity_CoveLilyMotel_1F_Text_MonFoundLostItem, MSGBOX_DEFAULT - applymovement LOCALID_OWNER, Common_Movement_FacePlayer + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FacePlayer waitmovement 0 msgbox LilycoveCity_CoveLilyMotel_1F_Text_HeardAquaHideoutBusted, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OWNER, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end LilycoveCity_CoveLilyMotel_1F_EventScript_GameClear:: msgbox LilycoveCity_CoveLilyMotel_1F_Text_HouseSittingMonCaughtBurglar, MSGBOX_DEFAULT - applymovement LOCALID_OWNER, Common_Movement_FacePlayer + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FacePlayer waitmovement 0 msgbox LilycoveCity_CoveLilyMotel_1F_Text_BetterGetWorkingOnGuestsDinner, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OWNER, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MOTEL_OWNER, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end @@ -42,18 +40,18 @@ LilycoveCity_CoveLilyMotel_1F_EventScript_GameClear:: LilycoveCity_CoveLilyMotel_1F_EventScript_BlockingTV:: lockall playse SE_PIN - applymovement LOCALID_OWNER, Common_Movement_ExclamationMark + applymovement LOCALID_MOTEL_OWNER, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_OWNER, Common_Movement_Delay48 + applymovement LOCALID_MOTEL_OWNER, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox LilycoveCity_CoveLilyMotel_1F_Text_CantSeeTheTV, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_CoveLilyMotel_1F_Movement_PlayerPushFromTV - applymovement LOCALID_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerPushPlayer + applymovement LOCALID_MOTEL_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerPushPlayer waitmovement 0 - applymovement LOCALID_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerReturn + applymovement LOCALID_MOTEL_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerReturn waitmovement 0 release end diff --git a/data/maps/LilycoveCity_DepartmentStore_5F/map.json b/data/maps/LilycoveCity_DepartmentStore_5F/map.json index e816d3f217..a7d258ec9c 100644 --- a/data/maps/LilycoveCity_DepartmentStore_5F/map.json +++ b/data/maps/LilycoveCity_DepartmentStore_5F/map.json @@ -93,6 +93,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEPARTMENT_STORE_STAIRS_WOMAN", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 9, "y": 5, diff --git a/data/maps/LilycoveCity_DepartmentStore_5F/scripts.inc b/data/maps/LilycoveCity_DepartmentStore_5F/scripts.inc index a9683d13c9..84b8a3ac7e 100644 --- a/data/maps/LilycoveCity_DepartmentStore_5F/scripts.inc +++ b/data/maps/LilycoveCity_DepartmentStore_5F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WOMAN, 7 - LilycoveCity_DepartmentStore_5F_MapScripts:: map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, LilycoveCity_DepartmentStore_5F_OnWarp .byte 0 @@ -13,8 +11,8 @@ LilycoveCity_DepartmentStore_5F_OnWarp: .2byte 0 LilycoveCity_DepartmentStore_5F_EventScript_BlockRoofStairs:: - setobjectxy LOCALID_WOMAN, 16, 2 - turnobject LOCALID_WOMAN, DIR_NORTH + setobjectxy LOCALID_DEPARTMENT_STORE_STAIRS_WOMAN, 16, 2 + turnobject LOCALID_DEPARTMENT_STORE_STAIRS_WOMAN, DIR_NORTH end LilycoveCity_DepartmentStore_5F_EventScript_ClerkFarLeft:: @@ -127,7 +125,7 @@ LilycoveCity_DepartmentStore_5F_EventScript_PokefanF:: LilycoveCity_DepartmentStore_5F_EventScript_Woman:: lockall - applymovement LOCALID_WOMAN, Common_Movement_FacePlayer + applymovement LOCALID_DEPARTMENT_STORE_STAIRS_WOMAN, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 0, LilycoveCity_DepartmentStore_5F_EventScript_WomanNormal goto_if_ge VAR_SOOTOPOLIS_CITY_STATE, 4, LilycoveCity_DepartmentStore_5F_EventScript_WomanNormal @@ -143,7 +141,7 @@ LilycoveCity_DepartmentStore_5F_EventScript_WomanNormal:: LilycoveCity_DepartmentStore_5F_EventScript_WomanLegendaryWeather:: msgbox LilycoveCity_DepartmentStore_5F_Text_ClosedRooftopForWeather, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WOMAN, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_DEPARTMENT_STORE_STAIRS_WOMAN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 releaseall end diff --git a/data/maps/LilycoveCity_Harbor/map.json b/data/maps/LilycoveCity_Harbor/map.json index 06d49e0c88..671e6edd74 100644 --- a/data/maps/LilycoveCity_Harbor/map.json +++ b/data/maps/LilycoveCity_Harbor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_LILYCOVE_HARBOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "x": 8, "y": 10, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_LILYCOVE_HARBOR_FERRY_ATTENDANT" }, { + "local_id": "LOCALID_LILYCOVE_HARBOR_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 8, "y": 9, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 10, @@ -67,6 +70,7 @@ "flag": "FLAG_HIDE_LILYCOVE_HARBOR_FERRY_SAILOR" }, { + "local_id": "LOCALID_LILYCOVE_HARBOR_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 8, "y": 10, diff --git a/data/maps/LilycoveCity_Harbor/scripts.inc b/data/maps/LilycoveCity_Harbor/scripts.inc index 63010dc4c7..9187199296 100644 --- a/data/maps/LilycoveCity_Harbor/scripts.inc +++ b/data/maps/LilycoveCity_Harbor/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_ATTENDANT, 1 -.set LOCALID_SS_TIDAL, 2 -.set LOCALID_FERRY_SAILOR, 4 -.set LOCALID_BRINEY, 5 - LilycoveCity_Harbor_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LilycoveCity_Harbor_OnTransition .byte 0 @@ -231,16 +226,16 @@ LilycoveCity_Harbor_EventScript_OldSeaMapFirstTime:: call LilycoveCity_Harbor_EventScript_GetEventTicketSailor msgbox EventTicket_Text_OldSeaMapTooFar, MSGBOX_DEFAULT closemessage - applymovement LOCALID_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_FERRY_SAILOR, Common_Movement_ExclamationMark + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_FERRY_SAILOR, Common_Movement_Delay48 + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_Delay48 waitmovement 0 call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_MoveSailorOutOfWayNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_MoveSailorOutOfWayEast - addobject LOCALID_BRINEY + addobject LOCALID_LILYCOVE_HARBOR_BRINEY call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_BrineyFaceSailorNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_BrineyFaceSailorEast msgbox EventTicket_Text_BrineyHoldOnASecond, MSGBOX_DEFAULT @@ -250,7 +245,7 @@ LilycoveCity_Harbor_EventScript_OldSeaMapFirstTime:: closemessage call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorEast - setvar VAR_0x8004, LOCALID_SS_TIDAL + setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart warp MAP_FARAWAY_ISLAND_ENTRANCE, 13, 38 waitstate @@ -305,14 +300,14 @@ LilycoveCity_Harbor_EventScript_MultipleEventTicketsFirstTime:: LilycoveCity_Harbor_EventScript_ExitFirstTimeTicketSailSelect:: msgbox EventTicket_Text_AsYouLike, MSGBOX_DEFAULT closemessage - applymovement LOCALID_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 30 - removeobject LOCALID_FERRY_SAILOR + removeobject LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR delay 30 - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_LILYCOVE_HARBOR_ATTENDANT, Common_Movement_WalkInPlaceFasterDown waitmovement 0 - showobjectat LOCALID_ATTENDANT, MAP_LILYCOVE_CITY_HARBOR + showobjectat LOCALID_LILYCOVE_HARBOR_ATTENDANT, MAP_LILYCOVE_CITY_HARBOR delay 30 msgbox LilycoveCity_Harbor_Text_SailAnotherTime, MSGBOX_DEFAULT release @@ -324,22 +319,22 @@ LilycoveCity_Harbor_EventScript_GetEventTicketSailor:: delay 30 hideobjectat VAR_LAST_TALKED, MAP_LILYCOVE_CITY_HARBOR delay 60 - addobject LOCALID_FERRY_SAILOR + addobject LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR delay 30 - applymovement LOCALID_FERRY_SAILOR, Common_Movement_FacePlayer + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_FacePlayer waitmovement 0 return LilycoveCity_Harbor_EventScript_BoardFerryWithSailor:: - applymovement LOCALID_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 30 - removeobject LOCALID_FERRY_SAILOR + removeobject LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 hideobjectat OBJ_EVENT_ID_PLAYER, 0 - setvar VAR_0x8004, LOCALID_SS_TIDAL + setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return @@ -399,7 +394,7 @@ LilycoveCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 hideobjectat OBJ_EVENT_ID_PLAYER, 0 - setvar VAR_0x8004, LOCALID_SS_TIDAL + setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return @@ -445,12 +440,12 @@ LilycoveCity_Harbor_EventScript_SailorFerryAvailable:: end LilycoveCity_Harbor_EventScript_MoveSailorOutOfWayNorth:: - applymovement LOCALID_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorOutOfWayNorth + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorOutOfWayNorth waitmovement 0 return LilycoveCity_Harbor_EventScript_MoveSailorOutOfWayEast:: - applymovement LOCALID_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorOutOfWayEast + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorOutOfWayEast waitmovement 0 return @@ -468,36 +463,36 @@ LilycoveCity_Harbor_Movement_SailorOutOfWayEast: step_end LilycoveCity_Harbor_EventScript_BrineyFaceSailorNorth:: - applymovement LOCALID_BRINEY, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return LilycoveCity_Harbor_EventScript_BrineyFaceSailorEast:: - applymovement LOCALID_BRINEY, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return LilycoveCity_Harbor_EventScript_BrineyFacePlayerNorth:: - applymovement LOCALID_BRINEY, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return LilycoveCity_Harbor_EventScript_BrineyFacePlayerEast:: - applymovement LOCALID_BRINEY, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorNorth:: - applymovement LOCALID_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyNorth - applymovement LOCALID_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyNorth + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyNorth waitmovement 0 return LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorEast:: - applymovement LOCALID_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry + applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyEast - applymovement LOCALID_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyEast + applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyEast waitmovement 0 return diff --git a/data/maps/LilycoveCity_LilycoveMuseum_1F/map.json b/data/maps/LilycoveCity_LilycoveMuseum_1F/map.json index 1710e0df8f..6b44c299fe 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_1F/map.json +++ b/data/maps/LilycoveCity_LilycoveMuseum_1F/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MUSEUM_1F_CURATOR", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 16, "y": 2, @@ -106,6 +107,7 @@ "flag": "FLAG_HIDE_LILYCOVE_MUSEUM_PATRON_1" }, { + "local_id": "LOCALID_MUSEUM_1F_ARTIST_2", "graphics_id": "OBJ_EVENT_GFX_ARTIST", "x": 19, "y": 3, diff --git a/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc index 2d9d446f9d..1802be417d 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_CURATOR, 2 -.set LOCALID_ARTIST_2, 8 - LilycoveCity_LilycoveMuseum_1F_MapScripts:: .byte 0 @@ -10,7 +7,7 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_Greeter:: LilycoveCity_LilycoveMuseum_1F_EventScript_Curator:: lockall - applymovement LOCALID_CURATOR, Common_Movement_FacePlayer + applymovement LOCALID_MUSEUM_1F_CURATOR, Common_Movement_FacePlayer message LilycoveCity_LilycoveMuseum_1F_Text_ImCuratorHaveYouViewedOurPaintings waitmessage multichoice 20, 8, MULTI_VIEWED_PAINTINGS, TRUE @@ -35,9 +32,9 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_NotInterested:: LilycoveCity_LilycoveMuseum_1F_EventScript_InterestedInPaintings:: msgbox LilycoveCity_LilycoveMuseum_1F_Text_ExcellentCanYouComeWithMe, MSGBOX_SIGN - applymovement LOCALID_CURATOR, LilycoveCity_LilycoveMuseum_1F_Movement_CuratorEnterStairs + applymovement LOCALID_MUSEUM_1F_CURATOR, LilycoveCity_LilycoveMuseum_1F_Movement_CuratorEnterStairs waitmovement 0 - removeobject LOCALID_CURATOR + removeobject LOCALID_MUSEUM_1F_CURATOR switch VAR_FACING case DIR_NORTH, LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorNorth case DIR_WEST, LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorWest @@ -152,7 +149,7 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_Artist2:: faceplayer msgbox LilycoveCity_LilycoveMuseum_1F_Text_AimToSeeGreatPaintings, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARTIST_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MUSEUM_1F_ARTIST_2, Common_Movement_FaceOriginalDirection waitmovement 0 release end diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/map.json b/data/maps/LilycoveCity_LilycoveMuseum_2F/map.json index 83fe63aab0..be3467f2d1 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_2F/map.json +++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MUSEUM_2F_CURATOR", "graphics_id": "OBJ_EVENT_GFX_GENTLEMAN", "x": 10, "y": 8, diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc index 9212ca67df..196a48aeb8 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_CURATOR, 1 - LilycoveCity_LilycoveMuseum_2F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, LilycoveCity_LilycoveMuseum_2F_OnLoad map_script MAP_SCRIPT_ON_FRAME_TABLE, LilycoveCity_LilycoveMuseum_2F_OnFrame @@ -64,16 +62,16 @@ LilycoveCity_LilycoveMuseum_2F_OnFrame: LilycoveCity_LilycoveMuseum_2F_EventScript_ShowExhibitHall:: lockall - applymovement LOCALID_CURATOR, Common_Movement_FacePlayer + applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ThisIsExhibitHall, MSGBOX_SIGN - applymovement LOCALID_CURATOR, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall + applymovement LOCALID_MUSEUM_2F_CURATOR, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ExplainExhibitHall, MSGBOX_SIGN - applymovement LOCALID_CURATOR, Common_Movement_FacePlayer + applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft waitmovement 0 @@ -109,16 +107,16 @@ LilycoveCity_LilycoveMuseum_2F_EventScript_AddedPainting:: end LilycoveCity_LilycoveMuseum_2F_EventScript_ThankPlayer:: - applymovement LOCALID_CURATOR, Common_Movement_FacePlayer + applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ItsYouPlayer, MSGBOX_DEFAULT - applymovement LOCALID_CURATOR, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall + applymovement LOCALID_MUSEUM_2F_CURATOR, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall msgbox LilycoveCity_LilycoveMuseum_2F_Text_PaintingsAttractedMoreGuests, MSGBOX_DEFAULT goto LilycoveCity_LilycoveMuseum_2F_EventScript_GiveGlassOrnament end LilycoveCity_LilycoveMuseum_2F_EventScript_GiveGlassOrnament:: - applymovement LOCALID_CURATOR, Common_Movement_FacePlayer + applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer msgbox LilycoveCity_LilycoveMuseum_2F_Text_TokenOfGratitude, MSGBOX_DEFAULT givedecoration DECOR_GLASS_ORNAMENT goto_if_eq VAR_RESULT, FALSE, LilycoveCity_LilycoveMuseum_2F_EventScript_NoRoomForGlassOrnament diff --git a/data/maps/LittlerootTown_MaysHouse_2F/map.json b/data/maps/LittlerootTown_MaysHouse_2F/map.json index 8af2eae114..02d5ab06db 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/map.json +++ b/data/maps/LittlerootTown_MaysHouse_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RIVALS_HOUSE_2F_RIVAL", "graphics_id": "OBJ_EVENT_GFX_RIVAL_MAY_NORMAL", "x": 1, "y": 1, diff --git a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc index ef8e83bf7e..cc8db687c7 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc +++ b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_RIVAL, 1 - LittlerootTown_MaysHouse_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, LittlerootTown_MaysHouse_2F_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, LittlerootTown_MaysHouse_2F_OnWarp @@ -22,8 +20,8 @@ LittlerootTown_MaysHouse_2F_EventScript_TryUpdateMayPos:: checkplayergender goto_if_eq VAR_RESULT, FEMALE, LittlerootTown_MaysHouse_2F_EventScript_Ret goto_if_ge VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 2, LittlerootTown_MaysHouse_2F_EventScript_Ret - setobjectxyperm LOCALID_RIVAL, 8, 2 - setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_RIVALS_HOUSE_2F_RIVAL, 8, 2 + setobjectmovementtype LOCALID_RIVALS_HOUSE_2F_RIVAL, MOVEMENT_TYPE_FACE_UP return LittlerootTown_MaysHouse_2F_EventScript_Ret:: @@ -56,13 +54,13 @@ LittlerootTown_MaysHouse_2F_EventScript_RivalsPokeBall:: LittlerootTown_MaysHouse_2F_EventScript_MeetMay:: delay 10 - addobject LOCALID_RIVAL - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayEnters + addobject LOCALID_RIVALS_HOUSE_2F_RIVAL + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayEnters waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, Common_Movement_Delay48 waitmovement 0 delay 10 playbgm MUS_ENCOUNTER_MAY, TRUE @@ -80,49 +78,49 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMay:: end LittlerootTown_MaysHouse_2F_EventScript_MeetMayNorth:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerNorth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayNorth - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCNorth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCNorth waitmovement 0 return LittlerootTown_MaysHouse_2F_EventScript_MeetMaySouth:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerSouth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerSouth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMaySouth - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCSouth + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCSouth waitmovement 0 return LittlerootTown_MaysHouse_2F_EventScript_MeetMayWest:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerWest + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerWest waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCWest + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCWest waitmovement 0 return LittlerootTown_MaysHouse_2F_EventScript_MeetMayEast:: - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerEast + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayEast - applymovement LOCALID_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCEast + applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCEast waitmovement 0 return diff --git a/data/maps/MagmaHideout_4F/map.json b/data/maps/MagmaHideout_4F/map.json index d426affdec..f257ebaf5c 100644 --- a/data/maps/MagmaHideout_4F/map.json +++ b/data/maps/MagmaHideout_4F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_GROUDON", "graphics_id": "OBJ_EVENT_GFX_GROUDON_FRONT", "x": 16, "y": 17, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_4F_GROUDON" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 31, "y": 22, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 30, "y": 13, @@ -54,6 +57,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 26, "y": 13, @@ -67,6 +71,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_TABITHA", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 22, "y": 4, @@ -80,6 +85,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 16, "y": 21, @@ -93,6 +99,7 @@ "flag": "FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS" }, { + "local_id": "LOCALID_MAGMA_HIDEOUT_4F_GROUDON_SLEEPING", "graphics_id": "OBJ_EVENT_GFX_GROUDON_ASLEEP", "x": 16, "y": 17, diff --git a/data/maps/MagmaHideout_4F/scripts.inc b/data/maps/MagmaHideout_4F/scripts.inc index ef29d1180a..1ec622d0dd 100644 --- a/data/maps/MagmaHideout_4F/scripts.inc +++ b/data/maps/MagmaHideout_4F/scripts.inc @@ -1,11 +1,3 @@ -.set LOCALID_GROUDON, 1 -.set LOCALID_GRUNT_1, 2 -.set LOCALID_GRUNT_2, 3 -.set LOCALID_GRUNT_3, 4 -.set LOCALID_TABITHA, 5 -.set LOCALID_MAXIE, 6 -.set LOCALID_GROUDON_SLEEPING, 7 - MagmaHideout_4F_MapScripts:: .byte 0 @@ -26,11 +18,11 @@ MagmaHideout_4F_EventScript_Maxie:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 150 - removeobject LOCALID_GROUDON_SLEEPING - addobject LOCALID_GROUDON + removeobject LOCALID_MAGMA_HIDEOUT_4F_GROUDON_SLEEPING + addobject LOCALID_MAGMA_HIDEOUT_4F_GROUDON waitstate delay 60 - applymovement LOCALID_GROUDON, MagmaHideout_4F_Movement_GroudonApproach + applymovement LOCALID_MAGMA_HIDEOUT_4F_GROUDON, MagmaHideout_4F_Movement_GroudonApproach waitmovement 0 special FadeOutOrbEffect waitstate @@ -40,9 +32,9 @@ MagmaHideout_4F_EventScript_Maxie:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_GROUDON, MagmaHideout_4F_Movement_GroudonExit + applymovement LOCALID_MAGMA_HIDEOUT_4F_GROUDON, MagmaHideout_4F_Movement_GroudonExit waitmovement 0 - removeobject LOCALID_GROUDON + removeobject LOCALID_MAGMA_HIDEOUT_4F_GROUDON delay 4 setvar VAR_0x8004, 2 @ vertical pan setvar VAR_0x8005, 2 @ horizontal pan @@ -51,14 +43,14 @@ MagmaHideout_4F_EventScript_Maxie:: special ShakeCamera waitstate delay 30 - applymovement LOCALID_MAXIE, MagmaHideout_4F_Movement_MaxieLookAround + applymovement LOCALID_MAGMA_HIDEOUT_4F_MAXIE, MagmaHideout_4F_Movement_MaxieLookAround waitmovement 0 msgbox MagmaHideout_4F_Text_MaxieGroudonWhatsWrong, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 - applymovement LOCALID_MAXIE, Common_Movement_FacePlayer + applymovement LOCALID_MAGMA_HIDEOUT_4F_MAXIE, Common_Movement_FacePlayer waitmovement 0 msgbox MagmaHideout_4F_Text_MaxieOhItWasYou, MSGBOX_DEFAULT closemessage @@ -71,11 +63,11 @@ MagmaHideout_4F_EventScript_Maxie:: setflag FLAG_GROUDON_AWAKENED_MAGMA_HIDEOUT setvar VAR_SLATEPORT_HARBOR_STATE, 1 fadescreen FADE_TO_BLACK - removeobject LOCALID_MAXIE - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 - removeobject LOCALID_GRUNT_3 - removeobject LOCALID_TABITHA + removeobject LOCALID_MAGMA_HIDEOUT_4F_MAXIE + removeobject LOCALID_MAGMA_HIDEOUT_4F_GRUNT_1 + removeobject LOCALID_MAGMA_HIDEOUT_4F_GRUNT_2 + removeobject LOCALID_MAGMA_HIDEOUT_4F_GRUNT_3 + removeobject LOCALID_MAGMA_HIDEOUT_4F_TABITHA setflag FLAG_HIDE_MAGMA_HIDEOUT_GRUNTS fadescreen FADE_FROM_BLACK releaseall diff --git a/data/maps/MarineCave_End/map.json b/data/maps/MarineCave_End/map.json index 3430b2da0d..6e59768d5b 100644 --- a/data/maps/MarineCave_End/map.json +++ b/data/maps/MarineCave_End/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MARINE_CAVE_KYOGRE", "graphics_id": "OBJ_EVENT_GFX_KYOGRE_FRONT", "x": 9, "y": 22, diff --git a/data/maps/MarineCave_End/scripts.inc b/data/maps/MarineCave_End/scripts.inc index a7ff583695..b246038bb3 100644 --- a/data/maps/MarineCave_End/scripts.inc +++ b/data/maps/MarineCave_End/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_KYOGRE, 1 - MarineCave_End_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, MarineCave_End_OnResume map_script MAP_SCRIPT_ON_TRANSITION, MarineCave_End_OnTransition @@ -12,7 +10,7 @@ MarineCave_End_OnResume: MarineCave_End_EventScript_TryRemoveKyogre:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_KYOGRE + removeobject LOCALID_MARINE_CAVE_KYOGRE return MarineCave_End_OnTransition: @@ -28,13 +26,13 @@ MarineCave_End_EventScript_Kyogre:: lockall applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp waitmovement 0 - applymovement LOCALID_KYOGRE, MarineCave_End_Movement_KyogreApproach + applymovement LOCALID_MARINE_CAVE_KYOGRE, MarineCave_End_Movement_KyogreApproach waitmovement 0 waitse playmoncry SPECIES_KYOGRE, CRY_MODE_ENCOUNTER delay 40 waitmoncry - setvar VAR_LAST_TALKED, LOCALID_KYOGRE + setvar VAR_LAST_TALKED, LOCALID_MARINE_CAVE_KYOGRE setwildbattle SPECIES_KYOGRE, 70 setflag FLAG_SYS_CTRL_OBJ_DELETE special BattleSetup_StartLegendaryBattle diff --git a/data/maps/MeteorFalls_1F_1R/map.json b/data/maps/MeteorFalls_1F_1R/map.json index e0d32c5804..7aa0e579ce 100644 --- a/data/maps/MeteorFalls_1F_1R/map.json +++ b/data/maps/MeteorFalls_1F_1R/map.json @@ -67,6 +67,7 @@ "flag": "FLAG_ITEM_METEOR_FALLS_1F_1R_PP_UP" }, { + "local_id": "LOCALID_METEOR_FALLS_MAGMA_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 12, "y": 20, @@ -80,6 +81,7 @@ "flag": "FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA" }, { + "local_id": "LOCALID_METEOR_FALLS_MAGMA_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 14, "y": 21, @@ -93,6 +95,7 @@ "flag": "FLAG_HIDE_METEOR_FALLS_TEAM_MAGMA" }, { + "local_id": "LOCALID_METEOR_FALLS_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 6, "y": 20, @@ -106,6 +109,7 @@ "flag": "FLAG_HIDE_METEOR_FALLS_TEAM_AQUA" }, { + "local_id": "LOCALID_METEOR_FALLS_AQUA_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 6, "y": 20, @@ -119,6 +123,7 @@ "flag": "FLAG_HIDE_METEOR_FALLS_TEAM_AQUA" }, { + "local_id": "LOCALID_METEOR_FALLS_AQUA_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 6, "y": 21, diff --git a/data/maps/MeteorFalls_1F_1R/scripts.inc b/data/maps/MeteorFalls_1F_1R/scripts.inc index b81f5de267..9ac00f57e5 100644 --- a/data/maps/MeteorFalls_1F_1R/scripts.inc +++ b/data/maps/MeteorFalls_1F_1R/scripts.inc @@ -1,9 +1,3 @@ -.set LOCALID_MAGMA_GRUNT_1, 5 -.set LOCALID_MAGMA_GRUNT_2, 6 -.set LOCALID_ARCHIE, 7 -.set LOCALID_AQUA_GRUNT_1, 8 -.set LOCALID_AQUA_GRUNT_2, 9 - MeteorFalls_1F_1R_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, MeteorFalls_1F_1R_OnLoad .byte 0 @@ -25,70 +19,70 @@ MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceDown waitmovement 0 delay 30 - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceDown + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceDown waitmovement 0 msgbox MeteorFalls_1F_1R_Text_WithThisMeteorite, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_ExclamationMark + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_Delay48 + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_Delay48 waitmovement 0 msgbox MeteorFalls_1F_1R_Text_DontExpectMercyFromMagma, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MAGMA_GRUNT_1, MeteorFalls_1F_1R_Movement_MagmaGruntApproachPlayer + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, MeteorFalls_1F_1R_Movement_MagmaGruntApproachPlayer waitmovement 0 msgbox MeteorFalls_1F_1R_Text_HoldItRightThereMagma, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 - addobject LOCALID_ARCHIE - addobject LOCALID_AQUA_GRUNT_1 - addobject LOCALID_AQUA_GRUNT_2 + addobject LOCALID_METEOR_FALLS_ARCHIE + addobject LOCALID_METEOR_FALLS_AQUA_GRUNT_1 + addobject LOCALID_METEOR_FALLS_AQUA_GRUNT_2 playbgm MUS_ENCOUNTER_AQUA, FALSE - applymovement LOCALID_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieArrive - applymovement LOCALID_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Arrive - applymovement LOCALID_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Arrive + applymovement LOCALID_METEOR_FALLS_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieArrive + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Arrive + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Arrive waitmovement 0 - applymovement LOCALID_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox MeteorFalls_1F_1R_Text_BeSeeingYouTeamAqua, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, MeteorFalls_1F_1R_Movement_PushPlayerOutOfWay - applymovement LOCALID_MAGMA_GRUNT_1, MeteorFalls_1F_1R_Movement_MagmaGrunt1Exit - applymovement LOCALID_MAGMA_GRUNT_2, MeteorFalls_1F_1R_Movement_MagmaGrunt2Exit + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, MeteorFalls_1F_1R_Movement_MagmaGrunt1Exit + applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, MeteorFalls_1F_1R_Movement_MagmaGrunt2Exit waitmovement 0 - removeobject LOCALID_MAGMA_GRUNT_1 - removeobject LOCALID_MAGMA_GRUNT_2 - applymovement LOCALID_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieApproachPlayer + removeobject LOCALID_METEOR_FALLS_MAGMA_GRUNT_1 + removeobject LOCALID_METEOR_FALLS_MAGMA_GRUNT_2 + applymovement LOCALID_METEOR_FALLS_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieApproachPlayer waitmovement 0 msgbox MeteorFalls_1F_1R_Text_ArchieSeenYouBefore, MSGBOX_DEFAULT closemessage - applymovement LOCALID_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1ApproachArchie - applymovement LOCALID_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2ApproachArchie + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1ApproachArchie + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2ApproachArchie waitmovement 0 msgbox MeteorFalls_1F_1R_Text_BossWeShouldChaseMagma, MSGBOX_DEFAULT - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_METEOR_FALLS_ARCHIE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox MeteorFalls_1F_1R_Text_ArchieYesNoTellingWhatMagmaWillDo, MSGBOX_DEFAULT - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_METEOR_FALLS_ARCHIE, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox MeteorFalls_1F_1R_Text_ArchieFarewell, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieExit - applymovement LOCALID_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Exit - applymovement LOCALID_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Exit + applymovement LOCALID_METEOR_FALLS_ARCHIE, MeteorFalls_1F_1R_Movement_ArchieExit + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_1, MeteorFalls_1F_1R_Movement_AquaGrunt1Exit + applymovement LOCALID_METEOR_FALLS_AQUA_GRUNT_2, MeteorFalls_1F_1R_Movement_AquaGrunt2Exit waitmovement 0 fadedefaultbgm - removeobject LOCALID_ARCHIE - removeobject LOCALID_AQUA_GRUNT_1 - removeobject LOCALID_AQUA_GRUNT_2 + removeobject LOCALID_METEOR_FALLS_ARCHIE + removeobject LOCALID_METEOR_FALLS_AQUA_GRUNT_1 + removeobject LOCALID_METEOR_FALLS_AQUA_GRUNT_2 setflag FLAG_HIDE_ROUTE_112_TEAM_MAGMA setflag FLAG_MET_ARCHIE_METEOR_FALLS setflag FLAG_HIDE_FALLARBOR_TOWN_BATTLE_TENT_SCOTT diff --git a/data/maps/MeteorFalls_StevensCave/map.json b/data/maps/MeteorFalls_StevensCave/map.json index 8e329fc0d3..69520324c6 100644 --- a/data/maps/MeteorFalls_StevensCave/map.json +++ b/data/maps/MeteorFalls_StevensCave/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_METEOR_FALLS_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 19, "y": 3, diff --git a/data/maps/MeteorFalls_StevensCave/scripts.inc b/data/maps/MeteorFalls_StevensCave/scripts.inc index a1c9e74ece..de24d35124 100644 --- a/data/maps/MeteorFalls_StevensCave/scripts.inc +++ b/data/maps/MeteorFalls_StevensCave/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_STEVEN, 1 - MeteorFalls_StevensCave_MapScripts:: .byte 0 @@ -8,11 +6,11 @@ MeteorFalls_StevensCave_EventScript_Steven:: goto_if_set FLAG_DEFEATED_METEOR_FALLS_STEVEN, MeteorFalls_StevensCave_EventScript_Defeated waitse playse SE_PIN - applymovement LOCALID_STEVEN, Common_Movement_ExclamationMark + applymovement LOCALID_METEOR_FALLS_STEVEN, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_STEVEN, Common_Movement_Delay48 + applymovement LOCALID_METEOR_FALLS_STEVEN, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_STEVEN, Common_Movement_FacePlayer + applymovement LOCALID_METEOR_FALLS_STEVEN, Common_Movement_FacePlayer waitmovement 0 msgbox MeteorFalls_StevensCave_Text_ShouldKnowHowGoodIAmExpectWorst, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_STEVEN, MeteorFalls_StevensCave_Text_StevenDefeat @@ -22,7 +20,7 @@ MeteorFalls_StevensCave_EventScript_Steven:: end MeteorFalls_StevensCave_EventScript_Defeated:: - applymovement LOCALID_STEVEN, Common_Movement_FacePlayer + applymovement LOCALID_METEOR_FALLS_STEVEN, Common_Movement_FacePlayer waitmovement 0 msgbox MeteorFalls_StevensCave_Text_MyPredictionCameTrue, MSGBOX_DEFAULT release diff --git a/data/maps/MirageTower_4F/map.json b/data/maps/MirageTower_4F/map.json index fb375f6ae1..a1873a9c54 100644 --- a/data/maps/MirageTower_4F/map.json +++ b/data/maps/MirageTower_4F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MIRAGE_ROOT_FOSSIL", "graphics_id": "OBJ_EVENT_GFX_FOSSIL", "x": 5, "y": 4, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL" }, { + "local_id": "LOCALID_MIRAGE_CLAW_FOSSIL", "graphics_id": "OBJ_EVENT_GFX_FOSSIL", "x": 7, "y": 4, diff --git a/data/maps/MirageTower_4F/scripts.inc b/data/maps/MirageTower_4F/scripts.inc index 61bde877c5..57280b9d03 100644 --- a/data/maps/MirageTower_4F/scripts.inc +++ b/data/maps/MirageTower_4F/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ROOT_FOSSIL, 1 -.set LOCALID_CLAW_FOSSIL, 2 - MirageTower_4F_MapScripts:: .byte 0 @@ -13,7 +10,7 @@ MirageTower_4F_EventScript_RootFossil:: closemessage setflag FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL setflag FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL - removeobject LOCALID_ROOT_FOSSIL + removeobject LOCALID_MIRAGE_ROOT_FOSSIL delay 30 setflag FLAG_CHOSE_ROOT_FOSSIL goto MirageTower_4F_EventScript_CollapseMirageTower @@ -33,7 +30,7 @@ MirageTower_4F_EventScript_ClawFossil:: closemessage setflag FLAG_HIDE_MIRAGE_TOWER_CLAW_FOSSIL setflag FLAG_HIDE_MIRAGE_TOWER_ROOT_FOSSIL - removeobject LOCALID_CLAW_FOSSIL + removeobject LOCALID_MIRAGE_CLAW_FOSSIL delay 30 setflag FLAG_CHOSE_CLAW_FOSSIL goto MirageTower_4F_EventScript_CollapseMirageTower diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 232cbda814..993f0c5520 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -148,6 +148,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MOSSDEEP_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 44, "y": 23, @@ -161,6 +162,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MOSSDEEP_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 44, "y": 24, @@ -174,6 +176,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MOSSDEEP_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 44, "y": 25, @@ -187,6 +190,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MOSSDEEP_GRUNT_4", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 44, "y": 26, @@ -200,6 +204,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MOSSDEEP_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 45, "y": 25, @@ -226,6 +231,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MOSSDEEP_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 61, "y": 29, diff --git a/data/maps/MossdeepCity/scripts.inc b/data/maps/MossdeepCity/scripts.inc index a03b1db820..10e520e347 100644 --- a/data/maps/MossdeepCity/scripts.inc +++ b/data/maps/MossdeepCity/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_GRUNT_1, 10 -.set LOCALID_GRUNT_2, 11 -.set LOCALID_GRUNT_3, 12 -.set LOCALID_GRUNT_4, 13 -.set LOCALID_MAXIE, 14 -.set LOCALID_SCOTT, 16 - MossdeepCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_OnTransition .byte 0 @@ -82,24 +75,24 @@ MossdeepCity_EventScript_VisitedMossdeep:: MossdeepCity_EventScript_TeamMagmaEnterSpaceCenter:: lockall - applymovement LOCALID_MAXIE, MossdeepCity_Movement_MaxieGestureToSpaceCenter + applymovement LOCALID_MOSSDEEP_MAXIE, MossdeepCity_Movement_MaxieGestureToSpaceCenter waitmovement 0 - applymovement LOCALID_GRUNT_1, MossdeepCity_Movement_GruntFaceSpaceCenter - applymovement LOCALID_GRUNT_2, MossdeepCity_Movement_GruntFaceSpaceCenter - applymovement LOCALID_GRUNT_3, MossdeepCity_Movement_GruntFaceSpaceCenter - applymovement LOCALID_GRUNT_4, MossdeepCity_Movement_GruntFaceSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_1, MossdeepCity_Movement_GruntFaceSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_2, MossdeepCity_Movement_GruntFaceSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_3, MossdeepCity_Movement_GruntFaceSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_4, MossdeepCity_Movement_GruntFaceSpaceCenter waitmovement 0 - applymovement LOCALID_MAXIE, MossdeepCity_Movement_MaxieEnterSpaceCenter - applymovement LOCALID_GRUNT_1, MossdeepCity_Movement_Grunt1EnterSpaceCenter - applymovement LOCALID_GRUNT_2, MossdeepCity_Movement_Grunt2EnterSpaceCenter - applymovement LOCALID_GRUNT_3, MossdeepCity_Movement_Grunt3EnterSpaceCenter - applymovement LOCALID_GRUNT_4, MossdeepCity_Movement_Grunt4EnterSpaceCenter + applymovement LOCALID_MOSSDEEP_MAXIE, MossdeepCity_Movement_MaxieEnterSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_1, MossdeepCity_Movement_Grunt1EnterSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_2, MossdeepCity_Movement_Grunt2EnterSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_3, MossdeepCity_Movement_Grunt3EnterSpaceCenter + applymovement LOCALID_MOSSDEEP_GRUNT_4, MossdeepCity_Movement_Grunt4EnterSpaceCenter waitmovement 0 - removeobject LOCALID_MAXIE - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 - removeobject LOCALID_GRUNT_3 - removeobject LOCALID_GRUNT_4 + removeobject LOCALID_MOSSDEEP_MAXIE + removeobject LOCALID_MOSSDEEP_GRUNT_1 + removeobject LOCALID_MOSSDEEP_GRUNT_2 + removeobject LOCALID_MOSSDEEP_GRUNT_3 + removeobject LOCALID_MOSSDEEP_GRUNT_4 delay 30 setvar VAR_MOSSDEEP_CITY_STATE, 2 setflag FLAG_HIDE_MOSSDEEP_CITY_TEAM_MAGMA @@ -263,19 +256,19 @@ MossdeepCity_EventScript_Scott:: call_if_eq VAR_FACING, DIR_NORTH, MossdeepCity_EventScript_ScottExitNorth call_if_eq VAR_FACING, DIR_EAST, MossdeepCity_EventScript_ScottExitEast addvar VAR_SCOTT_STATE, 1 - removeobject LOCALID_SCOTT + removeobject LOCALID_MOSSDEEP_SCOTT release end MossdeepCity_EventScript_ScottExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit - applymovement LOCALID_SCOTT, MossdeepCity_Movement_ScottExitNorth + applymovement LOCALID_MOSSDEEP_SCOTT, MossdeepCity_Movement_ScottExitNorth waitmovement 0 return MossdeepCity_EventScript_ScottExitEast:: applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit - applymovement LOCALID_SCOTT, MossdeepCity_Movement_ScottExitEast + applymovement LOCALID_MOSSDEEP_SCOTT, MossdeepCity_Movement_ScottExitEast waitmovement 0 return diff --git a/data/maps/MossdeepCity_House2/map.json b/data/maps/MossdeepCity_House2/map.json index a8a03ed958..8bd4a210e3 100644 --- a/data/maps/MossdeepCity_House2/map.json +++ b/data/maps/MossdeepCity_House2/map.json @@ -41,6 +41,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MOSSDEEP_HOUSE_WINGULL", "graphics_id": "OBJ_EVENT_GFX_WINGULL", "x": 4, "y": 5, diff --git a/data/maps/MossdeepCity_House2/scripts.inc b/data/maps/MossdeepCity_House2/scripts.inc index 56a8381963..0317753560 100644 --- a/data/maps/MossdeepCity_House2/scripts.inc +++ b/data/maps/MossdeepCity_House2/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WINGULL, 3 - MossdeepCity_House2_MapScripts:: .byte 0 @@ -23,17 +21,17 @@ MossdeepCity_House2_EventScript_Wingull:: clearflag FLAG_HIDE_FORTREE_CITY_HOUSE_4_WINGULL call_if_eq VAR_FACING, DIR_NORTH, MossdeepCity_House2_EventScript_WingullExitNorth call_if_eq VAR_FACING, DIR_WEST, MossdeepCity_House2_EventScript_WingullExitWest - removeobject LOCALID_WINGULL + removeobject LOCALID_MOSSDEEP_HOUSE_WINGULL release end MossdeepCity_House2_EventScript_WingullExitNorth:: - applymovement LOCALID_WINGULL, MossdeepCity_House2_Movement_WingullExitNorth + applymovement LOCALID_MOSSDEEP_HOUSE_WINGULL, MossdeepCity_House2_Movement_WingullExitNorth waitmovement 0 return MossdeepCity_House2_EventScript_WingullExitWest:: - applymovement LOCALID_WINGULL, MossdeepCity_House2_Movement_WingullExitEast + applymovement LOCALID_MOSSDEEP_HOUSE_WINGULL, MossdeepCity_House2_Movement_WingullExitEast waitmovement 0 return diff --git a/data/maps/MossdeepCity_SpaceCenter_1F/map.json b/data/maps/MossdeepCity_SpaceCenter_1F/map.json index e7f47bcfb8..f6b04f5f2f 100644 --- a/data/maps/MossdeepCity_SpaceCenter_1F/map.json +++ b/data/maps/MossdeepCity_SpaceCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SPACE_CENTER_1F_SCIENTIST_1", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 7, "y": 2, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_1F_SCIENTIST_2", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 2, "y": 2, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_1F_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 6, "y": 6, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_1F_OLD_MAN", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN", "x": 10, "y": 2, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SPACE_CENTER_1F_WOMAN", "graphics_id": "OBJ_EVENT_GFX_WOMAN_4", "x": 14, "y": 7, @@ -119,6 +124,7 @@ "flag": "FLAG_HIDE_MOSSDEEP_CITY_SPACE_CENTER_1F_TEAM_MAGMA" }, { + "local_id": "LOCALID_SPACE_CENTER_1F_STAIR_GRUNT", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 13, "y": 2, diff --git a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc index e17af35724..0ed531ba4b 100644 --- a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_SCIENTIST_1, 1 -.set LOCALID_SCIENTIST_2, 2 -.set LOCALID_SAILOR, 3 -.set LOCALID_OLD_MAN, 4 -.set LOCALID_WOMAN, 5 -.set LOCALID_STAIR_GRUNT, 9 - MossdeepCity_SpaceCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, MossdeepCity_SpaceCenter_1F_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, MossdeepCity_SpaceCenter_1F_OnTransition @@ -15,31 +8,31 @@ MossdeepCity_SpaceCenter_1F_OnTransition: end MossdeepCity_SpaceCenter_1F_EventScript_MoveObjectsForTeamMagma:: - setobjectxyperm LOCALID_SAILOR, 1, 9 - setobjectmovementtype LOCALID_SAILOR, MOVEMENT_TYPE_FACE_RIGHT - setobjectxyperm LOCALID_WOMAN, 0, 8 - setobjectmovementtype LOCALID_WOMAN, MOVEMENT_TYPE_FACE_RIGHT - setobjectxyperm LOCALID_OLD_MAN, 1, 6 - setobjectmovementtype LOCALID_OLD_MAN, MOVEMENT_TYPE_FACE_RIGHT - setobjectxyperm LOCALID_SCIENTIST_1, 3, 4 - setobjectmovementtype LOCALID_SCIENTIST_1, MOVEMENT_TYPE_FACE_RIGHT - setobjectmovementtype LOCALID_SCIENTIST_2, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_1F_SAILOR, 1, 9 + setobjectmovementtype LOCALID_SPACE_CENTER_1F_SAILOR, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_1F_WOMAN, 0, 8 + setobjectmovementtype LOCALID_SPACE_CENTER_1F_WOMAN, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_1F_OLD_MAN, 1, 6 + setobjectmovementtype LOCALID_SPACE_CENTER_1F_OLD_MAN, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SPACE_CENTER_1F_SCIENTIST_1, 3, 4 + setobjectmovementtype LOCALID_SPACE_CENTER_1F_SCIENTIST_1, MOVEMENT_TYPE_FACE_RIGHT + setobjectmovementtype LOCALID_SPACE_CENTER_1F_SCIENTIST_2, MOVEMENT_TYPE_FACE_RIGHT goto_if_eq VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 1, MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardLeft goto_if_eq VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2, MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardDown goto_if_eq VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 3, MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardRight end MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardLeft:: - setobjectxyperm LOCALID_STAIR_GRUNT, 12, 2 + setobjectxyperm LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, 12, 2 end MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardDown:: - setobjectxyperm LOCALID_STAIR_GRUNT, 13, 3 + setobjectxyperm LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, 13, 3 end @ Functionally unused. See comment on MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast MossdeepCity_SpaceCenter_1F_EventScript_MoveStairGuardRight:: - setobjectxyperm LOCALID_STAIR_GRUNT, 14, 2 + setobjectxyperm LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, 14, 2 end MossdeepCity_SpaceCenter_1F_OnLoad: @@ -226,7 +219,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2:: msgbox MossdeepCity_SpaceCenter_1F_Text_Grunt2Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_2, MossdeepCity_SpaceCenter_1F_Text_Grunt2Defeat setflag FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F - copyobjectxytoperm LOCALID_STAIR_GRUNT + copyobjectxytoperm LOCALID_SPACE_CENTER_1F_STAIR_GRUNT switch VAR_FACING case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest #ifdef BUGFIX @@ -234,7 +227,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2:: #else case DIR_WEST, MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast #endif - applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs + applymovement LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairs waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 2 release @@ -246,7 +239,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_Grunt2Defeated:: end MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest:: - applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairsWest + applymovement LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairsWest waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 1 release @@ -255,7 +248,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsWest:: @ Functionally unused by mistake. The movement is handled anyway after the switch (see above) @ This also means VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE can never be 3 MossdeepCity_SpaceCenter_1F_EventScript_MoveGruntFromStairsEast:: - applymovement LOCALID_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairsEast + applymovement LOCALID_SPACE_CENTER_1F_STAIR_GRUNT, MossdeepCity_SpaceCenter_1F_Movement_MoveGruntFromStairsEast waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STAIR_GUARD_STATE, 3 release diff --git a/data/maps/MtChimney/map.json b/data/maps/MtChimney/map.json index 55bd065cb6..e4cf247d0e 100644 --- a/data/maps/MtChimney/map.json +++ b/data/maps/MtChimney/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MT_CHIMNEY_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 24, "y": 19, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA" }, { + "local_id": "LOCALID_MT_CHIMNEY_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 13, "y": 6, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MT_CHIMNEY_TABITHA", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 12, "y": 11, @@ -288,6 +291,7 @@ "flag": "FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA" }, { + "local_id": "LOCALID_MT_CHIMNEY_MAGMA_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 9, "y": 16, @@ -379,6 +383,7 @@ "flag": "FLAG_HIDE_MT_CHIMNEY_TRAINERS" }, { + "local_id": "LOCALID_MT_CHIMNEY_MAGMA_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_F", "x": 13, "y": 16, diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index 1931633258..fa5e5ff172 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_ARCHIE, 1 -.set LOCALID_MAXIE, 2 -.set LOCALID_TABITHA, 3 -.set LOCALID_MAGMA_GRUNT_2, 22 -.set LOCALID_MAGMA_GRUNT_1, 29 - - MtChimney_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, MtChimney_OnResume map_script MAP_SCRIPT_ON_TRANSITION, MtChimney_OnTransition @@ -24,7 +17,7 @@ MtChimney_EventScript_Archie:: call_if_unset FLAG_EVIL_LEADER_PLEASE_STOP, MtChimney_EventScript_ArchieGoStopTeamMagma call_if_set FLAG_EVIL_LEADER_PLEASE_STOP, MtChimney_EventScript_ArchieBusyFighting closemessage - applymovement LOCALID_ARCHIE, Common_Movement_FaceOriginalDirection + applymovement LOCALID_MT_CHIMNEY_ARCHIE, Common_Movement_FaceOriginalDirection waitmovement 0 setflag FLAG_EVIL_LEADER_PLEASE_STOP release @@ -42,12 +35,12 @@ MtChimney_EventScript_Maxie:: lockall playbgm MUS_ENCOUNTER_MAGMA, FALSE msgbox MtChimney_Text_MeteoriteWillActivateVolcano, MSGBOX_DEFAULT - applymovement LOCALID_MAXIE, Common_Movement_FacePlayer + applymovement LOCALID_MT_CHIMNEY_MAXIE, Common_Movement_FacePlayer waitmovement 0 playse SE_PIN - applymovement LOCALID_MAXIE, Common_Movement_ExclamationMark + applymovement LOCALID_MT_CHIMNEY_MAXIE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_MAXIE, Common_Movement_Delay48 + applymovement LOCALID_MT_CHIMNEY_MAXIE, Common_Movement_Delay48 waitmovement 0 msgbox MtChimney_Text_MaxieIntro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_MAXIE_MT_CHIMNEY, MtChimney_Text_MaxieDefeat @@ -55,14 +48,14 @@ MtChimney_EventScript_Maxie:: closemessage delay 30 fadescreen FADE_TO_BLACK - removeobject LOCALID_MAXIE - removeobject LOCALID_MAGMA_GRUNT_1 - removeobject LOCALID_TABITHA - removeobject LOCALID_MAGMA_GRUNT_2 + removeobject LOCALID_MT_CHIMNEY_MAXIE + removeobject LOCALID_MT_CHIMNEY_MAGMA_GRUNT_1 + removeobject LOCALID_MT_CHIMNEY_TABITHA + removeobject LOCALID_MT_CHIMNEY_MAGMA_GRUNT_2 setflag FLAG_HIDE_MT_CHIMNEY_TEAM_MAGMA fadescreen FADE_FROM_BLACK - setobjectxyperm LOCALID_ARCHIE, 10, 12 - addobject LOCALID_ARCHIE + setobjectxyperm LOCALID_MT_CHIMNEY_ARCHIE, 10, 12 + addobject LOCALID_MT_CHIMNEY_ARCHIE call_if_eq VAR_FACING, DIR_EAST, MtChimney_EventScript_ArchieApproachPlayerEast call_if_eq VAR_FACING, DIR_NORTH, MtChimney_EventScript_ArchieApproachPlayerNorth applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft @@ -71,7 +64,7 @@ MtChimney_EventScript_Maxie:: closemessage call_if_eq VAR_FACING, DIR_EAST, MtChimney_EventScript_ArchieExitEast call_if_eq VAR_FACING, DIR_NORTH, MtChimney_EventScript_ArchieExitNorth - removeobject LOCALID_ARCHIE + removeobject LOCALID_MT_CHIMNEY_ARCHIE setflag FLAG_HIDE_MT_CHIMNEY_TEAM_AQUA setflag FLAG_DEFEATED_EVIL_TEAM_MT_CHIMNEY clearflag FLAG_HIDE_FALLARBOR_HOUSE_PROF_COZMO @@ -81,22 +74,22 @@ MtChimney_EventScript_Maxie:: end MtChimney_EventScript_ArchieApproachPlayerEast:: - applymovement LOCALID_ARCHIE, MtChimney_Movement_ArchieApproachPlayerEast + applymovement LOCALID_MT_CHIMNEY_ARCHIE, MtChimney_Movement_ArchieApproachPlayerEast waitmovement 0 return MtChimney_EventScript_ArchieApproachPlayerNorth:: - applymovement LOCALID_ARCHIE, MtChimney_Movement_ArchieApproachPlayerNorth + applymovement LOCALID_MT_CHIMNEY_ARCHIE, MtChimney_Movement_ArchieApproachPlayerNorth waitmovement 0 return MtChimney_EventScript_ArchieExitEast:: - applymovement LOCALID_ARCHIE, MtChimney_Movement_ArchieExitEast + applymovement LOCALID_MT_CHIMNEY_ARCHIE, MtChimney_Movement_ArchieExitEast waitmovement 0 return MtChimney_EventScript_ArchieExitNorth:: - applymovement LOCALID_ARCHIE, MtChimney_Movement_ArchieExitNorth + applymovement LOCALID_MT_CHIMNEY_ARCHIE, MtChimney_Movement_ArchieExitNorth waitmovement 0 return diff --git a/data/maps/MtPyre_Summit/map.json b/data/maps/MtPyre_Summit/map.json index 49fd8b9f72..7a2cccdd36 100644 --- a/data/maps/MtPyre_Summit/map.json +++ b/data/maps/MtPyre_Summit/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 23, "y": 6, @@ -41,6 +42,7 @@ "flag": "FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_OLD_LADY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_F", "x": 23, "y": 5, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 21, "y": 15, @@ -67,6 +70,7 @@ "flag": "FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 25, "y": 18, @@ -80,6 +84,7 @@ "flag": "FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 21, "y": 11, @@ -93,6 +98,7 @@ "flag": "FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_GRUNT_4", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_F", "x": 25, "y": 11, @@ -106,6 +112,7 @@ "flag": "FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA" }, { + "local_id": "LOCALID_MT_PYRE_SUMMIT_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 23, "y": 6, diff --git a/data/maps/MtPyre_Summit/scripts.inc b/data/maps/MtPyre_Summit/scripts.inc index 3de60df3f2..06c91fe382 100644 --- a/data/maps/MtPyre_Summit/scripts.inc +++ b/data/maps/MtPyre_Summit/scripts.inc @@ -1,11 +1,3 @@ -.set LOCALID_ARCHIE, 2 -.set LOCALID_OLD_LADY, 3 -.set LOCALID_GRUNT_1, 4 -.set LOCALID_GRUNT_2, 5 -.set LOCALID_GRUNT_3, 6 -.set LOCALID_GRUNT_4, 7 -.set LOCALID_MAXIE, 8 - MtPyre_Summit_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, MtPyre_Summit_OnTransition .byte 0 @@ -15,8 +7,8 @@ MtPyre_Summit_OnTransition: end MtPyre_Summit_EventScript_SetArchieMaxiePositions:: - setobjectxyperm LOCALID_MAXIE, 23, 6 - setobjectxyperm LOCALID_ARCHIE, 22, 6 + setobjectxyperm LOCALID_MT_PYRE_SUMMIT_MAXIE, 23, 6 + setobjectxyperm LOCALID_MT_PYRE_SUMMIT_ARCHIE, 22, 6 end MtPyre_Summit_EventScript_TeamAquaTrigger0:: @@ -41,7 +33,7 @@ MtPyre_Summit_EventScript_TeamAquaExits:: playbgm MUS_ENCOUNTER_AQUA, FALSE applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp waitmovement 0 - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 50 call_if_eq VAR_0x8008, 0, MtPyre_Summit_EventScript_ArchieFacePlayer0 @@ -50,11 +42,11 @@ MtPyre_Summit_EventScript_TeamAquaExits:: msgbox MtPyre_Summit_Text_ArchieWeGotTheOrbLetsGo, MSGBOX_DEFAULT closemessage fadescreen FADE_TO_BLACK - removeobject LOCALID_ARCHIE - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 - removeobject LOCALID_GRUNT_3 - removeobject LOCALID_GRUNT_4 + removeobject LOCALID_MT_PYRE_SUMMIT_ARCHIE + removeobject LOCALID_MT_PYRE_SUMMIT_GRUNT_1 + removeobject LOCALID_MT_PYRE_SUMMIT_GRUNT_2 + removeobject LOCALID_MT_PYRE_SUMMIT_GRUNT_3 + removeobject LOCALID_MT_PYRE_SUMMIT_GRUNT_4 setflag FLAG_HIDE_MT_PYRE_SUMMIT_ARCHIE setflag FLAG_HIDE_MT_PYRE_SUMMIT_TEAM_AQUA fadedefaultbgm @@ -72,7 +64,7 @@ MtPyre_Summit_EventScript_TeamAquaExits:: end MtPyre_Summit_EventScript_ArchieFacePlayer0:: - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieFacePlayer0 + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieFacePlayer0 waitmovement 0 return @@ -81,24 +73,24 @@ MtPyre_Summit_EventScript_ArchieFacePlayer1:: return MtPyre_Summit_EventScript_ArchieFacePlayer2:: - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieFacePlayer2 + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieFacePlayer2 waitmovement 0 return MtPyre_Summit_EventScript_OldLadyApproachPlayer0:: - applymovement LOCALID_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer0 + applymovement LOCALID_MT_PYRE_SUMMIT_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer0 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return MtPyre_Summit_EventScript_OldLadyApproachPlayer1:: - applymovement LOCALID_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer1 + applymovement LOCALID_MT_PYRE_SUMMIT_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer1 waitmovement 0 return MtPyre_Summit_EventScript_OldLadyApproachPlayer2:: - applymovement LOCALID_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer2 + applymovement LOCALID_MT_PYRE_SUMMIT_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer2 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 @@ -211,9 +203,9 @@ MtPyre_Summit_EventScript_ArchieMaxieReturnOrbs:: call_if_eq VAR_0x8008, 1, MtPyre_Summit_EventScript_ArchieMaxieBeginExit1 call_if_eq VAR_0x8008, 2, MtPyre_Summit_EventScript_ArchieMaxieBeginExit2 playse SE_PIN - applymovement LOCALID_MAXIE, Common_Movement_ExclamationMark + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_MAXIE, Common_Movement_Delay48 + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, Common_Movement_Delay48 waitmovement 0 delay 30 call_if_eq VAR_0x8008, 0, MtPyre_Summit_EventScript_MaxieApproachPlayer0 @@ -225,78 +217,78 @@ MtPyre_Summit_EventScript_ArchieMaxieReturnOrbs:: call_if_eq VAR_0x8008, 1, MtPyre_Summit_EventScript_MaxieApproachArchie1 call_if_eq VAR_0x8008, 2, MtPyre_Summit_EventScript_MaxieApproachArchie2 delay 30 - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieExit - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieExit + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 - removeobject LOCALID_ARCHIE - removeobject LOCALID_MAXIE + removeobject LOCALID_MT_PYRE_SUMMIT_ARCHIE + removeobject LOCALID_MT_PYRE_SUMMIT_MAXIE setvar VAR_MT_PYRE_STATE, 3 releaseall end MtPyre_Summit_EventScript_ArchieMaxieBeginExit0:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit0 - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieExit - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieExit + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_ArchieMaxieBeginExit1:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit1 - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieExit - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieExit + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_ArchieMaxieBeginExit2:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit2 - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieExit - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieExit + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer0:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie0 - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer0 + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer0 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer1:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer1 + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer1 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer2:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie - applymovement LOCALID_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer2 + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer2 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachArchie0:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie0 + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie0 waitmovement 0 - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachArchie1:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie1 + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie1 waitmovement 0 - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachArchie2:: applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie - applymovement LOCALID_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie2 + applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie2 waitmovement 0 - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return diff --git a/data/maps/NavelRock_Harbor/map.json b/data/maps/NavelRock_Harbor/map.json index ed0bb70dac..c3ca23d82d 100644 --- a/data/maps/NavelRock_Harbor/map.json +++ b/data/maps/NavelRock_Harbor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_NAVEL_ROCK_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 8, "y": 5, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_NAVEL_ROCK_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 8, "y": 7, diff --git a/data/maps/NavelRock_Harbor/scripts.inc b/data/maps/NavelRock_Harbor/scripts.inc index a981759175..fb12688e32 100644 --- a/data/maps/NavelRock_Harbor/scripts.inc +++ b/data/maps/NavelRock_Harbor/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_SAILOR, 1 -.set LOCALID_SS_TIDAL, 2 - NavelRock_Harbor_MapScripts:: .byte 0 @@ -14,8 +11,8 @@ NavelRock_Harbor_EventScript_Sailor:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 - hideobjectat LOCALID_SAILOR, MAP_NAVEL_ROCK_HARBOR - setvar VAR_0x8004, LOCALID_SS_TIDAL + hideobjectat LOCALID_NAVEL_ROCK_SAILOR, MAP_NAVEL_ROCK_HARBOR + setvar VAR_0x8004, LOCALID_NAVEL_ROCK_SS_TIDAL call Common_EventScript_FerryDepartIsland warp MAP_LILYCOVE_CITY_HARBOR, 8, 11 waitstate diff --git a/data/maps/OldaleTown/map.json b/data/maps/OldaleTown/map.json index 4bb86784e9..991d2e50ca 100644 --- a/data/maps/OldaleTown/map.json +++ b/data/maps/OldaleTown/map.json @@ -44,6 +44,7 @@ "flag": "0" }, { + "local_id": "LOCALID_OLDALE_MART_EMPLOYEE", "graphics_id": "OBJ_EVENT_GFX_MART_EMPLOYEE", "x": 13, "y": 7, @@ -57,6 +58,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FOOTPRINTS_MAN", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 8, "y": 9, @@ -70,6 +72,7 @@ "flag": "0" }, { + "local_id": "LOCALID_OLDALE_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 11, "y": 19, diff --git a/data/maps/OldaleTown/scripts.inc b/data/maps/OldaleTown/scripts.inc index b2c25a6dfb..d19658dc13 100644 --- a/data/maps/OldaleTown/scripts.inc +++ b/data/maps/OldaleTown/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_MART_EMPLOYEE, 2 -.set LOCALID_FOOTPRINTS_MAN, 3 -.set LOCALID_RIVAL, 4 - OldaleTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, OldaleTown_OnTransition .byte 0 @@ -25,8 +21,8 @@ OldaleTown_EventScript_BlockWestEntrance:: return OldaleTown_EventScript_MoveMartEmployee:: - setobjectxyperm LOCALID_MART_EMPLOYEE, 13, 14 - setobjectmovementtype LOCALID_MART_EMPLOYEE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_OLDALE_MART_EMPLOYEE, 13, 14 + setobjectmovementtype LOCALID_OLDALE_MART_EMPLOYEE, MOVEMENT_TYPE_FACE_DOWN return OldaleTown_EventScript_TownSign:: @@ -53,14 +49,14 @@ OldaleTown_EventScript_MartEmployee:: end OldaleTown_EventScript_GoToMartSouth:: - applymovement LOCALID_MART_EMPLOYEE, OldaleTown_Movement_EmployeeSouth + applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeSouth applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerSouth waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart end OldaleTown_EventScript_GoToMartNorth:: - applymovement LOCALID_MART_EMPLOYEE, OldaleTown_Movement_EmployeeNorth + applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeNorth applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerNorth waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart @@ -68,7 +64,7 @@ OldaleTown_EventScript_GoToMartNorth:: OldaleTown_EventScript_GoToMartEast:: applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerEast - applymovement LOCALID_MART_EMPLOYEE, OldaleTown_Movement_EmployeeEast + applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeEast waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart end @@ -221,7 +217,7 @@ OldaleTown_EventScript_NotBlockingPath:: OldaleTown_EventScript_Rival:: lockall - applymovement LOCALID_RIVAL, Common_Movement_FacePlayer + applymovement LOCALID_OLDALE_RIVAL, Common_Movement_FacePlayer waitmovement 0 setvar VAR_0x8009, 0 goto OldaleTown_EventScript_ShowRivalMessage @@ -229,7 +225,7 @@ OldaleTown_EventScript_Rival:: OldaleTown_EventScript_RivalTrigger1:: lockall - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalApproachPlayer1 + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer1 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -239,7 +235,7 @@ OldaleTown_EventScript_RivalTrigger1:: OldaleTown_EventScript_RivalTrigger2:: lockall - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalApproachPlayer2 + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer2 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -249,7 +245,7 @@ OldaleTown_EventScript_RivalTrigger2:: OldaleTown_EventScript_RivalTrigger3:: lockall - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalApproachPlayer3 + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer3 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -277,9 +273,9 @@ OldaleTown_EventScript_RivalFinish:: closemessage call_if_eq VAR_0x8009, 0, OldaleTown_EventScript_DoExitMovement1 call_if_eq VAR_0x8009, 1, OldaleTown_EventScript_DoExitMovement2 - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalExit + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalExit waitmovement 0 - removeobject LOCALID_RIVAL + removeobject LOCALID_OLDALE_RIVAL setvar VAR_OLDALE_RIVAL_STATE, 2 setflag FLAG_HIDE_OLDALE_TOWN_RIVAL releaseall @@ -287,13 +283,13 @@ OldaleTown_EventScript_RivalFinish:: OldaleTown_EventScript_DoExitMovement1:: goto_if_ne VAR_FACING, DIR_SOUTH, OldaleTown_EventScript_DoExitMovement2 - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalExit + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalExit waitmovement 0 return OldaleTown_EventScript_DoExitMovement2:: applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_WatchRivalExit - applymovement LOCALID_RIVAL, OldaleTown_Movement_RivalExit + applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalExit waitmovement 0 return diff --git a/data/maps/PacifidlogTown_PokemonCenter_1F/map.json b/data/maps/PacifidlogTown_PokemonCenter_1F/map.json index f98fdb3dd7..08f661ce97 100644 --- a/data/maps/PacifidlogTown_PokemonCenter_1F/map.json +++ b/data/maps/PacifidlogTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PACIFIDLOG_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/PacifidlogTown_PokemonCenter_1F/scripts.inc b/data/maps/PacifidlogTown_PokemonCenter_1F/scripts.inc index 32db89f8dc..78ea62594a 100644 --- a/data/maps/PacifidlogTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/PacifidlogTown_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - PacifidlogTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PacifidlogTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -10,7 +8,7 @@ PacifidlogTown_PokemonCenter_1F_OnTransition: end PacifidlogTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_PACIFIDLOG_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index 63e02e8955..57238192dc 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -39,6 +39,7 @@ "flag": "FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM" }, { + "local_id": "LOCALID_PETALBURG_WALLY", "graphics_id": "OBJ_EVENT_GFX_WALLY", "x": 15, "y": 10, @@ -52,6 +53,7 @@ "flag": "FLAG_HIDE_PETALBURG_CITY_WALLY" }, { + "local_id": "LOCALID_PETALBURG_BOY", "graphics_id": "OBJ_EVENT_GFX_BOY_1", "x": 8, "y": 22, @@ -78,6 +80,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PETALBURG_WALLYS_DAD", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 15, "y": 10, @@ -117,6 +120,7 @@ "flag": "FLAG_ITEM_PETALBURG_CITY_ETHER" }, { + "local_id": "LOCALID_GYM_BOY", "graphics_id": "OBJ_EVENT_GFX_BOY_2", "x": 12, "y": 15, @@ -130,6 +134,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PETALBURG_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 13, "y": 12, diff --git a/data/maps/PetalburgCity/scripts.inc b/data/maps/PetalburgCity/scripts.inc index a9dd1014f2..45487bcd46 100644 --- a/data/maps/PetalburgCity/scripts.inc +++ b/data/maps/PetalburgCity/scripts.inc @@ -1,9 +1,3 @@ -.set LOCALID_WALLY, 2 -.set LOCALID_BOY, 3 -.set LOCALID_WALLYS_DAD, 5 -.set LOCALID_GYM_BOY, 8 -.set LOCALID_SCOTT, 9 - PetalburgCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PetalburgCity_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, PetalburgCity_OnFrame @@ -39,15 +33,15 @@ PetalburgCity_EventScript_WallyTutorial:: lockall special SavePlayerParty special LoadWallyZigzagoon - applymovement LOCALID_WALLY, PetalburgCity_Movement_WallyTutorialWally + applymovement LOCALID_PETALBURG_WALLY, PetalburgCity_Movement_WallyTutorialWally applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WallyTutorialPlayer waitmovement 0 msgbox Route102_Text_WatchMeCatchPokemon, MSGBOX_DEFAULT special StartWallyTutorialBattle waitstate msgbox Route102_Text_WallyIDidIt, MSGBOX_DEFAULT - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterLeft, MAP_PETALBURG_CITY - waitmovement LOCALID_WALLY, MAP_PETALBURG_CITY + applymovement LOCALID_PETALBURG_WALLY, Common_Movement_WalkInPlaceFasterLeft, MAP_PETALBURG_CITY + waitmovement LOCALID_PETALBURG_WALLY, MAP_PETALBURG_CITY msgbox Route102_Text_LetsGoBack, MSGBOX_DEFAULT closemessage clearflag FLAG_HIDE_MAP_NAME_POPUP @@ -64,14 +58,14 @@ PetalburgCity_EventScript_WallyTutorial:: PetalburgCity_EventScript_WalkToWallyHouse:: lockall setflag FLAG_HIDE_MAP_NAME_POPUP - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Movement_WalkToWallyHouseWallysDad + applymovement LOCALID_PETALBURG_WALLYS_DAD, PetalburgCity_Movement_WalkToWallyHouseWallysDad applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WalkToWallyHousePlayer waitmovement 0 setvar VAR_0x8004, 7 setvar VAR_0x8005, 5 opendoor VAR_0x8004, VAR_0x8005 waitdooranim - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Movement_WalkInsideHouseWallysDad + applymovement LOCALID_PETALBURG_WALLYS_DAD, PetalburgCity_Movement_WalkInsideHouseWallysDad applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WalkInsideHousePlayer waitmovement 0 setflag FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD @@ -91,7 +85,7 @@ PetalburgCity_EventScript_Boy:: faceplayer msgbox PetalburgCity_Text_WaterReflection, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BOY, Common_Movement_FaceOriginalDirection + applymovement LOCALID_PETALBURG_BOY, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -504,57 +498,57 @@ PetalburgCity_Movement_PlayerWalkToGym3: PetalburgCity_EventScript_Scott0:: lockall - addobject LOCALID_SCOTT + addobject LOCALID_PETALBURG_SCOTT setvar VAR_0x8008, 0 - setobjectxy LOCALID_SCOTT, 13, 10 + setobjectxy LOCALID_PETALBURG_SCOTT, 13, 10 goto PetalburgCity_EventScript_Scott end PetalburgCity_EventScript_Scott1:: lockall - addobject LOCALID_SCOTT + addobject LOCALID_PETALBURG_SCOTT setvar VAR_0x8008, 1 - setobjectxy LOCALID_SCOTT, 13, 11 + setobjectxy LOCALID_PETALBURG_SCOTT, 13, 11 goto PetalburgCity_EventScript_Scott end PetalburgCity_EventScript_Scott2:: lockall - addobject LOCALID_SCOTT + addobject LOCALID_PETALBURG_SCOTT setvar VAR_0x8008, 2 - setobjectxy LOCALID_SCOTT, 13, 12 + setobjectxy LOCALID_PETALBURG_SCOTT, 13, 12 goto PetalburgCity_EventScript_Scott end PetalburgCity_EventScript_Scott3:: lockall - addobject LOCALID_SCOTT + addobject LOCALID_PETALBURG_SCOTT setvar VAR_0x8008, 3 - setobjectxy LOCALID_SCOTT, 13, 13 + setobjectxy LOCALID_PETALBURG_SCOTT, 13, 13 goto PetalburgCity_EventScript_Scott end PetalburgCity_EventScript_Scott:: - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottStartWalkLeft + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottStartWalkLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_SCOTT, Common_Movement_ExclamationMark + applymovement LOCALID_PETALBURG_SCOTT, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_SCOTT, Common_Movement_Delay48 + applymovement LOCALID_PETALBURG_SCOTT, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottApproachPlayer + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 setvar VAR_SCOTT_STATE, 1 msgbox PetalburgCity_Text_AreYouATrainer, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PETALBURG_SCOTT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 msgbox PetalburgCity_Text_WellMaybeNot, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PETALBURG_SCOTT, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 30 msgbox PetalburgCity_Text_ImLookingForTalentedTrainers, MSGBOX_DEFAULT @@ -564,31 +558,31 @@ PetalburgCity_EventScript_Scott:: call_if_eq VAR_0x8008, 2, PetalburgCity_EventScript_ScottExit2 call_if_eq VAR_0x8008, 3, PetalburgCity_EventScript_ScottExit3 setvar VAR_SCOTT_PETALBURG_ENCOUNTER, 1 - removeobject LOCALID_SCOTT + removeobject LOCALID_PETALBURG_SCOTT releaseall end PetalburgCity_EventScript_ScottExit0:: applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit0 - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottExit0 + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit0 waitmovement 0 return PetalburgCity_EventScript_ScottExit1:: applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit1 - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottExit1 + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit1 waitmovement 0 return PetalburgCity_EventScript_ScottExit2:: applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit2 - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottExit2 + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit2 waitmovement 0 return PetalburgCity_EventScript_ScottExit3:: applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit3 - applymovement LOCALID_SCOTT, PetalburgCity_Movement_ScottExit3 + applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit3 waitmovement 0 return diff --git a/data/maps/PetalburgCity_Gym/map.json b/data/maps/PetalburgCity_Gym/map.json index ef58491713..ecc3176b20 100644 --- a/data/maps/PetalburgCity_Gym/map.json +++ b/data/maps/PetalburgCity_Gym/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PETALBURG_GYM_NORMAN", "graphics_id": "OBJ_EVENT_GFX_NORMAN", "x": 4, "y": 2, @@ -132,6 +133,7 @@ "flag": "FLAG_HIDE_PETALBURG_GYM_GREETER" }, { + "local_id": "LOCALID_PETALBURG_GYM_WALLY", "graphics_id": "OBJ_EVENT_GFX_WALLY", "x": 4, "y": 111, @@ -145,6 +147,7 @@ "flag": "FLAG_HIDE_PETALBURG_GYM_WALLY" }, { + "local_id": "LOCALID_PETALBURG_GYM_WALLYS_DAD", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 1, "y": 7, diff --git a/data/maps/PetalburgCity_Gym/scripts.inc b/data/maps/PetalburgCity_Gym/scripts.inc index 8b107c68ec..9c0a8a5bf3 100644 --- a/data/maps/PetalburgCity_Gym/scripts.inc +++ b/data/maps/PetalburgCity_Gym/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_NORMAN, 1 -.set LOCALID_WALLY, 10 -.set LOCALID_WALLYS_DAD, 11 - PetalburgCity_Gym_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, PetalburgCity_Gym_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, PetalburgCity_Gym_OnTransition @@ -46,11 +42,11 @@ PetalburgCity_Gym_OnTransition: end PetalburgCity_Gym_EventScript_MoveWallyToEntrance:: - setobjectxyperm LOCALID_WALLY, 5, 108 + setobjectxyperm LOCALID_PETALBURG_GYM_WALLY, 5, 108 return PetalburgCity_Gym_EventScript_MoveNormanToEntrance:: - setobjectxyperm LOCALID_NORMAN, 4, 107 + setobjectxyperm LOCALID_PETALBURG_GYM_NORMAN, 4, 107 return PetalburgCity_Gym_EventScript_CheckNormanForRematch:: @@ -58,7 +54,7 @@ PetalburgCity_Gym_EventScript_CheckNormanForRematch:: specialvar VAR_RESULT, IsTrainerReadyForRematch goto_if_eq VAR_RESULT, TRUE, PetalburgCity_Gym_EventScript_DontMoveNormanToFront goto_if_eq VAR_PETALBURG_GYM_STATE, 8, PetalburgCity_Gym_EventScript_DontMoveNormanToFront - setobjectxyperm LOCALID_NORMAN, 4, 107 + setobjectxyperm LOCALID_PETALBURG_GYM_NORMAN, 4, 107 return PetalburgCity_Gym_EventScript_DontMoveNormanToFront:: @@ -83,10 +79,10 @@ PetalburgCity_Gym_EventScript_ReturnFromWallyTutorial:: msgbox PetalburgCity_Gym_Text_WallyThankYouBye, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyExitGym + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitGym waitmovement 0 playse SE_EXIT - removeobject LOCALID_WALLY + removeobject LOCALID_PETALBURG_GYM_WALLY setflag FLAG_HIDE_PETALBURG_CITY_WALLY delay 30 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp @@ -144,7 +140,7 @@ PetalburgCity_Gym_EventScript_BeginWallyTutorialEast:: end PetalburgCity_Gym_EventScript_BeginWallyTutorial:: - addobject LOCALID_WALLY + addobject LOCALID_PETALBURG_GYM_WALLY playse SE_DOOR call_if_eq VAR_0x8008, 0, PetalburgCity_Gym_EventScript_WallyArriveSouth call_if_eq VAR_0x8008, 1, PetalburgCity_Gym_EventScript_WallyArriveNorth @@ -182,7 +178,7 @@ PetalburgCity_Gym_EventScript_BeginWallyTutorial:: call_if_eq VAR_0x8008, 1, PetalburgCity_Gym_EventScript_ExitGymWithWallyNorth call_if_eq VAR_0x8008, 2, PetalburgCity_Gym_EventScript_ExitGymWithWallyWest call_if_eq VAR_0x8008, 3, PetalburgCity_Gym_EventScript_ExitGymWithWallyEast - removeobject LOCALID_WALLY + removeobject LOCALID_PETALBURG_GYM_WALLY setflag FLAG_HIDE_PETALBURG_CITY_WALLYS_MOM setvar VAR_PETALBURG_GYM_STATE, 1 setvar VAR_PETALBURG_CITY_STATE, 2 @@ -196,101 +192,101 @@ PetalburgCity_Gym_EventScript_BeginWallyTutorial:: end PetalburgCity_Gym_EventScript_WallyArriveSouth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyArrive + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyArrive waitmovement 0 return PetalburgCity_Gym_EventScript_WallyArriveNorth:: - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyArriveNorth + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyArriveNorth waitmovement 0 - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PetalburgCity_Gym_EventScript_WallyArriveWestEast:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyArrive + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyArrive waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallySouth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallySouth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyNorth:: - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyExitNorth + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitNorth applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyNorth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyWest:: - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyWest waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyEast:: - applymovement LOCALID_WALLY, PetalburgCity_Gym_Movement_WallyExitEast + applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitEast applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyEast waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerSouth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerNorth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerWest:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerEast:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterLeft applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressWallySouth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressWallyNorth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressWallyWest:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressWallyEast:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PetalburgCity_Gym_EventScript_WallyFacePlayer:: - applymovement LOCALID_WALLY, Common_Movement_FacePlayer + applymovement LOCALID_PETALBURG_GYM_WALLY, Common_Movement_FacePlayer waitmovement 0 return PetalburgCity_Gym_EventScript_WallyFaceDown:: - applymovement LOCALID_WALLY, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_WALLY, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -319,7 +315,7 @@ PetalburgCity_Gym_EventScript_NormanFaceDoorSouth:: @ For all other NormanFaceDoorX, Norman is already facing the door from NormanAddressWallyX PetalburgCity_Gym_EventScript_NormanFaceDoorNorth:: - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -397,7 +393,7 @@ PetalburgCity_Gym_EventScript_NormanBattle:: delay 40 playse SE_DOOR delay 10 - addobject LOCALID_WALLYS_DAD + addobject LOCALID_PETALBURG_GYM_WALLYS_DAD switch VAR_FACING case DIR_NORTH, PetalburgCity_Gym_EventScript_WallysDadArrivesNorth case DIR_WEST, PetalburgCity_Gym_EventScript_WallysDadArrivesWest @@ -424,12 +420,12 @@ PetalburgCity_Gym_EventScript_WallysDadArrivesWest:: goto PetalburgCity_Gym_EventScript_WallysDadArrives PetalburgCity_Gym_EventScript_WallysDadArrives:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadEnterGym + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadEnterGym waitmovement 0 playse SE_PIN - applymovement LOCALID_WALLYS_DAD, Common_Movement_ExclamationMark + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_WALLYS_DAD, Common_Movement_Delay48 + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, Common_Movement_Delay48 waitmovement 0 delay 10 call_if_eq VAR_0x8008, 1, PetalburgCity_Gym_EventScript_WallysDadApproachPlayerNorth @@ -448,7 +444,7 @@ PetalburgCity_Gym_EventScript_WallysDadArrives:: call_if_eq VAR_0x8008, 1, PetalburgCity_Gym_EventScript_ExitGymWithWallysDadNorth call_if_eq VAR_0x8008, 2, PetalburgCity_Gym_EventScript_ExitGymWithWallysDadEast call_if_eq VAR_0x8008, 3, PetalburgCity_Gym_EventScript_ExitGymWithWallysDadWest - removeobject LOCALID_WALLYS_DAD + removeobject LOCALID_PETALBURG_GYM_WALLYS_DAD setvar VAR_PETALBURG_CITY_STATE, 4 clearflag FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD warp MAP_PETALBURG_CITY, 15, 8 @@ -457,59 +453,59 @@ PetalburgCity_Gym_EventScript_WallysDadArrives:: end PetalburgCity_Gym_EventScript_WallysDadFaceNormanNorth:: - applymovement LOCALID_WALLYS_DAD, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_Gym_EventScript_WallysDadFaceNormanEast:: - applymovement LOCALID_WALLYS_DAD, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PetalburgCity_Gym_EventScript_WallysDadFaceNormanWest:: - applymovement LOCALID_WALLYS_DAD, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PetalburgCity_Gym_EventScript_WallysDadApproachPlayerNorth:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerNorth + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PetalburgCity_Gym_EventScript_WallysDadApproachPlayerEast:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerEast + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PetalburgCity_Gym_EventScript_WallysDadApproachPlayerWest:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerWest + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerWest waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallysDadNorth:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitNorth - applymovement LOCALID_NORMAN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitNorth + applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadNorth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallysDadEast:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitEast + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitEast applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadEast waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallysDadWest:: - applymovement LOCALID_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitWest + applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitWest applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadWest waitmovement 0 return diff --git a/data/maps/PetalburgCity_PokemonCenter_1F/map.json b/data/maps/PetalburgCity_PokemonCenter_1F/map.json index 12b7810df9..ae19e848b3 100644 --- a/data/maps/PetalburgCity_PokemonCenter_1F/map.json +++ b/data/maps/PetalburgCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PETALBURG_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/PetalburgCity_PokemonCenter_1F/scripts.inc b/data/maps/PetalburgCity_PokemonCenter_1F/scripts.inc index 3dadd3184b..032007dcfc 100644 --- a/data/maps/PetalburgCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/PetalburgCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - PetalburgCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, PetalburgCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ PetalburgCity_PokemonCenter_1F_OnTransition: end PetalburgCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_PETALBURG_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/PetalburgCity_WallysHouse/map.json b/data/maps/PetalburgCity_WallysHouse/map.json index f2fd03e7ff..8fb48df1ba 100644 --- a/data/maps/PetalburgCity_WallysHouse/map.json +++ b/data/maps/PetalburgCity_WallysHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_WALLYS_HOUSE_WALLYS_DAD", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_M", "x": 3, "y": 4, diff --git a/data/maps/PetalburgCity_WallysHouse/scripts.inc b/data/maps/PetalburgCity_WallysHouse/scripts.inc index f7e2e97828..21b2247bbd 100644 --- a/data/maps/PetalburgCity_WallysHouse/scripts.inc +++ b/data/maps/PetalburgCity_WallysHouse/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALLYS_DAD, 1 - PetalburgCity_WallysHouse_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, PetalburgCity_WallysHouse_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, PetalburgCity_WallysHouse_OnWarp @@ -11,7 +9,7 @@ PetalburgCity_WallysHouse_OnWarp: PetalburgCity_WallysHouse_EventScript_PlayerWallysDadFaceEachOther:: turnobject OBJ_EVENT_ID_PLAYER, DIR_EAST - turnobject LOCALID_WALLYS_DAD, DIR_WEST + turnobject LOCALID_WALLYS_HOUSE_WALLYS_DAD, DIR_WEST end PetalburgCity_WallysHouse_OnFrame: diff --git a/data/maps/PetalburgWoods/map.json b/data/maps/PetalburgWoods/map.json index 2979e7e469..5b6fa65fa7 100644 --- a/data/maps/PetalburgWoods/map.json +++ b/data/maps/PetalburgWoods/map.json @@ -41,6 +41,7 @@ "flag": "FLAG_TEMP_12" }, { + "local_id": "LOCALID_PETALBURG_WOODS_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 26, "y": 17, @@ -54,6 +55,7 @@ "flag": "FLAG_HIDE_PETALBURG_WOODS_AQUA_GRUNT" }, { + "local_id": "LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE", "graphics_id": "OBJ_EVENT_GFX_MAN_2", "x": 26, "y": 20, diff --git a/data/maps/PetalburgWoods/scripts.inc b/data/maps/PetalburgWoods/scripts.inc index 94bd390148..85a90c73dc 100644 --- a/data/maps/PetalburgWoods/scripts.inc +++ b/data/maps/PetalburgWoods/scripts.inc @@ -1,40 +1,37 @@ -.set LOCALID_GRUNT, 3 -.set LOCALID_DEVON_EMPLOYEE, 4 - PetalburgWoods_MapScripts:: .byte 0 PetalburgWoods_EventScript_DevonResearcherLeft:: lockall call PetalburgWoods_EventScript_DevonResearcherIntro - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherApproachPlayerLeft + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherApproachPlayerLeft waitmovement 0 msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_AQUA, FALSE - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaEntrance waitmovement 0 msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaApproachResearcherLeft + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaApproachResearcherLeft waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PetalburgWoods_Text_HandOverThosePapers, MSGBOX_DEFAULT closemessage - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherFleeToPlayerLeft + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherFleeToPlayerLeft waitmovement 0 msgbox PetalburgWoods_Text_YouHaveToHelpMe, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaApproachPlayer + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaApproachPlayer waitmovement 0 msgbox PetalburgWoods_Text_NoOneCrossesTeamAqua, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_PETALBURG_WOODS, PetalburgWoods_Text_YoureKiddingMe - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaBackOff + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaBackOff waitmovement 0 call PetalburgWoods_EventScript_DevonResearcherPostBattle applymovement OBJ_EVENT_ID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitLeft + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitLeft waitmovement 0 goto PetalburgWoods_EventScript_RemoveDevonResearcher end @@ -42,41 +39,41 @@ PetalburgWoods_EventScript_DevonResearcherLeft:: PetalburgWoods_EventScript_DevonResearcherRight:: lockall call PetalburgWoods_EventScript_DevonResearcherIntro - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherApproachPlayerRight + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherApproachPlayerRight waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_AQUA, FALSE - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaEntrance + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaEntrance waitmovement 0 msgbox PetalburgWoods_Text_IWasGoingToAmbushYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaApproachResearcherRight + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaApproachResearcherRight waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PetalburgWoods_Text_HandOverThosePapers, MSGBOX_DEFAULT closemessage - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherFleeToPlayerRight + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherFleeToPlayerRight waitmovement 0 msgbox PetalburgWoods_Text_YouHaveToHelpMe, MSGBOX_DEFAULT applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PetalburgWoods_Text_NoOneCrossesTeamAqua, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_PETALBURG_WOODS, PetalburgWoods_Text_YoureKiddingMe - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaBackOff + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaBackOff waitmovement 0 call PetalburgWoods_EventScript_DevonResearcherPostBattle applymovement OBJ_EVENT_ID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitRight + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitRight waitmovement 0 goto PetalburgWoods_EventScript_RemoveDevonResearcher end PetalburgWoods_EventScript_DevonResearcherIntro:: - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherLookAround + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherLookAround waitmovement 0 msgbox PetalburgWoods_Text_NotAOneToBeFound, MSGBOX_DEFAULT closemessage @@ -85,9 +82,9 @@ PetalburgWoods_EventScript_DevonResearcherIntro:: PetalburgWoods_EventScript_DevonResearcherPostBattle:: msgbox PetalburgWoods_Text_YouveGotSomeNerve, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, PetalburgWoods_Movement_AquaRunAway + applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaRunAway waitmovement 0 - removeobject LOCALID_GRUNT + removeobject LOCALID_PETALBURG_WOODS_GRUNT applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox PetalburgWoods_Text_ThatWasAwfullyClose, MSGBOX_DEFAULT @@ -103,14 +100,14 @@ PetalburgWoods_EventScript_BagFull:: PetalburgWoods_EventScript_DevonResearcherFinish:: msgbox PetalburgWoods_Text_TeamAquaAfterSomethingInRustboro, MSGBOX_DEFAULT - applymovement LOCALID_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherStartExit + applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherStartExit waitmovement 0 msgbox PetalburgWoods_Text_ICantBeWastingTime, MSGBOX_DEFAULT closemessage return PetalburgWoods_EventScript_RemoveDevonResearcher:: - removeobject LOCALID_DEVON_EMPLOYEE + removeobject LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE setvar VAR_PETALBURG_WOODS_STATE, 1 releaseall end diff --git a/data/maps/Route101/map.json b/data/maps/Route101/map.json index 1abb23030b..d24d997151 100644 --- a/data/maps/Route101/map.json +++ b/data/maps/Route101/map.json @@ -39,6 +39,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE101_BIRCH", "graphics_id": "OBJ_EVENT_GFX_PROF_BIRCH", "x": 9, "y": 13, @@ -65,6 +66,7 @@ "flag": "FLAG_HIDE_ROUTE_101_BIRCH_STARTERS_BAG" }, { + "local_id": "LOCALID_ROUTE101_ZIGZAGOON", "graphics_id": "OBJ_EVENT_GFX_ZIGZAGOON_1", "x": 10, "y": 13, diff --git a/data/maps/Route101/scripts.inc b/data/maps/Route101/scripts.inc index dd0ef5dcec..6b926c9ee4 100644 --- a/data/maps/Route101/scripts.inc +++ b/data/maps/Route101/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_BIRCH, 2 -.set LOCALID_ZIGZAGOON, 4 - Route101_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route101_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, Route101_OnFrame @@ -24,19 +21,19 @@ Route101_EventScript_StartBirchRescue:: playbgm MUS_HELP, TRUE msgbox Route101_Text_HelpMe, MSGBOX_DEFAULT closemessage - setobjectxy LOCALID_BIRCH, 0, 15 - setobjectxy LOCALID_ZIGZAGOON, 0, 16 + setobjectxy LOCALID_ROUTE101_BIRCH, 0, 15 + setobjectxy LOCALID_ROUTE101_ZIGZAGOON, 0, 16 applymovement OBJ_EVENT_ID_PLAYER, Route101_Movement_EnterScene - applymovement LOCALID_BIRCH, Route101_Movement_BirchRunAway1 - applymovement LOCALID_ZIGZAGOON, Route101_Movement_ZigzagoonChase1 + applymovement LOCALID_ROUTE101_BIRCH, Route101_Movement_BirchRunAway1 + applymovement LOCALID_ROUTE101_ZIGZAGOON, Route101_Movement_ZigzagoonChase1 waitmovement 0 - applymovement LOCALID_ZIGZAGOON, Route101_Movement_ZigzagoonChaseInCircles - applymovement LOCALID_BIRCH, Route101_Movement_BirchRunInCircles + applymovement LOCALID_ROUTE101_ZIGZAGOON, Route101_Movement_ZigzagoonChaseInCircles + applymovement LOCALID_ROUTE101_BIRCH, Route101_Movement_BirchRunInCircles waitmovement 0 - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_ROUTE101_BIRCH, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement LOCALID_ZIGZAGOON, Route101_Movement_ZigzagoonFaceBirch - applymovement LOCALID_BIRCH, Route101_Movement_BirchFaceZigzagoon + applymovement LOCALID_ROUTE101_ZIGZAGOON, Route101_Movement_ZigzagoonFaceBirch + applymovement LOCALID_ROUTE101_BIRCH, Route101_Movement_BirchFaceZigzagoon waitmovement 0 msgbox Route101_Text_PleaseHelp, MSGBOX_DEFAULT closemessage @@ -224,13 +221,13 @@ Route101_EventScript_BirchsBag:: setflag FLAG_SYS_POKEMON_GET setflag FLAG_RESCUED_BIRCH fadescreen FADE_TO_BLACK - removeobject LOCALID_ZIGZAGOON + removeobject LOCALID_ROUTE101_ZIGZAGOON setobjectxy OBJ_EVENT_ID_PLAYER, 6, 13 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 special ChooseStarter waitstate - applymovement LOCALID_BIRCH, Route101_Movement_BirchApproachPlayer + applymovement LOCALID_ROUTE101_BIRCH, Route101_Movement_BirchApproachPlayer waitmovement 0 msgbox Route101_Text_YouSavedMe, MSGBOX_DEFAULT special HealPlayerParty diff --git a/data/maps/Route104/map.json b/data/maps/Route104/map.json index 80af8aa6d8..4a4679acd3 100644 --- a/data/maps/Route104/map.json +++ b/data/maps/Route104/map.json @@ -109,6 +109,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE104_BOAT", "graphics_id": "OBJ_EVENT_GFX_MR_BRINEYS_BOAT", "x": 12, "y": 54, @@ -122,6 +123,7 @@ "flag": "FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT" }, { + "local_id": "LOCALID_ROUTE104_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 12, "y": 51, @@ -460,6 +462,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE104_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 17, "y": 50, diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc index dfb7675e90..b5ac270100 100644 --- a/data/maps/Route104/scripts.inc +++ b/data/maps/Route104/scripts.inc @@ -1,7 +1,3 @@ -@ NOTE: Route 104's sail to Dewford script references local IDs from Dewford's map. -@ These are labeled in DewfordTown/scripts.inc -.set LOCALID_RIVAL, 34 - Route104_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, Route104_OnFrame map_script MAP_SCRIPT_ON_TRANSITION, Route104_OnTransition @@ -36,7 +32,7 @@ Route104_EventScript_TrySetRivalPos:: goto_if_ge VAR_BOARD_BRINEY_BOAT_STATE, 1, Route104_EventScript_DontSetRivalPos goto_if_set FLAG_MET_RIVAL_RUSTBORO, Route104_EventScript_DontSetRivalPos goto_if_unset FLAG_REGISTER_RIVAL_POKENAV, Route104_EventScript_DontSetRivalPos - setobjectxyperm LOCALID_RIVAL, 17, 52 + setobjectxyperm LOCALID_ROUTE104_RIVAL, 17, 52 return Route104_EventScript_DontSetRivalPos:: @@ -45,7 +41,7 @@ Route104_EventScript_DontSetRivalPos:: Route104_EventScript_Rival:: lockall setvar VAR_0x8008, 1 - applymovement LOCALID_RIVAL, Common_Movement_FacePlayer + applymovement LOCALID_ROUTE104_RIVAL, Common_Movement_FacePlayer waitmovement 0 goto Route104_EventScript_RivalEncounter @@ -57,19 +53,19 @@ Route104_EventScript_RivalTrigger:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 10 - addobject LOCALID_RIVAL + addobject LOCALID_ROUTE104_RIVAL clearflag FLAG_HIDE_ROUTE_104_RIVAL applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerBackUp waitmovement 0 - applymovement LOCALID_RIVAL, Route104_Movement_RivalExitBrineysCottage + applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalExitBrineysCottage waitmovement 0 delay 20 setvar VAR_0x8008, 0 call RustboroCity_EventScript_PlayRivalMusic playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_ROUTE104_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_ROUTE104_RIVAL, Common_Movement_Delay48 waitmovement 0 goto Route104_EventScript_RivalEncounter @@ -108,13 +104,13 @@ Route104_EventScript_MayEncounter:: delay 30 setflag FLAG_ENABLE_RIVAL_MATCH_CALL applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerFaceRival - applymovement LOCALID_RIVAL, Route104_Movement_RivalWalkSlowLeft + applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalWalkSlowLeft msgbox Route104_Text_MayHowsYourPokedex, MSGBOX_DEFAULT closemessage waitmovement 0 - applymovement LOCALID_RIVAL, Route104_Movement_RivalApproachPlayer + applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalApproachPlayer waitmovement 0 - copyobjectxytoperm LOCALID_RIVAL + copyobjectxytoperm LOCALID_ROUTE104_RIVAL msgbox Route104_Text_MayMinesDecentLetsBattle, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, Route104_EventScript_BattleMay msgbox Route104_Text_MayHaventRaisedPokemon, MSGBOX_DEFAULT @@ -194,13 +190,13 @@ Route104_EventScript_BrendanEncounter:: delay 30 setflag FLAG_ENABLE_RIVAL_MATCH_CALL applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerFaceRival - applymovement LOCALID_RIVAL, Route104_Movement_RivalWalkSlowLeft + applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalWalkSlowLeft msgbox Route104_Text_BrendanHowsYourPokedex, MSGBOX_DEFAULT closemessage waitmovement 0 - applymovement LOCALID_RIVAL, Route104_Movement_RivalApproachPlayer + applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalApproachPlayer waitmovement 0 - copyobjectxytoperm LOCALID_RIVAL + copyobjectxytoperm LOCALID_ROUTE104_RIVAL msgbox Route104_Text_BrendanDoingGreatLetsBattle, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, Route104_EventScript_BattleBrendan msgbox Route104_Text_BrendanNoConfidence, MSGBOX_DEFAULT @@ -347,11 +343,11 @@ Route104_EventScript_Girl2:: end Route104_EventScript_SailToDewford:: - setobjectsubpriority LOCALID_BRINEY_R104, MAP_ROUTE104, 0 + setobjectsubpriority LOCALID_ROUTE104_BRINEY, MAP_ROUTE104, 0 setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE104, 0 - applymovement LOCALID_BRINEY_R104, Route104_Movement_BrineyBoardBoat + applymovement LOCALID_ROUTE104_BRINEY, Route104_Movement_BrineyBoardBoat waitmovement 0 - removeobject LOCALID_BRINEY_R104 + removeobject LOCALID_ROUTE104_BRINEY applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerBoardBoat waitmovement 0 hideobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 @@ -361,13 +357,13 @@ Route104_EventScript_SailToDewford:: end Route104_EventScript_SailToDewfordNoCall:: - applymovement LOCALID_BOAT_R104, Route104_Movement_SailToDewford + applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewford applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewford waitmovement 0 goto Route104_EventScript_ArriveInDewford Route104_EventScript_SailToDewfordDadCalls:: - applymovement LOCALID_BOAT_R104, Route104_Movement_SailToDewfordBeforeDadCalls + applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewfordBeforeDadCalls applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewfordBeforeDadCalls waitmovement 0 pokenavcall Route104_Text_DadPokenavCall @@ -380,8 +376,8 @@ Route104_EventScript_SailToDewfordDadCalls:: delay 30 setflag FLAG_ENABLE_NORMAN_MATCH_CALL applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewfordAfterDadCalls - applymovement LOCALID_BOAT_R104, Route104_Movement_SailToDewfordAfterDadCalls, MAP_ROUTE104 - waitmovement LOCALID_BOAT_R104, MAP_ROUTE104 + applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewfordAfterDadCalls, MAP_ROUTE104 + waitmovement LOCALID_ROUTE104_BOAT, MAP_ROUTE104 waitmovement 0 goto Route104_EventScript_ArriveInDewford @@ -393,21 +389,21 @@ Route104_EventScript_ArriveInDewford:: showobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerMoveForBriney waitmovement 0 - setobjectxyperm LOCALID_BRINEY_DEWFORD, 12, 8 - addobject LOCALID_BRINEY_DEWFORD - setobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN, 0 + setobjectxyperm LOCALID_DEWFORD_BRINEY, 12, 8 + addobject LOCALID_DEWFORD_BRINEY + setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 clearflag FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN - applymovement LOCALID_BRINEY_DEWFORD, Route104_Movement_BrineyExitBoat + applymovement LOCALID_DEWFORD_BRINEY, Route104_Movement_BrineyExitBoat waitmovement 0 - addobject LOCALID_BOAT_DEWFORD + addobject LOCALID_DEWFORD_BOAT clearflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN call Common_EventScript_StopBrineysBoatMusic setflag FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT - hideobjectat LOCALID_BOAT_R104, MAP_ROUTE104 + hideobjectat LOCALID_ROUTE104_BOAT, MAP_ROUTE104 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 - resetobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN - copyobjectxytoperm LOCALID_BRINEY_DEWFORD + resetobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN + copyobjectxytoperm LOCALID_DEWFORD_BRINEY setvar VAR_BOARD_BRINEY_BOAT_STATE, 0 goto_if_unset FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_DeliverLetterReminder goto_if_set FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_LandedInDewford diff --git a/data/maps/Route104_MrBrineysHouse/map.json b/data/maps/Route104_MrBrineysHouse/map.json index 6424965291..91420bd746 100644 --- a/data/maps/Route104_MrBrineysHouse/map.json +++ b/data/maps/Route104_MrBrineysHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_BRINEYS_HOUSE_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 5, "y": 3, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY" }, { + "local_id": "LOCALID_BRINEYS_HOUSE_PEEKO", "graphics_id": "OBJ_EVENT_GFX_WINGULL", "x": 6, "y": 3, diff --git a/data/maps/Route104_MrBrineysHouse/scripts.inc b/data/maps/Route104_MrBrineysHouse/scripts.inc index 4c693cb4fa..bce0895919 100644 --- a/data/maps/Route104_MrBrineysHouse/scripts.inc +++ b/data/maps/Route104_MrBrineysHouse/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_BRINEY, 1 -.set LOCALID_PEEKO, 2 - Route104_MrBrineysHouse_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route104_MrBrineysHouse_OnTransition .byte 0 @@ -16,10 +13,10 @@ Route104_MrBrineysHouse_EventScript_HideRustboroRival:: return Route104_MrBrineysHouse_EventScript_SetBrineyPeekoPos:: - setobjectxyperm LOCALID_BRINEY, 9, 3 - setobjectmovementtype LOCALID_BRINEY, MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT - setobjectxyperm LOCALID_PEEKO, 9, 6 - setobjectmovementtype LOCALID_PEEKO, MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN + setobjectxyperm LOCALID_BRINEYS_HOUSE_BRINEY, 9, 3 + setobjectmovementtype LOCALID_BRINEYS_HOUSE_BRINEY, MOVEMENT_TYPE_WALK_SEQUENCE_DOWN_LEFT_UP_RIGHT + setobjectxyperm LOCALID_BRINEYS_HOUSE_PEEKO, 9, 6 + setobjectmovementtype LOCALID_BRINEYS_HOUSE_PEEKO, MOVEMENT_TYPE_WALK_SEQUENCE_LEFT_UP_RIGHT_DOWN return Route104_MrBrineysHouse_EventScript_Briney:: diff --git a/data/maps/Route104_PrettyPetalFlowerShop/map.json b/data/maps/Route104_PrettyPetalFlowerShop/map.json index 27e18ddc71..9f81453c60 100644 --- a/data/maps/Route104_PrettyPetalFlowerShop/map.json +++ b/data/maps/Route104_PrettyPetalFlowerShop/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FLOWER_SHOP_OWNER", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 0, "y": 3, diff --git a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc index 5f0ec28fa5..08d52a0a73 100644 --- a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc +++ b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_OWNER, 1 - Route104_PrettyPetalFlowerShop_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route104_PrettyPetalFlowerShop_OnTransition .byte 0 @@ -12,7 +10,7 @@ Route104_PrettyPetalFlowerShop_OnTransition: end Route104_PrettyPetalFlowerShop_EventScript_MoveShopOwner:: - setobjectxyperm LOCALID_OWNER, 4, 6 + setobjectxyperm LOCALID_FLOWER_SHOP_OWNER, 4, 6 end Route104_PrettyPetalFlowerShop_EventScript_ShopOwner:: diff --git a/data/maps/Route109/map.json b/data/maps/Route109/map.json index 49357f0a0e..be5fa5a6b2 100644 --- a/data/maps/Route109/map.json +++ b/data/maps/Route109/map.json @@ -26,6 +26,7 @@ ], "object_events": [ { + "local_id": "LOCALID_ROUTE109_BOAT", "graphics_id": "OBJ_EVENT_GFX_MR_BRINEYS_BOAT", "x": 21, "y": 26, @@ -39,6 +40,7 @@ "flag": "FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT" }, { + "local_id": "LOCALID_ROUTE109_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 21, "y": 24, diff --git a/data/maps/Route109/scripts.inc b/data/maps/Route109/scripts.inc index f0353fef4d..a7b4f65d48 100644 --- a/data/maps/Route109/scripts.inc +++ b/data/maps/Route109/scripts.inc @@ -6,11 +6,11 @@ Route109_MapScripts:: Route109_EventScript_StartDepartForDewford:: call EventScript_BackupMrBrineyLocation - setobjectsubpriority LOCALID_BRINEY_R109, MAP_ROUTE109, 0 + setobjectsubpriority LOCALID_ROUTE109_BRINEY, MAP_ROUTE109, 0 setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE109, 0 - applymovement LOCALID_BRINEY_R109, Route109_Movement_BrineyEnterBoat + applymovement LOCALID_ROUTE109_BRINEY, Route109_Movement_BrineyEnterBoat waitmovement 0 - removeobject LOCALID_BRINEY_R109 + removeobject LOCALID_ROUTE109_BRINEY switch VAR_FACING case DIR_SOUTH, Route109_EventScript_EnterBoatSouth case DIR_WEST, Route109_EventScript_EnterBoatWest @@ -38,7 +38,7 @@ Route109_EventScript_EnterBoatWest:: Route109_EventScript_DoSailToDewford:: hideobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 call Common_EventScript_PlayBrineysBoatMusic - applymovement LOCALID_BOAT_R109, Route109_Movement_SailToDewford + applymovement LOCALID_ROUTE109_BOAT, Route109_Movement_SailToDewford applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_SailToDewford waitmovement 0 delay 50 @@ -46,22 +46,22 @@ Route109_EventScript_DoSailToDewford:: showobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_PlayerExitBoat waitmovement 0 - addobject LOCALID_BOAT_DEWFORD + addobject LOCALID_DEWFORD_BOAT clearflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN - setobjectxyperm LOCALID_BRINEY_DEWFORD, 12, 8 - addobject LOCALID_BRINEY_DEWFORD - setobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN, 0 - applymovement LOCALID_BRINEY_DEWFORD, Route109_Movement_BrineyExitBoat + setobjectxyperm LOCALID_DEWFORD_BRINEY, 12, 8 + addobject LOCALID_DEWFORD_BRINEY + setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 + applymovement LOCALID_DEWFORD_BRINEY, Route109_Movement_BrineyExitBoat waitmovement 0 clearflag FLAG_HIDE_MR_BRINEY_DEWFORD_TOWN setflag FLAG_HIDE_ROUTE_109_MR_BRINEY_BOAT - hideobjectat LOCALID_BOAT_R109, MAP_ROUTE109 + hideobjectat LOCALID_ROUTE109_BOAT, MAP_ROUTE109 msgbox DewfordTown_Text_BrineyLandedInDewford, MSGBOX_DEFAULT closemessage copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 - resetobjectsubpriority LOCALID_BRINEY_DEWFORD, MAP_DEWFORD_TOWN - copyobjectxytoperm LOCALID_BRINEY_DEWFORD + resetobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN + copyobjectxytoperm LOCALID_DEWFORD_BRINEY release end diff --git a/data/maps/Route110/map.json b/data/maps/Route110/map.json index 6e4982fa22..989229f8c9 100644 --- a/data/maps/Route110/map.json +++ b/data/maps/Route110/map.json @@ -291,6 +291,7 @@ "flag": "FLAG_ITEM_ROUTE_110_RARE_CANDY" }, { + "local_id": "LOCALID_CHALLENGE_BIKER", "graphics_id": "OBJ_EVENT_GFX_CYCLING_TRIATHLETE_M", "x": 27, "y": 92, @@ -382,6 +383,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE110_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 34, "y": 54, @@ -395,6 +397,7 @@ "flag": "FLAG_HIDE_ROUTE_110_RIVAL" }, { + "local_id": "LOCALID_ROUTE110_RIVAL_ON_BIKE", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 34, "y": 54, @@ -486,6 +489,7 @@ "flag": "FLAG_ITEM_ROUTE_110_ELIXIR" }, { + "local_id": "LOCALID_ROUTE110_BIRCH", "graphics_id": "OBJ_EVENT_GFX_PROF_BIRCH", "x": 9, "y": 79, diff --git a/data/maps/Route110/scripts.inc b/data/maps/Route110/scripts.inc index 7d16c8b10c..984595a82c 100644 --- a/data/maps/Route110/scripts.inc +++ b/data/maps/Route110/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_CHALLENGE_BIKER, 21 -.set LOCALID_RIVAL, 28 -.set LOCALID_RIVAL_ON_BIKE, 29 -.set LOCALID_BIRCH, 36 - Route110_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, Route110_OnResume map_script MAP_SCRIPT_ON_TRANSITION, Route110_OnTransition @@ -378,11 +373,11 @@ Route110_EventScript_RivalScene:: checkplayergender call_if_eq VAR_RESULT, MALE, Route110_EventScript_PlayMayMusic call_if_eq VAR_RESULT, FEMALE, Route110_EventScript_PlayBrendanMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE110_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_ROUTE110_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_ROUTE110_RIVAL, Common_Movement_Delay48 waitmovement 0 delay 30 call_if_eq VAR_0x8008, 1, Route110_EventScript_RivalApproachPlayer1 @@ -471,15 +466,15 @@ Route110_EventScript_RivalExit:: call_if_eq VAR_0x8008, 1, Route110_EventScript_MoveRival1 call_if_eq VAR_0x8008, 2, Route110_EventScript_MoveRival2 call_if_eq VAR_0x8008, 3, Route110_EventScript_MoveRival3 - setobjectmovementtype LOCALID_RIVAL, MOVEMENT_TYPE_FACE_RIGHT - setobjectmovementtype LOCALID_RIVAL_ON_BIKE, MOVEMENT_TYPE_FACE_RIGHT - removeobject LOCALID_RIVAL - addobject LOCALID_RIVAL_ON_BIKE + setobjectmovementtype LOCALID_ROUTE110_RIVAL, MOVEMENT_TYPE_FACE_RIGHT + setobjectmovementtype LOCALID_ROUTE110_RIVAL_ON_BIKE, MOVEMENT_TYPE_FACE_RIGHT + removeobject LOCALID_ROUTE110_RIVAL + addobject LOCALID_ROUTE110_RIVAL_ON_BIKE delay 45 call_if_eq VAR_0x8008, 1, Route110_EventScript_RivalExit1 call_if_eq VAR_0x8008, 2, Route110_EventScript_RivalExit2 call_if_eq VAR_0x8008, 3, Route110_EventScript_RivalExit3 - removeobject LOCALID_RIVAL_ON_BIKE + removeobject LOCALID_ROUTE110_RIVAL_ON_BIKE setvar VAR_ROUTE110_STATE, 1 savebgm MUS_DUMMY fadedefaultbgm @@ -487,45 +482,45 @@ Route110_EventScript_RivalExit:: end Route110_EventScript_RivalApproachPlayer1:: - applymovement LOCALID_RIVAL, Route110_Movement_RivalApproachPlayer1 + applymovement LOCALID_ROUTE110_RIVAL, Route110_Movement_RivalApproachPlayer1 waitmovement 0 return Route110_EventScript_RivalApproachPlayer2:: - applymovement LOCALID_RIVAL, Route110_Movement_RivalApproachPlayer2 + applymovement LOCALID_ROUTE110_RIVAL, Route110_Movement_RivalApproachPlayer2 waitmovement 0 return Route110_EventScript_RivalApproachPlayer3:: - applymovement LOCALID_RIVAL, Route110_Movement_RivalApproachPlayer3 + applymovement LOCALID_ROUTE110_RIVAL, Route110_Movement_RivalApproachPlayer3 waitmovement 0 return Route110_EventScript_RivalExit1:: - applymovement LOCALID_RIVAL_ON_BIKE, Route110_Movement_RivalExit1 + applymovement LOCALID_ROUTE110_RIVAL_ON_BIKE, Route110_Movement_RivalExit1 waitmovement 0 return Route110_EventScript_RivalExit2:: - applymovement LOCALID_RIVAL_ON_BIKE, Route110_Movement_RivalExit2 + applymovement LOCALID_ROUTE110_RIVAL_ON_BIKE, Route110_Movement_RivalExit2 waitmovement 0 return Route110_EventScript_RivalExit3:: - applymovement LOCALID_RIVAL_ON_BIKE, Route110_Movement_RivalExit3 + applymovement LOCALID_ROUTE110_RIVAL_ON_BIKE, Route110_Movement_RivalExit3 waitmovement 0 return Route110_EventScript_MoveRival1:: - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 33, 55 + setobjectxyperm LOCALID_ROUTE110_RIVAL_ON_BIKE, 33, 55 return Route110_EventScript_MoveRival2:: - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 34, 55 + setobjectxyperm LOCALID_ROUTE110_RIVAL_ON_BIKE, 34, 55 return Route110_EventScript_MoveRival3:: - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 35, 55 + setobjectxyperm LOCALID_ROUTE110_RIVAL_ON_BIKE, 35, 55 return Route110_Movement_RivalApproachPlayer1: @@ -596,13 +591,13 @@ Route110_EventScript_BirchScene4:: goto Route110_EventScript_BirchScene Route110_EventScript_BirchScene:: - addobject LOCALID_BIRCH - applymovement LOCALID_BIRCH, Route110_Movement_BirchEntrance + addobject LOCALID_ROUTE110_BIRCH + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchEntrance waitmovement 0 playse SE_PIN - applymovement LOCALID_BIRCH, Common_Movement_ExclamationMark + applymovement LOCALID_ROUTE110_BIRCH, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_BIRCH, Common_Movement_Delay48 + applymovement LOCALID_ROUTE110_BIRCH, Common_Movement_Delay48 waitmovement 0 call_if_eq VAR_0x8008, 1, Route110_EventScript_BirchApproachPlayer1 call_if_eq VAR_0x8008, 2, Route110_EventScript_BirchApproachPlayer2 @@ -611,13 +606,13 @@ Route110_EventScript_BirchScene:: msgbox Route110_Text_ImagineSeeingYouHere, MSGBOX_DEFAULT closemessage delay 20 - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_ROUTE110_BIRCH, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 10 - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_ROUTE110_BIRCH, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 20 - applymovement LOCALID_BIRCH, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE110_BIRCH, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 msgbox Route110_Text_HeardYouInstallMatchCall, MSGBOX_DEFAULT @@ -635,48 +630,48 @@ Route110_EventScript_BirchScene:: call_if_eq VAR_0x8008, 2, Route110_EventScript_BirchExit2 call_if_eq VAR_0x8008, 3, Route110_EventScript_BirchExit3 call_if_eq VAR_0x8008, 4, Route110_EventScript_BirchExit4 - removeobject LOCALID_BIRCH + removeobject LOCALID_ROUTE110_BIRCH setvar VAR_REGISTER_BIRCH_STATE, 2 releaseall end Route110_EventScript_BirchApproachPlayer1:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchApproachPlayer1 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchApproachPlayer1 waitmovement 0 return Route110_EventScript_BirchApproachPlayer2:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchApproachPlayer2 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchApproachPlayer2 waitmovement 0 return Route110_EventScript_BirchApproachPlayer3:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchApproachPlayer3 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchApproachPlayer3 waitmovement 0 return Route110_EventScript_BirchApproachPlayer4:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchApproachPlayer4 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchApproachPlayer4 waitmovement 0 return Route110_EventScript_BirchExit1:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchExit1 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchExit1 waitmovement 0 return Route110_EventScript_BirchExit2:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchExit2 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchExit2 waitmovement 0 return Route110_EventScript_BirchExit3:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchExit3 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchExit3 waitmovement 0 return Route110_EventScript_BirchExit4:: - applymovement LOCALID_BIRCH, Route110_Movement_BirchExit4 + applymovement LOCALID_ROUTE110_BIRCH, Route110_Movement_BirchExit4 waitmovement 0 return diff --git a/data/maps/Route110_TrickHousePuzzle5/map.json b/data/maps/Route110_TrickHousePuzzle5/map.json index 3775505235..e094688bbf 100644 --- a/data/maps/Route110_TrickHousePuzzle5/map.json +++ b/data/maps/Route110_TrickHousePuzzle5/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MECHADOLL_1", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 6, "y": 17, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MECHADOLL_2", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 0, "y": 7, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MECHADOLL_3", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 14, "y": 10, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MECHADOLL_4", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 14, "y": 19, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_MECHADOLL_5", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 10, "y": 4, diff --git a/data/maps/Route110_TrickHousePuzzle5/scripts.inc b/data/maps/Route110_TrickHousePuzzle5/scripts.inc index e0fa432bd2..c59dad2e57 100644 --- a/data/maps/Route110_TrickHousePuzzle5/scripts.inc +++ b/data/maps/Route110_TrickHousePuzzle5/scripts.inc @@ -1,9 +1,3 @@ -.set LOCALID_MECHADOLL_1, 1 -.set LOCALID_MECHADOLL_2, 2 -.set LOCALID_MECHADOLL_3, 3 -.set LOCALID_MECHADOLL_4, 4 -.set LOCALID_MECHADOLL_5, 5 - Route110_TrickHousePuzzle5_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route110_TrickHousePuzzle5_OnTransition .byte 0 diff --git a/data/maps/Route111/map.json b/data/maps/Route111/map.json index 054e846c4a..c090b61c9f 100644 --- a/data/maps/Route111/map.json +++ b/data/maps/Route111/map.json @@ -31,6 +31,7 @@ ], "object_events": [ { + "local_id": "LOCALID_ROUTE111_VICTOR", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 13, "y": 114, @@ -44,6 +45,7 @@ "flag": "FLAG_HIDE_ROUTE_111_VICTOR_WINSTRATE" }, { + "local_id": "LOCALID_ROUTE111_VICTORIA", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_F", "x": 13, "y": 113, @@ -57,6 +59,7 @@ "flag": "FLAG_HIDE_ROUTE_111_VICTORIA_WINSTRATE" }, { + "local_id": "LOCALID_ROUTE111_VIVI", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 13, "y": 113, @@ -70,6 +73,7 @@ "flag": "FLAG_HIDE_ROUTE_111_VIVI_WINSTRATE" }, { + "local_id": "LOCALID_ROUTE111_VICKY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_F", "x": 13, "y": 113, @@ -623,6 +627,7 @@ "flag": "FLAG_HIDE_ROUTE_111_PLAYER_DESCENT" }, { + "local_id": "LOCALID_ROUTE111_ROCK_SMASH_MAN", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "x": 19, "y": 101, diff --git a/data/maps/Route111/scripts.inc b/data/maps/Route111/scripts.inc index 7335d0e1ce..8280033228 100644 --- a/data/maps/Route111/scripts.inc +++ b/data/maps/Route111/scripts.inc @@ -1,11 +1,3 @@ -.set LOCALID_VICTOR, 1 -.set LOCALID_VICTORIA, 2 -.set LOCALID_VIVI, 3 -.set LOCALID_VICKY, 4 -.set LOCALID_ROCK_SMASH_MAN, 46 - -@ Note: LOCALID_ROUTE111_PLAYER_FALLING is a local id for this map used elsewhere. It's defined in event_objects.h - Route111_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, Route111_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, Route111_OnTransition @@ -277,68 +269,68 @@ Route111_EventScript_Victor:: Route111_EventScript_BattleWinstrates:: msgbox Route111_Text_VictorIntro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_VICTOR, Route111_Text_VictorDefeat - applymovement LOCALID_VICTOR, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_ROUTE111_VICTOR, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call Route111_EventScript_OpenWinstrateDoor msgbox Route111_Text_VictorPostBattle, MSGBOX_DEFAULT closemessage - applymovement LOCALID_VICTOR, Route111_Movement_WinstrateEnterHouse + applymovement LOCALID_ROUTE111_VICTOR, Route111_Movement_WinstrateEnterHouse waitmovement 0 - removeobject LOCALID_VICTOR + removeobject LOCALID_ROUTE111_VICTOR call Route111_EventScript_CloseWinstrateDoor applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor - addobject LOCALID_VICTORIA - applymovement LOCALID_VICTORIA, Route111_Movement_WinstrateExitHouse + addobject LOCALID_ROUTE111_VICTORIA + applymovement LOCALID_ROUTE111_VICTORIA, Route111_Movement_WinstrateExitHouse waitmovement 0 call Route111_EventScript_CloseWinstrateDoor msgbox Route111_Text_VictoriaIntro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_VICTORIA, Route111_Text_VictoriaDefeat - applymovement LOCALID_VICTORIA, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_ROUTE111_VICTORIA, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call Route111_EventScript_OpenWinstrateDoor msgbox Route111_Text_VictoriaPostBattle, MSGBOX_DEFAULT closemessage - applymovement LOCALID_VICTORIA, Route111_Movement_WinstrateEnterHouse + applymovement LOCALID_ROUTE111_VICTORIA, Route111_Movement_WinstrateEnterHouse waitmovement 0 - removeobject LOCALID_VICTORIA + removeobject LOCALID_ROUTE111_VICTORIA call Route111_EventScript_CloseWinstrateDoor applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor - addobject LOCALID_VIVI - applymovement LOCALID_VIVI, Route111_Movement_WinstrateExitHouse + addobject LOCALID_ROUTE111_VIVI + applymovement LOCALID_ROUTE111_VIVI, Route111_Movement_WinstrateExitHouse waitmovement 0 call Route111_EventScript_CloseWinstrateDoor msgbox Route111_Text_ViviIntro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_VIVI, Route111_Text_ViviDefeat - applymovement LOCALID_VIVI, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_ROUTE111_VIVI, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call Route111_EventScript_OpenWinstrateDoor msgbox Route111_Text_ViviPostBattle, MSGBOX_DEFAULT closemessage - applymovement LOCALID_VIVI, Route111_Movement_WinstrateEnterHouse + applymovement LOCALID_ROUTE111_VIVI, Route111_Movement_WinstrateEnterHouse waitmovement 0 - removeobject LOCALID_VIVI + removeobject LOCALID_ROUTE111_VIVI call Route111_EventScript_CloseWinstrateDoor applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor - addobject LOCALID_VICKY - applymovement LOCALID_VICKY, Route111_Movement_WinstrateExitHouse + addobject LOCALID_ROUTE111_VICKY + applymovement LOCALID_ROUTE111_VICKY, Route111_Movement_WinstrateExitHouse waitmovement 0 call Route111_EventScript_CloseWinstrateDoor msgbox Route111_Text_VickyIntro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_VICKY, Route111_Text_VickyDefeat msgbox Route111_Text_VickyPostBattle, MSGBOX_DEFAULT closemessage - applymovement LOCALID_VICKY, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_ROUTE111_VICKY, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call Route111_EventScript_OpenWinstrateDoor - applymovement LOCALID_VICKY, Route111_Movement_WinstrateEnterHouse + applymovement LOCALID_ROUTE111_VICKY, Route111_Movement_WinstrateEnterHouse waitmovement 0 - removeobject LOCALID_VICKY + removeobject LOCALID_ROUTE111_VICKY call Route111_EventScript_CloseWinstrateDoor release end @@ -427,11 +419,11 @@ Route111_EventScript_HikerMirageTowerVisible:: Route111_EventScript_RockSmashTipFatMan:: lockall - applymovement LOCALID_ROCK_SMASH_MAN, Common_Movement_FacePlayer + applymovement LOCALID_ROUTE111_ROCK_SMASH_MAN, Common_Movement_FacePlayer waitmovement 0 msgbox Route111_Text_MauvilleUncleToldMeToTakeRockSmash, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ROCK_SMASH_MAN, Common_Movement_FaceOriginalDirection + applymovement LOCALID_ROUTE111_ROCK_SMASH_MAN, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end diff --git a/data/maps/Route111_WinstrateFamilysHouse/map.json b/data/maps/Route111_WinstrateFamilysHouse/map.json index 5e6f9d75e8..3e061ae94e 100644 --- a/data/maps/Route111_WinstrateFamilysHouse/map.json +++ b/data/maps/Route111_WinstrateFamilysHouse/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_WINSTRATE_HOUSE_VIVI", "graphics_id": "OBJ_EVENT_GFX_LASS", "x": 7, "y": 5, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_WINSTRATE_HOUSE_VICTOR", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 4, "y": 5, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_WINSTRATE_HOUSE_VICTORIA", "graphics_id": "OBJ_EVENT_GFX_POKEFAN_F", "x": 7, "y": 4, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_WINSTRATE_HOUSE_VICKY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_F", "x": 4, "y": 4, diff --git a/data/maps/Route111_WinstrateFamilysHouse/scripts.inc b/data/maps/Route111_WinstrateFamilysHouse/scripts.inc index a163c7b4f2..4f44241cf9 100644 --- a/data/maps/Route111_WinstrateFamilysHouse/scripts.inc +++ b/data/maps/Route111_WinstrateFamilysHouse/scripts.inc @@ -1,15 +1,10 @@ -.set LOCALID_VIVI, 1 -.set LOCALID_VICTOR, 2 -.set LOCALID_VICTORIA, 3 -.set LOCALID_VICKY, 4 - Route111_WinstrateFamilysHouse_MapScripts:: .byte 0 Route111_WinstrateFamilysHouse_EventScript_Victor:: lock faceplayer - setvar VAR_0x8008, LOCALID_VICTOR + setvar VAR_0x8008, LOCALID_WINSTRATE_HOUSE_VICTOR msgbox Route111_WinstrateFamilysHouse_Text_MySonIsStrongerThanYou, MSGBOX_DEFAULT goto Route111_WinstrateFamilysHouse_EventScript_FaceOriginalDirection end @@ -17,7 +12,7 @@ Route111_WinstrateFamilysHouse_EventScript_Victor:: Route111_WinstrateFamilysHouse_EventScript_Victoria:: lock faceplayer - setvar VAR_0x8008, LOCALID_VICTORIA + setvar VAR_0x8008, LOCALID_WINSTRATE_HOUSE_VICTORIA goto_if_set FLAG_RECEIVED_MACHO_BRACE, Route111_WinstrateFamilysHouse_EventScript_ReceivedMachoBrace msgbox Route111_WinstrateFamilysHouse_Text_LikeYouToHaveMachoBrace, MSGBOX_DEFAULT giveitem ITEM_MACHO_BRACE @@ -34,7 +29,7 @@ Route111_WinstrateFamilysHouse_EventScript_ReceivedMachoBrace:: Route111_WinstrateFamilysHouse_EventScript_Vivi:: lock faceplayer - setvar VAR_0x8008, LOCALID_VIVI + setvar VAR_0x8008, LOCALID_WINSTRATE_HOUSE_VIVI msgbox Route111_WinstrateFamilysHouse_Text_StrongerFamilyMembers, MSGBOX_DEFAULT goto Route111_WinstrateFamilysHouse_EventScript_FaceOriginalDirection end @@ -42,7 +37,7 @@ Route111_WinstrateFamilysHouse_EventScript_Vivi:: Route111_WinstrateFamilysHouse_EventScript_Vicky:: lock faceplayer - setvar VAR_0x8008, LOCALID_VICKY + setvar VAR_0x8008, LOCALID_WINSTRATE_HOUSE_VICKY goto_if_set FLAG_TEMP_4, Route111_WinstrateFamilysHouse_EventScript_AlreadySpokenTo msgbox Route111_WinstrateFamilysHouse_Text_GrandsonStrong, MSGBOX_DEFAULT setflag FLAG_TEMP_4 diff --git a/data/maps/Route112/map.json b/data/maps/Route112/map.json index 5340680ea5..d3260f27fe 100644 --- a/data/maps/Route112/map.json +++ b/data/maps/Route112/map.json @@ -31,6 +31,7 @@ ], "object_events": [ { + "local_id": "LOCALID_ROUTE112_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 26, "y": 30, @@ -96,6 +97,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE112_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 27, "y": 30, diff --git a/data/maps/Route112/scripts.inc b/data/maps/Route112/scripts.inc index a6c248e1f6..73e229532f 100644 --- a/data/maps/Route112/scripts.inc +++ b/data/maps/Route112/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_GRUNT_1, 1 -.set LOCALID_GRUNT_2, 6 - Route112_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route112_OnTransition .byte 0 @@ -13,36 +10,36 @@ Route112_OnTransition: Route112_EventScript_MagmaGrunts:: lockall delay 40 - applymovement LOCALID_GRUNT_1, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_ROUTE112_GRUNT_1, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 20 msgbox Route112_Text_LeaderGoingToAwakenThing, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_ROUTE112_GRUNT_1, Common_Movement_FaceOriginalDirection waitmovement 0 delay 40 - applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_ROUTE112_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 20 msgbox Route112_Text_YeahWeNeedMeteorite, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_ROUTE112_GRUNT_2, Common_Movement_FaceOriginalDirection waitmovement 0 delay 40 - applymovement LOCALID_GRUNT_1, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_ROUTE112_GRUNT_1, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 20 msgbox Route112_Text_OhThatsWhyCrewWentToFallarbor, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_ROUTE112_GRUNT_1, Common_Movement_FaceOriginalDirection waitmovement 0 delay 40 - applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_ROUTE112_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 20 msgbox Route112_Text_CantLetAnyonePassUntilTheyreBack, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_ROUTE112_GRUNT_2, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end diff --git a/data/maps/Route112_CableCarStation/map.json b/data/maps/Route112_CableCarStation/map.json index 09401d83b0..3aeadc6f1f 100644 --- a/data/maps/Route112_CableCarStation/map.json +++ b/data/maps/Route112_CableCarStation/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_ROUTE112_CABLE_CAR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "x": 6, "y": 6, diff --git a/data/maps/Route112_CableCarStation/scripts.inc b/data/maps/Route112_CableCarStation/scripts.inc index 3ce4f62e2a..416b3b5627 100644 --- a/data/maps/Route112_CableCarStation/scripts.inc +++ b/data/maps/Route112_CableCarStation/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - Route112_CableCarStation_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route112_CableCarStation_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, Route112_CableCarStation_OnFrame @@ -11,8 +9,8 @@ Route112_CableCarStation_OnTransition: end Route112_CableCarStation_EventScript_MoveAttendantAside:: - setobjectxyperm LOCALID_ATTENDANT, 7, 4 - setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_LEFT + setobjectxyperm LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, 7, 4 + setobjectmovementtype LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, MOVEMENT_TYPE_FACE_LEFT return Route112_CableCarStation_OnFrame: @@ -22,11 +20,11 @@ Route112_CableCarStation_OnFrame: Route112_CableCarStation_EventScript_ExitCableCar:: lockall applymovement OBJ_EVENT_ID_PLAYER, Route112_CableCarStation_Movement_ExitCableCar - applymovement LOCALID_ATTENDANT, Route112_CableCarStation_Movement_FollowPlayerOutFromCableCar + applymovement LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, Route112_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 - setobjectxyperm LOCALID_ATTENDANT, 6, 7 - setobjectmovementtype LOCALID_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, 6, 7 + setobjectmovementtype LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, MOVEMENT_TYPE_FACE_DOWN releaseall end @@ -41,7 +39,7 @@ Route112_CableCarStation_EventScript_Attendant:: Route112_CableCarStation_EventScript_RideCableCar:: msgbox Route112_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, Route112_CableCarStation_Movement_LeadPlayerToCableCar + applymovement LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, Route112_CableCarStation_Movement_LeadPlayerToCableCar applymovement OBJ_EVENT_ID_PLAYER, Route112_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, FALSE @ Going up diff --git a/data/maps/Route114_FossilManiacsTunnel/map.json b/data/maps/Route114_FossilManiacsTunnel/map.json index 034545e6ba..625c5afc08 100644 --- a/data/maps/Route114_FossilManiacsTunnel/map.json +++ b/data/maps/Route114_FossilManiacsTunnel/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FOSSIL_MANIAC", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 5, "y": 3, diff --git a/data/maps/Route114_FossilManiacsTunnel/scripts.inc b/data/maps/Route114_FossilManiacsTunnel/scripts.inc index 72138bbe40..9ec5247a9f 100644 --- a/data/maps/Route114_FossilManiacsTunnel/scripts.inc +++ b/data/maps/Route114_FossilManiacsTunnel/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_FOSSIL_MANIAC, 1 - Route114_FossilManiacsTunnel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route114_FossilManiacsTunnel_OnTransition map_script MAP_SCRIPT_ON_LOAD, Route114_FossilManiacsTunnel_OnLoad diff --git a/data/maps/Route116/map.json b/data/maps/Route116/map.json index adf9a86d59..6e4da0ac0a 100644 --- a/data/maps/Route116/map.json +++ b/data/maps/Route116/map.json @@ -156,6 +156,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE116_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 46, "y": 9, @@ -286,6 +287,7 @@ "flag": "FLAG_ITEM_ROUTE_116_X_SPECIAL" }, { + "local_id": "LOCALID_ROUTE116_WANDAS_BF", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 38, "y": 9, diff --git a/data/maps/Route116/scripts.inc b/data/maps/Route116/scripts.inc index 2a464d1996..98206435ee 100644 --- a/data/maps/Route116/scripts.inc +++ b/data/maps/Route116/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_BRINEY, 11 -.set LOCALID_WANDAS_BF_OUTSIDE, 21 - Route116_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route116_OnTransition map_script MAP_SCRIPT_ON_LOAD, Route116_OnLoad @@ -15,7 +12,7 @@ Route116_OnTransition: end Route116_EventScript_SetWandasBoyfriendPos:: - setobjectxyperm LOCALID_WANDAS_BF_OUTSIDE, 38, 10 + setobjectxyperm LOCALID_ROUTE116_WANDAS_BF, 38, 10 return Route116_OnLoad: @@ -144,7 +141,7 @@ Route116_EventScript_Briney:: Route116_EventScript_BrineyTrigger:: lockall - applymovement LOCALID_BRINEY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_ROUTE116_BRINEY, Common_Movement_WalkInPlaceFasterRight applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox Route116_Text_ScoundrelMadeOffWithPeeko, MSGBOX_DEFAULT diff --git a/data/maps/Route118/map.json b/data/maps/Route118/map.json index e1e2b288d6..f1a292c00d 100644 --- a/data/maps/Route118/map.json +++ b/data/maps/Route118/map.json @@ -271,6 +271,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE118_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 44, "y": 7, diff --git a/data/maps/Route118/scripts.inc b/data/maps/Route118/scripts.inc index 92dd8847d4..db1c001fdf 100644 --- a/data/maps/Route118/scripts.inc +++ b/data/maps/Route118/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_STEVEN, 19 - Route118_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route118_OnTransition map_script MAP_SCRIPT_ON_LOAD, Route118_OnLoad @@ -66,7 +64,7 @@ Route118_EventScript_StevenTrigger0:: setvar VAR_0x8008, 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp waitmovement 0 - applymovement LOCALID_STEVEN, Route118_Movement_StevenApproachLedge0 + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenApproachLedge0 waitmovement 0 goto Route118_EventScript_StevenTrigger end @@ -84,14 +82,14 @@ Route118_EventScript_StevenTrigger2:: setvar VAR_0x8008, 2 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp waitmovement 0 - applymovement LOCALID_STEVEN, Route118_Movement_StevenApproachLedge2 + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenApproachLedge2 waitmovement 0 goto Route118_EventScript_StevenTrigger end Route118_EventScript_StevenTrigger:: playse SE_LEDGE - applymovement LOCALID_STEVEN, Route118_Movement_StevenJumpLedge + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenJumpLedge waitmovement 0 delay 30 msgbox Route118_Text_StevenQuestions, MSGBOX_DEFAULT @@ -100,25 +98,25 @@ Route118_EventScript_StevenTrigger:: call_if_eq VAR_0x8008, 1, Route118_EventScript_StevenExit1 call_if_eq VAR_0x8008, 2, Route118_EventScript_StevenExit2 setvar VAR_ROUTE118_STATE, 1 - removeobject LOCALID_STEVEN + removeobject LOCALID_ROUTE118_STEVEN releaseall end Route118_EventScript_StevenExit0:: applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit - applymovement LOCALID_STEVEN, Route118_Movement_StevenExit0 + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit0 waitmovement 0 return Route118_EventScript_StevenExit1:: applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit - applymovement LOCALID_STEVEN, Route118_Movement_StevenExit1 + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit1 waitmovement 0 return Route118_EventScript_StevenExit2:: applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit - applymovement LOCALID_STEVEN, Route118_Movement_StevenExit2 + applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit2 waitmovement 0 return diff --git a/data/maps/Route119/map.json b/data/maps/Route119/map.json index f8591a5ba2..a2850b70ab 100644 --- a/data/maps/Route119/map.json +++ b/data/maps/Route119/map.json @@ -221,6 +221,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE119_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 25, "y": 32, @@ -338,6 +339,7 @@ "flag": "FLAG_HIDE_ROUTE_119_TEAM_AQUA" }, { + "local_id": "LOCALID_ROUTE119_RIVAL_ON_BIKE", "graphics_id": "OBJ_EVENT_GFX_VAR_3", "x": 17, "y": 33, @@ -572,6 +574,7 @@ "flag": "FLAG_ITEM_ROUTE_119_ELIXIR_2" }, { + "local_id": "LOCALID_ROUTE119_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 28, "y": 25, diff --git a/data/maps/Route119/scripts.inc b/data/maps/Route119/scripts.inc index 6c9767dcb6..6dd4eb8caa 100644 --- a/data/maps/Route119/scripts.inc +++ b/data/maps/Route119/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_RIVAL, 16 -.set LOCALID_RIVAL_ON_BIKE, 25 -.set LOCALID_SCOTT, 43 - Route119_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, Route119_OnResume map_script MAP_SCRIPT_ON_TRANSITION, Route119_OnTransition @@ -42,7 +38,7 @@ Route119_EventScript_RivalTrigger2:: Route119_EventScript_RivalEncounter:: lockall - addobject LOCALID_RIVAL_ON_BIKE + addobject LOCALID_ROUTE119_RIVAL_ON_BIKE checkplayergender call_if_eq VAR_RESULT, MALE, Route119_EventScript_PlayMayMusic call_if_eq VAR_RESULT, FEMALE, Route119_EventScript_PlayBrendanMusic @@ -54,8 +50,8 @@ Route119_EventScript_RivalEncounter:: delay 30 call_if_eq VAR_TEMP_1, 1, Route119_EventScript_SetRivalPos1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_SetRivalPos2 - removeobject LOCALID_RIVAL_ON_BIKE - addobject LOCALID_RIVAL + removeobject LOCALID_ROUTE119_RIVAL_ON_BIKE + addobject LOCALID_ROUTE119_RIVAL delay 30 checkplayergender goto_if_eq VAR_RESULT, MALE, Route119_EventScript_BattleMay @@ -140,78 +136,78 @@ Route119_EventScript_RivalExitScottArrive:: closemessage call_if_eq VAR_TEMP_1, 1, Route119_EventScript_SetRivalPos1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_SetRivalPos2 - removeobject LOCALID_RIVAL - addobject LOCALID_RIVAL_ON_BIKE + removeobject LOCALID_ROUTE119_RIVAL + addobject LOCALID_ROUTE119_RIVAL_ON_BIKE delay 30 call_if_eq VAR_TEMP_1, 1, Route119_EventScript_RivalExit1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_RivalExit2 - removeobject LOCALID_RIVAL_ON_BIKE + removeobject LOCALID_ROUTE119_RIVAL_ON_BIKE setvar VAR_ROUTE119_STATE, 1 savebgm MUS_DUMMY fadedefaultbgm delay 60 call_if_eq VAR_TEMP_1, 1, Route119_EventScript_SetScottPos1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_SetScottPos2 - addobject LOCALID_SCOTT - applymovement LOCALID_SCOTT, Route119_Movement_ScottEnter + addobject LOCALID_ROUTE119_SCOTT + applymovement LOCALID_ROUTE119_SCOTT, Route119_Movement_ScottEnter waitmovement 0 addvar VAR_SCOTT_STATE, 1 msgbox Route119_Text_ScottWayToGoBeSeeingYou, MSGBOX_DEFAULT closemessage call_if_eq VAR_TEMP_1, 1, Route119_EventScript_ScottExit1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_ScottExit2 - removeobject LOCALID_SCOTT + removeobject LOCALID_ROUTE119_SCOTT releaseall end Route119_EventScript_SetScottPos1:: - setobjectxyperm LOCALID_SCOTT, 27, 25 + setobjectxyperm LOCALID_ROUTE119_SCOTT, 27, 25 return Route119_EventScript_SetScottPos2:: - setobjectxyperm LOCALID_SCOTT, 28, 25 + setobjectxyperm LOCALID_ROUTE119_SCOTT, 28, 25 return Route119_EventScript_ScottExit1:: - applymovement LOCALID_SCOTT, Route119_Movement_ScottExit1 + applymovement LOCALID_ROUTE119_SCOTT, Route119_Movement_ScottExit1 waitmovement 0 return Route119_EventScript_ScottExit2:: - applymovement LOCALID_SCOTT, Route119_Movement_ScottExit2 + applymovement LOCALID_ROUTE119_SCOTT, Route119_Movement_ScottExit2 waitmovement 0 return Route119_EventScript_RivalEnter1:: - applymovement LOCALID_RIVAL_ON_BIKE, Route119_Movement_RivalEnter1 + applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalEnter1 waitmovement 0 return Route119_EventScript_RivalEnter2:: - applymovement LOCALID_RIVAL_ON_BIKE, Route119_Movement_RivalEnter2 + applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalEnter2 waitmovement 0 return Route119_EventScript_RivalExit1:: applymovement OBJ_EVENT_ID_PLAYER, Route119_Movement_PlayerWatchRivalExit1 - applymovement LOCALID_RIVAL_ON_BIKE, Route119_Movement_RivalExit1 + applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalExit1 waitmovement 0 return Route119_EventScript_RivalExit2:: applymovement OBJ_EVENT_ID_PLAYER, Route119_Movement_PlayerWatchRivalExit2 - applymovement LOCALID_RIVAL_ON_BIKE, Route119_Movement_RivalExit2 + applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalExit2 waitmovement 0 return Route119_EventScript_SetRivalPos1:: - setobjectxyperm LOCALID_RIVAL, 25, 32 - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 25, 32 + setobjectxyperm LOCALID_ROUTE119_RIVAL, 25, 32 + setobjectxyperm LOCALID_ROUTE119_RIVAL_ON_BIKE, 25, 32 return Route119_EventScript_SetRivalPos2:: - setobjectxyperm LOCALID_RIVAL, 26, 32 - setobjectxyperm LOCALID_RIVAL_ON_BIKE, 26, 32 + setobjectxyperm LOCALID_ROUTE119_RIVAL, 26, 32 + setobjectxyperm LOCALID_ROUTE119_RIVAL_ON_BIKE, 26, 32 return Route119_Movement_PlayerWatchRivalExit1: diff --git a/data/maps/Route119_WeatherInstitute_1F/map.json b/data/maps/Route119_WeatherInstitute_1F/map.json index 02f2ffe37f..a0d5e12ff3 100644 --- a/data/maps/Route119_WeatherInstitute_1F/map.json +++ b/data/maps/Route119_WeatherInstitute_1F/map.json @@ -67,6 +67,7 @@ "flag": "FLAG_HIDE_WEATHER_INSTITUTE_1F_WORKERS" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_LITTLE_BOY", "graphics_id": "OBJ_EVENT_GFX_NINJA_BOY", "x": 14, "y": 11, diff --git a/data/maps/Route119_WeatherInstitute_1F/scripts.inc b/data/maps/Route119_WeatherInstitute_1F/scripts.inc index cce41bfb5f..927984aebe 100644 --- a/data/maps/Route119_WeatherInstitute_1F/scripts.inc +++ b/data/maps/Route119_WeatherInstitute_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_LITTLE_BOY, 5 - Route119_WeatherInstitute_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route119_WeatherInstitute_1F_OnTransition .byte 0 @@ -9,8 +7,8 @@ Route119_WeatherInstitute_1F_OnTransition: end Route119_WeatherInstitute_1F_EventScript_SetLittleBoyPos:: - setobjectxyperm LOCALID_LITTLE_BOY, 0, 5 - setobjectmovementtype LOCALID_LITTLE_BOY, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_WEATHER_INSTITUTE_LITTLE_BOY, 0, 5 + setobjectmovementtype LOCALID_WEATHER_INSTITUTE_LITTLE_BOY, MOVEMENT_TYPE_FACE_RIGHT return Route119_WeatherInstitute_1F_EventScript_LittleBoy:: diff --git a/data/maps/Route119_WeatherInstitute_2F/map.json b/data/maps/Route119_WeatherInstitute_2F/map.json index 935ea48dd9..8b62e63a91 100644 --- a/data/maps/Route119_WeatherInstitute_2F/map.json +++ b/data/maps/Route119_WeatherInstitute_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 15, "y": 6, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_ROUTE_119_TEAM_AQUA" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 10, "y": 8, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_ROUTE_119_TEAM_AQUA" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_SHELLY", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_F", "x": 4, "y": 6, @@ -67,6 +70,7 @@ "flag": "FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 18, "y": 6, @@ -93,6 +97,7 @@ "flag": "FLAG_HIDE_WEATHER_INSTITUTE_2F_WORKERS" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 16, "y": 6, @@ -106,6 +111,7 @@ "flag": "FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M" }, { + "local_id": "LOCALID_WEATHER_INSTITUTE_2F_GRUNT_4", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_F", "x": 19, "y": 6, diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc index e5df03d4a1..b651fa626f 100644 --- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc +++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_GRUNT_1, 1 -.set LOCALID_GRUNT_2, 2 -.set LOCALID_SHELLY, 3 -.set LOCALID_SCIENTIST, 5 -.set LOCALID_GRUNT_3, 7 -.set LOCALID_GRUNT_4, 8 - Route119_WeatherInstitute_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, Route119_WeatherInstitute_2F_OnTransition .byte 0 @@ -16,18 +9,18 @@ Route119_WeatherInstitute_2F_OnTransition: end Route119_WeatherInstitute_2F_EventScript_SetScientistPosAquaHere:: - setobjectxyperm LOCALID_SCIENTIST, 1, 6 - setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, 1, 6 + setobjectmovementtype LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT return Route119_WeatherInstitute_2F_EventScript_SetScientistPosAquaGone:: - setobjectxyperm LOCALID_SCIENTIST, 4, 6 - setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, 4, 6 + setobjectmovementtype LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, MOVEMENT_TYPE_FACE_RIGHT return Route119_WeatherInstitute_2F_EventScript_SetScientistPosGameClear:: - setobjectxyperm LOCALID_SCIENTIST, 2, 2 - setobjectmovementtype LOCALID_SCIENTIST, MOVEMENT_TYPE_FACE_UP + setobjectxyperm LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, 2, 2 + setobjectmovementtype LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, MOVEMENT_TYPE_FACE_UP return Route119_WeatherInstitute_2F_EventScript_Grunt5:: @@ -53,16 +46,16 @@ Route119_WeatherInstitute_2F_EventScript_Shelly:: Route119_WeatherInstitute_2F_EventScript_ShellyDefeated:: msgbox Route119_WeatherInstitute_2F_Text_ShellyPostBattle, MSGBOX_DEFAULT closemessage - addobject LOCALID_GRUNT_3 - applymovement LOCALID_GRUNT_3, Route119_WeatherInstitute_2F_Movement_GruntApproachShelly + addobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3 + applymovement LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3, Route119_WeatherInstitute_2F_Movement_GruntApproachShelly applymovement OBJ_EVENT_ID_PLAYER, Route119_WeatherInstitute_2F_Movement_ShovePlayerOutOfWay waitmovement 0 msgbox Route119_WeatherInstitute_2F_Text_TeamMagmaJustPassedBy, MSGBOX_DEFAULT closemessage playse SE_PIN - applymovement LOCALID_SHELLY, Common_Movement_ExclamationMark + applymovement LOCALID_WEATHER_INSTITUTE_2F_SHELLY, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_SHELLY, Common_Movement_Delay48 + applymovement LOCALID_WEATHER_INSTITUTE_2F_SHELLY, Common_Movement_Delay48 waitmovement 0 msgbox Route119_WeatherInstitute_2F_Text_WeHaveToHurryToMtPyre, MSGBOX_DEFAULT closemessage @@ -72,17 +65,17 @@ Route119_WeatherInstitute_2F_EventScript_ShellyDefeated:: fadescreen FADE_TO_BLACK setflag FLAG_HIDE_ROUTE_119_TEAM_AQUA setflag FLAG_HIDE_WEATHER_INSTITUTE_2F_AQUA_GRUNT_M - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 - removeobject LOCALID_SHELLY - removeobject LOCALID_GRUNT_4 - removeobject LOCALID_GRUNT_3 + removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_1 + removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_2 + removeobject LOCALID_WEATHER_INSTITUTE_2F_SHELLY + removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_4 + removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3 applymovement OBJ_EVENT_ID_PLAYER, Route119_WeatherInstitute_2F_Movement_PlayerReturnToPosition waitmovement 0 fadescreen FADE_FROM_BLACK - applymovement LOCALID_SCIENTIST, Route119_WeatherInstitute_2F_Movement_ScientistApproachPlayer + applymovement LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, Route119_WeatherInstitute_2F_Movement_ScientistApproachPlayer waitmovement 0 - copyobjectxytoperm LOCALID_SCIENTIST + copyobjectxytoperm LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST goto Route119_WeatherInstitute_2F_EventScript_ReceiveCastform end diff --git a/data/maps/Route120/map.json b/data/maps/Route120/map.json index f8799a74ef..0a12521c67 100644 --- a/data/maps/Route120/map.json +++ b/data/maps/Route120/map.json @@ -407,6 +407,7 @@ "flag": "FLAG_ITEM_ROUTE_120_HYPER_POTION" }, { + "local_id": "LOCALID_BRIDGE_KECLEON", "graphics_id": "OBJ_EVENT_GFX_KECLEON", "x": 12, "y": 16, @@ -420,6 +421,7 @@ "flag": "FLAG_HIDE_ROUTE_120_KECLEON_BRIDGE" }, { + "local_id": "LOCALID_ROUTE120_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 13, "y": 15, @@ -485,6 +487,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BRIDGE_KECLEON_SHADOW", "graphics_id": "OBJ_EVENT_GFX_KECLEON_BRIDGE_SHADOW", "x": 12, "y": 16, diff --git a/data/maps/Route120/scripts.inc b/data/maps/Route120/scripts.inc index a0bfbc60c3..defff8807a 100644 --- a/data/maps/Route120/scripts.inc +++ b/data/maps/Route120/scripts.inc @@ -1,7 +1,4 @@ -.set LOCALID_BRIDGE_KECLEON, 30 -.set LOCALID_STEVEN, 31 -.set LOCALID_BRIDGE_KECLEON_SHADOW, 36 @ They use a second object which is identical to Kecleon but has a reflection palette tag for the bridge shadow - +@ LOCALID_BRIDGE_KECLEON_SHADOW is a second object which is identical to LOCALID_BRIDGE_KECLEON but has a reflection palette tag for the bridge shadow Route120_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, Route120_OnResume map_script MAP_SCRIPT_ON_TRANSITION, Route120_OnTransition @@ -180,7 +177,7 @@ Route120_EventScript_StevenBattleKecleon:: closemessage call_if_eq VAR_FACING, DIR_NORTH, Route120_EventScript_PlayerApproachKecleonNorth call_if_eq VAR_FACING, DIR_WEST, Route120_EventScript_PlayerApproachKecleonWest - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_ROUTE120_STEVEN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 20 msgbox Route120_Text_StevenUsedDevonScope, MSGBOX_DEFAULT @@ -214,7 +211,7 @@ Route120_EventScript_RemoveBridgeKecleonPostBattle:: end Route120_EventScript_StevenGiveDeconScope:: - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE120_STEVEN, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route120_Text_StevenGiveDevonScope, MSGBOX_DEFAULT @@ -222,13 +219,13 @@ Route120_EventScript_StevenGiveDeconScope:: setflag FLAG_RECEIVED_DEVON_SCOPE msgbox Route120_Text_StevenGoodbye, MSGBOX_DEFAULT closemessage - applymovement LOCALID_STEVEN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_ROUTE120_STEVEN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 50 setfieldeffectargument 0, 1 dofieldeffect FLDEFF_NPCFLY_OUT delay 15 - removeobject LOCALID_STEVEN + removeobject LOCALID_ROUTE120_STEVEN waitfieldeffect FLDEFF_NPCFLY_OUT setmetatile 13, 15, METATILE_Fortree_WoodBridge1_Top, FALSE setmetatile 12, 16, METATILE_Fortree_WoodBridge1_Bottom, FALSE diff --git a/data/maps/Route121/map.json b/data/maps/Route121/map.json index 4a73f3fdd9..9911a619c5 100644 --- a/data/maps/Route121/map.json +++ b/data/maps/Route121/map.json @@ -174,6 +174,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ROUTE121_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 30, "y": 8, @@ -187,6 +188,7 @@ "flag": "FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS" }, { + "local_id": "LOCALID_ROUTE121_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 30, "y": 7, @@ -200,6 +202,7 @@ "flag": "FLAG_HIDE_ROUTE_121_TEAM_AQUA_GRUNTS" }, { + "local_id": "LOCALID_ROUTE121_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 31, "y": 7, diff --git a/data/maps/Route121/scripts.inc b/data/maps/Route121/scripts.inc index 317328825c..beb9e3a91d 100644 --- a/data/maps/Route121/scripts.inc +++ b/data/maps/Route121/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_GRUNT_1, 12 -.set LOCALID_GRUNT_2, 13 -.set LOCALID_GRUNT_3, 14 - Route121_MapScripts:: .byte 0 @@ -20,18 +16,18 @@ Route121_EventScript_SafariZoneSign:: Route121_EventScript_AquaGruntsMoveOut:: lockall playbgm MUS_ENCOUNTER_AQUA, FALSE - applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceRight + applymovement LOCALID_ROUTE121_GRUNT_2, Common_Movement_WalkInPlaceRight waitmovement 0 msgbox Route121_Text_OkayMoveOutToMtPyre, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_1, Route121_Movement_Grunt1Exit - applymovement LOCALID_GRUNT_2, Route121_Movement_Grunt2Exit - applymovement LOCALID_GRUNT_3, Route121_Movement_Grunt3Exit + applymovement LOCALID_ROUTE121_GRUNT_1, Route121_Movement_Grunt1Exit + applymovement LOCALID_ROUTE121_GRUNT_2, Route121_Movement_Grunt2Exit + applymovement LOCALID_ROUTE121_GRUNT_3, Route121_Movement_Grunt3Exit waitmovement 0 fadedefaultbgm - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 - removeobject LOCALID_GRUNT_3 + removeobject LOCALID_ROUTE121_GRUNT_1 + removeobject LOCALID_ROUTE121_GRUNT_2 + removeobject LOCALID_ROUTE121_GRUNT_3 setvar VAR_ROUTE121_STATE, 1 releaseall end diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 2d42b30850..49f8a7d601 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -109,6 +109,7 @@ "flag": "0" }, { + "local_id": "LOCALID_RUSTBORO_LITTLE_BOY", "graphics_id": "OBJ_EVENT_GFX_LITTLE_BOY", "x": 24, "y": 51, @@ -122,6 +123,7 @@ "flag": "0" }, { + "local_id": "LOCALID_RUSTBORO_LITTLE_GIRL", "graphics_id": "OBJ_EVENT_GFX_LITTLE_GIRL", "x": 25, "y": 51, @@ -135,6 +137,7 @@ "flag": "0" }, { + "local_id": "LOCALID_RUSTBORO_DEVON_EMPLOYEE", "graphics_id": "OBJ_EVENT_GFX_MAN_2", "x": 30, "y": 10, @@ -148,6 +151,7 @@ "flag": "FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1" }, { + "local_id": "LOCALID_RUSTBORO_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 13, "y": 21, @@ -200,6 +204,7 @@ "flag": "0" }, { + "local_id": "LOCALID_RUSTBORO_RIVAL", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 16, "y": 50, @@ -213,6 +218,7 @@ "flag": "FLAG_HIDE_RUSTBORO_CITY_RIVAL" }, { + "local_id": "LOCALID_RUSTBORO_SCIENTIST", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 11, "y": 15, diff --git a/data/maps/RustboroCity/scripts.inc b/data/maps/RustboroCity/scripts.inc index 28fd389210..8022083ea5 100644 --- a/data/maps/RustboroCity/scripts.inc +++ b/data/maps/RustboroCity/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_LITTLE_BOY, 7 -.set LOCALID_LITTLE_GIRL, 8 -.set LOCALID_DEVON_EMPLOYEE, 9 -.set LOCALID_GRUNT, 10 -.set LOCALID_RIVAL, 14 -.set LOCALID_SCIENTIST, 15 - RustboroCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RustboroCity_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, RustboroCity_OnFrame @@ -20,11 +13,11 @@ RustboroCity_OnTransition: RustboroCity_EventScript_PositionScientistForExit:: goto_if_eq VAR_TEMP_0, 11, RustboroCity_EventScript_PositionScientistLeftExit - setobjectxyperm LOCALID_SCIENTIST, 12, 15 + setobjectxyperm LOCALID_RUSTBORO_SCIENTIST, 12, 15 end RustboroCity_EventScript_PositionScientistLeftExit:: - setobjectxyperm LOCALID_SCIENTIST, 11, 15 + setobjectxyperm LOCALID_RUSTBORO_SCIENTIST, 11, 15 end RustboroCity_EventScript_HideMapNamePopup:: @@ -42,22 +35,22 @@ RustboroCity_EventScript_ScientistAddMatchCall:: waitmovement 0 playse SE_EXIT delay 10 - addobject LOCALID_SCIENTIST - applymovement LOCALID_SCIENTIST, RustboroCity_Movement_ScientistApproachPlayer + addobject LOCALID_RUSTBORO_SCIENTIST + applymovement LOCALID_RUSTBORO_SCIENTIST, RustboroCity_Movement_ScientistApproachPlayer waitmovement 0 playse SE_PIN - applymovement LOCALID_SCIENTIST, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_SCIENTIST, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_SCIENTIST, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_SCIENTIST, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 - applymovement LOCALID_SCIENTIST, RustboroCity_Movement_ScientistWalkInPlaceDown + applymovement LOCALID_RUSTBORO_SCIENTIST, RustboroCity_Movement_ScientistWalkInPlaceDown waitmovement 0 msgbox RustboroCity_Text_DevelopedNewPokenavFeature, MSGBOX_DEFAULT closemessage setflag FLAG_HAS_MATCH_CALL - applymovement LOCALID_SCIENTIST, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_RUSTBORO_SCIENTIST, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 playse SE_CLICK delay 10 @@ -67,7 +60,7 @@ RustboroCity_EventScript_ScientistAddMatchCall:: delay 10 playse SE_CLICK delay 20 - applymovement LOCALID_SCIENTIST, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_SCIENTIST, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox RustboroCity_Text_AddedMatchCallPleaseCallMrStone, MSGBOX_DEFAULT closemessage @@ -98,10 +91,10 @@ RustboroCity_EventScript_MatchCallTutorial:: delay 20 msgbox RustboroCity_Text_IdBetterGetBackToWork, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCIENTIST, RustboroCity_Movement_ScientistLeave + applymovement LOCALID_RUSTBORO_SCIENTIST, RustboroCity_Movement_ScientistLeave waitmovement 0 playse SE_EXIT - removeobject LOCALID_SCIENTIST + removeobject LOCALID_RUSTBORO_SCIENTIST setflag FLAG_HIDE_RUSTBORO_CITY_SCIENTIST setvar VAR_RUSTBORO_CITY_STATE, 7 clearflag FLAG_HIDE_MAP_NAME_POPUP @@ -227,7 +220,7 @@ RustboroCity_EventScript_LittleBoy:: lock faceplayer msgbox RustboroCity_Text_PokemonCanChangeLookFromExp, MSGBOX_DEFAULT - applymovement LOCALID_LITTLE_BOY, Common_Movement_FaceOriginalDirection + applymovement LOCALID_RUSTBORO_LITTLE_BOY, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -236,7 +229,7 @@ RustboroCity_EventScript_LittleGirl:: lock faceplayer msgbox RustboroCity_Text_PokemonChangeShape, MSGBOX_DEFAULT - applymovement LOCALID_LITTLE_GIRL, Common_Movement_FaceOriginalDirection + applymovement LOCALID_RUSTBORO_LITTLE_GIRL, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -250,40 +243,40 @@ RustboroCity_EventScript_Man2:: RustboroCity_EventScript_StolenGoodsTrigger0:: lockall - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 14, 21 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 14, 21 + setobjectmovementtype LOCALID_RUSTBORO_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT setvar VAR_0x8004, 0 goto RustboroCity_EventScript_StolenGoodsScene end RustboroCity_EventScript_StolenGoodsTrigger1:: lockall - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 14, 21 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 14, 21 + setobjectmovementtype LOCALID_RUSTBORO_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT setvar VAR_0x8004, 1 goto RustboroCity_EventScript_StolenGoodsScene end RustboroCity_EventScript_StolenGoodsTrigger2:: lockall - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 14, 21 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 14, 21 + setobjectmovementtype LOCALID_RUSTBORO_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT setvar VAR_0x8004, 2 goto RustboroCity_EventScript_StolenGoodsScene end RustboroCity_EventScript_StolenGoodsTrigger3:: lockall - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 14, 21 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 14, 21 + setobjectmovementtype LOCALID_RUSTBORO_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT setvar VAR_0x8004, 3 goto RustboroCity_EventScript_StolenGoodsScene end RustboroCity_EventScript_StolenGoodsTrigger4:: lockall - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 14, 21 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 14, 21 + setobjectmovementtype LOCALID_RUSTBORO_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_RIGHT setvar VAR_0x8004, 4 goto RustboroCity_EventScript_StolenGoodsScene end @@ -292,20 +285,20 @@ RustboroCity_EventScript_StolenGoodsScene:: msgbox RustboroCity_Text_OutOfTheWay, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_AQUA, FALSE - addobject LOCALID_GRUNT - addobject LOCALID_DEVON_EMPLOYEE - applymovement LOCALID_GRUNT, RustboroCity_Movement_GruntEscape + addobject LOCALID_RUSTBORO_GRUNT + addobject LOCALID_RUSTBORO_DEVON_EMPLOYEE + applymovement LOCALID_RUSTBORO_GRUNT, RustboroCity_Movement_GruntEscape waitmovement 0 - removeobject LOCALID_GRUNT - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeChaseGrunt1 + removeobject LOCALID_RUSTBORO_GRUNT + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeChaseGrunt1 waitmovement 0 msgbox RustboroCity_Text_WaitDontTakeMyGoods, MSGBOX_DEFAULT closemessage - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeChaseGrunt2 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeChaseGrunt2 waitmovement 0 fadedefaultbgm - removeobject LOCALID_DEVON_EMPLOYEE - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 30, 10 + removeobject LOCALID_RUSTBORO_DEVON_EMPLOYEE + setobjectxyperm LOCALID_RUSTBORO_DEVON_EMPLOYEE, 30, 10 clearflag FLAG_HIDE_RUSTBORO_CITY_DEVON_EMPLOYEE_1 setflag FLAG_DEVON_GOODS_STOLEN setvar VAR_RUSTBORO_CITY_STATE, 2 @@ -331,31 +324,31 @@ RustboroCity_EventScript_YouGotItThankYou:: @ Unknown, unused employee movements. Based on the differences in movement theyre for approaching an object (probably the player) in different positions RustboroCity_EventScript_EmployeeApproachUp:: - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachUp + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachUp waitmovement 0 return @ Unused, see above RustboroCity_EventScript_EmployeeApproachLeft:: - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachLeft + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachLeft waitmovement 0 return @ Unused, see above RustboroCity_EventScript_EmployeeApproachRight:: - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachRight + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachRight waitmovement 0 return @ Unused, see above RustboroCity_EventScript_EmployeeApproachDown:: - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachDown waitmovement 0 return @ Unused, similar movement to the above scripts RustboroCity_EventScript_EmployeeApproachPlayerFar:: - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerFar + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerFar waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -509,57 +502,57 @@ RustboroCity_EventScript_EmployeeAskToGetGoods:: call_if_eq VAR_TEMP_1, 3, RustboroCity_EventScript_EmployeeApproachPlayerDown1 setflag FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN setvar VAR_RUSTBORO_CITY_STATE, 3 - copyobjectxytoperm LOCALID_DEVON_EMPLOYEE + copyobjectxytoperm LOCALID_RUSTBORO_DEVON_EMPLOYEE msgbox RustboroCity_Text_HelpMeIWasRobbed, MSGBOX_DEFAULT releaseall end @ The below movement scripts are either partially or fully duplicated by the movement scripts when the player returns the goods RustboroCity_EventScript_EmployeeFacePlayerUp1:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return RustboroCity_EventScript_EmployeeFacePlayerLeft1:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceRight waitmovement 0 return RustboroCity_EventScript_EmployeeFacePlayerDown1:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return RustboroCity_EventScript_EmployeeApproachPlayerDown1:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -618,69 +611,69 @@ RustboroCity_EventScript_BagFull:: return RustboroCity_EventScript_EmployeeFacePlayerUp2:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return RustboroCity_EventScript_EmployeeFacePlayerLeft2:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterRight waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceLeft waitmovement 0 return RustboroCity_EventScript_EmployeeFacePlayerDown2:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return RustboroCity_EventScript_EmployeeApproachPlayerDown2:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return RustboroCity_EventScript_EmployeeFacePlayerRight:: - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_DEVON_EMPLOYEE, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 return RustboroCity_EventScript_Rival:: lockall call_if_unset FLAG_MET_RIVAL_RUSTBORO, RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_FacePlayer + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_FacePlayer waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -701,14 +694,14 @@ RustboroCity_EventScript_PlayBrendanMusic:: RustboroCity_EventScript_RivalTrigger0:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer0 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer0 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -717,14 +710,14 @@ RustboroCity_EventScript_RivalTrigger0:: RustboroCity_EventScript_RivalTrigger1:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer1 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer1 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -733,14 +726,14 @@ RustboroCity_EventScript_RivalTrigger1:: RustboroCity_EventScript_RivalTrigger2:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer2 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer2 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -749,14 +742,14 @@ RustboroCity_EventScript_RivalTrigger2:: RustboroCity_EventScript_RivalTrigger3:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer3 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer3 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -765,14 +758,14 @@ RustboroCity_EventScript_RivalTrigger3:: RustboroCity_EventScript_RivalTrigger4:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer4 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer4 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -781,14 +774,14 @@ RustboroCity_EventScript_RivalTrigger4:: RustboroCity_EventScript_RivalTrigger5:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer5 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer5 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -797,14 +790,14 @@ RustboroCity_EventScript_RivalTrigger5:: RustboroCity_EventScript_RivalTrigger6:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer6 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer6 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 @@ -813,14 +806,14 @@ RustboroCity_EventScript_RivalTrigger6:: RustboroCity_EventScript_RivalTrigger7:: lockall call RustboroCity_EventScript_PlayRivalMusic - applymovement LOCALID_RIVAL, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_WalkInPlaceFasterDown waitmovement 0 playse SE_PIN - applymovement LOCALID_RIVAL, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_RIVAL, Common_Movement_Delay48 + applymovement LOCALID_RUSTBORO_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_RIVAL, RustboroCity_Movement_RivalApproachPlayer7 + applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer7 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 diff --git a/data/maps/RustboroCity_DevonCorp_2F/map.json b/data/maps/RustboroCity_DevonCorp_2F/map.json index 3892ba40ae..70a5312f9f 100644 --- a/data/maps/RustboroCity_DevonCorp_2F/map.json +++ b/data/maps/RustboroCity_DevonCorp_2F/map.json @@ -67,6 +67,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FOSSIL_SCIENTIST", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 14, "y": 8, diff --git a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc index ba3a259ec3..bd796aab6f 100644 --- a/data/maps/RustboroCity_DevonCorp_2F/scripts.inc +++ b/data/maps/RustboroCity_DevonCorp_2F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_FOSSIL_SCIENTIST, 5 - RustboroCity_DevonCorp_2F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RustboroCity_DevonCorp_2F_OnTransition .byte 0 diff --git a/data/maps/RustboroCity_DevonCorp_3F/map.json b/data/maps/RustboroCity_DevonCorp_3F/map.json index 4ddb727185..ffe289e759 100644 --- a/data/maps/RustboroCity_DevonCorp_3F/map.json +++ b/data/maps/RustboroCity_DevonCorp_3F/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DEVON_CORP_3F_EMPLOYEE", "graphics_id": "OBJ_EVENT_GFX_MAN_2", "x": 3, "y": 5, diff --git a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc index ebf9044c54..aba43c575d 100644 --- a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc +++ b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_DEVON_EMPLOYEE, 2 - RustboroCity_DevonCorp_3F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RustboroCity_DevonCorp_3F_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, RustboroCity_DevonCorp_3F_OnWarp @@ -11,8 +9,8 @@ RustboroCity_DevonCorp_3F_OnTransition: end RustboroCity_DevonCorp_3F_EventScript_SetEmployeePos:: - setobjectxyperm LOCALID_DEVON_EMPLOYEE, 3, 2 - setobjectmovementtype LOCALID_DEVON_EMPLOYEE, MOVEMENT_TYPE_FACE_LEFT + setobjectxyperm LOCALID_DEVON_CORP_3F_EMPLOYEE, 3, 2 + setobjectmovementtype LOCALID_DEVON_CORP_3F_EMPLOYEE, MOVEMENT_TYPE_FACE_LEFT return RustboroCity_DevonCorp_3F_OnWarp: @@ -31,21 +29,21 @@ RustboroCity_DevonCorp_3F_EventScript_MeetPresident:: lockall msgbox RustboroCity_DevonCorp_3F_Text_ThisIs3rdFloorWaitHere, MSGBOX_DEFAULT closemessage - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeWalkOffscreen + applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeWalkOffscreen waitmovement 0 delay 80 - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeReturnToPlayer + applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeReturnToPlayer waitmovement 0 msgbox RustboroCity_DevonCorp_3F_Text_WordWithPresidentComeWithMe, MSGBOX_DEFAULT closemessage playbgm MUS_FOLLOW_ME, FALSE - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_LeadPlayerToPresident + applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_LeadPlayerToPresident applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerFollowToPresident waitmovement 0 msgbox RustboroCity_DevonCorp_3F_Text_PleaseGoAhead, MSGBOX_DEFAULT closemessage fadedefaultbgm - applymovement LOCALID_DEVON_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeFaceDesk + applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeFaceDesk applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerApproachDesk waitmovement 0 msgbox RustboroCity_DevonCorp_3F_Text_MrStoneIHaveFavor, MSGBOX_DEFAULT diff --git a/data/maps/RustboroCity_Flat1_2F/map.json b/data/maps/RustboroCity_Flat1_2F/map.json index bb87670627..5591c344ff 100644 --- a/data/maps/RustboroCity_Flat1_2F/map.json +++ b/data/maps/RustboroCity_Flat1_2F/map.json @@ -80,6 +80,7 @@ "flag": "0" }, { + "local_id": "LOCALID_WALDAS_DAD", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 8, "y": 5, diff --git a/data/maps/RustboroCity_Flat1_2F/scripts.inc b/data/maps/RustboroCity_Flat1_2F/scripts.inc index 8e972182c1..038dfbf746 100644 --- a/data/maps/RustboroCity_Flat1_2F/scripts.inc +++ b/data/maps/RustboroCity_Flat1_2F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_WALDAS_DAD, 6 - RustboroCity_Flat1_2F_MapScripts:: .byte 0 diff --git a/data/maps/RusturfTunnel/map.json b/data/maps/RusturfTunnel/map.json index ef07714add..9883ac306a 100644 --- a/data/maps/RusturfTunnel/map.json +++ b/data/maps/RusturfTunnel/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RUSTURF_TUNNEL_WANDAS_BF", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 23, "y": 5, @@ -67,6 +68,7 @@ "flag": "FLAG_ITEM_RUSTURF_TUNNEL_MAX_ETHER" }, { + "local_id": "LOCALID_RUSTURF_TUNNEL_BRINEY", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 5, "y": 4, @@ -80,6 +82,7 @@ "flag": "FLAG_HIDE_RUSTURF_TUNNEL_BRINEY" }, { + "local_id": "LOCALID_RUSTURF_TUNNEL_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 14, "y": 5, @@ -93,6 +96,7 @@ "flag": "FLAG_HIDE_RUSTURF_TUNNEL_AQUA_GRUNT" }, { + "local_id": "LOCALID_RUSTURF_TUNNEL_PEEKO", "graphics_id": "OBJ_EVENT_GFX_WINGULL", "x": 14, "y": 4, @@ -132,6 +136,7 @@ "flag": "0" }, { + "local_id": "LOCALID_RUSTURF_TUNNEL_WANDA", "graphics_id": "OBJ_EVENT_GFX_WOMAN_2", "x": 25, "y": 4, diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index a705100956..fd54568802 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -1,9 +1,3 @@ -.equ LOCALID_WANDAS_BF, 1 -.set LOCALID_BRINEY, 5 -.set LOCALID_GRUNT, 6 -.set LOCALID_PEEKO, 7 -.equ LOCALID_WANDA, 10 - RusturfTunnel_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, RusturfTunnel_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, RusturfTunnel_OnFrame @@ -19,8 +13,8 @@ RusturfTunnel_OnTransition: end RusturfTunnel_EventScript_SetAquaGruntAndPeekoPos:: - setobjectxyperm LOCALID_PEEKO, 13, 4 - setobjectxyperm LOCALID_GRUNT, 13, 5 + setobjectxyperm LOCALID_RUSTURF_TUNNEL_PEEKO, 13, 4 + setobjectxyperm LOCALID_RUSTURF_TUNNEL_GRUNT, 13, 5 return RusturfTunnel_EventScript_Wanda:: @@ -80,35 +74,35 @@ RusturfTunnel_EventScript_ClearTunnelScene:: RusturfTunnel_EventScript_BoyfriendApproachWanda1:: applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend1 - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda1 + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda1 waitmovement 0 return RusturfTunnel_EventScript_BoyfriendApproachWanda2:: applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda waitmovement 0 - applymovement LOCALID_WANDA, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTURF_TUNNEL_WANDA, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return RusturfTunnel_EventScript_BoyfriendApproachWanda3:: applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda waitmovement 0 - applymovement LOCALID_WANDA, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_RUSTURF_TUNNEL_WANDA, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return RusturfTunnel_EventScript_FaceWandasBoyfriend1:: - applymovement LOCALID_WANDAS_BF, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, Common_Movement_WalkInPlaceFasterUp waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return RusturfTunnel_EventScript_FaceWandasBoyfriend2:: - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_BoyfriendFaceRight + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendFaceRight waitmovement 0 return @@ -117,28 +111,28 @@ RusturfTunnel_EventScript_FaceWandasBoyfriend3:: RusturfTunnel_EventScript_WandasBoyfriendApproachPlayer:: closemessage - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendApproachPlayer + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendApproachPlayer waitmovement 0 return RusturfTunnel_EventScript_WandaAndBoyfriendExit1:: - applymovement LOCALID_WANDA, RusturfTunnel_Movement_WandaExit1 - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendExit1 + applymovement LOCALID_RUSTURF_TUNNEL_WANDA, RusturfTunnel_Movement_WandaExit1 + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendExit1 waitmovement 0 return RusturfTunnel_EventScript_WandaAndBoyfriendExit:: applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchWandaExit - applymovement LOCALID_WANDA, RusturfTunnel_Movement_WandaExit - applymovement LOCALID_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendExit + applymovement LOCALID_RUSTURF_TUNNEL_WANDA, RusturfTunnel_Movement_WandaExit + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendExit waitmovement 0 return RusturfTunnel_EventScript_WandasBoyfriendNotice:: playse SE_PIN - applymovement LOCALID_WANDAS_BF, Common_Movement_ExclamationMark + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_WANDAS_BF, Common_Movement_Delay48 + applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, Common_Movement_Delay48 waitmovement 0 return @@ -276,11 +270,11 @@ RusturfTunnel_EventScript_AquaGruntBackUp:: lockall msgbox RusturfTunnel_Text_ComeAndGetSome, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, RusturfTunnel_Movement_GruntAndPeekoBackUp - applymovement LOCALID_PEEKO, RusturfTunnel_Movement_GruntAndPeekoBackUp + applymovement LOCALID_RUSTURF_TUNNEL_GRUNT, RusturfTunnel_Movement_GruntAndPeekoBackUp + applymovement LOCALID_RUSTURF_TUNNEL_PEEKO, RusturfTunnel_Movement_GruntAndPeekoBackUp waitmovement 0 - copyobjectxytoperm LOCALID_GRUNT - copyobjectxytoperm LOCALID_PEEKO + copyobjectxytoperm LOCALID_RUSTURF_TUNNEL_GRUNT + copyobjectxytoperm LOCALID_RUSTURF_TUNNEL_PEEKO setvar VAR_RUSTURF_TUNNEL_STATE, 3 releaseall end @@ -311,18 +305,18 @@ RusturfTunnel_EventScript_Grunt:: giveitem ITEM_DEVON_GOODS closemessage applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PushPlayerAsideForGrunt - applymovement LOCALID_GRUNT, RusturfTunnel_Movement_GruntEscape + applymovement LOCALID_RUSTURF_TUNNEL_GRUNT, RusturfTunnel_Movement_GruntEscape waitmovement 0 - removeobject LOCALID_GRUNT + removeobject LOCALID_RUSTURF_TUNNEL_GRUNT delay 50 - addobject LOCALID_BRINEY - applymovement LOCALID_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko1 + addobject LOCALID_RUSTURF_TUNNEL_BRINEY + applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko1 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerMoveAsideForBriney - applymovement LOCALID_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko2 + applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko2 waitmovement 0 msgbox RusturfTunnel_Text_PeekoGladToSeeYouSafe, MSGBOX_DEFAULT - applymovement LOCALID_BRINEY, Common_Movement_FacePlayer + applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, Common_Movement_FacePlayer waitmovement 0 message RusturfTunnel_Text_ThankYouLetsGoHomePeeko waitmessage @@ -332,11 +326,11 @@ RusturfTunnel_EventScript_Grunt:: waitmoncry closemessage applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBrineyExit - applymovement LOCALID_BRINEY, RusturfTunnel_Movement_BrineyExit - applymovement LOCALID_PEEKO, RusturfTunnel_Movement_PeekoExit + applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyExit + applymovement LOCALID_RUSTURF_TUNNEL_PEEKO, RusturfTunnel_Movement_PeekoExit waitmovement 0 - removeobject LOCALID_BRINEY - removeobject LOCALID_PEEKO + removeobject LOCALID_RUSTURF_TUNNEL_BRINEY + removeobject LOCALID_RUSTURF_TUNNEL_PEEKO clearflag FLAG_DEVON_GOODS_STOLEN setflag FLAG_RECOVERED_DEVON_GOODS setvar VAR_RUSTBORO_CITY_STATE, 4 diff --git a/data/maps/SSTidalCorridor/map.json b/data/maps/SSTidalCorridor/map.json index 7a25d4450c..460359a82c 100644 --- a/data/maps/SSTidalCorridor/map.json +++ b/data/maps/SSTidalCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SS_TIDAL_EXIT_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 1, "y": 11, @@ -67,6 +68,7 @@ "flag": "FLAG_HIDE_SS_TIDAL_CORRIDOR_MR_BRINEY" }, { + "local_id": "LOCALID_SS_TIDAL_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 9, "y": 10, diff --git a/data/maps/SSTidalCorridor/scripts.inc b/data/maps/SSTidalCorridor/scripts.inc index 0d425889a7..d8012b113b 100644 --- a/data/maps/SSTidalCorridor/scripts.inc +++ b/data/maps/SSTidalCorridor/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_SAILOR, 1 -.set LOCALID_SCOTT, 5 - SSTidalCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, SSTidalCorridor_OnFrame .byte 0 @@ -188,20 +185,20 @@ SSTidalCorridor_EventScript_TrainerNotDefeated:: SSTidalCorridor_EventScript_ScottScene:: lockall - applymovement LOCALID_SCOTT, SSTidalCorridor_Movement_ScottApproachPlayer + applymovement LOCALID_SS_TIDAL_SCOTT, SSTidalCorridor_Movement_ScottApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox SSTidalCorridor_Text_ScottBattleFrontierInvite, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, SSTidalCorridor_Movement_PlayerWatchScottExit - applymovement LOCALID_SAILOR, SSTidalCorridor_Movement_SailorMoveForScott - applymovement LOCALID_SCOTT, SSTidalCorridor_Movement_ScottExit + applymovement LOCALID_SS_TIDAL_EXIT_SAILOR, SSTidalCorridor_Movement_SailorMoveForScott + applymovement LOCALID_SS_TIDAL_SCOTT, SSTidalCorridor_Movement_ScottExit waitmovement 0 playse SE_EXIT waitse - removeobject LOCALID_SCOTT - applymovement LOCALID_SAILOR, SSTidalCorridor_Movement_SailorReturn + removeobject LOCALID_SS_TIDAL_SCOTT + applymovement LOCALID_SS_TIDAL_EXIT_SAILOR, SSTidalCorridor_Movement_SailorReturn waitmovement 0 delay 30 setflag FLAG_MET_SCOTT_ON_SS_TIDAL diff --git a/data/maps/SafariZone_South/map.json b/data/maps/SafariZone_South/map.json index dee1e40629..4fffe8afb9 100644 --- a/data/maps/SafariZone_South/map.json +++ b/data/maps/SafariZone_South/map.json @@ -31,6 +31,7 @@ ], "object_events": [ { + "local_id": "LOCALID_SAFARI_EXIT_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "x": 32, "y": 34, diff --git a/data/maps/SafariZone_South/scripts.inc b/data/maps/SafariZone_South/scripts.inc index 6b4c774c2b..c839789511 100644 --- a/data/maps/SafariZone_South/scripts.inc +++ b/data/maps/SafariZone_South/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - SafariZone_South_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SafariZone_South_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, SafariZone_South_OnFrame @@ -13,9 +11,9 @@ SafariZone_South_EventScript_EnterSafariZone:: lockall applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerEnter waitmovement 0 - applymovement LOCALID_ATTENDANT, SafariZone_South_Movement_ExitAttendantBlockDoor + applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_ExitAttendantBlockDoor waitmovement 0 - setobjectxyperm LOCALID_ATTENDANT, 32, 34 + setobjectxyperm LOCALID_SAFARI_EXIT_ATTENDANT, 32, 34 setvar VAR_SAFARI_ZONE_STATE, 0 releaseall end @@ -25,7 +23,7 @@ SafariZone_South_OnTransition: end SafariZone_South_EventScript_SetExitAttendantAside:: - setobjectxyperm LOCALID_ATTENDANT, 31, 34 + setobjectxyperm LOCALID_SAFARI_EXIT_ATTENDANT, 31, 34 return SafariZone_South_Movement_PlayerEnter: @@ -74,7 +72,7 @@ SafariZone_South_EventScript_ExitEarly:: end SafariZone_South_EventScript_ExitEarlyNorth:: - applymovement LOCALID_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantNorth + applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantNorth waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerExitNorth waitmovement 0 @@ -82,7 +80,7 @@ SafariZone_South_EventScript_ExitEarlyNorth:: end SafariZone_South_EventScript_ExitEarlyEast:: - applymovement LOCALID_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantEast + applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantEast waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerExitEast waitmovement 0 diff --git a/data/maps/SeafloorCavern_Entrance/map.json b/data/maps/SeafloorCavern_Entrance/map.json index 5e88d71432..7968d7afe9 100644 --- a/data/maps/SeafloorCavern_Entrance/map.json +++ b/data/maps/SeafloorCavern_Entrance/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 10, "y": 2, diff --git a/data/maps/SeafloorCavern_Entrance/scripts.inc b/data/maps/SeafloorCavern_Entrance/scripts.inc index eec69e6f80..05bf490e7d 100644 --- a/data/maps/SeafloorCavern_Entrance/scripts.inc +++ b/data/maps/SeafloorCavern_Entrance/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_GRUNT, 1 - SeafloorCavern_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, SeafloorCavern_Entrance_OnResume .byte 0 @@ -14,9 +12,9 @@ SeafloorCavern_Entrance_EventScript_Grunt:: goto_if_eq VAR_HAS_TALKED_TO_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, 1, SeafloorCavern_Entrance_EventScript_GruntSpeechShort waitse playse SE_PIN - applymovement LOCALID_GRUNT, Common_Movement_ExclamationMark + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_GRUNT, Common_Movement_Delay48 + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_Delay48 waitmovement 0 delay 20 call_if_eq VAR_FACING, DIR_WEST, SeafloorCavern_Entrance_EventScript_GruntFacePlayerWest @@ -24,10 +22,10 @@ SeafloorCavern_Entrance_EventScript_Grunt:: call_if_eq VAR_FACING, DIR_NORTH, SeafloorCavern_Entrance_EventScript_GruntFacePlayerNorth delay 30 setvar VAR_HAS_TALKED_TO_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, 1 - copyobjectxytoperm LOCALID_GRUNT + copyobjectxytoperm LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT msgbox SeafloorCavern_Entrance_Text_HearMagmaNearMossdeep, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 releaseall end @@ -38,23 +36,23 @@ SeafloorCavern_Entrance_EventScript_GruntSpeechShort:: call_if_eq VAR_FACING, DIR_NORTH, SeafloorCavern_Entrance_EventScript_GruntFacePlayerNorth msgbox SeafloorCavern_Entrance_Text_HearMagmaNearMossdeepShort, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 releaseall end SeafloorCavern_Entrance_EventScript_GruntFacePlayerEast:: - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return SeafloorCavern_Entrance_EventScript_GruntFacePlayerWest:: - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return SeafloorCavern_Entrance_EventScript_GruntFacePlayerNorth:: - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return diff --git a/data/maps/SeafloorCavern_Room9/map.json b/data/maps/SeafloorCavern_Room9/map.json index 04fb621df1..241a53fe69 100644 --- a/data/maps/SeafloorCavern_Room9/map.json +++ b/data/maps/SeafloorCavern_Room9/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SEAFLOOR_CAVERN_KYOGRE", "graphics_id": "OBJ_EVENT_GFX_KYOGRE_FRONT", "x": 17, "y": 38, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_KYOGRE" }, { + "local_id": "LOCALID_SEAFLOOR_CAVERN_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 9, "y": 42, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_ARCHIE" }, { + "local_id": "LOCALID_SEAFLOOR_CAVERN_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 9, "y": 42, @@ -54,6 +57,7 @@ "flag": "FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAXIE" }, { + "local_id": "LOCALID_SEAFLOOR_CAVERN_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_M", "x": 8, "y": 41, @@ -67,6 +71,7 @@ "flag": "FLAG_HIDE_SEAFLOOR_CAVERN_ROOM_9_MAGMA_GRUNTS" }, { + "local_id": "LOCALID_SEAFLOOR_CAVERN_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_MAGMA_MEMBER_F", "x": 8, "y": 42, @@ -93,6 +98,7 @@ "flag": "FLAG_ITEM_SEAFLOOR_CAVERN_ROOM_9_TM_EARTHQUAKE" }, { + "local_id": "LOCALID_SEAFLOOR_CAVERN_KYOGRE_SLEEPING", "graphics_id": "OBJ_EVENT_GFX_KYOGRE_ASLEEP", "x": 17, "y": 38, diff --git a/data/maps/SeafloorCavern_Room9/scripts.inc b/data/maps/SeafloorCavern_Room9/scripts.inc index 63e6baf3c7..5e07275242 100644 --- a/data/maps/SeafloorCavern_Room9/scripts.inc +++ b/data/maps/SeafloorCavern_Room9/scripts.inc @@ -1,19 +1,12 @@ -.set LOCALID_KYOGRE, 1 -.set LOCALID_ARCHIE, 2 -.set LOCALID_MAXIE, 3 -.set LOCALID_GRUNT_1, 4 -.set LOCALID_GRUNT_2, 5 -.set LOCALID_KYOGRE_SLEEPING, 7 - SeafloorCavern_Room9_MapScripts:: .byte 0 SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: lockall - setvar VAR_0x8004, LOCALID_ARCHIE - setvar VAR_0x8005, LOCALID_MAXIE - setvar VAR_0x8006, LOCALID_GRUNT_1 - setvar VAR_0x8007, LOCALID_GRUNT_2 + setvar VAR_0x8004, LOCALID_SEAFLOOR_CAVERN_ARCHIE + setvar VAR_0x8005, LOCALID_SEAFLOOR_CAVERN_MAXIE + setvar VAR_0x8006, LOCALID_SEAFLOOR_CAVERN_GRUNT_1 + setvar VAR_0x8007, LOCALID_SEAFLOOR_CAVERN_GRUNT_2 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, SeafloorCavern_Room9_Movement_Delay32 @@ -55,11 +48,11 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 150 - removeobject LOCALID_KYOGRE_SLEEPING - addobject LOCALID_KYOGRE + removeobject LOCALID_SEAFLOOR_CAVERN_KYOGRE_SLEEPING + addobject LOCALID_SEAFLOOR_CAVERN_KYOGRE waitstate delay 60 - applymovement LOCALID_KYOGRE, SeafloorCavern_Room9_Movement_KyogreApproach + applymovement LOCALID_SEAFLOOR_CAVERN_KYOGRE, SeafloorCavern_Room9_Movement_KyogreApproach waitmovement 0 special FadeOutOrbEffect waitstate @@ -69,9 +62,9 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SeafloorCavern_Room9_Movement_KyogreExit + applymovement LOCALID_SEAFLOOR_CAVERN_KYOGRE, SeafloorCavern_Room9_Movement_KyogreExit waitmovement 0 - removeobject LOCALID_KYOGRE + removeobject LOCALID_SEAFLOOR_CAVERN_KYOGRE delay 4 setvar VAR_0x8004, 2 @ vertical pan setvar VAR_0x8005, 2 @ horizontal pan @@ -80,10 +73,10 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: special ShakeCamera waitstate delay 30 - setvar VAR_0x8004, LOCALID_ARCHIE - setvar VAR_0x8005, LOCALID_MAXIE - setvar VAR_0x8006, LOCALID_GRUNT_1 - setvar VAR_0x8007, LOCALID_GRUNT_2 + setvar VAR_0x8004, LOCALID_SEAFLOOR_CAVERN_ARCHIE + setvar VAR_0x8005, LOCALID_SEAFLOOR_CAVERN_MAXIE + setvar VAR_0x8006, LOCALID_SEAFLOOR_CAVERN_GRUNT_1 + setvar VAR_0x8007, LOCALID_SEAFLOOR_CAVERN_GRUNT_2 msgbox SeafloorCavern_Room9_Text_ArchieWhereDidKyogreGo, MSGBOX_DEFAULT playse SE_PC_LOGIN applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft diff --git a/data/maps/SkyPillar_Top/map.json b/data/maps/SkyPillar_Top/map.json index 4c7ea03d15..888e05805d 100644 --- a/data/maps/SkyPillar_Top/map.json +++ b/data/maps/SkyPillar_Top/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_RAYQUAZA_SLEEPING", "graphics_id": "OBJ_EVENT_GFX_RAYQUAZA", "x": 14, "y": 7, diff --git a/data/maps/SkyPillar_Top/scripts.inc b/data/maps/SkyPillar_Top/scripts.inc index 19cd7e4f42..8b2f1bcc9b 100644 --- a/data/maps/SkyPillar_Top/scripts.inc +++ b/data/maps/SkyPillar_Top/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_RAYQUAZA_SLEEPING, 1 - SkyPillar_Top_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, SkyPillar_Top_OnResume map_script MAP_SCRIPT_ON_TRANSITION, SkyPillar_Top_OnTransition diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index eb01d3c166..90835cef3b 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -31,6 +31,7 @@ ], "object_events": [ { + "local_id": "LOCALID_SLATEPORT_FAT_MAN", "graphics_id": "OBJ_EVENT_GFX_FAT_MAN", "x": 21, "y": 11, @@ -44,6 +45,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_MAN_1", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 34, "y": 29, @@ -57,6 +59,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_RICH_BOY", "graphics_id": "OBJ_EVENT_GFX_RICH_BOY", "x": 5, "y": 13, @@ -83,6 +86,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_F", "x": 31, "y": 27, @@ -96,6 +100,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_COOK", "graphics_id": "OBJ_EVENT_GFX_COOK", "x": 5, "y": 43, @@ -109,6 +114,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_OLD_WOMAN", "graphics_id": "OBJ_EVENT_GFX_OLD_WOMAN", "x": 20, "y": 37, @@ -122,6 +128,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_GIRL", "graphics_id": "OBJ_EVENT_GFX_GIRL_1", "x": 8, "y": 42, @@ -135,6 +142,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_TY", "graphics_id": "OBJ_EVENT_GFX_CAMERAMAN", "x": 29, "y": 13, @@ -148,6 +156,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY" }, { + "local_id": "LOCALID_SLATEPORT_GABBY", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 28, "y": 14, @@ -161,6 +170,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_GABBY_AND_TY" }, { + "local_id": "LOCALID_SLATEPORT_CAPT_STERN", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 28, "y": 13, @@ -252,6 +262,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 30, "y": 27, @@ -265,6 +276,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_3", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 29, "y": 27, @@ -357,6 +369,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_4", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 22, "y": 27, @@ -370,6 +383,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_5", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 23, "y": 27, @@ -383,6 +397,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_6", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 24, "y": 27, @@ -396,6 +411,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_7", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 21, "y": 26, @@ -409,6 +425,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_8", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 20, "y": 26, @@ -422,6 +439,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_9", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 26, "y": 27, @@ -448,6 +466,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_TEAM_AQUA" }, { + "local_id": "LOCALID_SLATEPORT_GRUNT_11", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 25, "y": 27, @@ -474,6 +493,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 10, "y": 12, diff --git a/data/maps/SlateportCity/scripts.inc b/data/maps/SlateportCity/scripts.inc index ae3910750e..bfbd428732 100644 --- a/data/maps/SlateportCity/scripts.inc +++ b/data/maps/SlateportCity/scripts.inc @@ -1,26 +1,3 @@ -.set LOCALID_FAT_MAN, 1 -.set LOCALID_MAN_1, 2 -.set LOCALID_RICH_BOY, 3 -.set LOCALID_GRUNT_1, 5 -.set LOCALID_COOK, 6 -.set LOCALID_OLD_WOMAN, 7 -.set LOCALID_GIRL, 8 -.set LOCALID_TY, 9 -.set LOCALID_GABBY, 10 -.set LOCALID_CAPT_STERN, 11 -.set LOCALID_GRUNT_2, 18 -.set LOCALID_GRUNT_3, 19 -.set LOCALID_GRUNT_4, 26 -.set LOCALID_GRUNT_5, 27 -.set LOCALID_GRUNT_6, 28 -.set LOCALID_GRUNT_7, 29 -.set LOCALID_GRUNT_8, 30 -.set LOCALID_GRUNT_9, 31 -.set LOCALID_GRUNT_11, 33 -.set LOCALID_SCOTT, 35 - -@ Note: LOCALID_SLATEPORT_ENERGY_GURU is a local id for this map used elsewhere. It's defined in event_objects.h - SlateportCity_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SlateportCity_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, SlateportCity_OnFrame @@ -40,33 +17,33 @@ SlateportCity_EventScript_EnterSlateport:: return SlateportCity_EventScript_MovePeopleForSternInterview:: - setobjectxyperm LOCALID_CAPT_STERN, 28, 13 - setobjectxyperm LOCALID_OLD_WOMAN, 25, 13 - setobjectxyperm LOCALID_RICH_BOY, 25, 14 - setobjectxyperm LOCALID_COOK, 27, 16 - setobjectxyperm LOCALID_GIRL, 28, 16 - setobjectxyperm LOCALID_FAT_MAN, 29, 16 - setobjectxyperm LOCALID_MAN_1, 31, 14 - setobjectmovementtype LOCALID_CAPT_STERN, MOVEMENT_TYPE_FACE_DOWN - setobjectmovementtype LOCALID_OLD_WOMAN, MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT - setobjectmovementtype LOCALID_RICH_BOY, MOVEMENT_TYPE_FACE_UP_AND_RIGHT - setobjectmovementtype LOCALID_COOK, MOVEMENT_TYPE_FACE_UP - setobjectmovementtype LOCALID_GIRL, MOVEMENT_TYPE_FACE_UP - setobjectmovementtype LOCALID_FAT_MAN, MOVEMENT_TYPE_FACE_UP - setobjectmovementtype LOCALID_MAN_1, MOVEMENT_TYPE_FACE_LEFT + setobjectxyperm LOCALID_SLATEPORT_CAPT_STERN, 28, 13 + setobjectxyperm LOCALID_SLATEPORT_OLD_WOMAN, 25, 13 + setobjectxyperm LOCALID_SLATEPORT_RICH_BOY, 25, 14 + setobjectxyperm LOCALID_SLATEPORT_COOK, 27, 16 + setobjectxyperm LOCALID_SLATEPORT_GIRL, 28, 16 + setobjectxyperm LOCALID_SLATEPORT_FAT_MAN, 29, 16 + setobjectxyperm LOCALID_SLATEPORT_MAN_1, 31, 14 + setobjectmovementtype LOCALID_SLATEPORT_CAPT_STERN, MOVEMENT_TYPE_FACE_DOWN + setobjectmovementtype LOCALID_SLATEPORT_OLD_WOMAN, MOVEMENT_TYPE_FACE_DOWN_AND_RIGHT + setobjectmovementtype LOCALID_SLATEPORT_RICH_BOY, MOVEMENT_TYPE_FACE_UP_AND_RIGHT + setobjectmovementtype LOCALID_SLATEPORT_COOK, MOVEMENT_TYPE_FACE_UP + setobjectmovementtype LOCALID_SLATEPORT_GIRL, MOVEMENT_TYPE_FACE_UP + setobjectmovementtype LOCALID_SLATEPORT_FAT_MAN, MOVEMENT_TYPE_FACE_UP + setobjectmovementtype LOCALID_SLATEPORT_MAN_1, MOVEMENT_TYPE_FACE_LEFT return SlateportCity_EventScript_SetReadyForScottScene:: setflag FLAG_HIDE_MAP_NAME_POPUP getplayerxy VAR_0x8004, VAR_0x8005 goto_if_eq VAR_0x8004, 30, SlateportCity_EventScript_MoveScottLeft - setobjectxyperm LOCALID_SCOTT, 23, 27 - setobjectmovementtype LOCALID_SCOTT, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SLATEPORT_SCOTT, 23, 27 + setobjectmovementtype LOCALID_SLATEPORT_SCOTT, MOVEMENT_TYPE_FACE_RIGHT return SlateportCity_EventScript_MoveScottLeft:: - setobjectxyperm LOCALID_SCOTT, 22, 27 - setobjectmovementtype LOCALID_SCOTT, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_SLATEPORT_SCOTT, 22, 27 + setobjectmovementtype LOCALID_SLATEPORT_SCOTT, MOVEMENT_TYPE_FACE_RIGHT return SlateportCity_OnFrame: @@ -75,17 +52,17 @@ SlateportCity_OnFrame: SlateportCity_EventScript_ScottScene:: lockall - addobject LOCALID_SCOTT + addobject LOCALID_SLATEPORT_SCOTT applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerFaceScott - applymovement LOCALID_SCOTT, SlateportCity_Movement_ScottApproachPlayer + applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottApproachPlayer waitmovement 0 msgbox SlateportCity_Text_YouDroveTeamAquaAway, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SLATEPORT_SCOTT, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 delay 60 msgbox SlateportCity_Text_MaybeThisTrainer, MSGBOX_DEFAULT - applymovement LOCALID_SCOTT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SLATEPORT_SCOTT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox SlateportCity_Text_LetsRegisterEachOther, MSGBOX_DEFAULT closemessage @@ -98,11 +75,11 @@ SlateportCity_EventScript_ScottScene:: setflag FLAG_ENABLE_SCOTT_MATCH_CALL msgbox SlateportCity_Text_KeepEyeOnTrainersBeSeeingYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCOTT, SlateportCity_Movement_ScottExit + applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottExit waitmovement 0 - removeobject LOCALID_SCOTT - setobjectxyperm LOCALID_SCOTT, 10, 12 - setobjectmovementtype LOCALID_SCOTT, MOVEMENT_TYPE_FACE_DOWN + removeobject LOCALID_SLATEPORT_SCOTT + setobjectxyperm LOCALID_SLATEPORT_SCOTT, 10, 12 + setobjectmovementtype LOCALID_SLATEPORT_SCOTT, MOVEMENT_TYPE_FACE_DOWN clearflag FLAG_HIDE_MAP_NAME_POPUP setvar VAR_SLATEPORT_OUTSIDE_MUSEUM_STATE, 2 addvar VAR_SCOTT_STATE, 1 @@ -372,7 +349,7 @@ SlateportCity_EventScript_AquaGrunt1:: faceplayer msgbox SlateportCity_Text_QuitPushing, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_1, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -382,7 +359,7 @@ SlateportCity_EventScript_AquaGrunt2:: faceplayer msgbox SlateportCity_Text_AquaHasPolicy, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_2, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -392,7 +369,7 @@ SlateportCity_EventScript_AquaGrunt3:: faceplayer msgbox SlateportCity_Text_BossIsBrilliant, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_3, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_3, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -402,7 +379,7 @@ SlateportCity_EventScript_AquaGrunt4:: faceplayer msgbox SlateportCity_Text_WhatsNewSchemeIWonder, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_4, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_4, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -412,7 +389,7 @@ SlateportCity_EventScript_AquaGrunt5:: faceplayer msgbox SlateportCity_Text_ShouldTakeItAll, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_5, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_5, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -422,7 +399,7 @@ SlateportCity_EventScript_AquaGrunt6:: faceplayer msgbox SlateportCity_Text_DontButtIn, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_6, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_6, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -432,7 +409,7 @@ SlateportCity_EventScript_AquaGrunt7:: faceplayer msgbox SlateportCity_Text_RemindsMeOfLongLineForGames, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_7, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_7, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -442,7 +419,7 @@ SlateportCity_EventScript_AquaGrunt8:: faceplayer msgbox SlateportCity_Text_WhyAreWeLiningUp, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_8, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_8, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -451,31 +428,31 @@ SlateportCity_EventScript_AquaGrunt9:: lock faceplayer playse SE_PIN - applymovement LOCALID_GRUNT_9, Common_Movement_ExclamationMark + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_GRUNT_9, Common_Movement_Delay48 + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_Delay48 waitmovement 0 msgbox SlateportCity_Text_WhatDoYouWant, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_9, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_FaceOriginalDirection waitmovement 0 - applymovement LOCALID_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt + applymovement LOCALID_SLATEPORT_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt waitmovement 0 - applymovement LOCALID_GRUNT_9, Common_Movement_FacePlayer + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_FacePlayer waitmovement 0 msgbox SlateportCity_Text_IllReadSignForYou, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_9, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_FaceOriginalDirection waitmovement 0 - applymovement LOCALID_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt + applymovement LOCALID_SLATEPORT_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt waitmovement 0 msgbox SlateportCity_Text_SaysSomethingLikeSeaIsEndless, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_9, Common_Movement_FacePlayer + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_FacePlayer waitmovement 0 - applymovement LOCALID_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt + applymovement LOCALID_SLATEPORT_GRUNT_9, SlateportCity_Movement_DelayAquaGrunt waitmovement 0 - applymovement LOCALID_GRUNT_9, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_9, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -494,7 +471,7 @@ SlateportCity_EventScript_AquaGrunt11:: faceplayer msgbox SlateportCity_Text_HotSpringsAfterOperation, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_11, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SLATEPORT_GRUNT_11, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -578,48 +555,48 @@ SlateportCity_EventScript_CaptStern:: msgbox SlateportCity_Text_SternMoveAheadWithExploration, MSGBOX_DEFAULT msgbox SlateportCity_Text_GabbyWonderfulThanksForInterview, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GABBY, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SLATEPORT_GABBY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 10 - applymovement LOCALID_TY, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SLATEPORT_TY, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 25 - applymovement LOCALID_CAPT_STERN, SlateportCity_Movement_SternWatchGabbyAndTyExit + applymovement LOCALID_SLATEPORT_CAPT_STERN, SlateportCity_Movement_SternWatchGabbyAndTyExit applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerFaceStern - applymovement LOCALID_GABBY, SlateportCity_Movement_GabbyExit - applymovement LOCALID_TY, SlateportCity_Movement_TyExit + applymovement LOCALID_SLATEPORT_GABBY, SlateportCity_Movement_GabbyExit + applymovement LOCALID_SLATEPORT_TY, SlateportCity_Movement_TyExit waitmovement 0 - removeobject LOCALID_GABBY - removeobject LOCALID_TY + removeobject LOCALID_SLATEPORT_GABBY + removeobject LOCALID_SLATEPORT_TY msgbox SlateportCity_Text_SternWhewFirstInterview, MSGBOX_DEFAULT - applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SLATEPORT_CAPT_STERN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox SlateportCity_Text_OhPlayerWeMadeDiscovery, MSGBOX_DEFAULT playbgm MUS_ENCOUNTER_AQUA, FALSE msgbox SlateportCity_Text_AquaWillAssumeControlOfSubmarine, MSGBOX_DEFAULT - applymovement LOCALID_COOK, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_FAT_MAN, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_OLD_WOMAN, SlateportCity_Movement_OldWomanConcern - applymovement LOCALID_RICH_BOY, Common_Movement_QuestionMark - applymovement LOCALID_MAN_1, SlateportCity_Movement_ManConcern + applymovement LOCALID_SLATEPORT_COOK, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SLATEPORT_FAT_MAN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SLATEPORT_OLD_WOMAN, SlateportCity_Movement_OldWomanConcern + applymovement LOCALID_SLATEPORT_RICH_BOY, Common_Movement_QuestionMark + applymovement LOCALID_SLATEPORT_MAN_1, SlateportCity_Movement_ManConcern waitmovement 0 - applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SLATEPORT_CAPT_STERN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox SlateportCity_Text_SternWhatWasAllThat, MSGBOX_DEFAULT playse SE_PIN - applymovement LOCALID_CAPT_STERN, Common_Movement_ExclamationMark + applymovement LOCALID_SLATEPORT_CAPT_STERN, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_CAPT_STERN, Common_Movement_Delay48 + applymovement LOCALID_SLATEPORT_CAPT_STERN, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SLATEPORT_CAPT_STERN, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox SlateportCity_Text_FromHarborTryingToTakeSub, MSGBOX_DEFAULT msgbox SlateportCity_Text_PleaseComeWithMe, MSGBOX_DEFAULT closemessage - applymovement LOCALID_CAPT_STERN, SlateportCity_Movement_SternEnterHarbor + applymovement LOCALID_SLATEPORT_CAPT_STERN, SlateportCity_Movement_SternEnterHarbor applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerEnterHarbor waitmovement 0 - removeobject LOCALID_CAPT_STERN + removeobject LOCALID_SLATEPORT_CAPT_STERN clearflag FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN clearflag FLAG_HIDE_SLATEPORT_CITY_HARBOR_SUBMARINE_SHADOW clearflag FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT @@ -899,18 +876,18 @@ SlateportCity_EventScript_ScottBattleTentScene:: waitmovement 0 opendoor 10, 12 waitdooranim - addobject LOCALID_SCOTT + addobject LOCALID_SLATEPORT_SCOTT applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PushPlayerDown - applymovement LOCALID_SCOTT, SlateportCity_Movement_ScottExitBattleTent + applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottExitBattleTent waitmovement 0 closedoor 10, 12 waitdooranim msgbox SlateportCity_Text_TakingBattleTentChallenge, MSGBOX_DEFAULT closemessage applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerWatchScottExit - applymovement LOCALID_SCOTT, SlateportCity_Movement_ScottExitAfterBattleTent + applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottExitAfterBattleTent waitmovement 0 - removeobject LOCALID_SCOTT + removeobject LOCALID_SLATEPORT_SCOTT addvar VAR_SCOTT_STATE, 1 setvar VAR_SLATEPORT_OUTSIDE_MUSEUM_STATE, 3 releaseall diff --git a/data/maps/SlateportCity_Harbor/map.json b/data/maps/SlateportCity_Harbor/map.json index 05fe77c61c..11b530cd1e 100644 --- a/data/maps/SlateportCity_Harbor/map.json +++ b/data/maps/SlateportCity_Harbor/map.json @@ -54,6 +54,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS" }, { + "local_id": "LOCALID_SLATEPORT_HARBOR_CAPT_STERN", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 6, "y": 13, @@ -67,6 +68,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN" }, { + "local_id": "LOCALID_SLATEPORT_HARBOR_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 8, "y": 9, @@ -80,6 +82,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_HARBOR_SS_TIDAL" }, { + "local_id": "LOCALID_SLATEPORT_HARBOR_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 7, "y": 10, @@ -93,6 +96,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_HARBOR_AQUA_GRUNT" }, { + "local_id": "LOCALID_SLATEPORT_HARBOR_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 8, "y": 10, @@ -106,6 +110,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_HARBOR_ARCHIE" }, { + "local_id": "LOCALID_SLATEPORT_HARBOR_SUBMARINE", "graphics_id": "OBJ_EVENT_GFX_SUBMARINE_SHADOW", "x": 7, "y": 9, diff --git a/data/maps/SlateportCity_Harbor/scripts.inc b/data/maps/SlateportCity_Harbor/scripts.inc index b2a71f2b7c..ca90fa897e 100644 --- a/data/maps/SlateportCity_Harbor/scripts.inc +++ b/data/maps/SlateportCity_Harbor/scripts.inc @@ -1,9 +1,3 @@ -.set LOCALID_CAPT_STERN, 4 -.set LOCALID_SS_TIDAL, 5 -.set LOCALID_GRUNT, 6 -.set LOCALID_ARCHIE, 7 -.set LOCALID_SUBMARINE, 8 - SlateportCity_Harbor_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SlateportCity_Harbor_OnTransition .byte 0 @@ -21,8 +15,8 @@ SlateportCity_Harbor_EventScript_ShowSSTidal:: SlateportCity_Harbor_EventScript_ReadyAquaEscapeScene:: savebgm MUS_ENCOUNTER_AQUA - setobjectxyperm LOCALID_CAPT_STERN, 12, 13 - setobjectmovementtype LOCALID_CAPT_STERN, MOVEMENT_TYPE_FACE_LEFT + setobjectxyperm LOCALID_SLATEPORT_HARBOR_CAPT_STERN, 12, 13 + setobjectmovementtype LOCALID_SLATEPORT_HARBOR_CAPT_STERN, MOVEMENT_TYPE_FACE_LEFT setflag FLAG_HIDE_SLATEPORT_CITY_HARBOR_PATRONS return @@ -53,20 +47,20 @@ SlateportCity_Harbor_EventScript_AquaEscapeTrigger3:: end SlateportCity_Harbor_EventScript_AquaEscapeScene:: - applymovement LOCALID_ARCHIE, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SLATEPORT_HARBOR_ARCHIE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 - applymovement LOCALID_GRUNT, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_SLATEPORT_HARBOR_GRUNT, Common_Movement_WalkInPlaceFasterDown applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox SlateportCity_Harbor_Text_ArchieYouAgainHideoutInLilycove, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT, SlateportCity_Harbor_Movement_AquaBoardSub - applymovement LOCALID_ARCHIE, SlateportCity_Harbor_Movement_AquaBoardSub - applymovement LOCALID_SUBMARINE, SlateportCity_Harbor_Movement_SubmarineExit + applymovement LOCALID_SLATEPORT_HARBOR_GRUNT, SlateportCity_Harbor_Movement_AquaBoardSub + applymovement LOCALID_SLATEPORT_HARBOR_ARCHIE, SlateportCity_Harbor_Movement_AquaBoardSub + applymovement LOCALID_SLATEPORT_HARBOR_SUBMARINE, SlateportCity_Harbor_Movement_SubmarineExit waitmovement 0 - removeobject LOCALID_GRUNT - removeobject LOCALID_ARCHIE - removeobject LOCALID_SUBMARINE + removeobject LOCALID_SLATEPORT_HARBOR_GRUNT + removeobject LOCALID_SLATEPORT_HARBOR_ARCHIE + removeobject LOCALID_SLATEPORT_HARBOR_SUBMARINE setvar VAR_SLATEPORT_HARBOR_STATE, 2 setflag FLAG_MET_TEAM_AQUA_HARBOR setflag FLAG_HIDE_LILYCOVE_MOTEL_SCOTT @@ -78,27 +72,27 @@ SlateportCity_Harbor_EventScript_AquaEscapeScene:: closemessage setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_1_BLOCKING_ENTRANCE setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_2_BLOCKING_ENTRANCE - copyobjectxytoperm LOCALID_CAPT_STERN - setobjectmovementtype LOCALID_CAPT_STERN, MOVEMENT_TYPE_FACE_RIGHT + copyobjectxytoperm LOCALID_SLATEPORT_HARBOR_CAPT_STERN + setobjectmovementtype LOCALID_SLATEPORT_HARBOR_CAPT_STERN, MOVEMENT_TYPE_FACE_RIGHT releaseall end SlateportCity_Harbor_EventScript_SternApproachPlayer0:: - applymovement LOCALID_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer0 + applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer0 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SlateportCity_Harbor_EventScript_SternApproachPlayer1:: - applymovement LOCALID_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer1 + applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer1 waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return SlateportCity_Harbor_EventScript_SternApproachPlayer:: - applymovement LOCALID_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer + applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -235,7 +229,7 @@ SlateportCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_EAST, SlateportCity_Harbor_EventScript_BoardFerryEast delay 30 hideobjectat OBJ_EVENT_ID_PLAYER, 0 - setvar VAR_0x8004, LOCALID_SS_TIDAL + setvar VAR_0x8004, LOCALID_SLATEPORT_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/map.json b/data/maps/SlateportCity_OceanicMuseum_1F/map.json index fd3468a52d..14d6b0583d 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/map.json +++ b/data/maps/SlateportCity_OceanicMuseum_1F/map.json @@ -171,6 +171,7 @@ "flag": "FLAG_HIDE_SLATEPORT_MUSEUM_POPULATION" }, { + "local_id": "LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 9, "y": 4, diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc index 8b464f73ae..5c0244288a 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_FAMILIAR_GRUNT, 13 - SlateportCity_OceanicMuseum_1F_MapScripts:: .byte 0 @@ -146,9 +144,9 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGrunt:: faceplayer delay 8 playse SE_PIN - applymovement LOCALID_FAMILIAR_GRUNT, Common_Movement_ExclamationMark + applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_FAMILIAR_GRUNT, Common_Movement_Delay48 + applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, Common_Movement_Delay48 waitmovement 0 msgbox SlateportCity_OceanicMuseum_1F_Text_RememberMeTakeThis, MSGBOX_DEFAULT giveitem ITEM_TM_THIEF @@ -164,20 +162,20 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGrunt:: SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitNorth:: applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitNorth - applymovement LOCALID_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExitNorth + applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExitNorth waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited end SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitSouth:: - applymovement LOCALID_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExit + applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExit waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited end SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitWestEast:: applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitWestEast - applymovement LOCALID_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExit + applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExit waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited end @@ -185,7 +183,7 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitWestEast:: SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited:: setflag FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_FAMILIAR_AQUA_GRUNT playse SE_EXIT - removeobject LOCALID_FAMILIAR_GRUNT + removeobject LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT release end diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/map.json b/data/maps/SlateportCity_OceanicMuseum_2F/map.json index bab9c1ea58..7ada1f8ac1 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/map.json +++ b/data/maps/SlateportCity_OceanicMuseum_2F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_OCEANIC_MUSEUM_2F_CAPT_STERN", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 13, "y": 6, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_CAPTAIN_STERN" }, { + "local_id": "LOCALID_OCEANIC_MUSEUM_2F_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 6, "y": 1, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_ARCHIE" }, { + "local_id": "LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 6, "y": 1, @@ -54,6 +57,7 @@ "flag": "FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_2F_AQUA_GRUNT_1" }, { + "local_id": "LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2", "graphics_id": "OBJ_EVENT_GFX_AQUA_MEMBER_M", "x": 6, "y": 1, diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc index 59131fd7ee..95f7cdec7d 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_CAPT_STERN, 1 -.set LOCALID_ARCHIE, 2 -.set LOCALID_GRUNT_1, 3 -.set LOCALID_GRUNT_2, 4 - SlateportCity_OceanicMuseum_2F_MapScripts:: .byte 0 @@ -12,14 +7,14 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: msgbox SlateportCity_OceanicMuseum_2F_Text_ThankYouForTheParts, MSGBOX_DEFAULT closemessage playbgm MUS_ENCOUNTER_AQUA, TRUE - addobject LOCALID_GRUNT_1 - applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntEnter + addobject LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1 + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntEnter waitmovement 0 - addobject LOCALID_GRUNT_2 - applymovement LOCALID_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_SecondGruntEnter + addobject LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2 + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_SecondGruntEnter waitmovement 0 - applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntApproach - applymovement LOCALID_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_SecondGruntApproach + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_FirstGruntApproach + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_SecondGruntApproach waitmovement 0 call_if_eq VAR_FACING, DIR_SOUTH, SlateportCity_OceanicMuseum_2F_EventScript_PlayerFaceGrunts call_if_eq VAR_FACING, DIR_EAST, SlateportCity_OceanicMuseum_2F_EventScript_PlayerFaceGrunts @@ -28,43 +23,43 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: msgbox SlateportCity_OceanicMuseum_2F_Text_SternWhoAreYou, MSGBOX_DEFAULT msgbox SlateportCity_OceanicMuseum_2F_Text_WereTeamAqua, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntApproachToBattle + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntApproachToBattle waitmovement 0 call_if_eq VAR_FACING, DIR_SOUTH, SlateportCity_OceanicMuseum_2F_EventScript_PlayerApproachGruntSouth call_if_eq VAR_FACING, DIR_WEST, SlateportCity_OceanicMuseum_2F_EventScript_PlayerApproachGruntWest trainerbattle_no_intro TRAINER_GRUNT_MUSEUM_1, SlateportCity_OceanicMuseum_2F_Text_Grunt1Defeat msgbox SlateportCity_OceanicMuseum_2F_Text_BossGoingToBeFurious, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntDefeated + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntDefeated waitmovement 0 - applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_GruntApproachToBattle + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_GruntApproachToBattle waitmovement 0 msgbox SlateportCity_OceanicMuseum_2F_Text_LetMeTakeCareOfThis, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_MUSEUM_2, SlateportCity_OceanicMuseum_2F_Text_Grunt2Defeat - applymovement LOCALID_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_GruntDefeated + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1, SlateportCity_OceanicMuseum_2F_Movement_GruntDefeated waitmovement 0 - applymovement LOCALID_GRUNT_1, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_GRUNT_2, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox SlateportCity_OceanicMuseum_2F_Text_MeddlingKid, MSGBOX_DEFAULT closemessage delay 35 - addobject LOCALID_ARCHIE - applymovement LOCALID_ARCHIE, SlateportCity_OceanicMuseum_2F_Movement_ArchieEnter - applymovement LOCALID_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntMoveForArchie + addobject LOCALID_OCEANIC_MUSEUM_2F_ARCHIE + applymovement LOCALID_OCEANIC_MUSEUM_2F_ARCHIE, SlateportCity_OceanicMuseum_2F_Movement_ArchieEnter + applymovement LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2, SlateportCity_OceanicMuseum_2F_Movement_GruntMoveForArchie waitmovement 0 msgbox SlateportCity_OceanicMuseum_2F_Text_CameToSeeWhatsTakingSoLong, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ARCHIE, SlateportCity_OceanicMuseum_2F_Movement_ArchieApproachPlayer + applymovement LOCALID_OCEANIC_MUSEUM_2F_ARCHIE, SlateportCity_OceanicMuseum_2F_Movement_ArchieApproachPlayer waitmovement 0 msgbox SlateportCity_OceanicMuseum_2F_Text_ArchieWarning, MSGBOX_DEFAULT closemessage savebgm MUS_DUMMY fadedefaultbgm fadescreen FADE_TO_BLACK - removeobject LOCALID_ARCHIE - removeobject LOCALID_GRUNT_1 - removeobject LOCALID_GRUNT_2 + removeobject LOCALID_OCEANIC_MUSEUM_2F_ARCHIE + removeobject LOCALID_OCEANIC_MUSEUM_2F_GRUNT_1 + removeobject LOCALID_OCEANIC_MUSEUM_2F_GRUNT_2 fadescreen FADE_FROM_BLACK delay 30 setflag FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS @@ -79,7 +74,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: playfanfare MUS_HEAL waitfanfare special HealPlayerParty - removeobject LOCALID_CAPT_STERN + removeobject LOCALID_OCEANIC_MUSEUM_2F_CAPT_STERN setflag FLAG_HIDE_ROUTE_110_TEAM_AQUA call_if_eq VAR_REGISTER_BIRCH_STATE, 0, SlateportCity_OceanicMuseum_2F_EventScript_ReadyRegisterBirch setflag FLAG_DELIVERED_DEVON_GOODS @@ -100,7 +95,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_PlayerFaceGrunts:: return SlateportCity_OceanicMuseum_2F_EventScript_SternFaceGrunts:: - applymovement LOCALID_CAPT_STERN, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_OCEANIC_MUSEUM_2F_CAPT_STERN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/maps/SlateportCity_SternsShipyard_1F/map.json b/data/maps/SlateportCity_SternsShipyard_1F/map.json index 4414fcfb12..cd5bd174aa 100644 --- a/data/maps/SlateportCity_SternsShipyard_1F/map.json +++ b/data/maps/SlateportCity_SternsShipyard_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DOCK", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 5, "y": 5, diff --git a/data/maps/SlateportCity_SternsShipyard_1F/scripts.inc b/data/maps/SlateportCity_SternsShipyard_1F/scripts.inc index 8b4a4de54a..cf2752fd2c 100644 --- a/data/maps/SlateportCity_SternsShipyard_1F/scripts.inc +++ b/data/maps/SlateportCity_SternsShipyard_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_DOCK, 1 - SlateportCity_SternsShipyard_1F_MapScripts:: .byte 0 diff --git a/data/maps/SootopolisCity/map.json b/data/maps/SootopolisCity/map.json index a436d72cb3..d1d9242a57 100644 --- a/data/maps/SootopolisCity/map.json +++ b/data/maps/SootopolisCity/map.json @@ -15,6 +15,7 @@ "connections": [], "object_events": [ { + "local_id": "LOCALID_SOOTOPOLIS_EXPERT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 31, "y": 18, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SOOTOPOLIS_WOMAN_2", "graphics_id": "OBJ_EVENT_GFX_WOMAN_4", "x": 47, "y": 33, @@ -41,6 +43,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS" }, { + "local_id": "LOCALID_KIRI", "graphics_id": "OBJ_EVENT_GFX_GIRL_2", "x": 9, "y": 43, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SOOTOPOLIS_NINJA_BOY", "graphics_id": "OBJ_EVENT_GFX_NINJA_BOY", "x": 51, "y": 14, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SOOTOPOLIS_BOY_1", "graphics_id": "OBJ_EVENT_GFX_BOY_1", "x": 43, "y": 26, @@ -93,6 +98,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_MAN_1" }, { + "local_id": "LOCALID_SOOTOPOLIS_STEVEN", "graphics_id": "OBJ_EVENT_GFX_STEVEN", "x": 20, "y": 36, @@ -106,6 +112,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_STEVEN" }, { + "local_id": "LOCALID_SOOTOPOLIS_WOMAN_1", "graphics_id": "OBJ_EVENT_GFX_WOMAN_5", "x": 49, "y": 34, @@ -119,6 +126,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SOOTOPOLIS_GROUDON", "graphics_id": "OBJ_EVENT_GFX_GROUDON_SIDE", "x": 28, "y": 44, @@ -132,6 +140,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_GROUDON" }, { + "local_id": "LOCALID_SOOTOPOLIS_KYOGRE", "graphics_id": "OBJ_EVENT_GFX_KYOGRE_SIDE", "x": 34, "y": 44, @@ -145,6 +154,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_KYOGRE" }, { + "local_id": "LOCALID_SOOTOPOLIS_RAYQUAZA", "graphics_id": "OBJ_EVENT_GFX_RAYQUAZA", "x": 31, "y": 41, @@ -158,6 +168,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RAYQUAZA" }, { + "local_id": "LOCALID_SOOTOPOLIS_MANIAC", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 17, "y": 44, @@ -171,6 +182,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS" }, { + "local_id": "LOCALID_SOOTOPOLIS_GIRL", "graphics_id": "OBJ_EVENT_GFX_GIRL_3", "x": 14, "y": 42, @@ -184,6 +196,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS" }, { + "local_id": "LOCALID_SOOTOPOLIS_BLACK_BELT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 17, "y": 40, @@ -197,6 +210,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS" }, { + "local_id": "LOCALID_SOOTOPOLIS_BOY_2", "graphics_id": "OBJ_EVENT_GFX_BOY_2", "x": 19, "y": 37, @@ -210,6 +224,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_RESIDENTS" }, { + "local_id": "LOCALID_SOOTOPOLIS_MAXIE", "graphics_id": "OBJ_EVENT_GFX_MAXIE", "x": 29, "y": 33, @@ -223,6 +238,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_MAXIE" }, { + "local_id": "LOCALID_SOOTOPOLIS_ARCHIE", "graphics_id": "OBJ_EVENT_GFX_ARCHIE", "x": 31, "y": 33, @@ -236,6 +252,7 @@ "flag": "FLAG_HIDE_SOOTOPOLIS_CITY_ARCHIE" }, { + "local_id": "LOCALID_SOOTOPOLIS_WALLACE", "graphics_id": "OBJ_EVENT_GFX_WALLACE", "x": 31, "y": 18, diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 16e2d03252..ada86689ad 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -1,21 +1,3 @@ -.set LOCALID_EXPERT, 1 -.set LOCALID_WOMAN_2, 2 -.set LOCALID_KIRI, 3 -.set LOCALID_NINJA_BOY, 4 -.set LOCALID_BOY_1, 5 -.set LOCALID_STEVEN, 7 -.set LOCALID_WOMAN_1, 8 -.set LOCALID_GROUDON, 9 -.set LOCALID_KYOGRE, 10 -.set LOCALID_RAYQUAZA, 11 -.set LOCALID_MANIAC, 12 -.set LOCALID_GIRL, 13 -.set LOCALID_BLACK_BELT, 14 -.set LOCALID_BOY_2, 15 -.set LOCALID_MAXIE, 16 -.set LOCALID_ARCHIE, 17 -.set LOCALID_WALLACE, 18 - SootopolisCity_MapScripts:: map_script MAP_SCRIPT_ON_LOAD, SootopolisCity_OnLoad map_script MAP_SCRIPT_ON_TRANSITION, SootopolisCity_OnTransition @@ -73,13 +55,13 @@ SootopolisCity_EventScript_HideMapNamePopup:: SootopolisCity_EventScript_SetBattleSpectators:: setobjectxyperm LOCALID_KIRI, 13, 48 - setobjectxyperm LOCALID_BOY_1, 46, 32 - setobjectxyperm LOCALID_NINJA_BOY, 48, 41 - setobjectxyperm LOCALID_WOMAN_1, 45, 43 + setobjectxyperm LOCALID_SOOTOPOLIS_BOY_1, 46, 32 + setobjectxyperm LOCALID_SOOTOPOLIS_NINJA_BOY, 48, 41 + setobjectxyperm LOCALID_SOOTOPOLIS_WOMAN_1, 45, 43 setobjectmovementtype LOCALID_KIRI, MOVEMENT_TYPE_FACE_UP - setobjectmovementtype LOCALID_BOY_1, MOVEMENT_TYPE_FACE_LEFT - setobjectmovementtype LOCALID_NINJA_BOY, MOVEMENT_TYPE_FACE_LEFT - setobjectmovementtype LOCALID_WOMAN_1, MOVEMENT_TYPE_FACE_LEFT + setobjectmovementtype LOCALID_SOOTOPOLIS_BOY_1, MOVEMENT_TYPE_FACE_LEFT + setobjectmovementtype LOCALID_SOOTOPOLIS_NINJA_BOY, MOVEMENT_TYPE_FACE_LEFT + setobjectmovementtype LOCALID_SOOTOPOLIS_WOMAN_1, MOVEMENT_TYPE_FACE_LEFT return SootopolisCity_EventScript_SetLayout:: @@ -119,43 +101,43 @@ SootopolisCity_EventScript_CheckSetEnterCaveOfOriginObjPos:: return SootopolisCity_EventScript_SetEnterCaveOfOriginObjPos:: - setobjectxyperm LOCALID_EXPERT, 30, 18 - setobjectxyperm LOCALID_STEVEN, 32, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_EXPERT, 30, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_STEVEN, 32, 18 return SootopolisCity_EventScript_SetExitCaveOfOriginObjPos:: - setobjectxyperm LOCALID_EXPERT, 30, 18 - setobjectxyperm LOCALID_WALLACE, 31, 18 - setobjectxyperm LOCALID_STEVEN, 32, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_EXPERT, 30, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_WALLACE, 31, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_STEVEN, 32, 18 end SootopolisCity_EventScript_SetOutsideGymObjPos:: - setobjectxyperm LOCALID_EXPERT, 31, 18 - setobjectxyperm LOCALID_STEVEN, 29, 33 - setobjectxyperm LOCALID_MAXIE, 33, 35 - setobjectxyperm LOCALID_ARCHIE, 34, 35 + setobjectxyperm LOCALID_SOOTOPOLIS_EXPERT, 31, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_STEVEN, 29, 33 + setobjectxyperm LOCALID_SOOTOPOLIS_MAXIE, 33, 35 + setobjectxyperm LOCALID_SOOTOPOLIS_ARCHIE, 34, 35 call_if_eq VAR_SOOTOPOLIS_WALLACE_STATE, 0, SootopolisCity_EventScript_SetWallaceMiddle call_if_eq VAR_SOOTOPOLIS_WALLACE_STATE, 1, SootopolisCity_EventScript_SetWallaceRight call_if_eq VAR_SOOTOPOLIS_WALLACE_STATE, 2, SootopolisCity_EventScript_SetWallaceLeft return SootopolisCity_EventScript_SetWallaceMiddle:: - setobjectxyperm LOCALID_WALLACE, 31, 33 - setobjectmovementtype LOCALID_WALLACE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_SOOTOPOLIS_WALLACE, 31, 33 + setobjectmovementtype LOCALID_SOOTOPOLIS_WALLACE, MOVEMENT_TYPE_FACE_DOWN return SootopolisCity_EventScript_SetWallaceRight:: - setobjectxyperm LOCALID_WALLACE, 32, 33 - setobjectmovementtype LOCALID_WALLACE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_SOOTOPOLIS_WALLACE, 32, 33 + setobjectmovementtype LOCALID_SOOTOPOLIS_WALLACE, MOVEMENT_TYPE_FACE_DOWN return SootopolisCity_EventScript_SetWallaceLeft:: - setobjectxyperm LOCALID_WALLACE, 30, 33 - setobjectmovementtype LOCALID_WALLACE, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_SOOTOPOLIS_WALLACE, 30, 33 + setobjectmovementtype LOCALID_SOOTOPOLIS_WALLACE, MOVEMENT_TYPE_FACE_DOWN return SootopolisCity_EventScript_SetExpertBlockCaveEntrance:: - setobjectxyperm LOCALID_EXPERT, 31, 18 + setobjectxyperm LOCALID_SOOTOPOLIS_EXPERT, 31, 18 return SootopolisCity_OnWarp: @@ -207,14 +189,14 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate - applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_GROUDON, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SOOTOPOLIS_KYOGRE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SOOTOPOLIS_GROUDON, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 60 waitse playmoncry SPECIES_KYOGRE, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreAttack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonDefend + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreAttack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonDefend waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -222,13 +204,13 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 waitse playmoncry SPECIES_GROUDON, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreDefend - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonAttack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreDefend + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonAttack waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -236,13 +218,13 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 waitse playmoncry SPECIES_KYOGRE, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreAttack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonDefend + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreAttack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonDefend waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -250,12 +232,12 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 special SpawnCameraObject - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreIdle - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonIdle + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreIdle + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonIdle applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanBackToPokeCenter waitmovement 0 special RemoveCameraObject @@ -307,14 +289,14 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: setvar VAR_0x8004, FALSE @ Just do Groudon/Kyogre fight scene special Script_DoRayquazaScene waitstate - applymovement LOCALID_KYOGRE, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_GROUDON, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_SOOTOPOLIS_KYOGRE, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_SOOTOPOLIS_GROUDON, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 60 waitse playmoncry SPECIES_KYOGRE, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreAttack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonDefend + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreAttack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonDefend waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -322,13 +304,13 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 waitse playmoncry SPECIES_GROUDON, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreDefend - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonAttack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreDefend + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonAttack waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -336,13 +318,13 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 waitse playmoncry SPECIES_KYOGRE, CRY_MODE_ENCOUNTER - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreAttack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonDefend + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreAttack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonDefend waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan setvar VAR_0x8005, 1 @ horizontal pan @@ -350,12 +332,12 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: setvar VAR_0x8007, 5 @ shake delay special ShakeCamera waitstate - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreMoveBack - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonMoveBack + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreMoveBack + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonMoveBack waitmovement 0 special SpawnCameraObject - applymovement LOCALID_KYOGRE, SootopolisCity_Movement_KyogreIdle - applymovement LOCALID_GROUDON, SootopolisCity_Movement_GroudonIdle + applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreIdle + applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonIdle applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanBackToDive waitmovement 0 special RemoveCameraObject @@ -492,9 +474,9 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: delay 60 fadescreenspeed FADE_TO_BLACK, 8 call SootopolisCity_EventScript_SetRoughWater - removeobject LOCALID_GROUDON - removeobject LOCALID_KYOGRE - addobject LOCALID_RAYQUAZA + removeobject LOCALID_SOOTOPOLIS_GROUDON + removeobject LOCALID_SOOTOPOLIS_KYOGRE + addobject LOCALID_SOOTOPOLIS_RAYQUAZA setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate @@ -521,9 +503,9 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: waitmoncry setweather WEATHER_NONE doweather - applymovement LOCALID_RAYQUAZA, SootopolisCity_Movement_RayquazaFlyOff + applymovement LOCALID_SOOTOPOLIS_RAYQUAZA, SootopolisCity_Movement_RayquazaFlyOff waitmovement 0 - removeobject LOCALID_RAYQUAZA + removeobject LOCALID_SOOTOPOLIS_RAYQUAZA special WaitWeather waitstate clearflag FLAG_SYS_WEATHER_CTRL @@ -545,9 +527,9 @@ SootopolisCity_EventScript_RayquazaSceneFromDive:: delay 60 fadescreenspeed FADE_TO_BLACK, 8 call SootopolisCity_EventScript_SetRoughWater - removeobject LOCALID_GROUDON - removeobject LOCALID_KYOGRE - addobject LOCALID_RAYQUAZA + removeobject LOCALID_SOOTOPOLIS_GROUDON + removeobject LOCALID_SOOTOPOLIS_KYOGRE + addobject LOCALID_SOOTOPOLIS_RAYQUAZA setvar VAR_0x8004, TRUE special Script_DoRayquazaScene waitstate @@ -574,9 +556,9 @@ SootopolisCity_EventScript_RayquazaSceneFromDive:: waitmoncry setweather WEATHER_NONE doweather - applymovement LOCALID_RAYQUAZA, SootopolisCity_Movement_RayquazaFlyOff + applymovement LOCALID_SOOTOPOLIS_RAYQUAZA, SootopolisCity_Movement_RayquazaFlyOff waitmovement 0 - removeobject LOCALID_RAYQUAZA + removeobject LOCALID_SOOTOPOLIS_RAYQUAZA special WaitWeather waitstate clearflag FLAG_SYS_WEATHER_CTRL @@ -771,12 +753,12 @@ SootopolisCity_EventScript_KiriLikeSeasonBornIn:: SootopolisCity_EventScript_Woman2:: lockall - applymovement LOCALID_WOMAN_2, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_WOMAN_2, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_Woman2Rayquaza msgbox SootopolisCity_Text_WeatherWentWild, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WOMAN_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_WOMAN_2, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end @@ -812,7 +794,7 @@ SootopolisCity_EventScript_Woman1:: SootopolisCity_EventScript_Woman1Legendaries:: msgbox SootopolisCity_Text_GiganticPokemonFight, MSGBOX_DEFAULT closemessage - applymovement LOCALID_WOMAN_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_WOMAN_1, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -829,14 +811,14 @@ SootopolisCity_EventScript_Woman1Rayquaza:: SootopolisCity_EventScript_NinjaBoy:: lockall - applymovement LOCALID_NINJA_BOY, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_NINJA_BOY, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_NinjaBoyRayquaza goto_if_ge VAR_SOOTOPOLIS_CITY_STATE, 6, SootopolisCity_EventScript_NinjaBoyNormal goto_if_le VAR_SOOTOPOLIS_CITY_STATE, 1, SootopolisCity_EventScript_NinjaBoyNormal msgbox SootopolisCity_Text_ThisIsWicked, MSGBOX_DEFAULT closemessage - applymovement LOCALID_NINJA_BOY, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_NINJA_BOY, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -853,7 +835,7 @@ SootopolisCity_EventScript_NinjaBoyRayquaza:: SootopolisCity_EventScript_Boy1:: lockall - applymovement LOCALID_BOY_1, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_BOY_1, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_Boy1Rayquaza goto_if_set FLAG_SYS_GAME_CLEAR, SootopolisCity_EventScript_Boy1GameClear @@ -861,7 +843,7 @@ SootopolisCity_EventScript_Boy1:: goto_if_le VAR_SOOTOPOLIS_CITY_STATE, 1, SootopolisCity_EventScript_Boy1Normal msgbox SootopolisCity_Text_GiantPokemonSuddenlyAppeared, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BOY_1, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_BOY_1, Common_Movement_FaceOriginalDirection waitmovement 0 release end @@ -895,7 +877,7 @@ EventScript_ClosedSootopolisDoor:: SootopolisCity_EventScript_Steven:: lockall - applymovement LOCALID_STEVEN, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_STEVEN, Common_Movement_FacePlayer waitmovement 0 call_if_unset FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN, SootopolisCity_EventScript_StevenLeadPlayerCaveOfOrigin goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 2, SootopolisCity_EventScript_StevenHelpWallace @@ -928,13 +910,13 @@ SootopolisCity_EventScript_StevenLeadPlayerCaveOfOrigin:: call_if_eq VAR_FACING, DIR_NORTH, SootopolisCity_EventScript_StartWalkToCaveOfOriginNorth msgbox SootopolisCity_Text_DoesThisMakeYourFearPokemon, MSGBOX_DEFAULT closemessage - applymovement LOCALID_STEVEN, SootopolisCity_Movement_StevenWalkToCaveOfOrigin + applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenWalkToCaveOfOrigin applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerWalkToCaveOfOrigin waitmovement 0 delay 120 - applymovement LOCALID_EXPERT, SootopolisCity_Movement_ExpertMoveAside + applymovement LOCALID_SOOTOPOLIS_EXPERT, SootopolisCity_Movement_ExpertMoveAside waitmovement 0 - applymovement LOCALID_STEVEN, SootopolisCity_Movement_StevenArriveCaveEntrance + applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenArriveCaveEntrance applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerArriveCaveEntrance waitmovement 0 msgbox SootopolisCity_Text_HereWereAreHelpWallace, MSGBOX_DEFAULT @@ -947,13 +929,13 @@ SootopolisCity_EventScript_StevenLeadPlayerCaveOfOrigin:: end SootopolisCity_EventScript_StartWalkToCaveOfOriginWest:: - applymovement LOCALID_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin + applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginWest waitmovement 0 return SootopolisCity_EventScript_StartWalkToCaveOfOriginNorth:: - applymovement LOCALID_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin + applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginNorth waitmovement 0 return @@ -1224,12 +1206,12 @@ SootopolisCity_Movement_PlayerEnterCaveOfOrigin: SootopolisCity_EventScript_Boy2:: lockall - applymovement LOCALID_BOY_2, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_BOY_2, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_Boy2Rayquaza msgbox SootopolisCity_Text_TwoPokemonArentAngry, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BOY_2, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_BOY_2, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end @@ -1245,17 +1227,17 @@ SootopolisCity_EventScript_BlackBelt:: goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_BlackBeltRayquaza msgbox SootopolisCity_Text_GoRedAndBlueMon, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BLACK_BELT, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_BLACK_BELT, Common_Movement_FacePlayer waitmovement 0 msgbox SootopolisCity_Text_DoYouKnowMonNames, MSGBOX_DEFAULT closemessage - applymovement LOCALID_BLACK_BELT, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_BLACK_BELT, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end SootopolisCity_EventScript_BlackBeltRayquaza:: - applymovement LOCALID_BLACK_BELT, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_BLACK_BELT, Common_Movement_FacePlayer waitmovement 0 msgbox SootopolisCity_Text_GreenOneSettlesThings, MSGBOX_DEFAULT releaseall @@ -1263,12 +1245,12 @@ SootopolisCity_EventScript_BlackBeltRayquaza:: SootopolisCity_EventScript_Girl:: lockall - applymovement LOCALID_GIRL, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_GIRL, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_GirlRayquaza msgbox SootopolisCity_Text_SootopolisWillBeWrecked, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GIRL, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_GIRL, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end @@ -1281,12 +1263,12 @@ SootopolisCity_EventScript_GirlRayquaza:: SootopolisCity_EventScript_Maniac:: lockall - applymovement LOCALID_MANIAC, Common_Movement_FacePlayer + applymovement LOCALID_SOOTOPOLIS_MANIAC, Common_Movement_FacePlayer waitmovement 0 goto_if_eq VAR_SOOTOPOLIS_CITY_STATE, 5, SootopolisCity_EventScript_ManiacRayquaza msgbox SootopolisCity_Text_SeeingLegendWithOwnEyes, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MANIAC, Common_Movement_FaceOriginalDirection + applymovement LOCALID_SOOTOPOLIS_MANIAC, Common_Movement_FaceOriginalDirection waitmovement 0 releaseall end @@ -1319,16 +1301,16 @@ SootopolisCity_EventScript_GiveWaterfall:: end SootopolisCity_EventScript_WallaceMoveFromGym:: - applymovement LOCALID_WALLACE, SootopolisCity_Movement_WallaceMoveFromGym + applymovement LOCALID_SOOTOPOLIS_WALLACE, SootopolisCity_Movement_WallaceMoveFromGym waitmovement 0 - copyobjectxytoperm LOCALID_WALLACE + copyobjectxytoperm LOCALID_SOOTOPOLIS_WALLACE setvar VAR_SOOTOPOLIS_WALLACE_STATE, 1 return SootopolisCity_EventScript_WallaceMoveFromGymWest:: - applymovement LOCALID_WALLACE, SootopolisCity_Movement_WallaceMoveFromGymWest + applymovement LOCALID_SOOTOPOLIS_WALLACE, SootopolisCity_Movement_WallaceMoveFromGymWest waitmovement 0 - copyobjectxytoperm LOCALID_WALLACE + copyobjectxytoperm LOCALID_SOOTOPOLIS_WALLACE setvar VAR_SOOTOPOLIS_WALLACE_STATE, 2 return diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_1F/map.json b/data/maps/SootopolisCity_MysteryEventsHouse_1F/map.json index 0b2ad974c0..f9307a231b 100644 --- a/data/maps/SootopolisCity_MysteryEventsHouse_1F/map.json +++ b/data/maps/SootopolisCity_MysteryEventsHouse_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_MYSTERY_EVENTS_OLD_MAN", "graphics_id": "OBJ_EVENT_GFX_OLD_MAN", "x": 6, "y": 4, diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc index 374adbfc66..2df40a5188 100644 --- a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc +++ b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_OLD_MAN, 1 - SootopolisCity_MysteryEventsHouse_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SootopolisCity_MysteryEventsHouse_1F_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, SootopolisCity_MysteryEventsHouse_1F_OnFrame @@ -13,14 +11,14 @@ SootopolisCity_MysteryEventsHouse_1F_OnTransition: SootopolisCity_MysteryEventsHouse_1F_EventScript_SetTrainerVisitingLayout:: setvar VAR_TEMP_1, 1 - setobjectxyperm LOCALID_OLD_MAN, 3, 2 - setobjectmovementtype LOCALID_OLD_MAN, MOVEMENT_TYPE_FACE_DOWN + setobjectxyperm LOCALID_MYSTERY_EVENTS_OLD_MAN, 3, 2 + setobjectmovementtype LOCALID_MYSTERY_EVENTS_OLD_MAN, MOVEMENT_TYPE_FACE_DOWN setmaplayoutindex LAYOUT_SOOTOPOLIS_CITY_MYSTERY_EVENTS_HOUSE_1F_STAIRS_UNBLOCKED return SootopolisCity_MysteryEventsHouse_1F_EventScript_MoveOldManToDoor:: - setobjectxyperm LOCALID_OLD_MAN, 2, 2 - setobjectmovementtype LOCALID_OLD_MAN, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_MYSTERY_EVENTS_OLD_MAN, 2, 2 + setobjectmovementtype LOCALID_MYSTERY_EVENTS_OLD_MAN, MOVEMENT_TYPE_FACE_RIGHT return SootopolisCity_MysteryEventsHouse_1F_OnFrame: @@ -33,9 +31,9 @@ SootopolisCity_MysteryEventsHouse_1F_EventScript_OldManCommentOnBattle:: lockall applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerExitStairs waitmovement 0 - applymovement LOCALID_OLD_MAN, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManWalkBehindPlayer + applymovement LOCALID_MYSTERY_EVENTS_OLD_MAN, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManWalkBehindPlayer waitmovement 0 - copyobjectxytoperm LOCALID_OLD_MAN + copyobjectxytoperm LOCALID_MYSTERY_EVENTS_OLD_MAN applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call_if_eq VAR_SOOTOPOLIS_MYSTERY_EVENTS_STATE, 1, SootopolisCity_MysteryEventsHouse_1F_EventScript_BattleWonComment diff --git a/data/maps/SootopolisCity_PokemonCenter_1F/map.json b/data/maps/SootopolisCity_PokemonCenter_1F/map.json index 0fa27599da..8db695278d 100644 --- a/data/maps/SootopolisCity_PokemonCenter_1F/map.json +++ b/data/maps/SootopolisCity_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SOOTOPOLIS_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/SootopolisCity_PokemonCenter_1F/scripts.inc b/data/maps/SootopolisCity_PokemonCenter_1F/scripts.inc index e1e13b35c8..757c9063e4 100644 --- a/data/maps/SootopolisCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/SootopolisCity_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - SootopolisCity_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SootopolisCity_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -10,7 +8,7 @@ SootopolisCity_PokemonCenter_1F_OnTransition: end SootopolisCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_SOOTOPOLIS_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/SouthernIsland_Exterior/map.json b/data/maps/SouthernIsland_Exterior/map.json index 6912e3f4bd..d7cdb1238a 100644 --- a/data/maps/SouthernIsland_Exterior/map.json +++ b/data/maps/SouthernIsland_Exterior/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SOUTHERN_ISLAND_SAILOR", "graphics_id": "OBJ_EVENT_GFX_SAILOR", "x": 13, "y": 23, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SOUTHERN_ISLAND_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 13, "y": 25, diff --git a/data/maps/SouthernIsland_Exterior/scripts.inc b/data/maps/SouthernIsland_Exterior/scripts.inc index 6e7009a1f2..c5c6ad2d80 100644 --- a/data/maps/SouthernIsland_Exterior/scripts.inc +++ b/data/maps/SouthernIsland_Exterior/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_SAILOR, 1 -.set LOCALID_SS_TIDAL, 2 - SouthernIsland_Exterior_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SouthernIsland_Exterior_OnTransition .byte 0 @@ -19,8 +16,8 @@ SouthernIsland_Exterior_EventScript_Sailor:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 - hideobjectat LOCALID_SAILOR, MAP_SOUTHERN_ISLAND_EXTERIOR - setvar VAR_0x8004, LOCALID_SS_TIDAL + hideobjectat LOCALID_SOUTHERN_ISLAND_SAILOR, MAP_SOUTHERN_ISLAND_EXTERIOR + setvar VAR_0x8004, LOCALID_SOUTHERN_ISLAND_SS_TIDAL call Common_EventScript_FerryDepartIsland warp MAP_LILYCOVE_CITY_HARBOR, 8, 11 waitstate diff --git a/data/maps/SouthernIsland_Interior/map.json b/data/maps/SouthernIsland_Interior/map.json index 76212cbbd1..6871b7704f 100644 --- a/data/maps/SouthernIsland_Interior/map.json +++ b/data/maps/SouthernIsland_Interior/map.json @@ -28,6 +28,7 @@ "flag": "FLAG_HIDE_SOUTHERN_ISLAND_EON_STONE" }, { + "local_id": "LOCALID_SOUTHERN_ISLAND_LATI", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 13, "y": 2, diff --git a/data/maps/SouthernIsland_Interior/scripts.inc b/data/maps/SouthernIsland_Interior/scripts.inc index 8486739d93..749bfb2549 100644 --- a/data/maps/SouthernIsland_Interior/scripts.inc +++ b/data/maps/SouthernIsland_Interior/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_LATI, 2 - SouthernIsland_Interior_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, SouthernIsland_Interior_OnResume map_script MAP_SCRIPT_ON_TRANSITION, SouthernIsland_Interior_OnTransition @@ -12,7 +10,7 @@ SouthernIsland_Interior_OnResume: SouthernIsland_Interior_EventScript_TryRemoveLati:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCALID_LATI + removeobject LOCALID_SOUTHERN_ISLAND_LATI return SouthernIsland_Interior_OnTransition: @@ -66,14 +64,14 @@ SouthernIsland_Interior_EventScript_Lati:: playmoncry VAR_TEMP_4, CRY_MODE_NORMAL delay 30 waitmoncry - addobject LOCALID_LATI + addobject LOCALID_SOUTHERN_ISLAND_LATI delay 30 applymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanDown - applymovement LOCALID_LATI, SouthernIsland_Interior_Movement_LatiApproach + applymovement LOCALID_SOUTHERN_ISLAND_LATI, SouthernIsland_Interior_Movement_LatiApproach waitmovement 0 delay 50 special RemoveCameraObject - setvar VAR_LAST_TALKED, LOCALID_LATI + setvar VAR_LAST_TALKED, LOCALID_SOUTHERN_ISLAND_LATI call_if_eq VAR_ROAMER_POKEMON, 0, SouthernIsland_Interior_EventScript_SetLatiosBattleVars call_if_ne VAR_ROAMER_POKEMON, 0, SouthernIsland_Interior_EventScript_SetLatiasBattleVars setflag FLAG_SYS_CTRL_OBJ_DELETE diff --git a/data/maps/TrainerHill_Elevator/map.json b/data/maps/TrainerHill_Elevator/map.json index a611cbf641..c24a063633 100644 --- a/data/maps/TrainerHill_Elevator/map.json +++ b/data/maps/TrainerHill_Elevator/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRAINER_HILL_ELEVATOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 0, "y": 6, diff --git a/data/maps/TrainerHill_Elevator/scripts.inc b/data/maps/TrainerHill_Elevator/scripts.inc index bec1ffbff1..49483d8150 100644 --- a/data/maps/TrainerHill_Elevator/scripts.inc +++ b/data/maps/TrainerHill_Elevator/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - TrainerHill_Elevator_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, TrainerHill_Elevator_OnFrame .byte 0 @@ -22,13 +20,13 @@ TrainerHill_Elevator_EventScript_ExitToRoof:: TrainerHill_Elevator_EventScript_EnterElevator:: applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerApproachAttendant waitmovement 0 - applymovement LOCALID_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFacePlayer + applymovement LOCALID_TRAINER_HILL_ELEVATOR_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFacePlayer waitmovement 0 lockall msgbox TrainerHill_Elevator_Text_ReturnToReception, MSGBOX_YESNO goto_if_eq VAR_RESULT, NO, TrainerHill_Elevator_EventScript_ExitToRoof releaseall - applymovement LOCALID_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFaceDown + applymovement LOCALID_TRAINER_HILL_ELEVATOR_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFaceDown waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerMoveToCenterOfElevator waitmovement 0 diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index c8395b10c0..60e9d1b9be 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -39,6 +39,7 @@ "flag": "0" }, { + "local_id": "LOCALID_VERDANTURF_TWIN", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 9, "y": 2, diff --git a/data/maps/VerdanturfTown/scripts.inc b/data/maps/VerdanturfTown/scripts.inc index 133fd62865..1e115e6762 100644 --- a/data/maps/VerdanturfTown/scripts.inc +++ b/data/maps/VerdanturfTown/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_TWIN, 2 - VerdanturfTown_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VerdanturfTown_OnTransition .byte 0 @@ -14,14 +12,14 @@ VerdanturfTown_EventScript_Twin:: faceplayer goto_if_set FLAG_RUSTURF_TUNNEL_OPENED, VerdanturfTown_EventScript_TwinTunnelOpen msgbox VerdanturfTown_Text_ManTryingToDigTunnel, MSGBOX_DEFAULT - applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection + applymovement LOCALID_VERDANTURF_TWIN, Common_Movement_FaceOriginalDirection waitmovement 0 release end VerdanturfTown_EventScript_TwinTunnelOpen:: msgbox VerdanturfTown_Text_ManDugTunnelForLove, MSGBOX_DEFAULT - applymovement LOCALID_TWIN, Common_Movement_FaceOriginalDirection + applymovement LOCALID_VERDANTURF_TWIN, Common_Movement_FaceOriginalDirection waitmovement 0 release end diff --git a/data/maps/VerdanturfTown_PokemonCenter_1F/map.json b/data/maps/VerdanturfTown_PokemonCenter_1F/map.json index 20a144afb9..4bae6ce2f4 100644 --- a/data/maps/VerdanturfTown_PokemonCenter_1F/map.json +++ b/data/maps/VerdanturfTown_PokemonCenter_1F/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_VERDANTURF_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/VerdanturfTown_PokemonCenter_1F/scripts.inc b/data/maps/VerdanturfTown_PokemonCenter_1F/scripts.inc index 5fbdba42f4..2531a7501b 100644 --- a/data/maps/VerdanturfTown_PokemonCenter_1F/scripts.inc +++ b/data/maps/VerdanturfTown_PokemonCenter_1F/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_NURSE, 1 - VerdanturfTown_PokemonCenter_1F_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VerdanturfTown_PokemonCenter_1F_OnTransition map_script MAP_SCRIPT_ON_RESUME, CableClub_OnResume @@ -11,7 +9,7 @@ VerdanturfTown_PokemonCenter_1F_OnTransition: end VerdanturfTown_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_VERDANTURF_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/src/field_specials.c b/src/field_specials.c index 5d52e5542e..f5abeb8bc1 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -3600,7 +3600,7 @@ u32 GetMartEmployeeObjectEventId(void) { MAP_GROUP(MAP_FORTREE_CITY_MART), MAP_NUM(MAP_FORTREE_CITY_MART), LOCALID_FORTREE_MART_CLERK }, { MAP_GROUP(MAP_MOSSDEEP_CITY_MART), MAP_NUM(MAP_MOSSDEEP_CITY_MART), LOCALID_MOSSDEEP_MART_CLERK }, { MAP_GROUP(MAP_SOOTOPOLIS_CITY_MART), MAP_NUM(MAP_SOOTOPOLIS_CITY_MART), LOCALID_SOOTOPOLIS_MART_CLERK }, - { MAP_GROUP(MAP_BATTLE_FRONTIER_MART), MAP_NUM(MAP_BATTLE_FRONTIER_MART), LOCALID_BATTLE_FRONTIER_MART_CLERK } + { MAP_GROUP(MAP_BATTLE_FRONTIER_MART), MAP_NUM(MAP_BATTLE_FRONTIER_MART), LOCALID_FRONTIER_MART_CLERK }, }; u8 i; From bf17d54b52cf23646b9235bb54e488d8e20ab206 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 12 Oct 2024 12:39:50 -0400 Subject: [PATCH 010/187] Finish adding local IDs to map.json files --- .../map.json | 8 ++ .../scripts.inc | 108 ++++++++---------- .../map.json | 1 + .../scripts.inc | 8 +- .../BattleFrontier_BattleArenaLobby/map.json | 1 + .../scripts.inc | 10 +- .../map.json | 6 + .../scripts.inc | 64 +++++------ .../map.json | 1 + .../scripts.inc | 10 +- .../BattleFrontier_BattleDomeLobby/map.json | 2 + .../scripts.inc | 11 +- .../map.json | 1 + .../scripts.inc | 4 +- .../map.json | 8 ++ .../scripts.inc | 49 ++++---- .../map.json | 2 + .../scripts.inc | 7 +- .../map.json | 1 + .../scripts.inc | 16 ++- .../map.json | 5 + .../scripts.inc | 85 +++++++------- .../map.json | 1 + .../scripts.inc | 12 +- .../BattleFrontier_BattlePalaceLobby/map.json | 2 + .../scripts.inc | 7 +- .../map.json | 2 +- .../scripts.inc | 2 +- .../BattleFrontier_BattlePikeLobby/map.json | 2 +- .../scripts.inc | 2 +- .../map.json | 1 + .../scripts.inc | 4 +- .../map.json | 2 + .../scripts.inc | 69 ++++++----- .../map.json | 1 + .../scripts.inc | 6 +- .../map.json | 2 + .../scripts.inc | 9 +- .../BattleFrontier_BattlePyramidTop/map.json | 2 + .../scripts.inc | 9 +- .../map.json | 3 + .../scripts.inc | 40 +++---- .../map.json | 2 +- .../scripts.inc | 4 +- .../map.json | 2 +- .../scripts.inc | 4 +- .../BattleFrontier_BattleTowerLobby/map.json | 6 +- .../scripts.inc | 15 +-- .../map.json | 6 + .../scripts.inc | 67 +++++------ .../map.json | 4 + .../scripts.inc | 44 ++++--- .../map.json | 1 + .../scripts.inc | 16 ++- data/maps/BattleFrontier_OutsideWest/map.json | 8 ++ .../BattleFrontier_OutsideWest/scripts.inc | 35 +++--- .../BattleFrontier_ReceptionGate/map.json | 3 + .../BattleFrontier_ReceptionGate/scripts.inc | 26 ++--- .../map.json | 3 + .../scripts.inc | 46 ++++---- .../FallarborTown_BattleTentCorridor/map.json | 1 + .../scripts.inc | 6 +- .../MauvilleCity_PokemonCenter_1F/map.json | 2 +- .../MauvilleCity_PokemonCenter_1F/scripts.inc | 2 +- data/maps/NavelRock_Top/map.json | 2 +- data/maps/NavelRock_Top/scripts.inc | 8 +- .../map.json | 2 + .../scripts.inc | 21 ++-- .../SlateportCity_BattleTentCorridor/map.json | 1 + .../scripts.inc | 12 +- .../SlateportCity_BattleTentLobby/map.json | 1 + .../SlateportCity_BattleTentLobby/scripts.inc | 6 +- data/maps/TrainerHill_Entrance/map.json | 4 + data/maps/TrainerHill_Entrance/scripts.inc | 15 +-- .../map.json | 3 + .../scripts.inc | 36 +++--- .../map.json | 1 + .../scripts.inc | 6 +- .../VerdanturfTown_BattleTentLobby/map.json | 1 + .../scripts.inc | 6 +- data/scripts/battle_pike.inc | 25 ++-- src/tv.c | 2 +- 82 files changed, 508 insertions(+), 533 deletions(-) diff --git a/data/maps/BattleFrontier_BattleArenaBattleRoom/map.json b/data/maps/BattleFrontier_BattleArenaBattleRoom/map.json index b7b4e168a6..6aa89f9055 100644 --- a/data/maps/BattleFrontier_BattleArenaBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleArenaBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_ARENA_BATTLE_BLACK_BELT_1", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 5, "y": 3, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_BLACK_BELT_2", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 10, "y": 3, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_BLACK_BELT_3", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 5, "y": 9, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_BLACK_BELT_4", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 10, "y": 9, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 4, "y": 5, @@ -93,6 +98,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 15, "y": 6, @@ -106,6 +112,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 0, "y": 6, @@ -119,6 +126,7 @@ "flag": "0" }, { + "local_id": "LOCALID_ARENA_BATTLE_ANNOUNCER", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 7, "y": 4, diff --git a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc index 844ec070a6..79132baec9 100644 --- a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc @@ -1,12 +1,7 @@ -.set LOCALID_BLACK_BELT_1, 1 -.set LOCALID_BLACK_BELT_2, 2 -.set LOCALID_BLACK_BELT_3, 3 -.set LOCALID_BLACK_BELT_4, 4 -.set LOCALID_ATTENDANT, 5 -.set LOCALID_OPPONENT, 7 -.set LOCALID_PLAYER, 8 -.set LOCALID_ANNOUNCER, 9 - +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_ARENA_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. BattleFrontier_BattleArenaBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleArenaBattleRoom_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleArenaBattleRoom_OnFrame @@ -14,9 +9,6 @@ BattleFrontier_BattleArenaBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattleArenaBattleRoom_OnResume .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, which has the gfx id VAR_OBJ_GFX_ID_1 - BattleFrontier_BattleArenaBattleRoom_OnResume: special OffsetCameraForBattle end @@ -46,47 +38,47 @@ BattleFrontier_BattleArenaBattleRoom_OnFrame: BattleFrontier_BattleArenaBattleRoom_EventScript_EnterRoom:: lockall - showobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerEnter + showobjectat LOCALID_ARENA_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerEnter waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleArenaBattleRoom_EventScript_AnnounceTrainers - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceDown - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceLeft + applymovement LOCALID_ARENA_BATTLE_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceDown + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceLeft setvar VAR_TEMP_2, 1 frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE goto BattleFrontier_BattleArenaBattleRoom_EventScript_AskReadyForOpponent BattleFrontier_BattleArenaBattleRoom_EventScript_AnnounceTrainers:: tower_setopponent - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentEnter + addobject LOCALID_ARENA_BATTLE_OPPONENT + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentEnter waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown playse SE_M_BELLY_DRUM waitse waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_PlayerStepForward, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForward + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForward waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown playse SE_M_BELLY_DRUM waitse waitmovement 0 arena_gettrainername msgbox BattleFrontier_BattleArenaBattleRoom_Text_OpponentStepForward, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown playse SE_M_BELLY_DRUM waitse waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_SetKOTourneyBegin, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForward - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForward + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward waitmovement 0 palace_getopponentintro msgbox gStringVar4, MSGBOX_DEFAULT @@ -95,11 +87,11 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_AnnounceTrainers:: switch VAR_RESULT case 1, BattleFrontier_BattleArenaBattleRoom_EventScript_DefeatedOpponent BattleFrontier_BattleArenaBattleRoom_EventScript_DeclareOpponentWinner:: - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_1, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_2, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_3, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp - applymovement LOCALID_BLACK_BELT_4, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_1, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_2, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_3, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_4, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp playse SE_M_SNORE waitse waitmovement 0 @@ -117,12 +109,12 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_DefeatedOpponent:: frontier_set FRONTIER_DATA_BATTLE_NUM, VAR_RESULT switch VAR_RESULT case 7, BattleFrontier_BattleArenaBattleRoom_EventScript_ReturnToLobbyWon - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerWalkBackToLine - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentExit + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerWalkBackToLine + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentExit waitmovement 0 - removeobject LOCALID_OPPONENT - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceDown - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceLeft + removeobject LOCALID_ARENA_BATTLE_OPPONENT + applymovement LOCALID_ARENA_BATTLE_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceDown + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceLeft waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_MonsWillBeRestored, MSGBOX_DEFAULT special LoadPlayerParty @@ -191,8 +183,8 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_AskRetireChallenge:: BattleFrontier_BattleArenaBattleRoom_EventScript_ContinueChallenge:: closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight + applymovement LOCALID_ARENA_BATTLE_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight waitmovement 0 goto BattleFrontier_BattleArenaBattleRoom_EventScript_AnnounceTrainers waitstate @@ -269,27 +261,27 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_AskReadyForTycoonNoRecord:: BattleFrontier_BattleArenaBattleRoom_EventScript_BattleGreta:: call BattleFrontier_EventScript_SetBrainObjectGfx - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight + applymovement LOCALID_ARENA_BATTLE_ATTENDANT, BattleFrontier_BattleArenaBattleRoom_Movement_WalkInPlaceRight waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown playse SE_M_BELLY_DRUM waitse waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_PlayerStepForward, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForwardLong + applymovement LOCALID_ARENA_BATTLE_PLAYER, BattleFrontier_BattleArenaBattleRoom_Movement_PlayerStepForwardLong waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown playse SE_M_BELLY_DRUM waitse waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_MakeWayForGreta, MSGBOX_DEFAULT closemessage - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaEnter + addobject LOCALID_ARENA_BATTLE_OPPONENT + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaEnter waitmovement 0 - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForward waitmovement 0 switch VAR_TEMP_F case FRONTIER_BRAIN_GOLD, BattleFrontier_BattleArenaBattleRoom_EventScript_IntroGretaGold @@ -300,11 +292,11 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_BattleGreta:: msgbox BattleFrontier_BattleArenaBattleRoom_Text_GretaYoureChallenger, MSGBOX_DEFAULT closemessage frontier_set FRONTIER_DATA_HEARD_BRAIN_SPEECH - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaLookAroundPlayer + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaLookAroundPlayer waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_IsThatRight, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaWalkBackToCenter + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaWalkBackToCenter waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_YouLookWeakTakeThingsEasy, MSGBOX_DEFAULT BattleFrontier_BattleArenaBattleRoom_EventScript_BattleGretaSilver:: @@ -317,7 +309,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_DefeatedGretaSilver:: call BattleFrontier_BattleArenaBattleRoom_EventScript_DeclarePlayerWinner frontier_getsymbols goto_if_ne VAR_RESULT, 0, BattleFrontier_BattleArenaBattleRoom_EventScript_ReturnToLobbyWon - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForwardLong + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForwardLong waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_GretaYoureToughAfterAll, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL @@ -334,11 +326,11 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_IntroGretaGold:: msgbox BattleFrontier_BattleArenaBattleRoom_Text_GretaLookingForwardToSeeingAgain, MSGBOX_DEFAULT closemessage frontier_set FRONTIER_DATA_HEARD_BRAIN_SPEECH - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaLookAroundPlayer + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaLookAroundPlayer waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_SoAreYouReady, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaWalkBackToCenter + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_GretaWalkBackToCenter waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_WontAllowHalfheartedEffort, MSGBOX_DEFAULT BattleFrontier_BattleArenaBattleRoom_EventScript_BattleGretaGold:: @@ -351,7 +343,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_DefeatedGretaGold:: call BattleFrontier_BattleArenaBattleRoom_EventScript_DeclarePlayerWinner frontier_getsymbols goto_if_eq VAR_RESULT, 2, BattleFrontier_BattleArenaBattleRoom_EventScript_ReturnToLobbyWon - applymovement LOCALID_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForwardLong + applymovement LOCALID_ARENA_BATTLE_OPPONENT, BattleFrontier_BattleArenaBattleRoom_Movement_OpponentStepForwardLong waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_GretaBlownAway, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL @@ -382,11 +374,11 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_DoArenaBattle:: return BattleFrontier_BattleArenaBattleRoom_EventScript_DeclarePlayerWinner:: - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_1, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_2, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown - applymovement LOCALID_BLACK_BELT_3, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp - applymovement LOCALID_BLACK_BELT_4, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp + applymovement LOCALID_ARENA_BATTLE_ANNOUNCER, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_1, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_2, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceDown + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_3, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp + applymovement LOCALID_ARENA_BATTLE_BLACK_BELT_4, BattleFrontier_BattleArenaBattleRoom_Movement_JumpInPlaceUp playse SE_BANG waitse waitmovement 0 @@ -469,8 +461,8 @@ BattleFrontier_BattleArenaBattleRoom_OnWarp: .2byte 0 BattleFrontier_BattleArenaBattleRoom_EventScript_SetUpRoomObjects:: - hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM - removeobject LOCALID_OPPONENT + hideobjectat LOCALID_ARENA_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM + removeobject LOCALID_ARENA_BATTLE_OPPONENT call BattleFrontier_BattleDomeBattleRoom_EventScript_SetPlayerGfx applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisible setvar VAR_TEMP_1, 1 diff --git a/data/maps/BattleFrontier_BattleArenaCorridor/map.json b/data/maps/BattleFrontier_BattleArenaCorridor/map.json index dbf6093250..6ec197aba6 100644 --- a/data/maps/BattleFrontier_BattleArenaCorridor/map.json +++ b/data/maps/BattleFrontier_BattleArenaCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_ARENA_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 9, "y": 12, diff --git a/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc b/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc index 7086819569..c74756e7dd 100644 --- a/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleArenaCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleArenaCorridor_OnFrame .byte 0 @@ -11,13 +9,13 @@ BattleFrontier_BattleArenaCorridor_OnFrame: BattleFrontier_BattleArenaCorridor_EventScript_WalkToBattleRoom:: delay 16 setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantWalkToDoor + applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantWalkToDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerWalkToDoor waitmovement 0 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantFacePlayer + applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantFacePlayer waitmovement 0 msgbox BattleFrontier_BattleArenaCorridor_Text_PleaseStepIn, MSGBOX_SIGN - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantMoveOutOfWay + applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantMoveOutOfWay waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerEnterDoor waitmovement 0 diff --git a/data/maps/BattleFrontier_BattleArenaLobby/map.json b/data/maps/BattleFrontier_BattleArenaLobby/map.json index 210da8118c..0985255d9c 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/map.json +++ b/data/maps/BattleFrontier_BattleArenaLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_ARENA_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 7, "y": 7, diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 5d9ee507ec..2fb04a5493 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleArenaLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleArenaLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleArenaLobby_OnWarp @@ -201,12 +199,12 @@ BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge:: end BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLv50:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToLeftDoor + applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToLeftDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToLeftDoor waitmovement 0 opendoor 2, 2 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor + applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 2 @@ -250,12 +248,12 @@ BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor: step_end BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLvOpen:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToRightDoor + applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToRightDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToRightDoor waitmovement 0 opendoor 11, 2 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor + applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 11, 2 diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json index c2b427cbe3..b4407e55d6 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DOME_ANNOUNCER", "graphics_id": "OBJ_EVENT_GFX_REPORTER_M", "x": 5, "y": 4, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_AUDIENCE_TWIN", "graphics_id": "OBJ_EVENT_GFX_TWIN", "x": 7, "y": 2, @@ -80,6 +82,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_AUDIENCE_WALKING", "graphics_id": "OBJ_EVENT_GFX_MAN_1", "x": 4, "y": 2, @@ -119,6 +122,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_REFEREE", "graphics_id": "OBJ_EVENT_GFX_MAN_2", "x": 0, "y": 4, @@ -171,6 +175,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 4, "y": 9, @@ -197,6 +202,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 11, "y": 6, diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index def903b1df..be00c2aaf3 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -1,9 +1,7 @@ -.set LOCALID_ANNOUNCER, 1 -.set LOCALID_AUDIENCE_TWIN, 2 -.set LOCALID_AUDIENCE_WALKING, 6 -.set LOCALID_REFEREE, 9 -.set LOCALID_PLAYER, 13 -.set LOCALID_OPPONENT, 15 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_DOME_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by dome_setopponentgfx. .set NO_DRAW, 0 .set DRAW_TRAINER, 1 @@ -46,20 +44,20 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_EnterRoom:: lockall call BattleFrontier_BattleDomeBattleRoom_EventScript_GetRoundNum call_if_eq VAR_RESULT, DOME_ROUND1, BattleFrontier_BattleDomeBattleRoom_EventScript_TryDoAudienceMemberWalkToSeat - applymovement LOCALID_ANNOUNCER, Common_Movement_WalkInPlaceDown + applymovement LOCALID_DOME_ANNOUNCER, Common_Movement_WalkInPlaceDown waitmovement 0 call BattleFrontier_BattleDomeBattleRoom_EventScript_AnnouncePlayer msgbox BattleFrontier_BattleDomeBattleRoom_Text_PlayerHasEnteredDome, MSGBOX_DEFAULT closemessage - showobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM + showobjectat LOCALID_DOME_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM goto_if_ne VAR_TEMP_F, DOME_FINAL, BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerEnter goto_if_ne VAR_TEMP_E, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerEnterForTucker BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerEnter:: - applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerEnter + applymovement LOCALID_DOME_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerEnter goto BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceReactToPlayer BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerEnterForTucker:: - applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerEnterForTucker + applymovement LOCALID_DOME_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerEnterForTucker BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceReactToPlayer:: playse SE_M_ENCORE2 call BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceLookAround @@ -70,8 +68,8 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_BattleOpponent:: dome_getopponentname msgbox BattleFrontier_BattleDomeBattleRoom_Text_PlayerVersusTrainer, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerStepForward - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_OpponentStepForward + applymovement LOCALID_DOME_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerStepForward + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_OpponentStepForward waitmovement 0 tower_getopponentintro 0 msgbox gStringVar4, MSGBOX_DEFAULT @@ -90,19 +88,19 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_Draw:: playse SE_M_ENCORE2 call BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceLookAround delay 60 - applymovement LOCALID_REFEREE, BattleFrontier_BattleDomeBattleRoom_Movement_RefereeEnter + applymovement LOCALID_DOME_REFEREE, BattleFrontier_BattleDomeBattleRoom_Movement_RefereeEnter waitmovement 0 - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleDomeBattleRoom_Movement_AnnouncerFaceLeft + applymovement LOCALID_DOME_ANNOUNCER, BattleFrontier_BattleDomeBattleRoom_Movement_AnnouncerFaceLeft waitmovement 0 delay 180 - applymovement LOCALID_REFEREE, BattleFrontier_BattleDomeBattleRoom_Movement_RefereeExit + applymovement LOCALID_DOME_REFEREE, BattleFrontier_BattleDomeBattleRoom_Movement_RefereeExit waitmovement 0 goto_if_eq VAR_TEMP_2, DRAW_TUCKER, BattleFrontier_BattleDomeBattleRoom_EventScript_LostToOpponent @ Tucker always wins on a draw dome_compareseeds switch VAR_RESULT case 1, BattleFrontier_BattleDomeBattleRoom_EventScript_DefeatedOpponent BattleFrontier_BattleDomeBattleRoom_EventScript_LostToOpponent:: - applymovement LOCALID_ANNOUNCER, Common_Movement_WalkInPlaceDown + applymovement LOCALID_DOME_ANNOUNCER, Common_Movement_WalkInPlaceDown waitmovement 0 dome_getopponentname call_if_eq VAR_TEMP_2, NO_DRAW, BattleFrontier_BattleDomeBattleRoom_EventScript_OpponentWon @@ -135,7 +133,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_TuckerWonDraw:: return BattleFrontier_BattleDomeBattleRoom_EventScript_DefeatedOpponent:: - applymovement LOCALID_ANNOUNCER, Common_Movement_WalkInPlaceDown + applymovement LOCALID_DOME_ANNOUNCER, Common_Movement_WalkInPlaceDown waitmovement 0 call_if_eq VAR_TEMP_2, NO_DRAW, BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerWon call_if_eq VAR_TEMP_2, DRAW_TRAINER, BattleFrontier_BattleDomeBattleRoom_EventScript_PlayerWonDraw @@ -154,7 +152,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_DefeatedOpponent:: waitstate BattleFrontier_BattleDomeBattleRoom_EventScript_WonTourney:: - applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerApproachAudience + applymovement LOCALID_DOME_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerApproachAudience waitmovement 0 frontier_get FRONTIER_DATA_LVL_MODE switch VAR_RESULT @@ -340,9 +338,9 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_AnnounceTuckerGold:: msgbox BattleFrontier_BattleDomeBattleRoom_Text_LegendHasReturnedDomeAceTucker, MSGBOX_DEFAULT BattleFrontier_BattleDomeBattleRoom_EventScript_TuckerEnter:: closemessage - applymovement LOCALID_AUDIENCE_TWIN, BattleFrontier_BattleDomeBattleRoom_Movement_AudienceTwinJump - applymovement LOCALID_ANNOUNCER, BattleFrontier_BattleDomeBattleRoom_Movement_AnnouncerMoveForTuckerEntrance - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerEnterAndDance + applymovement LOCALID_DOME_AUDIENCE_TWIN, BattleFrontier_BattleDomeBattleRoom_Movement_AudienceTwinJump + applymovement LOCALID_DOME_ANNOUNCER, BattleFrontier_BattleDomeBattleRoom_Movement_AnnouncerMoveForTuckerEntrance + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerEnterAndDance playse SE_M_ENCORE2 call BattleFrontier_BattleDomeBattleRoom_EventScript_AudienceLookAround waitse @@ -384,7 +382,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_BattleTuckerSilver:: frontier_getsymbols goto_if_ne VAR_RESULT, 0, BattleFrontier_BattleDomeBattleRoom_EventScript_WonTourney closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerApproachPlayer + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerApproachPlayer waitmovement 0 msgbox BattleFrontier_BattleDomeBattleRoom_Text_SeeYourFrontierPass, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL @@ -412,7 +410,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_BattleTuckerGold:: frontier_getsymbols goto_if_eq VAR_RESULT, 2, BattleFrontier_BattleDomeBattleRoom_EventScript_WonTourney closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerApproachPlayer + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerApproachPlayer waitmovement 0 msgbox BattleFrontier_BattleDomeBattleRoom_Text_NeverLostWhenPowerUnleashed, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL @@ -426,8 +424,8 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_BattleTuckerGold:: BattleFrontier_BattleDomeBattleRoom_EventScript_DoTuckerBattle:: msgbox BattleFrontier_BattleDomeBattleRoom_Text_PlayerVersusTucker, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerStepForward2 - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerStepForward + applymovement LOCALID_DOME_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_PlayerStepForward2 + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_TuckerStepForward waitmovement 0 call BattleFrontier_BattleDomeBattleRoom_EventScript_DoDomeBattle return @@ -462,7 +460,7 @@ BattleFrontier_BattleDomeBattleRoom_OnWarp: .2byte 0 BattleFrontier_BattleDomeBattleRoom_EventScript_SetUpObjects:: - hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM + hideobjectat LOCALID_DOME_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_DOME_BATTLE_ROOM call BattleFrontier_BattleDomeBattleRoom_EventScript_AddAudience call BattleFrontier_BattleDomeBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 @@ -473,10 +471,10 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_SetUpObjects:: copyvar VAR_TEMP_E, VAR_RESULT goto_if_eq VAR_RESULT, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleDomeBattleRoom_EventScript_EndSetUpObjects call BattleFrontier_EventScript_SetBrainObjectGfx - setobjectxyperm LOCALID_OPPONENT, 13, 9 - removeobject LOCALID_OPPONENT - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisibleFacingUp + setobjectxyperm LOCALID_DOME_OPPONENT, 13, 9 + removeobject LOCALID_DOME_OPPONENT + addobject LOCALID_DOME_OPPONENT + applymovement LOCALID_DOME_OPPONENT, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisibleFacingUp BattleFrontier_BattleDomeBattleRoom_EventScript_EndSetUpObjects:: end @@ -869,13 +867,13 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_SetWalkingAudienceMemberPos:: random 2 copyvar VAR_TEMP_D, VAR_RESULT goto_if_eq VAR_TEMP_D, 0, Common_EventScript_NopReturn - setobjectxyperm LOCALID_AUDIENCE_WALKING, 2, 0 - setobjectmovementtype LOCALID_AUDIENCE_WALKING, MOVEMENT_TYPE_FACE_RIGHT + setobjectxyperm LOCALID_DOME_AUDIENCE_WALKING, 2, 0 + setobjectmovementtype LOCALID_DOME_AUDIENCE_WALKING, MOVEMENT_TYPE_FACE_RIGHT return BattleFrontier_BattleDomeBattleRoom_EventScript_TryDoAudienceMemberWalkToSeat:: goto_if_eq VAR_TEMP_D, 0, Common_EventScript_NopReturn - applymovement LOCALID_AUDIENCE_WALKING, BattleFrontier_BattleDomeBattleRoom_Movement_AudienceMemberWalkToSeat + applymovement LOCALID_DOME_AUDIENCE_WALKING, BattleFrontier_BattleDomeBattleRoom_Movement_AudienceMemberWalkToSeat return BattleFrontier_BattleDomeBattleRoom_Movement_AudienceTwinJump: diff --git a/data/maps/BattleFrontier_BattleDomeCorridor/map.json b/data/maps/BattleFrontier_BattleDomeCorridor/map.json index 5a68af443c..bb2088e7fc 100644 --- a/data/maps/BattleFrontier_BattleDomeCorridor/map.json +++ b/data/maps/BattleFrontier_BattleDomeCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DOME_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 23, "y": 5, diff --git a/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc b/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc index d286dc8681..5258aae9e3 100644 --- a/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleDomeCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleDomeCorridor_OnFrame .byte 0 @@ -13,12 +11,12 @@ BattleFrontier_BattleDomeCorridor_EventScript_EnterCorridor:: setvar VAR_TEMP_0, 1 frontier_get FRONTIER_DATA_LVL_MODE goto_if_eq VAR_RESULT, FRONTIER_LVL_OPEN, BattleFrontier_BattleDomeCorridor_EventScript_WalkToBattleRoomLvOpen - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLv50 + applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLv50 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLv50 waitmovement 0 opendoor 13, 3 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLv50 + applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLv50 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLv50 waitmovement 0 closedoor 13, 3 @@ -26,12 +24,12 @@ BattleFrontier_BattleDomeCorridor_EventScript_EnterCorridor:: goto BattleFrontier_BattleDomeCorridor_EventScript_WarpToPreBattleRoom BattleFrontier_BattleDomeCorridor_EventScript_WalkToBattleRoomLvOpen:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLvOpen + applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLvOpen applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLvOpen waitmovement 0 opendoor 37, 3 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLvOpen + applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLvOpen applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLvOpen waitmovement 0 closedoor 37, 3 diff --git a/data/maps/BattleFrontier_BattleDomeLobby/map.json b/data/maps/BattleFrontier_BattleDomeLobby/map.json index d47bb0f2b4..283379b0be 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/map.json +++ b/data/maps/BattleFrontier_BattleDomeLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DOME_ATTENDANT_SINGLES", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 5, "y": 10, @@ -80,6 +81,7 @@ "flag": "0" }, { + "local_id": "LOCALID_DOME_ATTENDANT_DOUBLES", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 17, "y": 10, diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index 9801b19fe5..eb73dad6f6 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ATTENDANT_SINGLES, 1 -.set LOCALID_ATTENDANT_DOUBLES, 6 - BattleFrontier_BattleDomeLobby_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattleDomeLobby_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleDomeLobby_OnFrame @@ -246,19 +243,19 @@ BattleFrontier_BattleDomeLobby_EventScript_WalkToDoor:: return BattleFrontier_BattleDomeLobby_EventScript_SinglesAttendantWalkToDoor:: - applymovement LOCALID_ATTENDANT_SINGLES, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor + applymovement LOCALID_DOME_ATTENDANT_SINGLES, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor return BattleFrontier_BattleDomeLobby_EventScript_DoublesAttendantWalkToDoor:: - applymovement LOCALID_ATTENDANT_DOUBLES, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor + applymovement LOCALID_DOME_ATTENDANT_DOUBLES, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor return BattleFrontier_BattleDomeLobby_EventScript_SinglesAttendantEnterDoor:: - applymovement LOCALID_ATTENDANT_SINGLES, BattleFrontier_BattleDomeLobby_Movement_AttendantEnterDoor + applymovement LOCALID_DOME_ATTENDANT_SINGLES, BattleFrontier_BattleDomeLobby_Movement_AttendantEnterDoor return BattleFrontier_BattleDomeLobby_EventScript_DoublesAttendantEnterDoor:: - applymovement LOCALID_ATTENDANT_DOUBLES, BattleFrontier_BattleDomeLobby_Movement_AttendantEnterDoor + applymovement LOCALID_DOME_ATTENDANT_DOUBLES, BattleFrontier_BattleDomeLobby_Movement_AttendantEnterDoor return BattleFrontier_BattleDomeLobby_EventScript_WelcomeSingles:: diff --git a/data/maps/BattleFrontier_BattleDomePreBattleRoom/map.json b/data/maps/BattleFrontier_BattleDomePreBattleRoom/map.json index a175248ab2..5c5b891797 100644 --- a/data/maps/BattleFrontier_BattleDomePreBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleDomePreBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_DOME_PRE_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 5, "y": 2, diff --git a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc index 6ca4296cc0..a7aeb2c3e5 100644 --- a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleDomePreBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleDomePreBattleRoom_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleDomePreBattleRoom_OnWarp @@ -150,7 +148,7 @@ BattleFrontier_BattleDomePreBattleRoom_EventScript_ContinueChallenge:: dome_setopponent msgbox BattleFrontier_BattleDomePreBattleRoom_Text_RightThisWay, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleDomePreBattleRoom_Movement_AttendantMoveAside + applymovement LOCALID_DOME_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleDomePreBattleRoom_Movement_AttendantMoveAside waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerWalkToDoor waitmovement 0 diff --git a/data/maps/BattleFrontier_BattleFactoryBattleRoom/map.json b/data/maps/BattleFrontier_BattleFactoryBattleRoom/map.json index ef68f89ecb..dca5284cae 100644 --- a/data/maps/BattleFrontier_BattleFactoryBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleFactoryBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_1", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 0, "y": 6, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 7, "y": 4, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_2", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 0, "y": 4, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_3", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 0, "y": 8, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_4", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 12, "y": 4, @@ -80,6 +85,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_5", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 12, "y": 6, @@ -93,6 +99,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_SCIENTIST_6", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 12, "y": 8, @@ -106,6 +113,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_F", "x": 5, "y": 11, diff --git a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc index cf44e3118e..7330b5c4aa 100644 --- a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc @@ -1,11 +1,7 @@ -.set LOCALID_SCIENTIST_1, 1 -.set LOCALID_OPPONENT, 2 -.set LOCALID_SCIENTIST_2, 3 -.set LOCALID_SCIENTIST_3, 4 -.set LOCALID_SCIENTIST_4, 5 -.set LOCALID_SCIENTIST_5, 6 -.set LOCALID_SCIENTIST_6, 7 -.set LOCALID_PLAYER, 8 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_FACTORY_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by factory_setopponentgfx. BattleFrontier_BattleFactoryBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleFactoryBattleRoom_OnTransition @@ -13,9 +9,6 @@ BattleFrontier_BattleFactoryBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleFactoryBattleRoom_OnFrame .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, which has the gfx id VAR_OBJ_GFX_ID_F - BattleFrontier_BattleFactoryBattleRoom_OnTransition: frontier_settrainers checkplayergender @@ -28,7 +21,7 @@ BattleFrontier_BattleFactoryBattleRoom_OnTransition: BattleFrontier_BattleFactoryBattleRoom_EventScript_SetUpFactoryHeadObj:: call BattleFrontier_EventScript_SetBrainObjectGfx - setobjectxyperm LOCALID_OPPONENT, 7, 9 + setobjectxyperm LOCALID_FACTORY_BATTLE_OPPONENT, 7, 9 end BattleFrontier_BattleFactoryBattleRoom_OnWarp: @@ -39,7 +32,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_HideObjects:: setvar VAR_TEMP_1, 1 hideobjectat OBJ_EVENT_ID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM goto_if_ne VAR_TEMP_F, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleFactoryBattleRoom_EventScript_EndHideObjects - hideobjectat LOCALID_OPPONENT, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM + hideobjectat LOCALID_FACTORY_BATTLE_OPPONENT, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM BattleFrontier_BattleFactoryBattleRoom_EventScript_EndHideObjects:: end @@ -58,8 +51,8 @@ BattleFrontier_BattleFactoryBattleRoom_OnFrame: BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle:: msgbox BattleFrontier_BattleFactoryBattleRoom_Text_GetAMoveOn, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OPPONENT, BattleFrontier_BattleFactoryBattleRoom_Movement_NolandMoveToBattle - applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_FACTORY_BATTLE_OPPONENT, BattleFrontier_BattleFactoryBattleRoom_Movement_NolandMoveToBattle + applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom waitmovement 0 call BattleFrontier_BattleFactoryBattleRoom_EventScript_ScientistsFaceBattle @@ -68,15 +61,15 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle:: BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoom:: goto_if_ne VAR_TEMP_F, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle - applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom waitmovement 0 call BattleFrontier_BattleFactoryBattleRoom_EventScript_ScientistsFaceBattle factory_setopponentgfx - removeobject LOCALID_OPPONENT - setobjectxyperm LOCALID_OPPONENT, 7, 1 - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleFactoryBattleRoom_Movement_OpponentEnter + removeobject LOCALID_FACTORY_BATTLE_OPPONENT + setobjectxyperm LOCALID_FACTORY_BATTLE_OPPONENT, 7, 1 + addobject LOCALID_FACTORY_BATTLE_OPPONENT + applymovement LOCALID_FACTORY_BATTLE_OPPONENT, BattleFrontier_BattleFactoryBattleRoom_Movement_OpponentEnter waitmovement 0 BattleFrontier_BattleFactoryBattleRoom_EventScript_BattleOpponent:: goto_if_ne VAR_TEMP_F, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleFactoryBattleRoom_EventScript_BattleNoland @@ -138,7 +131,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_DefeatedNolandSilver:: goto_if_ne VAR_RESULT, 0, BattleFrontier_BattleFactoryBattleRoom_EventScript_DefeatedNoland msgbox BattleFrontier_BattleFactoryBattleRoom_Text_NolandLetsSeeFrontierPass, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerApproachNoland + applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerApproachNoland waitmovement 0 playfanfare MUS_OBTAIN_SYMBOL message BattleFrontier_BattleFactoryBattleRoom_Text_ReceivedKnowledgeSymbol @@ -164,7 +157,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_DefeatedNolandGold:: goto_if_eq VAR_RESULT, 2, BattleFrontier_BattleFactoryBattleRoom_EventScript_DefeatedNoland msgbox BattleFrontier_BattleFactoryBattleRoom_Text_OutOfMyLeagueLetsSeePass, MSGBOX_DEFAULT waitmessage - applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerApproachNoland + applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerApproachNoland waitmovement 0 playfanfare MUS_OBTAIN_SYMBOL message BattleFrontier_BattleFactoryBattleRoom_Text_KnowledgeSymbolTookGoldenShine @@ -241,12 +234,12 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_WarpToLobbyDoubles:: end BattleFrontier_BattleFactoryBattleRoom_EventScript_ScientistsFaceBattle:: - applymovement LOCALID_SCIENTIST_1, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_SCIENTIST_2, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_SCIENTIST_3, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_SCIENTIST_4, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_SCIENTIST_5, Common_Movement_WalkInPlaceFasterLeft - applymovement LOCALID_SCIENTIST_6, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_1, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_2, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_3, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_4, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_5, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_FACTORY_BATTLE_SCIENTIST_6, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/map.json b/data/maps/BattleFrontier_BattleFactoryLobby/map.json index 15d395fd83..1375c5f2b5 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/map.json +++ b/data/maps/BattleFrontier_BattleFactoryLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FACTORY_ATTENDANT_SINGLES", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 4, "y": 7, @@ -80,6 +81,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FACTORY_ATTENDANT_DOUBLES", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 14, "y": 7, diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc index be9caa0cd7..4354f4e8e9 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ATTENDANT_SINGLES, 1 -.set LOCALID_ATTENDANT_DOUBLES, 6 - BattleFrontier_BattleFactoryLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleFactoryLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleFactoryLobby_OnWarp @@ -178,11 +175,11 @@ BattleFrontier_BattleFactoryLobby_EventScript_EnterChallenge:: end BattleFrontier_BattleFactoryLobby_EventScript_TalkedToSinglesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_SINGLES + setvar VAR_LAST_TALKED, LOCALID_FACTORY_ATTENDANT_SINGLES return BattleFrontier_BattleFactoryLobby_EventScript_TalkedToDoublesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_DOUBLES + setvar VAR_LAST_TALKED, LOCALID_FACTORY_ATTENDANT_DOUBLES return BattleFrontier_BattleFactoryLobby_EventScript_ExplainChallenge:: diff --git a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/map.json b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/map.json index cf4ea2a6b4..9add31441f 100644 --- a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FACTORY_PRE_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 8, "y": 12, diff --git a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc index d54cf83570..4bbddc46b4 100644 --- a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleFactoryPreBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleFactoryPreBattleRoom_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleFactoryPreBattleRoom_OnWarp @@ -12,8 +10,8 @@ BattleFrontier_BattleFactoryPreBattleRoom_OnWarp: BattleFrontier_BattleFactoryPreBattleRoom_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 goto_if_ne VAR_0x8006, 1, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_TurnPlayerNorth - setobjectxy LOCALID_ATTENDANT, 8, 7 - turnobject LOCALID_ATTENDANT, DIR_SOUTH + setobjectxy LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, 8, 7 + turnobject LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, DIR_SOUTH BattleFrontier_BattleFactoryPreBattleRoom_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end @@ -25,7 +23,7 @@ BattleFrontier_BattleFactoryPreBattleRoom_OnFrame: BattleFrontier_BattleFactoryPreBattleRoom_EventScript_EnterRoom:: goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_ReturnToRoomFromBattle setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantEnterRoom + applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantEnterRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerEnterRoom waitmovement 0 goto_if_eq VAR_0x8006, 2, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_ResumeChallenge @@ -66,11 +64,11 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_ReturnToRoomFromBattle:: waitse msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_WaitFewMoments, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantMoveToReceiveCall + applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantMoveToReceiveCall waitmovement 0 msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_UnderstoodSirWillDo, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantReturnToPlayer + applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantReturnToPlayer waitmovement 0 msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_MessageFromHeadComeRightNow, MSGBOX_DEFAULT closemessage @@ -378,12 +376,12 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_AskSwapBeforeHead:: case MULTI_B_PRESSED, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_EnterBattleRoom BattleFrontier_BattleFactoryPreBattleRoom_EventScript_WalkToBattleRoomLv50:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLv50 + applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLv50 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLv50 return BattleFrontier_BattleFactoryPreBattleRoom_EventScript_WalkToBattleRoomLvOpen:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLvOpen + applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLvOpen applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLvOpen return diff --git a/data/maps/BattleFrontier_BattlePalaceBattleRoom/map.json b/data/maps/BattleFrontier_BattlePalaceBattleRoom/map.json index a0d00b5c01..e344c99951 100644 --- a/data/maps/BattleFrontier_BattlePalaceBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattlePalaceBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PALACE_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 1, "y": 9, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PALACE_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 13, "y": 1, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PALACE_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 1, "y": 4, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PALACE_DUSCLOPS", "graphics_id": "OBJ_EVENT_GFX_DUSCLOPS", "x": 13, "y": 1, @@ -67,6 +71,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PALACE_AZURILL", "graphics_id": "OBJ_EVENT_GFX_AZURILL", "x": 13, "y": 1, diff --git a/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc index 2e9366d44b..d9bae8f0ac 100644 --- a/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc @@ -1,8 +1,7 @@ -.set LOCALID_PLAYER, 1 -.set LOCALID_OPPONENT, 2 -.set LOCALID_ATTENDANT, 3 -.set LOCALID_DUSCLOPS, 4 -.set LOCALID_AZURILL, 5 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_PALACE_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. BattleFrontier_BattlePalaceBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattlePalaceBattleRoom_OnTransition @@ -10,10 +9,6 @@ BattleFrontier_BattlePalaceBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePalaceBattleRoom_OnWarp .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, which has the gfx id VAR_OBJ_GFX_ID_0 - @ The opponent is represented by LOCALID_OPPONENT, which has the gfx id VAR_OBJ_GFX_ID_1 - BattleFrontier_BattlePalaceBattleRoom_OnTransition: frontier_settrainers call BattleFrontier_BattlePalaceBattleRoom_EventScript_SetPlayerGfx @@ -41,23 +36,23 @@ BattleFrontier_BattlePalaceBattleRoom_OnFrame: .2byte 0 BattleFrontier_BattlePalaceBattleRoom_EventScript_EnterRoom:: - showobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM + showobjectat LOCALID_PALACE_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_eq VAR_RESULT, 0, BattleFrontier_BattlePalaceBattleRoom_EventScript_BeginChallenge - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_PlayerReturnToChallenge + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_PlayerReturnToChallenge waitmovement 0 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown setvar VAR_TEMP_2, 1 frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE goto BattleFrontier_BattlePalaceBattleRoom_EventScript_AskReadyForOpponent BattleFrontier_BattlePalaceBattleRoom_EventScript_BeginChallenge:: - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_PlayerEnterRoom waitmovement 0 BattleFrontier_BattlePalaceBattleRoom_EventScript_NextOpponentEnter:: tower_setopponent - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_OpponentEnter + addobject LOCALID_PALACE_BATTLE_OPPONENT + applymovement LOCALID_PALACE_BATTLE_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_OpponentEnter waitmovement 0 palace_getopponentintro msgbox gStringVar4, MSGBOX_DEFAULT @@ -76,11 +71,11 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_DefeatedOpponent:: frontier_set FRONTIER_DATA_BATTLE_NUM, VAR_RESULT switch VAR_RESULT case 7, BattleFrontier_BattlePalaceBattleRoom_EventScript_WarpToLobbyWon - applymovement LOCALID_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_OpponentExit + applymovement LOCALID_PALACE_BATTLE_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_OpponentExit waitmovement 0 - removeobject LOCALID_OPPONENT - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown + removeobject LOCALID_PALACE_BATTLE_OPPONENT + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown waitmovement 0 msgbox BattleFrontier_BattlePalaceBattleRoom_Text_LetMeRestoreYourMons, MSGBOX_DEFAULT special LoadPlayerParty @@ -148,8 +143,8 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_AskRetireChallenge:: case MULTI_B_PRESSED, BattleFrontier_BattlePalaceBattleRoom_EventScript_AskReadyForOpponent BattleFrontier_BattlePalaceBattleRoom_EventScript_ContinueChallenge:: - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight closemessage goto BattleFrontier_BattlePalaceBattleRoom_EventScript_NextOpponentEnter @@ -196,16 +191,16 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_BattleSpenser:: call BattleFrontier_EventScript_SetBrainObjectGfx msgbox BattleFrontier_BattlePalaceBattleRoom_Text_AnnounceArrivalOfSpenser, MSGBOX_DEFAULT closemessage - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight - setobjectxyperm LOCALID_OPPONENT, 15, 1 - addobject LOCALID_OPPONENT - hideobjectat LOCALID_OPPONENT, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM - setobjectxy LOCALID_OPPONENT, 13, 1 - setobjectxyperm LOCALID_OPPONENT, 13, 1 - applymovement LOCALID_DUSCLOPS, BattleFrontier_BattlePalaceBattleRoom_Movement_DusclopsEnter - applymovement LOCALID_AZURILL, BattleFrontier_BattlePalaceBattleRoom_Movement_AzurillEnter - applymovement LOCALID_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_SpenserEnter + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceRight + setobjectxyperm LOCALID_PALACE_BATTLE_OPPONENT, 15, 1 + addobject LOCALID_PALACE_BATTLE_OPPONENT + hideobjectat LOCALID_PALACE_BATTLE_OPPONENT, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM + setobjectxy LOCALID_PALACE_BATTLE_OPPONENT, 13, 1 + setobjectxyperm LOCALID_PALACE_BATTLE_OPPONENT, 13, 1 + applymovement LOCALID_PALACE_DUSCLOPS, BattleFrontier_BattlePalaceBattleRoom_Movement_DusclopsEnter + applymovement LOCALID_PALACE_AZURILL, BattleFrontier_BattlePalaceBattleRoom_Movement_AzurillEnter + applymovement LOCALID_PALACE_BATTLE_OPPONENT, BattleFrontier_BattlePalaceBattleRoom_Movement_SpenserEnter waitmovement 0 switch VAR_TEMP_F case FRONTIER_BRAIN_GOLD, BattleFrontier_BattlePalaceBattleRoom_EventScript_IntroSpenserGold @@ -226,18 +221,18 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_DefeatedSpenserSilver:: frontier_getsymbols goto_if_ne VAR_RESULT, 0, BattleFrontier_BattlePalaceBattleRoom_EventScript_WarpToLobbyWon msgbox BattleFrontier_BattlePalaceBattleRoom_Text_SpenserPostSilverBattle, MSGBOX_DEFAULT - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown msgbox BattleFrontier_BattlePalaceBattleRoom_Text_LetsSeeFrontierPass, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL message BattleFrontier_BattlePalaceBattleRoom_Text_ReceivedSpiritsSymbol waitmessage waitfanfare frontier_givesymbol - applymovement LOCALID_OPPONENT, Common_Movement_WalkInPlaceLeft + applymovement LOCALID_PALACE_BATTLE_OPPONENT, Common_Movement_WalkInPlaceLeft waitmovement 0 - applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PALACE_BATTLE_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox BattleFrontier_BattlePalaceBattleRoom_Text_SpenserAwaitNextTime, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceBattleRoom_EventScript_WarpToLobbyWon @@ -258,18 +253,18 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_DefeatedSpenserGold:: frontier_getsymbols goto_if_eq VAR_RESULT, 2, BattleFrontier_BattlePalaceBattleRoom_EventScript_WarpToLobbyWon msgbox BattleFrontier_BattlePalaceBattleRoom_Text_SpenserYourTeamIsAdmirable, MSGBOX_DEFAULT - applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown + applymovement LOCALID_PALACE_BATTLE_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceUp + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, BattleFrontier_BattlePalaceBattleRoom_Movement_FaceDown msgbox BattleFrontier_BattlePalaceBattleRoom_Text_HurryWithFrontierPass, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_SYMBOL message BattleFrontier_BattlePalaceBattleRoom_Text_SpiritsSymbolTookGoldenShine waitmessage waitfanfare frontier_givesymbol - applymovement LOCALID_OPPONENT, Common_Movement_WalkInPlaceLeft + applymovement LOCALID_PALACE_BATTLE_OPPONENT, Common_Movement_WalkInPlaceLeft waitmovement 0 - applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PALACE_BATTLE_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PALACE_BATTLE_ATTENDANT, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox BattleFrontier_BattlePalaceBattleRoom_Text_SpenserComeSeeMeAgain, MSGBOX_DEFAULT goto BattleFrontier_BattlePalaceBattleRoom_EventScript_WarpToLobbyWon @@ -293,13 +288,13 @@ BattleFrontier_BattlePalaceBattleRoom_OnWarp: .2byte 0 BattleFrontier_BattlePalaceBattleRoom_EventScript_SetUpRoomObjects:: - hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM + hideobjectat LOCALID_PALACE_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM call BattleFrontier_BattlePalaceBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible - removeobject LOCALID_OPPONENT - applymovement LOCALID_DUSCLOPS, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible - applymovement LOCALID_AZURILL, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible + removeobject LOCALID_PALACE_BATTLE_OPPONENT + applymovement LOCALID_PALACE_DUSCLOPS, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible + applymovement LOCALID_PALACE_AZURILL, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible end BattleFrontier_BattlePalaceBattleRoom_EventScript_ReadyFor2ndOpponent:: diff --git a/data/maps/BattleFrontier_BattlePalaceCorridor/map.json b/data/maps/BattleFrontier_BattlePalaceCorridor/map.json index e96f6d9e83..477ecc7c8d 100644 --- a/data/maps/BattleFrontier_BattlePalaceCorridor/map.json +++ b/data/maps/BattleFrontier_BattlePalaceCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PALACE_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 8, "y": 12, diff --git a/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc b/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc index ad2a2ee9f5..d79d4a66cc 100644 --- a/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattlePalaceCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePalaceCorridor_OnFrame .byte 0 @@ -10,7 +8,7 @@ BattleFrontier_BattlePalaceCorridor_OnFrame: BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: delay 16 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor + applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor waitmovement 0 lockall @@ -23,12 +21,12 @@ BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: closemessage frontier_get FRONTIER_DATA_LVL_MODE goto_if_eq VAR_RESULT, FRONTIER_LVL_OPEN, BattleFrontier_BattlePalaceCorridor_EventScript_WalkToOpenBattleRoom - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkTo50BattleRoom + applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkTo50BattleRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkTo50BattleRoom waitmovement 0 opendoor 6, 3 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom + applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom waitmovement 0 closedoor 6, 3 @@ -36,12 +34,12 @@ BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: goto BattleFrontier_BattlePalaceCorridor_EventScript_WarpToBattleRoom BattleFrontier_BattlePalaceCorridor_EventScript_WalkToOpenBattleRoom:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkToOpenBattleRoom + applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkToOpenBattleRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkToOpenBattleRoom waitmovement 0 opendoor 10, 3 waitdooranim - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom + applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom waitmovement 0 closedoor 10, 3 diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/map.json b/data/maps/BattleFrontier_BattlePalaceLobby/map.json index 7c8ee0cd13..90ac895fa4 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/map.json +++ b/data/maps/BattleFrontier_BattlePalaceLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PALACE_ATTENDANT_SINGLES", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 5, "y": 6, @@ -80,6 +81,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PALACE_ATTENDANT_DOUBLES", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 19, "y": 6, diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index e38ec6f7db..db354b5e23 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ATTENDANT_SINGLES, 1 -.set LOCALID_ATTENDANT_DOUBLES, 6 - BattleFrontier_BattlePalaceLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePalaceLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePalaceLobby_OnWarp @@ -255,11 +252,11 @@ BattleFrontier_BattlePalaceLobby_EventScript_WalkToDoor:: return BattleFrontier_BattlePalaceLobby_EventScript_TalkedToSinglesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_SINGLES + setvar VAR_LAST_TALKED, LOCALID_PALACE_ATTENDANT_SINGLES return BattleFrontier_BattlePalaceLobby_EventScript_TalkedToDoublesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_DOUBLES + setvar VAR_LAST_TALKED, LOCALID_PALACE_ATTENDANT_DOUBLES return BattleFrontier_BattlePalaceLobby_EventScript_OpenSinglesHallDoor:: diff --git a/data/maps/BattleFrontier_BattlePikeCorridor/map.json b/data/maps/BattleFrontier_BattlePikeCorridor/map.json index 5abcd44098..c5f407e8a9 100644 --- a/data/maps/BattleFrontier_BattlePikeCorridor/map.json +++ b/data/maps/BattleFrontier_BattlePikeCorridor/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCALID_BATTLE_PIKE_CORRIDOR_ATTENDANT", + "local_id": "LOCALID_PIKE_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 6, "y": 6, diff --git a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc index b8b4097b83..00e4f8e22b 100644 --- a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc @@ -13,7 +13,7 @@ BattleFrontier_BattlePikeCorridor_EventScript_EnterCorridor:: pike_cleartrainerids pike_nohealing TRUE applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerEnterCorridor - applymovement LOCALID_BATTLE_PIKE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePikeCorridor_Movement_AttendantEnterCorridor + applymovement LOCALID_PIKE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePikeCorridor_Movement_AttendantEnterCorridor waitmovement 0 lockall msgbox BattleFrontier_BattlePikeCorridor_Text_YourChallengeHasBegun, MSGBOX_DEFAULT diff --git a/data/maps/BattleFrontier_BattlePikeLobby/map.json b/data/maps/BattleFrontier_BattlePikeLobby/map.json index 5698b00826..038a3c59bb 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/map.json +++ b/data/maps/BattleFrontier_BattlePikeLobby/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCALID_BATTLE_PIKE_LOBBY_ATTENDANT", + "local_id": "LOCALID_PIKE_LOBBY_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 5, "y": 5, diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 09806cf503..5b188f3935 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -196,7 +196,7 @@ BattleFrontier_BattlePikeLobby_EventScript_ShowResults:: end BattleFrontier_BattlePikeLobby_EventScript_WalkToCorridor:: - applymovement LOCALID_BATTLE_PIKE_LOBBY_ATTENDANT, BattleFrontier_BattlePikeLobby_Movement_AttendantWalkToCorridor + applymovement LOCALID_PIKE_LOBBY_ATTENDANT, BattleFrontier_BattlePikeLobby_Movement_AttendantWalkToCorridor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeLobby_Movement_PlayerWalkToCorridor waitmovement 0 return diff --git a/data/maps/BattleFrontier_BattlePikeRoomFinal/map.json b/data/maps/BattleFrontier_BattlePikeRoomFinal/map.json index 5a53ad19c9..e1b1008a03 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomFinal/map.json +++ b/data/maps/BattleFrontier_BattlePikeRoomFinal/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PIKE_FINAL_ROOM_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 2, "y": 4, diff --git a/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc index e0246ed57d..9f5c02959e 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattlePikeRoomFinal_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePikeRoomFinal_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePikeRoomFinal_OnWarp @@ -11,7 +9,7 @@ BattleFrontier_BattlePikeRoomFinal_OnFrame: BattleFrontier_BattlePikeRoomFinal_EventScript_EnterRoom:: delay 16 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePikeRoomFinal_Movement_AttendantApproachPlayer + applymovement LOCALID_PIKE_FINAL_ROOM_ATTENDANT, BattleFrontier_BattlePikeRoomFinal_Movement_AttendantApproachPlayer waitmovement 0 frontier_set FRONTIER_DATA_CHALLENGE_STATUS, CHALLENGE_STATUS_WON lockall diff --git a/data/maps/BattleFrontier_BattlePikeRoomNormal/map.json b/data/maps/BattleFrontier_BattlePikeRoomNormal/map.json index 82414ac6a3..a75c5de15f 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomNormal/map.json +++ b/data/maps/BattleFrontier_BattlePikeRoomNormal/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PIKE_ROOM_NPC_1", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 4, "y": 4, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PIKE_ROOM_NPC_2", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 3, "y": 4, diff --git a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc index 45f042e4f8..335cb43cc4 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc @@ -1,8 +1,3 @@ -@ Objects in this room are set dynamically with OBJ_EVENT_GFX_VAR_0 and OBJ_EVENT_GFX_VAR_1 -@ Note: LOCALIDs shared with data/scripts/battle_pike.inc -.equ LOCALID_OBJ_0, 1 -.equ LOCALID_OBJ_1, 2 - BattleFrontier_BattlePikeRoomNormal_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattlePikeRoom_OnResume map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattlePikeRoom_OnTransition @@ -29,7 +24,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterRoom:: BattleFrontier_BattlePikeRoomNormal_EventScript_EnterSingleBattleRoom:: lockall delay 16 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer waitmovement 0 pike_gettrainerintro 0 msgbox gStringVar4, MSGBOX_DEFAULT @@ -49,7 +44,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_WarpToLobbyLost:: end BattleFrontier_BattlePikeRoomNormal_EventScript_WonSingleBattle:: - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit waitmovement 0 end @@ -59,7 +54,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterHardBattleRoom:: msgbox BattleFrontier_BattlePikeRoomNormal_Text_BattleSomewhatToughTrainer, MSGBOX_DEFAULT waitmessage closemessage - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer waitmovement 0 pike_gettrainerintro 0 msgbox gStringVar4, MSGBOX_DEFAULT @@ -76,9 +71,9 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterHardBattleRoom:: end BattleFrontier_BattlePikeRoomNormal_EventScript_WonHardBattle:: - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit waitmovement 0 - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCApproachPlayer waitmovement 0 lock faceplayer @@ -89,14 +84,14 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_WonHardBattle:: msgbox BattleFrontier_BattlePikeRoomNormal_Text_EnjoyRestOfChallenge2, MSGBOX_DEFAULT closemessage release - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit waitmovement 0 end BattleFrontier_BattlePikeRoomNormal_EventScript_EnterBrainRoom:: delay 22 lockall - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_PreQueenHealNPCApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_PreQueenHealNPCApproachPlayer waitmovement 0 pike_prequeenheal switch VAR_RESULT @@ -109,7 +104,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_LucyEnter:: closemessage special SpawnCameraObject applymovement OBJ_EVENT_ID_CAMERA, BattleFrontier_BattlePikeRoomNormal_Movement_CameraPanUp - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCExitForLucy + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCExitForLucy waitmovement 0 playse SE_PIKE_CURTAIN_CLOSE call BattleFrontier_BattlePikeRoomNormal_EventScript_SetCurtainTilesLittleClosed @@ -123,13 +118,13 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_LucyEnter:: playse SE_PIKE_CURTAIN_OPEN delay 65 call BattleFrontier_BattlePikeRoomNormal_EventScript_SetCurtainTilesMostlyClosed - showobjectat LOCALID_OBJ_0, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL + showobjectat LOCALID_PIKE_ROOM_NPC_1, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL delay 4 call BattleFrontier_BattlePikeRoomNormal_EventScript_SetCurtainTilesLittleClosed delay 4 call BattleFrontier_BattlePikeRoomNormal_EventScript_SetCurtainTilesOpen waitse - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_LucyEnter + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_LucyEnter waitmovement 0 pike_getbrainstatus switch VAR_RESULT @@ -187,7 +182,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DefeatedLucyGold:: end BattleFrontier_BattlePikeRoomNormal_EventScript_DefeatedLucy:: - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_LucyMoveAside + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_LucyMoveAside waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerWalkUp2 waitmovement 0 @@ -220,7 +215,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_PreQueenHealTwoMons:: BattleFrontier_BattlePikeRoomNormal_EventScript_EnterFullHealRoom:: lockall delay 16 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_ApproachPlayer waitmovement 0 message BattleFrontier_BattlePikeRoomNormal_Text_WillRestoreToFullHealth waitmessage @@ -229,7 +224,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterFullHealRoom:: special HealPlayerParty msgbox BattleFrontier_BattlePikeRoomNormal_Text_EnjoyRestOfChallenge, MSGBOX_DEFAULT closemessage - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCExit waitmovement 0 releaseall end @@ -237,14 +232,14 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterFullHealRoom:: BattleFrontier_BattlePikeRoomNormal_EventScript_EnterDoubleBattleRoom:: lockall delay 16 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1WalkRight - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2WalkLeft + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1WalkRight + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2WalkLeft waitmovement 0 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_DoubleTrainersWalkDown - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_DoubleTrainersWalkDown + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_DoubleTrainersWalkDown + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_DoubleTrainersWalkDown waitmovement 0 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1FacePlayer - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2FacePlayer + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1FacePlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2FacePlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer1 waitmovement 0 @@ -269,9 +264,9 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterDoubleBattleRoom:: BattleFrontier_BattlePikeRoomNormal_EventScript_WonDoubleBattle:: applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer2 waitmovement 0 - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1Exit + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1Exit waitmovement 0 - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2Exit + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2Exit waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceUp waitmovement 0 @@ -280,7 +275,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_WonDoubleBattle:: BattleFrontier_BattlePikeRoomNormal_EventScript_EnterStatusRoom:: lockall message BattleFrontier_BattlePikeRoomNormal_Text_WatchOut - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonApproachPlayer waitmovement 0 pike_getstatusmon copyvar VAR_0x8004, VAR_RESULT @@ -304,9 +299,9 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_KirliaAttack:: call_if_eq VAR_RESULT, PIKE_STATUS_SLEEP, BattleFrontier_BattlePikeRoomNormal_EventScript_KirliaUsedHypnosis pike_flashscreen waitstate - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_NPCApproachMon + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCApproachMon waitmovement 0 - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceNPC + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceNPC waitmovement 0 waitse playmoncry SPECIES_KIRLIA, CRY_MODE_NORMAL @@ -316,8 +311,8 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_KirliaAttack:: playmoncry SPECIES_KIRLIA, CRY_MODE_NORMAL waitmoncry closemessage - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonMoveAside - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_StatusNPCApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonMoveAside + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_StatusNPCApproachPlayer waitmovement 0 msgbox BattleFrontier_BattlePikeRoomNormal_Text_ApologizeForKirlia, MSGBOX_DEFAULT return @@ -333,9 +328,9 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DusclopsAttack:: call_if_eq VAR_RESULT, PIKE_STATUS_BURN, BattleFrontier_BattlePikeRoomNormal_EventScript_DusclopsUsedWillOWisp pike_flashscreen waitstate - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_NPCApproachMon + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_NPCApproachMon waitmovement 0 - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceNPC + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceNPC waitmovement 0 waitse playmoncry SPECIES_DUSCLOPS, CRY_MODE_NORMAL @@ -345,8 +340,8 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DusclopsAttack:: playmoncry SPECIES_DUSCLOPS, CRY_MODE_NORMAL waitmoncry closemessage - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonMoveAside - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_StatusNPCApproachPlayer + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonMoveAside + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_StatusNPCApproachPlayer waitmovement 0 msgbox BattleFrontier_BattlePikeRoomNormal_Text_ApologizeForDusclops, MSGBOX_DEFAULT return @@ -562,7 +557,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_HealNPC:: msgbox BattleFrontier_BattlePikeRoomNormal_Text_BestOfLuckFarewell, MSGBOX_DEFAULT closemessage release - applymovement LOCALID_OBJ_0, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCExit + applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCExit waitmovement 0 end @@ -587,7 +582,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_StatusMon:: msgbox BattleFrontier_BattlePikeRoomNormal_Text_Silence, MSGBOX_DEFAULT closemessage release - applymovement LOCALID_OBJ_1, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceRight + applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_MonFaceRight waitmovement 0 end diff --git a/data/maps/BattleFrontier_BattlePikeThreePathRoom/map.json b/data/maps/BattleFrontier_BattlePikeThreePathRoom/map.json index 536e02a898..9f2000ef1e 100644 --- a/data/maps/BattleFrontier_BattlePikeThreePathRoom/map.json +++ b/data/maps/BattleFrontier_BattlePikeThreePathRoom/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PIKE_HINT_GIVER", "graphics_id": "OBJ_EVENT_GFX_LINK_RECEPTIONIST", "x": 8, "y": 5, diff --git a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc index 3547871444..38d01c1e2d 100644 --- a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_HINT_GIVER, 2 - BattleFrontier_BattlePikeThreePathRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattlePikeRoom_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePikeThreePathRoom_OnFrame @@ -160,12 +158,12 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_SetPikeQueenHint:: end BattleFrontier_BattlePikeThreePathRoom_EventScript_GivePikeQueenHint:: - applymovement LOCALID_HINT_GIVER, BattleFrontier_BattlePikeThreePathRoom_Movement_HintGiverApproachPlayer + applymovement LOCALID_PIKE_HINT_GIVER, BattleFrontier_BattlePikeThreePathRoom_Movement_HintGiverApproachPlayer waitmovement 0 lockall msgbox BattleFrontier_BattlePikeThreePathRoom_Text_TerrifyingEvent, MSGBOX_DEFAULT releaseall - applymovement LOCALID_HINT_GIVER, BattleFrontier_BattlePikeThreePathRoom_Movement_HintGiverReturnToPos + applymovement LOCALID_PIKE_HINT_GIVER, BattleFrontier_BattlePikeThreePathRoom_Movement_HintGiverReturnToPos waitmovement 0 setvar VAR_TEMP_5, 255 end diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/map.json b/data/maps/BattleFrontier_BattlePyramidLobby/map.json index 4652af2747..4913cdb953 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/map.json +++ b/data/maps/BattleFrontier_BattlePyramidLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PYRAMID_LOBBY_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 7, "y": 12, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_PYRAMID_LOBBY_HINT_GIVER", "graphics_id": "OBJ_EVENT_GFX_HEX_MANIAC", "x": 14, "y": 13, diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index 25f5dc2b04..deb947245f 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ATTENDANT, 1 -.set LOCALID_HINT_GIVER, 2 - BattleFrontier_BattlePyramidLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePyramidLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleDomeLobby_OnWarp @@ -204,7 +201,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_EndCancelChallenge:: BattleFrontier_BattlePyramidLobby_EventScript_HintGiver:: lockall - applymovement LOCALID_HINT_GIVER, Common_Movement_FacePlayer + applymovement LOCALID_PYRAMID_LOBBY_HINT_GIVER, Common_Movement_FacePlayer waitmovement 0 msgbox BattleFrontier_BattlePyramidLobby_Text_TellYouWhatMisfortunesAwait, MSGBOX_DEFAULT call BattleFrontier_BattlePyramidLobby_EventScript_GiveHint @@ -366,7 +363,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_ShowResults:: end BattleFrontier_BattlePyramidLobby_EventScript_WalkToPanelAndReceiveBag:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantWalkToPanel + applymovement LOCALID_PYRAMID_LOBBY_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantWalkToPanel applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerWalkToPanel waitmovement 0 msgbox BattleFrontier_BattlePyramidLobby_Text_WeWillHoldBagForSafekeeping, MSGBOX_DEFAULT @@ -384,7 +381,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_ReceiveBattleBag:: waitse msgbox BattleFrontier_BattlePyramidLobby_Text_StepOnFloorPanel, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantMoveAside + applymovement LOCALID_PYRAMID_LOBBY_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantMoveAside waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerStepOnPanel waitmovement 0 diff --git a/data/maps/BattleFrontier_BattlePyramidTop/map.json b/data/maps/BattleFrontier_BattlePyramidTop/map.json index 4299f31834..570fd27c8d 100644 --- a/data/maps/BattleFrontier_BattlePyramidTop/map.json +++ b/data/maps/BattleFrontier_BattlePyramidTop/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_PYRAMID_TOP_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_HIKER", "x": 17, "y": 11, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_BRANDON", "graphics_id": "OBJ_EVENT_GFX_BRANDON", "x": 17, "y": 7, diff --git a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc index fa57635271..8639f429e8 100644 --- a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc @@ -1,6 +1,3 @@ -.set LOCALID_ATTENDANT, 1 -.set LOCALID_BRANDON, 2 - BattleFrontier_BattlePyramidTop_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattlePyramidTop_OnResume map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattlePyramidTop_OnFrame @@ -73,11 +70,11 @@ BattleFrontier_BattlePyramidTop_EventScript_Attendant:: goto_if_ne VAR_TEMP_C, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattlePyramidTop_EventScript_BrandonHereMoveAside msgbox BattleFrontier_BattlePyramidTop_Text_ReachedSummitUpYouGo, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantMoveAside + applymovement LOCALID_PYRAMID_TOP_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantMoveAside waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidTop_Movement_PlayerClimbToTop waitmovement 0 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantBlockPath + applymovement LOCALID_PYRAMID_TOP_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantBlockPath waitmovement 0 message BattleFrontier_BattlePyramidTop_Text_PlayerConqueredPyramid waitmessage @@ -97,7 +94,7 @@ BattleFrontier_BattlePyramidTop_EventScript_StepForwardWhenReady:: BattleFrontier_BattlePyramidTop_EventScript_BrandonHereMoveAside:: msgbox BattleFrontier_BattlePyramidTop_Text_ChiefBeatYouHere, MSGBOX_DEFAULT - applymovement LOCALID_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantMoveAside + applymovement LOCALID_PYRAMID_TOP_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantMoveAside setvar VAR_TEMP_D, 1 closemessage end diff --git a/data/maps/BattleFrontier_BattleTowerBattleRoom/map.json b/data/maps/BattleFrontier_BattleTowerBattleRoom/map.json index 1018ebb6d9..5798ab5667 100644 --- a/data/maps/BattleFrontier_BattleTowerBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleTowerBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TOWER_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 5, "y": 1, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_BATTLE_TOWER_OPPONENT" }, { + "local_id": "LOCALID_TOWER_BATTLE_ATTENDANT_1", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 7, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_BATTLE_ATTENDANT_2", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 4, "y": 8, diff --git a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc index 9b466af3bc..996121f0cc 100644 --- a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_OPPONENT, 1 -.set LOCALID_ATTENDANT_1, 2 -.set LOCALID_ATTENDANT_2, 3 - BattleFrontier_BattleTowerBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleTowerBattleRoom_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattleTowerBattleRoom_OnWarp @@ -13,7 +9,7 @@ BattleFrontier_BattleTowerBattleRoom_OnWarp: BattleFrontier_BattleTowerBattleRoom_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SetInvisible + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SetInvisible end BattleFrontier_BattleTowerBattleRoom_OnFrame: @@ -26,7 +22,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_EnterRoom:: waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerBattleRoom_EventScript_OpponentEnter - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 @@ -36,8 +32,8 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_EnterRoom:: BattleFrontier_BattleTowerBattleRoom_EventScript_OpponentEnter:: tower_setopponent - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_OpponentEnter + addobject LOCALID_TOWER_BATTLE_OPPONENT + applymovement LOCALID_TOWER_BATTLE_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_OpponentEnter waitmovement 0 tower_getopponentintro 0 msgbox gStringVar4, MSGBOX_DEFAULT @@ -57,12 +53,12 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_DefeatedOpponent:: tower_setbattlewon switch VAR_RESULT case 7, BattleFrontier_BattleTowerBattleRoom_EventScript_WarpToLobbyWon - applymovement LOCALID_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_OpponentExit + applymovement LOCALID_TOWER_BATTLE_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_OpponentExit waitmovement 0 - removeobject LOCALID_OPPONENT + removeobject LOCALID_TOWER_BATTLE_OPPONENT frontier_getbrainstatus call_if_ne VAR_RESULT, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleTowerBattleRoom_EventScript_SecondAttendantEnter - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 @@ -127,7 +123,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_ContinueChallenge:: closemessage applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle waitmovement 0 - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos waitmovement 0 goto BattleFrontier_BattleTowerBattleRoom_EventScript_OpponentEnter @@ -193,19 +189,19 @@ BattleFrontier_EventScript_IncrementWinStreak:: return BattleFrontier_BattleTowerBattleRoom_EventScript_SecondAttendantEnter:: - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantEnter + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantEnter waitmovement 0 - applymovement LOCALID_ATTENDANT_2, Common_Movement_WalkInPlaceLeft + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_2, Common_Movement_WalkInPlaceLeft waitmovement 0 playse SE_PIN - applymovement LOCALID_ATTENDANT_1, Common_Movement_ExclamationMark + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_ATTENDANT_1, Common_Movement_Delay48 + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, Common_Movement_Delay48 waitmovement 0 - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantDelay - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantFaceSecondAttendant + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantDelay + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantFaceSecondAttendant waitmovement 0 - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantExit + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerBattleRoom_Movement_SecondAttendantExit waitmovement 0 return @@ -239,10 +235,10 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_BattleAnabel:: closemessage applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle waitmovement 0 - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos + applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos waitmovement 0 - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_AnabelEnter + addobject LOCALID_TOWER_BATTLE_OPPONENT + applymovement LOCALID_TOWER_BATTLE_OPPONENT, BattleFrontier_BattleTowerBattleRoom_Movement_AnabelEnter waitmovement 0 switch VAR_TEMP_F case FRONTIER_BRAIN_GOLD, BattleFrontier_BattleTowerBattleRoom_EventScript_AnabelGoldIntro diff --git a/data/maps/BattleFrontier_BattleTowerCorridor/map.json b/data/maps/BattleFrontier_BattleTowerCorridor/map.json index 86c7d83957..e521df1ca3 100644 --- a/data/maps/BattleFrontier_BattleTowerCorridor/map.json +++ b/data/maps/BattleFrontier_BattleTowerCorridor/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT", + "local_id": "LOCALID_TOWER_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 9, "y": 2, diff --git a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc index 1cbbf61fbb..c8db4fbd9a 100644 --- a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc @@ -21,13 +21,13 @@ BattleFrontier_BattleTowerCorridor_OnFrame: BattleFrontier_BattleTowerCorridor_EventScript_EnterCorridor:: setvar VAR_TEMP_0, 1 goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor - applymovement LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToDoor + applymovement LOCALID_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToDoor waitmovement 0 goto BattleFrontier_BattleTowerCorridor_EventScript_WarpToBattleRoom BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor:: - applymovement LOCALID_BATTLE_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToFarDoor + applymovement LOCALID_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToFarDoor applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToFarDoor waitmovement 0 diff --git a/data/maps/BattleFrontier_BattleTowerElevator/map.json b/data/maps/BattleFrontier_BattleTowerElevator/map.json index d571ee6c12..d925ca2fc3 100644 --- a/data/maps/BattleFrontier_BattleTowerElevator/map.json +++ b/data/maps/BattleFrontier_BattleTowerElevator/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT", + "local_id": "LOCALID_TOWER_ELEVATOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 5, diff --git a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc index d14e1898d0..8147e21184 100644 --- a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattleTowerElevator_OnFrame: BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: setvar VAR_TEMP_0, 1 - applymovement LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantEnter + applymovement LOCALID_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantEnter applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerEnter waitmovement 0 special BufferBattleTowerElevatorFloors @@ -17,7 +17,7 @@ BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: special MoveElevator waitstate delay 48 - applymovement LOCALID_BATTLE_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantExit + applymovement LOCALID_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantExit applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerExit waitmovement 0 call BattleFrontier_BattleTowerElevator_EventScript_WarpToNextRoom diff --git a/data/maps/BattleFrontier_BattleTowerLobby/map.json b/data/maps/BattleFrontier_BattleTowerLobby/map.json index 19790034fb..b5c95b22bf 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/map.json +++ b/data/maps/BattleFrontier_BattleTowerLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TOWER_ATTENDANT_SINGLES", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 6, "y": 5, @@ -67,7 +68,7 @@ "flag": "0" }, { - "local_id": "LOCALID_BATTLE_TOWER_LOBBY_REPORTER", + "local_id": "LOCALID_TOWER_LOBBY_REPORTER", "graphics_id": "OBJ_EVENT_GFX_REPORTER_F", "x": 11, "y": 9, @@ -95,6 +96,7 @@ "flag": "FLAG_HIDE_APPRENTICE" }, { + "local_id": "LOCALID_TOWER_ATTENDANT_DOUBLES", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 10, "y": 5, @@ -108,6 +110,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_ATTENDANT_MULTIS", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 14, "y": 5, @@ -121,6 +124,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_ATTENDANT_LINK_MULTIS", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 18, "y": 5, diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index a216055b5b..f1d386b277 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -1,10 +1,3 @@ -.set LOCALID_ATTENDANT_SINGLES, 1 -.set LOCALID_ATTENDANT_DOUBLES, 7 -.set LOCALID_ATTENDANT_MULTIS, 8 -.set LOCALID_ATTENDANT_LINK_MULTIS, 9 - -@ Note: LOCALID_BATTLE_TOWER_LOBBY_REPORTER is a local id for this map used elsewhere. It's defined in event_objects.h - BattleFrontier_BattleTowerLobby_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattleTowerLobby_OnResume map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleTowerLobby_OnTransition @@ -690,19 +683,19 @@ BattleFrontier_BattleTowerLobby_EventScript_SetAttendantTalkedTo:: return BattleFrontier_BattleTowerLobby_EventScript_TalkedToSinglesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_SINGLES + setvar VAR_LAST_TALKED, LOCALID_TOWER_ATTENDANT_SINGLES return BattleFrontier_BattleTowerLobby_EventScript_TalkedToDoublesAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_DOUBLES + setvar VAR_LAST_TALKED, LOCALID_TOWER_ATTENDANT_DOUBLES return BattleFrontier_BattleTowerLobby_EventScript_TalkedToMultisAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_MULTIS + setvar VAR_LAST_TALKED, LOCALID_TOWER_ATTENDANT_MULTIS return BattleFrontier_BattleTowerLobby_EventScript_TalkedToLinkMultisAttendant:: - setvar VAR_LAST_TALKED, LOCALID_ATTENDANT_LINK_MULTIS + setvar VAR_LAST_TALKED, LOCALID_TOWER_ATTENDANT_LINK_MULTIS return BattleFrontier_BattleTowerLobby_EventScript_GetDoorXCoord:: diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/map.json b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/map.json index e48bcefd1b..eebfd53c47 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/map.json +++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 5, "y": 1, @@ -28,6 +29,7 @@ "flag": "FLAG_HIDE_BATTLE_TOWER_OPPONENT" }, { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_1", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 4, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_2", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 5, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 4, "y": 1, @@ -67,6 +71,7 @@ "flag": "FLAG_HIDE_BATTLE_TOWER_OPPONENT" }, { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_F", "x": 4, "y": 8, @@ -80,6 +85,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_BATTLE_PARTNER", "graphics_id": "OBJ_EVENT_GFX_VAR_E", "x": 5, "y": 8, diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc index e1cb64dda0..5607cf41f3 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc @@ -1,9 +1,8 @@ -.set LOCALID_OPPONENT_1, 1 -.set LOCALID_ATTENDANT_1, 2 -.set LOCALID_ATTENDANT_2, 3 -.set LOCALID_OPPONENT_2, 4 -.set LOCALID_PLAYER, 5 -.set LOCALID_PARTNER, 6 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. +@ The graphics of the partner are represented with VAR_OBJ_GFX_ID_E, which will ultimately be set by tower_setpartnergfx. +@ The graphics of the opponents are represented with VAR_OBJ_GFX_ID_0 and OBJ_EVENT_GFX_VAR_1, which will ultimately be set by tower_setopponent. BattleFrontier_BattleTowerMultiBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleTowerMultiBattleRoom_OnTransition @@ -11,10 +10,6 @@ BattleFrontier_BattleTowerMultiBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleTowerMultiBattleRoom_OnFrame .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, which has the gfx id VAR_OBJ_GFX_ID_F - @ The multi partner is represented by LOCALID_PARTNER, which has the gfx id VAR_OBJ_GFX_ID_E - BattleFrontier_BattleTowerMultiBattleRoom_OnTransition: call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_MULTIS, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_SetObjGfx call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_LINK_MULTIS, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_SetLinkPlayerGfx @@ -49,36 +44,36 @@ BattleFrontier_BattleTowerMultiBattleRoom_OnFrame: BattleFrontier_BattleTowerMultiBattleRoom_EventScript_EnterRoom:: setvar VAR_TEMP_0, 1 - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_PlayerEnterRoom - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_PartnerEnterRoom + applymovement LOCALID_TOWER_MULTI_BATTLE_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_TOWER_MULTI_BATTLE_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_PartnerEnterRoom waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_OpponentsEnter - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant + applymovement LOCALID_TOWER_MULTI_BATTLE_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant + applymovement LOCALID_TOWER_MULTI_BATTLE_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant waitmovement 0 frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE goto BattleFrontier_BattleTowerMultiBattleRoom_EventScript_AskReadyForOpponents BattleFrontier_BattleTowerMultiBattleRoom_EventScript_OpponentsEnter:: tower_setopponent - addobject LOCALID_OPPONENT_1 - addobject LOCALID_OPPONENT_2 - applymovement LOCALID_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent1Enter - applymovement LOCALID_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent2Enter + addobject LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1 + addobject LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2 + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent1Enter + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent2Enter waitmovement 0 goto_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_LINK_MULTIS, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_DoOpponentIntrosLink tower_getopponentintro 0 delay 15 - applymovement LOCALID_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft waitmovement 0 msgbox gStringVar4, MSGBOX_DEFAULT waitmessage tower_getopponentintro 1 - applymovement LOCALID_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft waitmovement 0 msgbox gStringVar4, MSGBOX_DEFAULT waitmessage @@ -87,13 +82,13 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_OpponentsEnter:: BattleFrontier_BattleTowerMultiBattleRoom_EventScript_DoOpponentIntrosLink:: tower_getopponentintro 0 delay 15 - applymovement LOCALID_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft waitmovement 0 messageautoscroll gStringVar4 waitmessage delay 48 tower_getopponentintro 1 - applymovement LOCALID_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_WalkInPlaceLeft waitmovement 0 messageautoscroll gStringVar4 waitmessage @@ -114,16 +109,16 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_DefeatedOpponents:: tower_setbattlewon switch VAR_RESULT case 7, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_WarpToLobbyWon - applymovement LOCALID_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent2Exit - applymovement LOCALID_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent1Exit + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent2Exit + applymovement LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_Opponent1Exit waitmovement 0 - removeobject LOCALID_OPPONENT_1 - removeobject LOCALID_OPPONENT_2 - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer + removeobject LOCALID_TOWER_MULTI_BATTLE_OPPONENT_1 + removeobject LOCALID_TOWER_MULTI_BATTLE_OPPONENT_2 + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant + applymovement LOCALID_TOWER_MULTI_BATTLE_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant + applymovement LOCALID_TOWER_MULTI_BATTLE_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceAttendant waitmovement 0 goto_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_LINK_MULTIS, BattleFrontier_BattleTowerMultiBattleRoom_EventScript_RetorePartyMsgLink msgbox BattleFrontier_BattleTowerBattleRoom_Text_RestoreMonsToFullHealth, MSGBOX_DEFAULT @@ -194,11 +189,11 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_AskRetireChallenge:: BattleFrontier_BattleTowerMultiBattleRoom_EventScript_ContinueChallenge:: closemessage clearflag FLAG_TEMP_2 - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceBattle - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceBattle + applymovement LOCALID_TOWER_MULTI_BATTLE_PLAYER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceBattle + applymovement LOCALID_TOWER_MULTI_BATTLE_PARTNER, BattleFrontier_BattleTowerMultiBattleRoom_Movement_FaceBattle waitmovement 0 - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantReturnToPos - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantReturnToPos + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantReturnToPos + applymovement LOCALID_TOWER_MULTI_BATTLE_ATTENDANT_2, BattleFrontier_BattleTowerMultiBattleRoom_Movement_AttendantReturnToPos waitmovement 0 goto BattleFrontier_BattleTowerMultiBattleRoom_EventScript_OpponentsEnter end diff --git a/data/maps/BattleFrontier_BattleTowerMultiCorridor/map.json b/data/maps/BattleFrontier_BattleTowerMultiCorridor/map.json index 36b4ecd46e..51d962dbe8 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiCorridor/map.json +++ b/data/maps/BattleFrontier_BattleTowerMultiCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TOWER_MULTI_CORRIDOR_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_F", "x": 1, "y": 1, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_1", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 14, "y": 3, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_2", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 1, "y": 3, @@ -54,6 +57,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TOWER_MULTI_CORRIDOR_PARTNER", "graphics_id": "OBJ_EVENT_GFX_VAR_E", "x": 14, "y": 1, diff --git a/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc index b36d2e6fd3..51a3ffac27 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc @@ -1,7 +1,7 @@ -.set LOCALID_PLAYER, 1 -.set LOCALID_ATTENDANT_1, 2 -.set LOCALID_ATTENDANT_2, 3 -.set LOCALID_PARTNER, 4 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_CORRIDOR_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. +@ The graphics of the partner are represented with VAR_OBJ_GFX_ID_E, which will ultimately be set by tower_setpartnergfx. BattleFrontier_BattleTowerMultiCorridor_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleTowerMultiCorridor_OnTransition @@ -9,10 +9,6 @@ BattleFrontier_BattleTowerMultiCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_BattleTowerMultiCorridor_OnFrame .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, and has the gfx id VAR_OBJ_GFX_ID_F - @ The multi partner is represented by LOCALID_PARTNER, and has the gfx id VAR_OBJ_GFX_ID_E - BattleFrontier_BattleTowerMultiCorridor_OnTransition: call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_MULTIS, BattleFrontier_BattleTowerMultiCorridor_EventScript_SetObjGfx call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_LINK_MULTIS, BattleFrontier_BattleTowerMultiCorridor_EventScript_SetLinkPlayerGfx @@ -39,8 +35,8 @@ BattleFrontier_BattleTowerMultiCorridor_OnWarp: BattleFrontier_BattleTowerMultiCorridor_EventScript_SetUpObjects:: hideobjectat OBJ_EVENT_ID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR - hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR - hideobjectat LOCALID_PARTNER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR + hideobjectat LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR + hideobjectat LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR special OffsetCameraForBattle end @@ -56,10 +52,10 @@ BattleFrontier_BattleTowerMultiCorridor_EventScript_EnterCorridor:: opendoor 1, 1 waitdooranim clearflag FLAG_ENABLE_MULTI_CORRIDOR_DOOR - showobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR - showobjectat LOCALID_PARTNER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_ExitElevator - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_ExitElevator + showobjectat LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR + showobjectat LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_ExitElevator + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_ExitElevator waitmovement 0 setflag FLAG_ENABLE_MULTI_CORRIDOR_DOOR setvar VAR_0x8004, 14 @ x coord of far door, used by DrawDoor @@ -67,21 +63,21 @@ BattleFrontier_BattleTowerMultiCorridor_EventScript_EnterCorridor:: closedoor 1, 1 waitdooranim clearflag FLAG_ENABLE_MULTI_CORRIDOR_DOOR - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_PlayerWalkToDoor - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_PartnerWalkToDoor - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerMultiCorridor_Movement_PlayerAttendantWalkToDoor - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerMultiCorridor_Movement_PartnerAttendantWalkToDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_PlayerWalkToDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_PartnerWalkToDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_2, BattleFrontier_BattleTowerMultiCorridor_Movement_PlayerAttendantWalkToDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_1, BattleFrontier_BattleTowerMultiCorridor_Movement_PartnerAttendantWalkToDoor waitmovement 0 delay 40 - applymovement LOCALID_ATTENDANT_2, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_ATTENDANT_1, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_2, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_1, Common_Movement_WalkInPlaceFasterUp waitmovement 0 opendoor 7, 1 waitdooranim - applymovement LOCALID_ATTENDANT_2, BattleFrontier_BattleTowerMultiCorridor_Movement_AttendantEnterDoor - applymovement LOCALID_ATTENDANT_1, BattleFrontier_BattleTowerMultiCorridor_Movement_AttendantEnterDoor - applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_TrainerEnterDoor - applymovement LOCALID_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_TrainerEnterDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_2, BattleFrontier_BattleTowerMultiCorridor_Movement_AttendantEnterDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_ATTENDANT_1, BattleFrontier_BattleTowerMultiCorridor_Movement_AttendantEnterDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, BattleFrontier_BattleTowerMultiCorridor_Movement_TrainerEnterDoor + applymovement LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, BattleFrontier_BattleTowerMultiCorridor_Movement_TrainerEnterDoor waitmovement 0 closedoor 7, 1 waitdooranim diff --git a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/map.json b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/map.json index c48458344f..687099d560 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/map.json +++ b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TOWER_PARTNER_ROOM_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 11, "y": 2, diff --git a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc index b9fc7d5543..64a91a9a5a 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - BattleFrontier_BattleTowerMultiPartnerRoom_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, BattleFrontier_BattleTowerMultiPartnerRoom_OnResume map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattleTowerMultiPartnerRoom_OnTransition @@ -35,7 +33,7 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_ChosePartner:: setvar VAR_OBJ_GFX_ID_7, OBJ_EVENT_GFX_BOY_1 setvar VAR_TEMP_1, 1 setvar VAR_TEMP_3, 1 - setobjectxyperm LOCALID_ATTENDANT, 10, 2 + setobjectxyperm LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, 10, 2 end BattleFrontier_BattleTowerMultiPartnerRoom_OnWarp: @@ -61,9 +59,9 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_EnterRoom:: lockall applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterRoom waitmovement 0 - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantBlockExit + applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantBlockExit waitmovement 0 - copyobjectxytoperm LOCALID_ATTENDANT + copyobjectxytoperm LOCALID_TOWER_PARTNER_ROOM_ATTENDANT applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox BattleFrontier_BattleTowerMultiPartnerRoom_Text_PleaseFindPartner, MSGBOX_DEFAULT @@ -100,7 +98,7 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_QuitChallenge:: BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_EnterElevator:: msgbox BattleFrontier_BattleTowerMultiPartnerRoom_Text_ThankYouForChoosingPartner, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 opendoor 10, 1 waitdooranim @@ -113,21 +111,21 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_EnterElevator:: end BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevator:: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator + applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevator waitmovement 0 return @ Unused BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevatorEast: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator + applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevatorEast waitmovement 0 return @ Unused BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevatorWest: - applymovement LOCALID_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator + applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEneterElevatorWest waitmovement 0 return diff --git a/data/maps/BattleFrontier_OutsideWest/map.json b/data/maps/BattleFrontier_OutsideWest/map.json index bcf579cf1d..a77f6ac578 100644 --- a/data/maps/BattleFrontier_OutsideWest/map.json +++ b/data/maps/BattleFrontier_OutsideWest/map.json @@ -34,6 +34,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_SS_TIDAL", "graphics_id": "OBJ_EVENT_GFX_SS_TIDAL", "x": 20, "y": 70, @@ -47,6 +48,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_FERRY_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BEAUTY", "x": 19, "y": 68, @@ -125,6 +127,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_MANIAC_1", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 13, "y": 44, @@ -138,6 +141,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_MANIAC_2", "graphics_id": "OBJ_EVENT_GFX_MANIAC", "x": 14, "y": 44, @@ -164,6 +168,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_GIRL", "graphics_id": "OBJ_EVENT_GFX_GIRL_1", "x": 38, "y": 27, @@ -190,6 +195,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_CAMPER", "graphics_id": "OBJ_EVENT_GFX_CAMPER", "x": 9, "y": 47, @@ -242,6 +248,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_FISHERMAN_2", "graphics_id": "OBJ_EVENT_GFX_FISHERMAN", "x": 42, "y": 48, @@ -307,6 +314,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_MAN_4", "graphics_id": "OBJ_EVENT_GFX_MAN_4", "x": 8, "y": 5, diff --git a/data/maps/BattleFrontier_OutsideWest/scripts.inc b/data/maps/BattleFrontier_OutsideWest/scripts.inc index 5ca5cb9fbb..378c1d6624 100644 --- a/data/maps/BattleFrontier_OutsideWest/scripts.inc +++ b/data/maps/BattleFrontier_OutsideWest/scripts.inc @@ -1,12 +1,3 @@ -.set LOCALID_SS_TIDAL, 2 -.set LOCALID_FERRY_ATTENDANT, 3 -.set LOCALID_MANIAC_1, 9 -.set LOCALID_MANIAC_2, 10 -.set LOCALID_GIRL, 12 -.set LOCALID_CAMPER, 14 -.set LOCALID_FISHERMAN_2, 18 -.set LOCALID_MAN_4, 23 - BattleFrontier_OutsideWest_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_OutsideWest_OnTransition .byte 0 @@ -72,8 +63,8 @@ BattleFrontier_OutsideWest_EventScript_BoardFerry:: applymovement VAR_LAST_TALKED, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 - hideobjectat LOCALID_FERRY_ATTENDANT, MAP_BATTLE_FRONTIER_OUTSIDE_WEST - setvar VAR_0x8004, LOCALID_SS_TIDAL + hideobjectat LOCALID_FRONTIER_FERRY_ATTENDANT, MAP_BATTLE_FRONTIER_OUTSIDE_WEST + setvar VAR_0x8004, LOCALID_FRONTIER_SS_TIDAL call Common_EventScript_FerryDepartIsland return @@ -113,7 +104,7 @@ BattleFrontier_OutsideWest_EventScript_Fisherman2:: faceplayer message BattleFrontier_OutsideWest_Text_GotSeasickOnWayHere waitmessage - applymovement LOCALID_FISHERMAN_2, Common_Movement_FaceAwayPlayer + applymovement LOCALID_FRONTIER_FISHERMAN_2, Common_Movement_FaceAwayPlayer waitmovement 0 waitbuttonpress release @@ -134,16 +125,16 @@ BattleFrontier_OutsideWest_EventScript_Maniac2:: end BattleFrontier_OutsideWest_EventScript_FactoryChallengersTalk:: - applymovement LOCALID_MANIAC_1, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_FRONTIER_MANIAC_1, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox BattleFrontier_OutsideWest_Text_SureWeCanChallengeWithNoMons, MSGBOX_DEFAULT - applymovement LOCALID_MANIAC_2, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_FRONTIER_MANIAC_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox BattleFrontier_OutsideWest_Text_BigGuySaidIllLendYouMons, MSGBOX_DEFAULT closemessage delay 25 - applymovement LOCALID_MANIAC_1, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_MANIAC_2, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_FRONTIER_MANIAC_1, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_FRONTIER_MANIAC_2, Common_Movement_WalkInPlaceFasterUp waitmovement 0 release end @@ -161,7 +152,7 @@ BattleFrontier_OutsideWest_EventScript_Camper:: end BattleFrontier_OutsideWest_EventScript_CamperFaceFactory:: - applymovement LOCALID_CAMPER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_FRONTIER_CAMPER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -182,22 +173,22 @@ BattleFrontier_OutsideWest_EventScript_Girl:: end BattleFrontier_OutsideWest_EventScript_GirlShudderNorth:: - applymovement LOCALID_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderNorth + applymovement LOCALID_FRONTIER_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderNorth waitmovement 0 return BattleFrontier_OutsideWest_EventScript_GirlShudderSouth:: - applymovement LOCALID_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderSouth + applymovement LOCALID_FRONTIER_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderSouth waitmovement 0 return BattleFrontier_OutsideWest_EventScript_GirlShudderWest:: - applymovement LOCALID_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderWest + applymovement LOCALID_FRONTIER_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderWest waitmovement 0 return BattleFrontier_OutsideWest_EventScript_GirlShudderEast:: - applymovement LOCALID_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderEast + applymovement LOCALID_FRONTIER_GIRL, BattleFrontier_OutsideWest_Movement_GirlShudderEast waitmovement 0 return @@ -298,7 +289,7 @@ BattleFrontier_OutsideWest_EventScript_Man4:: faceplayer msgbox BattleFrontier_OutsideWest_Text_FansOverThereUsedToBeTrainers, MSGBOX_DEFAULT closemessage - applymovement LOCALID_MAN_4, Common_Movement_FaceOriginalDirection + applymovement LOCALID_FRONTIER_MAN_4, Common_Movement_FaceOriginalDirection waitmovement 0 release end diff --git a/data/maps/BattleFrontier_ReceptionGate/map.json b/data/maps/BattleFrontier_ReceptionGate/map.json index 12a178198d..8f92c5e94b 100644 --- a/data/maps/BattleFrontier_ReceptionGate/map.json +++ b/data/maps/BattleFrontier_ReceptionGate/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FRONTIER_RECEPTION_GREETER", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 0, "y": 11, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_RECEPTION_GUIDE", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 8, "y": 11, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FRONTIER_RECEPTION_SCOTT", "graphics_id": "OBJ_EVENT_GFX_SCOTT", "x": 4, "y": 5, diff --git a/data/maps/BattleFrontier_ReceptionGate/scripts.inc b/data/maps/BattleFrontier_ReceptionGate/scripts.inc index 151bc665b5..169fcb07c4 100644 --- a/data/maps/BattleFrontier_ReceptionGate/scripts.inc +++ b/data/maps/BattleFrontier_ReceptionGate/scripts.inc @@ -1,7 +1,3 @@ -.set LOCALID_GREETER, 1 -.set LOCALID_GUIDE, 2 -.set LOCALID_SCOTT, 4 - BattleFrontier_ReceptionGate_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, BattleFrontier_ReceptionGate_OnFrame map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_ReceptionGate_OnTransition @@ -19,9 +15,9 @@ BattleFrontier_ReceptionGate_EventScript_FirstTimeEntering:: lockall setvar VAR_HAS_ENTERED_BATTLE_FRONTIER, 1 playse SE_PIN - applymovement LOCALID_GREETER, Common_Movement_ExclamationMark + applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_ExclamationMark waitmovement 0 - applymovement LOCALID_GREETER, Common_Movement_Delay48 + applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_Delay48 waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_FirstTimeHereThisWay, MSGBOX_DEFAULT closemessage @@ -42,27 +38,27 @@ BattleFrontier_ReceptionGate_EventScript_ScottScene:: msgbox BattleFrontier_ReceptionGate_Text_EnjoyBattleFrontier, MSGBOX_DEFAULT msgbox BattleFrontier_ReceptionGate_Text_IfItIsntPlayerYouCame, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GREETER, Common_Movement_WalkInPlaceFasterUp - applymovement LOCALID_GUIDE, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, Common_Movement_WalkInPlaceFasterUp applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN - applymovement LOCALID_GREETER, Common_Movement_ExclamationMark - applymovement LOCALID_GUIDE, Common_Movement_ExclamationMark + applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_ExclamationMark + applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, Common_Movement_ExclamationMark applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_OhMrScottGoodDay, MSGBOX_DEFAULT closemessage - applymovement LOCALID_GREETER, BattleFrontier_ReceptionGate_Movement_GreeterFaceScott - applymovement LOCALID_GUIDE, BattleFrontier_ReceptionGate_Movement_FacilityGuideFaceScott + applymovement LOCALID_FRONTIER_RECEPTION_GREETER, BattleFrontier_ReceptionGate_Movement_GreeterFaceScott + applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, BattleFrontier_ReceptionGate_Movement_FacilityGuideFaceScott applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_ReceptionGate_Movement_PlayerFaceScott - applymovement LOCALID_SCOTT, BattleFrontier_ReceptionGate_Movement_ScottEnter + applymovement LOCALID_FRONTIER_RECEPTION_SCOTT, BattleFrontier_ReceptionGate_Movement_ScottEnter waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_ScottGreatToSeeYouHere, MSGBOX_DEFAULT closemessage - applymovement LOCALID_SCOTT, BattleFrontier_ReceptionGate_Movement_ScottExit + applymovement LOCALID_FRONTIER_RECEPTION_SCOTT, BattleFrontier_ReceptionGate_Movement_ScottExit waitmovement 0 - removeobject LOCALID_SCOTT + removeobject LOCALID_FRONTIER_RECEPTION_SCOTT releaseall end diff --git a/data/maps/FallarborTown_BattleTentBattleRoom/map.json b/data/maps/FallarborTown_BattleTentBattleRoom/map.json index 7b702dc0e5..a03588eca6 100644 --- a/data/maps/FallarborTown_BattleTentBattleRoom/map.json +++ b/data/maps/FallarborTown_BattleTentBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FALLARBOR_TENT_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 4, "y": 8, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 3, "y": 2, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 5, "y": 1, diff --git a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc index 707995daeb..d6e8decf60 100644 --- a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc +++ b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc @@ -1,17 +1,13 @@ -.set LOCALID_PLAYER, 1 -.set LOCALID_ATTENDANT, 2 -.set LOCALID_OPPONENT, 3 - +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_FALLARBOR_TENT_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. FallarborTown_BattleTentBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, FallarborTown_BattleTentBattleRoom_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, FallarborTown_BattleTentBattleRoom_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, FallarborTown_BattleTentBattleRoom_OnWarp .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by object event 1, which has the gfx id VAR_OBJ_GFX_ID_1 - @ The opponent is represented by object event 3, which has the gfx id VAR_OBJ_GFX_ID_0 - FallarborTown_BattleTentBattleRoom_OnTransition: call FallarborTown_BattleTentBattleRoom_EventScript_SetPlayerGfx end @@ -38,17 +34,17 @@ FallarborTown_BattleTentBattleRoom_OnFrame: FallarborTown_BattleTentBattleRoom_EventScript_EnterRoom:: lockall - showobjectat LOCALID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM - applymovement LOCALID_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerEnter + showobjectat LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM + applymovement LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerEnter waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_ne VAR_RESULT, 0, FallarborTown_BattleTentBattleRoom_EventScript_ResumeChallenge FallarborTown_BattleTentBattleRoom_EventScript_NextOpponentEnter:: tower_setopponent - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, FallarborTown_BattleTentBattleRoom_Movement_OpponentEnter + addobject LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT + applymovement LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT, FallarborTown_BattleTentBattleRoom_Movement_OpponentEnter waitmovement 0 - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump playse SE_M_BELLY_DRUM waitse waitmovement 0 @@ -59,7 +55,7 @@ FallarborTown_BattleTentBattleRoom_EventScript_NextOpponentEnter:: call BattleFrontier_BattleArenaBattleRoom_EventScript_DoArenaBattle switch VAR_RESULT case 1, FallarborTown_BattleTentBattleRoom_EventScript_DefeatedOpponent - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump playse SE_M_SNORE waitse waitmovement 0 @@ -72,7 +68,7 @@ FallarborTown_BattleTentBattleRoom_EventScript_WarpToLobbyLost:: waitstate FallarborTown_BattleTentBattleRoom_EventScript_DefeatedOpponent:: - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantJump playse SE_BANG waitse waitmovement 0 @@ -84,12 +80,12 @@ FallarborTown_BattleTentBattleRoom_EventScript_IncrementBattleNum:: frontier_set FRONTIER_DATA_BATTLE_NUM, VAR_RESULT switch VAR_RESULT case 3, FallarborTown_BattleTentBattleRoom_EventScript_WarpToLobbyWon - applymovement LOCALID_OPPONENT, FallarborTown_BattleTentBattleRoom_Movement_OpponentExit + applymovement LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT, FallarborTown_BattleTentBattleRoom_Movement_OpponentExit waitmovement 0 - removeobject LOCALID_OPPONENT - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantApproachPlayer + removeobject LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement LOCALID_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceAttendant + applymovement LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 msgbox BattleFrontier_BattleArenaBattleRoom_Text_MonsWillBeRestored, MSGBOX_DEFAULT special LoadPlayerParty @@ -126,9 +122,9 @@ FallarborTown_BattleTentBattleRoom_EventScript_AskRetireChallenge:: FallarborTown_BattleTentBattleRoom_EventScript_ContinueChallenge:: closemessage - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantReturnToPos + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantReturnToPos waitmovement 0 - applymovement LOCALID_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceBattle + applymovement LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceBattle waitmovement 0 goto FallarborTown_BattleTentBattleRoom_EventScript_NextOpponentEnter waitstate @@ -168,9 +164,9 @@ FallarborTown_BattleTentBattleRoom_EventScript_PauseChallenge:: end FallarborTown_BattleTentBattleRoom_EventScript_ResumeChallenge:: - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantApproachPlayer + applymovement LOCALID_FALLARBOR_TENT_BATTLE_ATTENDANT, FallarborTown_BattleTentBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement LOCALID_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceAttendant + applymovement LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, FallarborTown_BattleTentBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 goto FallarborTown_BattleTentBattleRoom_EventScript_AskContinueChallenge end @@ -235,8 +231,8 @@ FallarborTown_BattleTentBattleRoom_OnWarp: FallarborTown_BattleTentBattleRoom_EventScript_SetUpObjects:: hideobjectat OBJ_EVENT_ID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM - hideobjectat LOCALID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM - removeobject LOCALID_OPPONENT + hideobjectat LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM + removeobject LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT setvar VAR_TEMP_1, 1 end diff --git a/data/maps/FallarborTown_BattleTentCorridor/map.json b/data/maps/FallarborTown_BattleTentCorridor/map.json index c086a32880..111889fe07 100644 --- a/data/maps/FallarborTown_BattleTentCorridor/map.json +++ b/data/maps/FallarborTown_BattleTentCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_FALLARBOR_TENT_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_BLACK_BELT", "x": 2, "y": 6, diff --git a/data/maps/FallarborTown_BattleTentCorridor/scripts.inc b/data/maps/FallarborTown_BattleTentCorridor/scripts.inc index 023dc919f8..4e5739238c 100644 --- a/data/maps/FallarborTown_BattleTentCorridor/scripts.inc +++ b/data/maps/FallarborTown_BattleTentCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - FallarborTown_BattleTentCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, FallarborTown_BattleTentCorridor_OnFrame .byte 0 @@ -11,12 +9,12 @@ FallarborTown_BattleTentCorridor_OnFrame: FallarborTown_BattleTentCorridor_EventScript_EnterCorridor:: lockall setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_WalkToDoor + applymovement LOCALID_FALLARBOR_TENT_CORRIDOR_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_WalkToDoor applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentCorridor_Movement_WalkToDoor waitmovement 0 opendoor 2, 1 waitdooranim - applymovement LOCALID_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_AttendantEnterDoor + applymovement LOCALID_FALLARBOR_TENT_CORRIDOR_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentCorridor_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 1 diff --git a/data/maps/MauvilleCity_PokemonCenter_1F/map.json b/data/maps/MauvilleCity_PokemonCenter_1F/map.json index 490dee9efe..4592d77b72 100644 --- a/data/maps/MauvilleCity_PokemonCenter_1F/map.json +++ b/data/maps/MauvilleCity_PokemonCenter_1F/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCAL_ID_MAUVILLE_NURSE", + "local_id": "LOCALID_MAUVILLE_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 7, "y": 2, diff --git a/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc b/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc index 1d4a52b58c..173fe97af0 100644 --- a/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/MauvilleCity_PokemonCenter_1F/scripts.inc @@ -14,7 +14,7 @@ MauvilleCity_PokemonCenter_1F_EventScript_SetMauvilleOldManGfx:: end MauvilleCity_PokemonCenter_1F_EventScript_Nurse:: - setvar VAR_0x800B, LOCAL_ID_MAUVILLE_NURSE + setvar VAR_0x800B, LOCALID_MAUVILLE_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/NavelRock_Top/map.json b/data/maps/NavelRock_Top/map.json index f63c578405..e208dd7099 100644 --- a/data/maps/NavelRock_Top/map.json +++ b/data/maps/NavelRock_Top/map.json @@ -15,7 +15,7 @@ "connections": null, "object_events": [ { - "local_id": "LOCAL_ID_NAVEL_ROCK_HO_OH", + "local_id": "LOCALID_NAVEL_ROCK_HO_OH", "graphics_id": "OBJ_EVENT_GFX_HOOH", "x": 12, "y": 4, diff --git a/data/maps/NavelRock_Top/scripts.inc b/data/maps/NavelRock_Top/scripts.inc index 628f581e29..038fc96f1b 100644 --- a/data/maps/NavelRock_Top/scripts.inc +++ b/data/maps/NavelRock_Top/scripts.inc @@ -27,7 +27,7 @@ NavelRock_Top_OnResume: NavelRock_Top_EventScript_TryRemoveHoOh:: specialvar VAR_RESULT, GetBattleOutcome goto_if_ne VAR_RESULT, B_OUTCOME_CAUGHT, Common_EventScript_NopReturn - removeobject LOCAL_ID_NAVEL_ROCK_HO_OH + removeobject LOCALID_NAVEL_ROCK_HO_OH return NavelRock_Top_EventScript_HoOh:: @@ -37,7 +37,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8004, 3 @ num loops setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE - applymovement LOCAL_ID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhAppear + applymovement LOCALID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhAppear applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanUp waitmovement 0 delay 50 @@ -52,7 +52,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanDown - applymovement LOCAL_ID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhApproach + applymovement LOCALID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhApproach waitmovement 0 special RemoveCameraObject seteventmon SPECIES_HO_OH, 70 @@ -60,7 +60,7 @@ NavelRock_Top_EventScript_HoOh:: special BattleSetup_StartLegendaryBattle waitstate clearflag FLAG_SYS_CTRL_OBJ_DELETE - setvar VAR_LAST_TALKED, LOCAL_ID_NAVEL_ROCK_HO_OH + setvar VAR_LAST_TALKED, LOCALID_NAVEL_ROCK_HO_OH specialvar VAR_RESULT, GetBattleOutcome goto_if_eq VAR_RESULT, B_OUTCOME_WON, NavelRock_Top_EventScript_DefeatedHoOh goto_if_eq VAR_RESULT, B_OUTCOME_RAN, NavelRock_Top_EventScript_RanFromHoOh diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/map.json b/data/maps/SlateportCity_BattleTentBattleRoom/map.json index 27cce84b49..13b8005364 100644 --- a/data/maps/SlateportCity_BattleTentBattleRoom/map.json +++ b/data/maps/SlateportCity_BattleTentBattleRoom/map.json @@ -28,6 +28,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 5, "y": 1, @@ -41,6 +42,7 @@ "flag": "0" }, { + "local_id": "LOCALID_SLATEPORT_TENT_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 4, "y": 8, diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc index 53514bb5e9..2f9f57d809 100644 --- a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc +++ b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc @@ -1,5 +1,7 @@ -.set LOCALID_OPPONENT, 2 -.set LOCALID_PLAYER, 3 +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_SLATEPORT_TENT_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by factory_setopponentgfx. SlateportCity_BattleTentBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, SlateportCity_BattleTentBattleRoom_OnTransition @@ -7,9 +9,6 @@ SlateportCity_BattleTentBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, SlateportCity_BattleTentBattleRoom_OnFrame .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by LOCALID_PLAYER, which has the gfx id VAR_OBJ_GFX_ID_1 - SlateportCity_BattleTentBattleRoom_OnTransition: call SlateportCity_BattleTentBattleRoom_EventScript_SetPlayerGfx end @@ -35,7 +34,7 @@ SlateportCity_BattleTentBattleRoom_OnWarp: SlateportCity_BattleTentBattleRoom_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 hideobjectat OBJ_EVENT_ID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM - hideobjectat LOCALID_OPPONENT, MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM + hideobjectat LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT, MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM end SlateportCity_BattleTentBattleRoom_OnFrame: @@ -43,13 +42,13 @@ SlateportCity_BattleTentBattleRoom_OnFrame: .2byte 0 SlateportCity_BattleTentBattleRoom_EventScript_EnterRoom:: - applymovement LOCALID_PLAYER, SlateportCity_BattleTentBattleRoom_Movement_PlayerEnter + applymovement LOCALID_SLATEPORT_TENT_BATTLE_PLAYER, SlateportCity_BattleTentBattleRoom_Movement_PlayerEnter waitmovement 0 factory_setopponentgfx - setobjectxyperm LOCALID_OPPONENT, 5, 1 - removeobject LOCALID_OPPONENT - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, SlateportCity_BattleTentBattleRoom_Movement_OpponentEnter + setobjectxyperm LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT, 5, 1 + removeobject LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT + addobject LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT + applymovement LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT, SlateportCity_BattleTentBattleRoom_Movement_OpponentEnter waitmovement 0 battletent_getopponentintro lockall diff --git a/data/maps/SlateportCity_BattleTentCorridor/map.json b/data/maps/SlateportCity_BattleTentCorridor/map.json index c9cd4b1a71..a6f1e60de7 100644 --- a/data/maps/SlateportCity_BattleTentCorridor/map.json +++ b/data/maps/SlateportCity_BattleTentCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 2, "y": 6, diff --git a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc index 75156f68f0..ca714b767e 100644 --- a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc +++ b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - SlateportCity_BattleTentCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, SlateportCity_BattleTentCorridor_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, SlateportCity_BattleTentCorridor_OnWarp @@ -14,8 +12,8 @@ SlateportCity_BattleTentCorridor_OnWarp: SlateportCity_BattleTentCorridor_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 goto_if_ne VAR_0x8006, 1, SlateportCity_BattleTentCorridor_EventScript_TurnPlayerNorth - setobjectxy LOCALID_ATTENDANT, 2, 2 - turnobject LOCALID_ATTENDANT, DIR_SOUTH + setobjectxy LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, 2, 2 + turnobject LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, DIR_SOUTH SlateportCity_BattleTentCorridor_EventScript_TurnPlayerNorth:: turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end @@ -27,7 +25,7 @@ SlateportCity_BattleTentCorridor_OnFrame: SlateportCity_BattleTentCorridor_EventScript_EnterCorridor:: goto_if_eq VAR_0x8006, 1, SlateportCity_BattleTentCorridor_EventScript_ReturnToRoomFromBattle setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantEnter + applymovement LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantEnter applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerEnter waitmovement 0 goto_if_eq VAR_0x8006, 2, SlateportCity_BattleTentCorridor_EventScript_ResumeChallenge @@ -40,11 +38,11 @@ SlateportCity_BattleTentCorridor_EventScript_EnterCorridor:: SlateportCity_BattleTentCorridor_EventScript_EnterBattleRoom:: msgbox BattleFrontier_BattleFactoryPreBattleRoom_Text_RightThisWay, MSGBOX_DEFAULT closemessage - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, Common_Movement_WalkInPlaceFasterUp waitmovement 0 opendoor 2, 1 waitdooranim - applymovement LOCALID_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantExit + applymovement LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantExit applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerExit waitmovement 0 closedoor 2, 1 diff --git a/data/maps/SlateportCity_BattleTentLobby/map.json b/data/maps/SlateportCity_BattleTentLobby/map.json index 6a599df8f3..227c0bb414 100644 --- a/data/maps/SlateportCity_BattleTentLobby/map.json +++ b/data/maps/SlateportCity_BattleTentLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_SLATEPORT_TENT_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_SCIENTIST_1", "x": 6, "y": 5, diff --git a/data/maps/SlateportCity_BattleTentLobby/scripts.inc b/data/maps/SlateportCity_BattleTentLobby/scripts.inc index 88dd323da0..3e6793f95a 100644 --- a/data/maps/SlateportCity_BattleTentLobby/scripts.inc +++ b/data/maps/SlateportCity_BattleTentLobby/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - SlateportCity_BattleTentLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, SlateportCity_BattleTentLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, SlateportCity_BattleTentLobby_OnWarp @@ -138,12 +136,12 @@ SlateportCity_BattleTentLobby_EventScript_EnterChallenge:: end SlateportCity_BattleTentLobby_EventScript_WalkToDoor:: - applymovement LOCALID_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantWalkToDoor + applymovement LOCALID_SLATEPORT_TENT_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantWalkToDoor applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerWalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim - applymovement LOCALID_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantEnterDoor + applymovement LOCALID_SLATEPORT_TENT_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 diff --git a/data/maps/TrainerHill_Entrance/map.json b/data/maps/TrainerHill_Entrance/map.json index 0f2b4ec558..5c931215c4 100644 --- a/data/maps/TrainerHill_Entrance/map.json +++ b/data/maps/TrainerHill_Entrance/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_TRAINER_HILL_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_TEALA", "x": 11, "y": 6, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_HILL_NURSE", "graphics_id": "OBJ_EVENT_GFX_NURSE", "x": 4, "y": 9, @@ -54,6 +56,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_HILL_GIRL", "graphics_id": "OBJ_EVENT_GFX_GIRL_3", "x": 5, "y": 14, @@ -67,6 +70,7 @@ "flag": "0" }, { + "local_id": "LOCALID_TRAINER_HILL_MAN", "graphics_id": "OBJ_EVENT_GFX_MAN_3", "x": 14, "y": 15, diff --git a/data/maps/TrainerHill_Entrance/scripts.inc b/data/maps/TrainerHill_Entrance/scripts.inc index 2dd001a3ba..474df29eba 100644 --- a/data/maps/TrainerHill_Entrance/scripts.inc +++ b/data/maps/TrainerHill_Entrance/scripts.inc @@ -1,8 +1,3 @@ -.set LOCALID_ATTENDANT, 1 -.set LOCALID_NURSE, 2 -.set LOCALID_GIRL, 4 -.set LOCALID_MAN, 5 - TrainerHill_Entrance_MapScripts:: map_script MAP_SCRIPT_ON_RESUME, TrainerHill_Entrance_OnResume map_script MAP_SCRIPT_ON_RETURN_TO_FIELD, TrainerHill_Entrance_OnReturn @@ -39,10 +34,10 @@ TrainerHill_Entrance_EventScript_PlayerDontFaceAttendant:: end TrainerHill_Entrance_OnReturn: - addobject LOCALID_NURSE - addobject LOCALID_ATTENDANT - addobject LOCALID_MAN - addobject LOCALID_GIRL + addobject LOCALID_TRAINER_HILL_NURSE + addobject LOCALID_TRAINER_HILL_ATTENDANT + addobject LOCALID_TRAINER_HILL_MAN + addobject LOCALID_TRAINER_HILL_GIRL end TrainerHill_Entrance_OnLoad: @@ -101,7 +96,7 @@ TrainerHill_Entrance_EventScript_EndExitChallenge:: end TrainerHill_Entrance_EventScript_Nurse:: - setvar VAR_0x800B, LOCALID_NURSE + setvar VAR_0x800B, LOCALID_TRAINER_HILL_NURSE call Common_EventScript_PkmnCenterNurse waitmessage waitbuttonpress diff --git a/data/maps/VerdanturfTown_BattleTentBattleRoom/map.json b/data/maps/VerdanturfTown_BattleTentBattleRoom/map.json index 72eca1d95c..7913b66e98 100644 --- a/data/maps/VerdanturfTown_BattleTentBattleRoom/map.json +++ b/data/maps/VerdanturfTown_BattleTentBattleRoom/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_VERDANTURF_TENT_BATTLE_PLAYER", "graphics_id": "OBJ_EVENT_GFX_VAR_1", "x": 2, "y": 8, @@ -28,6 +29,7 @@ "flag": "0" }, { + "local_id": "LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT", "graphics_id": "OBJ_EVENT_GFX_VAR_0", "x": 11, "y": 1, @@ -41,6 +43,7 @@ "flag": "0" }, { + "local_id": "LOCALID_VERDANTURF_TENT_BATTLE_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 2, "y": 4, diff --git a/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc b/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc index 29008b7c0f..faeda4b42d 100644 --- a/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc @@ -1,17 +1,13 @@ -.set LOCALID_PLAYER, 1 -.set LOCALID_OPPONENT, 2 -.set LOCALID_ATTENDANT, 3 - +@ On this map the player will automatically walk into the room, but the camera is supposed to remain still. +@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_VERDANTURF_TENT_BATTLE_PLAYER). +@ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. +@ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. VerdanturfTown_BattleTentBattleRoom_MapScripts:: map_script MAP_SCRIPT_ON_TRANSITION, VerdanturfTown_BattleTentBattleRoom_OnTransition map_script MAP_SCRIPT_ON_FRAME_TABLE, VerdanturfTown_BattleTentBattleRoom_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, VerdanturfTown_BattleTentBattleRoom_OnWarp .byte 0 - @ On this map the player (OBJ_EVENT_ID_PLAYER) is hidden - @ The player is represented instead by object event 1, which has the gfx id VAR_OBJ_GFX_ID_1 - @ The opponent is represented by object event 2, which has the gfx id VAR_OBJ_GFX_ID_0 - VerdanturfTown_BattleTentBattleRoom_OnTransition: call VerdanturfTown_BattleTentBattleRoom_EventScript_SetPlayerGfx end @@ -37,15 +33,15 @@ VerdanturfTown_BattleTentBattleRoom_OnFrame: .2byte 0 VerdanturfTown_BattleTentBattleRoom_EventScript_EnterRoom:: - showobjectat LOCALID_PLAYER, MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM - applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentBattleRoom_Movement_PlayerEnter + showobjectat LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM + applymovement LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, VerdanturfTown_BattleTentBattleRoom_Movement_PlayerEnter waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_ne VAR_RESULT, 0, VerdanturfTown_BattleTentBattleRoom_EventScript_AskContinueChallenge VerdanturfTown_BattleTentBattleRoom_EventScript_NextOpponentEnter:: tower_setopponent - addobject LOCALID_OPPONENT - applymovement LOCALID_OPPONENT, VerdanturfTown_BattleTentBattleRoom_Movement_OpponentEnter + addobject LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT + applymovement LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT, VerdanturfTown_BattleTentBattleRoom_Movement_OpponentEnter waitmovement 0 battletent_getopponentintro msgbox gStringVar4, MSGBOX_DEFAULT @@ -65,11 +61,11 @@ VerdanturfTown_BattleTentBattleRoom_EventScript_DefeatedOpponent:: frontier_set FRONTIER_DATA_BATTLE_NUM, VAR_RESULT switch VAR_RESULT case 3, VerdanturfTown_BattleTentBattleRoom_EventScript_WarpToLobbyWon - applymovement LOCALID_OPPONENT, VerdanturfTown_BattleTentBattleRoom_Movement_OpponentExit + applymovement LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT, VerdanturfTown_BattleTentBattleRoom_Movement_OpponentExit waitmovement 0 - removeobject LOCALID_OPPONENT - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterDown - applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp + removeobject LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT + applymovement LOCALID_VERDANTURF_TENT_BATTLE_ATTENDANT, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox BattleFrontier_BattlePalaceBattleRoom_Text_LetMeRestoreYourMons, MSGBOX_DEFAULT special LoadPlayerParty @@ -106,8 +102,8 @@ VerdanturfTown_BattleTentBattleRoom_EventScript_AskRetireChallenge:: case MULTI_B_PRESSED, VerdanturfTown_BattleTentBattleRoom_EventScript_AskContinueChallenge VerdanturfTown_BattleTentBattleRoom_EventScript_ContinueChallenge:: - applymovement LOCALID_ATTENDANT, Common_Movement_WalkInPlaceFasterRight - applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_VERDANTURF_TENT_BATTLE_ATTENDANT, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 closemessage goto VerdanturfTown_BattleTentBattleRoom_EventScript_NextOpponentEnter @@ -133,11 +129,11 @@ VerdanturfTown_BattleTentBattleRoom_OnWarp: .2byte 0 VerdanturfTown_BattleTentBattleRoom_EventScript_SetUpObjects:: - hideobjectat LOCALID_PLAYER, MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM + hideobjectat LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM call VerdanturfTown_BattleTentBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentBattleRoom_Movement_SetInvisible - removeobject LOCALID_OPPONENT + removeobject LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT end VerdanturfTown_BattleTentBattleRoom_EventScript_ReadyFor2ndOpponent:: diff --git a/data/maps/VerdanturfTown_BattleTentCorridor/map.json b/data/maps/VerdanturfTown_BattleTentCorridor/map.json index 2b875b9009..95c0dffc5a 100644 --- a/data/maps/VerdanturfTown_BattleTentCorridor/map.json +++ b/data/maps/VerdanturfTown_BattleTentCorridor/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_VERDANTURF_TENT_CORRIDOR_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 2, "y": 6, diff --git a/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc b/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc index debf1b177f..8be8fd11b0 100644 --- a/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - VerdanturfTown_BattleTentCorridor_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, VerdanturfTown_BattleTentCorridor_OnFrame .byte 0 @@ -11,12 +9,12 @@ VerdanturfTown_BattleTentCorridor_OnFrame: VerdanturfTown_BattleTentCorridor_EventScript_EnterCorridor:: lockall setvar VAR_TEMP_0, 1 - applymovement LOCALID_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor + applymovement LOCALID_VERDANTURF_TENT_CORRIDOR_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor waitmovement 0 opendoor 2, 1 waitdooranim - applymovement LOCALID_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_AttendantEnterDoor + applymovement LOCALID_VERDANTURF_TENT_CORRIDOR_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 1 diff --git a/data/maps/VerdanturfTown_BattleTentLobby/map.json b/data/maps/VerdanturfTown_BattleTentLobby/map.json index ddb4b9dd35..132e08c9c0 100644 --- a/data/maps/VerdanturfTown_BattleTentLobby/map.json +++ b/data/maps/VerdanturfTown_BattleTentLobby/map.json @@ -15,6 +15,7 @@ "connections": null, "object_events": [ { + "local_id": "LOCALID_VERDANTURF_TENT_ATTENDANT", "graphics_id": "OBJ_EVENT_GFX_EXPERT_M", "x": 6, "y": 5, diff --git a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc index f70baac84f..979b2a84d6 100644 --- a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc @@ -1,5 +1,3 @@ -.set LOCALID_ATTENDANT, 1 - VerdanturfTown_BattleTentLobby_MapScripts:: map_script MAP_SCRIPT_ON_FRAME_TABLE, VerdanturfTown_BattleTentLobby_OnFrame map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, VerdanturfTown_BattleTentLobby_OnWarp @@ -193,12 +191,12 @@ VerdanturfTown_BattleTentLobby_EventScript_EndCancelChallenge:: end VerdanturfTown_BattleTentLobby_EventScript_WalkToDoor:: - applymovement LOCALID_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor + applymovement LOCALID_VERDANTURF_TENT_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim - applymovement LOCALID_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_AttendantEnterDoor + applymovement LOCALID_VERDANTURF_TENT_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_AttendantEnterDoor applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 diff --git a/data/scripts/battle_pike.inc b/data/scripts/battle_pike.inc index 8ca7f5b1af..5fb7dcd8a8 100644 --- a/data/scripts/battle_pike.inc +++ b/data/scripts/battle_pike.inc @@ -1,4 +1,3 @@ -@ Note: LOCALIDs shared with BattleFrontier_BattlePikeRoomNormal BattleFrontier_BattlePikeRoom_MapScripts: map_script MAP_SCRIPT_ON_TRANSITION, BattleFrontier_BattlePikeRoom_OnTransition map_script MAP_SCRIPT_ON_WARP_INTO_MAP_TABLE, BattleFrontier_BattlePikeRoom_OnWarp @@ -18,28 +17,28 @@ BattleFrontier_BattlePikeRoom_OnTransition: end BattleFrontier_BattlePikeRoomNormal_EventScript_SetDoubleBattleObjPos:: - setobjectxyperm LOCALID_OBJ_0, 2, 5 - setobjectxyperm LOCALID_OBJ_1, 6, 5 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_1, 2, 5 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_2, 6, 5 end BattleFrontier_BattlePikeRoomNormal_EventScript_SetTwoObjectRoomPos:: - setobjectxyperm LOCALID_OBJ_0, 4, 4 - setobjectxyperm LOCALID_OBJ_1, 3, 4 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_1, 4, 4 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_2, 3, 4 end BattleFrontier_BattlePikeRoomNormal_EventScript_SetOneObjectRoomPos:: - setobjectxyperm LOCALID_OBJ_0, 4, 4 - setobjectxyperm LOCALID_OBJ_1, 0, 0 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_1, 4, 4 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_2, 0, 0 end BattleFrontier_BattlePikeRoomNormal_EventScript_SetNPCRoomObjPos:: - setobjectxyperm LOCALID_OBJ_0, 5, 5 - setobjectxyperm LOCALID_OBJ_1, 0, 0 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_1, 5, 5 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_2, 0, 0 end BattleFrontier_BattlePikeRoomNormal_EventScript_SetBrainRoomObjPos:: - setobjectxyperm LOCALID_OBJ_0, 4, 3 - setobjectxyperm LOCALID_OBJ_1, 4, 4 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_1, 4, 3 + setobjectxyperm LOCALID_PIKE_ROOM_NPC_2, 4, 4 end BattleFrontier_BattlePikeRoom_OnWarp: @@ -54,7 +53,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_InitRoomObjects:: goto_if_eq VAR_RESULT, PIKE_ROOM_HARD_BATTLE, BattleFrontier_BattlePikeRoomNormal_EventScript_InitTwoObjectRoom goto_if_eq VAR_RESULT, PIKE_ROOM_DOUBLE_BATTLE, BattleFrontier_BattlePikeRoomNormal_EventScript_InitTwoObjectRoom goto_if_eq VAR_RESULT, PIKE_ROOM_BRAIN, BattleFrontier_BattlePikeRoomNormal_EventScript_InitBrainRoomObjects - hideobjectat LOCALID_OBJ_1, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL + hideobjectat LOCALID_PIKE_ROOM_NPC_2, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL setvar VAR_TEMP_4, 1 turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH end @@ -67,7 +66,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_InitTwoObjectRoom:: BattleFrontier_BattlePikeRoomNormal_EventScript_InitBrainRoomObjects:: setvar VAR_TEMP_4, 1 turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH - hideobjectat LOCALID_OBJ_0, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL @ Pike Queen hidden initially + hideobjectat LOCALID_PIKE_ROOM_NPC_1, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL @ Pike Queen hidden initially end BattleFrontier_BattlePikeThreePathRoom_EventScript_LeftRoomWarp:: diff --git a/src/tv.c b/src/tv.c index e802a32458..9a321edf07 100644 --- a/src/tv.c +++ b/src/tv.c @@ -3442,7 +3442,7 @@ void GetMomOrDadStringForTVMessage(void) void HideBattleTowerReporter(void) { VarSet(VAR_BRAVO_TRAINER_BATTLE_TOWER_ON, 0); - RemoveObjectEventByLocalIdAndMap(LOCALID_BATTLE_TOWER_LOBBY_REPORTER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + RemoveObjectEventByLocalIdAndMap(LOCALID_TOWER_LOBBY_REPORTER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); FlagSet(FLAG_HIDE_BATTLE_TOWER_REPORTER); } From f61c0099b9346106924219589254f2e6f8219f1b Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sat, 12 Oct 2024 23:34:02 -0400 Subject: [PATCH 011/187] OBJ_EVENT_ID_PLAYER/CAMERA -> LOCALID_PLAYER/CAMERA --- data/event_scripts.s | 8 +-- .../scripts.inc | 4 +- .../scripts.inc | 4 +- .../scripts.inc | 10 ++-- .../scripts.inc | 4 +- .../scripts.inc | 8 +-- .../scripts.inc | 6 +-- .../scripts.inc | 8 +-- .../scripts.inc | 8 +-- .../scripts.inc | 4 +- .../scripts.inc | 8 +-- .../scripts.inc | 4 +- .../scripts.inc | 10 ++-- .../scripts.inc | 6 +-- .../scripts.inc | 6 +-- .../scripts.inc | 4 +- .../scripts.inc | 2 +- .../scripts.inc | 14 ++--- .../scripts.inc | 2 +- .../scripts.inc | 2 +- .../scripts.inc | 6 +-- .../scripts.inc | 8 +-- .../scripts.inc | 10 ++-- .../scripts.inc | 4 +- .../scripts.inc | 6 +-- .../scripts.inc | 6 +-- .../scripts.inc | 4 +- .../scripts.inc | 4 +- .../scripts.inc | 12 ++--- .../BattleFrontier_ReceptionGate/scripts.inc | 8 +-- data/maps/ContestHall/scripts.inc | 2 +- data/maps/DewfordTown/scripts.inc | 30 +++++------ data/maps/DewfordTown_Hall/scripts.inc | 8 +-- .../EverGrandeCity_ChampionsRoom/scripts.inc | 16 +++--- .../EverGrandeCity_DrakesRoom/scripts.inc | 2 +- .../EverGrandeCity_GlaciasRoom/scripts.inc | 2 +- data/maps/EverGrandeCity_Hall1/scripts.inc | 2 +- data/maps/EverGrandeCity_Hall2/scripts.inc | 2 +- data/maps/EverGrandeCity_Hall3/scripts.inc | 2 +- data/maps/EverGrandeCity_Hall4/scripts.inc | 2 +- data/maps/EverGrandeCity_Hall5/scripts.inc | 2 +- .../EverGrandeCity_HallOfFame/scripts.inc | 12 ++--- .../EverGrandeCity_PhoebesRoom/scripts.inc | 2 +- .../scripts.inc | 4 +- .../EverGrandeCity_SidneysRoom/scripts.inc | 2 +- .../scripts.inc | 4 +- .../scripts.inc | 4 +- .../FallarborTown_BattleTentLobby/scripts.inc | 6 +-- data/maps/GraniteCave_StevensRoom/scripts.inc | 4 +- data/maps/LavaridgeTown/scripts.inc | 4 +- .../LilycoveCity_ContestLobby/scripts.inc | 12 ++--- .../LilycoveCity_CoveLilyMotel_1F/scripts.inc | 4 +- data/maps/LilycoveCity_Harbor/scripts.inc | 12 ++--- .../scripts.inc | 6 +-- .../scripts.inc | 6 +-- .../scripts.inc | 4 +- data/maps/LittlerootTown/scripts.inc | 32 ++++++------ .../scripts.inc | 12 ++--- .../scripts.inc | 14 ++--- .../LittlerootTown_MaysHouse_1F/scripts.inc | 12 ++--- .../LittlerootTown_MaysHouse_2F/scripts.inc | 14 ++--- .../scripts.inc | 14 ++--- data/maps/MagmaHideout_4F/scripts.inc | 4 +- data/maps/MarineCave_End/scripts.inc | 2 +- data/maps/MauvilleCity/scripts.inc | 16 +++--- data/maps/MeteorFalls_1F_1R/scripts.inc | 6 +-- data/maps/MossdeepCity/scripts.inc | 4 +- data/maps/MossdeepCity_Gym/scripts.inc | 16 +++--- .../MossdeepCity_SpaceCenter_2F/scripts.inc | 10 ++-- data/maps/MtChimney/scripts.inc | 2 +- .../MtChimney_CableCarStation/scripts.inc | 4 +- data/maps/MtPyre_Summit/scripts.inc | 26 +++++----- data/maps/NavelRock_Top/scripts.inc | 4 +- data/maps/NewMauville_Entrance/scripts.inc | 2 +- data/maps/OldaleTown/scripts.inc | 16 +++--- data/maps/PetalburgCity/scripts.inc | 34 ++++++------ data/maps/PetalburgCity_Gym/scripts.inc | 36 ++++++------- .../PetalburgCity_WallysHouse/scripts.inc | 2 +- data/maps/PetalburgWoods/scripts.inc | 10 ++-- data/maps/Route101/scripts.inc | 12 ++--- data/maps/Route103/scripts.inc | 4 +- data/maps/Route104/scripts.inc | 28 +++++----- data/maps/Route109/scripts.inc | 18 +++---- .../scripts.inc | 2 +- .../scripts.inc | 2 +- data/maps/Route110_TrickHouseEnd/scripts.inc | 4 +- .../Route110_TrickHouseEntrance/scripts.inc | 10 ++-- data/maps/Route111/scripts.inc | 20 +++---- .../maps/Route112_CableCarStation/scripts.inc | 4 +- .../Route114_FossilManiacsTunnel/scripts.inc | 2 +- data/maps/Route116/scripts.inc | 2 +- data/maps/Route118/scripts.inc | 12 ++--- data/maps/Route119/scripts.inc | 6 +-- .../Route119_WeatherInstitute_2F/scripts.inc | 4 +- data/maps/Route120/scripts.inc | 6 +-- .../Route121_SafariZoneEntrance/scripts.inc | 8 +-- data/maps/Route128/scripts.inc | 8 +-- data/maps/RustboroCity/scripts.inc | 38 +++++++------- .../RustboroCity_DevonCorp_3F/scripts.inc | 6 +-- data/maps/RusturfTunnel/scripts.inc | 16 +++--- data/maps/SSTidalCorridor/scripts.inc | 4 +- data/maps/SafariZone_South/scripts.inc | 6 +-- data/maps/SeafloorCavern_Room9/scripts.inc | 10 ++-- data/maps/SkyPillar_Outside/scripts.inc | 4 +- data/maps/SkyPillar_Top/scripts.inc | 6 +-- data/maps/SlateportCity/scripts.inc | 12 ++--- .../scripts.inc | 4 +- .../scripts.inc | 6 +-- .../SlateportCity_BattleTentLobby/scripts.inc | 6 +-- data/maps/SlateportCity_Harbor/scripts.inc | 16 +++--- .../scripts.inc | 12 ++--- .../scripts.inc | 8 +-- data/maps/SootopolisCity/scripts.inc | 32 ++++++------ data/maps/SootopolisCity_Gym_1F/scripts.inc | 2 +- .../scripts.inc | 10 ++-- .../scripts.inc | 4 +- data/maps/SouthernIsland_Exterior/scripts.inc | 4 +- data/maps/SouthernIsland_Interior/scripts.inc | 4 +- data/maps/TerraCave_End/scripts.inc | 2 +- data/maps/TrainerHill_Elevator/scripts.inc | 8 +-- data/maps/TrainerHill_Entrance/scripts.inc | 20 +++---- .../scripts.inc | 4 +- .../scripts.inc | 4 +- .../scripts.inc | 6 +-- data/maps/VictoryRoad_1F/scripts.inc | 2 +- data/scripts/battle_pike.inc | 14 ++--- data/scripts/cable_club.inc | 52 +++++++++---------- data/scripts/cave_hole.inc | 4 +- data/scripts/elite_four.inc | 4 +- data/scripts/players_house.inc | 46 ++++++++-------- data/scripts/secret_base.inc | 2 +- include/constants/event_objects.h | 8 ++- src/event_object_lock.c | 4 +- src/event_object_movement.c | 12 ++--- src/field_control_avatar.c | 6 +-- src/field_player_avatar.c | 2 +- src/field_screen_effect.c | 12 ++--- src/field_special_scene.c | 6 +-- src/field_specials.c | 4 +- src/item_use.c | 10 ++-- src/match_call.c | 2 +- src/rotating_tile_puzzle.c | 2 +- src/scrcmd.c | 4 +- src/script.c | 2 +- src/script_movement.c | 2 +- src/trainer_see.c | 6 +-- 146 files changed, 627 insertions(+), 623 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index f18aae0b3a..24d0d16b73 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -784,11 +784,11 @@ RusturfTunnel_EventScript_SetRusturfTunnelOpen:: EventScript_UnusedBoardFerry:: delay 30 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 - showobjectat OBJ_EVENT_ID_PLAYER, 0 + showobjectat LOCALID_PLAYER, 0 delay 30 - applymovement OBJ_EVENT_ID_PLAYER, Movement_UnusedBoardFerry + applymovement LOCALID_PLAYER, Movement_UnusedBoardFerry waitmovement 0 delay 30 return @@ -801,7 +801,7 @@ Common_EventScript_FerryDepartIsland:: call_if_eq VAR_FACING, DIR_SOUTH, Ferry_EventScript_DepartIslandSouth call_if_eq VAR_FACING, DIR_WEST, Ferry_EventScript_DepartIslandWest delay 30 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 call Common_EventScript_FerryDepart return diff --git a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc index 79132baec9..1dec6328d6 100644 --- a/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_ARENA_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_ARENA_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. BattleFrontier_BattleArenaBattleRoom_MapScripts:: @@ -464,7 +464,7 @@ BattleFrontier_BattleArenaBattleRoom_EventScript_SetUpRoomObjects:: hideobjectat LOCALID_ARENA_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM removeobject LOCALID_ARENA_BATTLE_OPPONENT call BattleFrontier_BattleDomeBattleRoom_EventScript_SetPlayerGfx - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisible + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisible setvar VAR_TEMP_1, 1 end diff --git a/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc b/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc index c74756e7dd..9b0a1d55ac 100644 --- a/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaCorridor/scripts.inc @@ -10,14 +10,14 @@ BattleFrontier_BattleArenaCorridor_EventScript_WalkToBattleRoom:: delay 16 setvar VAR_TEMP_0, 1 applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantWalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerWalkToDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerWalkToDoor waitmovement 0 applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantFacePlayer waitmovement 0 msgbox BattleFrontier_BattleArenaCorridor_Text_PleaseStepIn, MSGBOX_SIGN applymovement LOCALID_ARENA_CORRIDOR_ATTENDANT, BattleFrontier_BattleArenaCorridor_Movement_AttendantMoveOutOfWay waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaCorridor_Movement_PlayerEnterDoor waitmovement 0 setvar VAR_0x8006, 0 warp MAP_BATTLE_FRONTIER_BATTLE_ARENA_BATTLE_ROOM, 7, 5 diff --git a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc index 2fb04a5493..ec655f8424 100644 --- a/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleArenaLobby/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattleArenaLobby_OnWarp: BattleFrontier_BattleArenaLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleArenaLobby_OnFrame: @@ -200,12 +200,12 @@ BattleFrontier_BattleArenaLobby_EventScript_EndCancelChallenge:: BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLv50:: applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToLeftDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToLeftDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToLeftDoor waitmovement 0 opendoor 2, 2 waitdooranim applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 2 waitdooranim @@ -249,12 +249,12 @@ BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor: BattleFrontier_BattleArenaLobby_EventScript_WalkToDoorLvOpen:: applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantWalkToRightDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToRightDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerWalkToRightDoor waitmovement 0 opendoor 11, 2 waitdooranim applymovement LOCALID_ARENA_ATTENDANT, BattleFrontier_BattleArenaLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleArenaLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 11, 2 waitdooranim diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index be00c2aaf3..44ddc0c62b 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_DOME_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_DOME_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by dome_setopponentgfx. @@ -464,7 +464,7 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_SetUpObjects:: call BattleFrontier_BattleDomeBattleRoom_EventScript_AddAudience call BattleFrontier_BattleDomeBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisible + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeBattleRoom_Movement_SetInvisible frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_ne VAR_RESULT, DOME_FINAL, BattleFrontier_BattleDomeBattleRoom_EventScript_EndSetUpObjects frontier_getbrainstatus diff --git a/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc b/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc index 5258aae9e3..6eca815247 100644 --- a/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeCorridor/scripts.inc @@ -12,12 +12,12 @@ BattleFrontier_BattleDomeCorridor_EventScript_EnterCorridor:: frontier_get FRONTIER_DATA_LVL_MODE goto_if_eq VAR_RESULT, FRONTIER_LVL_OPEN, BattleFrontier_BattleDomeCorridor_EventScript_WalkToBattleRoomLvOpen applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLv50 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLv50 + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLv50 waitmovement 0 opendoor 13, 3 waitdooranim applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLv50 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLv50 + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLv50 waitmovement 0 closedoor 13, 3 waitdooranim @@ -25,12 +25,12 @@ BattleFrontier_BattleDomeCorridor_EventScript_EnterCorridor:: BattleFrontier_BattleDomeCorridor_EventScript_WalkToBattleRoomLvOpen:: applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantWalkToDoorLvOpen - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLvOpen + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerWalkToDoorLvOpen waitmovement 0 opendoor 37, 3 waitdooranim applymovement LOCALID_DOME_CORRIDOR_ATTENDANT, BattleFrontier_BattleDomeCorridor_Movement_AttendantEnterDoorLvOpen - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLvOpen + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeCorridor_Movement_PlayerEnterDoorLvOpen waitmovement 0 closedoor 37, 3 waitdooranim diff --git a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc index eb73dad6f6..9bb2914ca3 100644 --- a/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeLobby/scripts.inc @@ -14,7 +14,7 @@ BattleFrontier_BattleDomeLobby_OnWarp: BattleFrontier_BattleDomeLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleDomeLobby_OnFrame: @@ -228,14 +228,14 @@ BattleFrontier_BattleDomeLobby_EventScript_EndCancelChallenge:: BattleFrontier_BattleDomeLobby_EventScript_WalkToDoor:: call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattleDomeLobby_EventScript_SinglesAttendantWalkToDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattleDomeLobby_EventScript_DoublesAttendantWalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeLobby_Movement_WalkToDoor waitmovement 0 call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattleDomeLobby_EventScript_OpenSinglesDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattleDomeLobby_EventScript_OpenDoublesDoor waitdooranim call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattleDomeLobby_EventScript_SinglesAttendantEnterDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattleDomeLobby_EventScript_DoublesAttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomeLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomeLobby_Movement_PlayerEnterDoor waitmovement 0 call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattleDomeLobby_EventScript_CloseSinglesDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattleDomeLobby_EventScript_CloseDoublesDoor diff --git a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc index a7aeb2c3e5..e06284c2ca 100644 --- a/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomePreBattleRoom/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattleDomePreBattleRoom_OnWarp: BattleFrontier_BattleDomePreBattleRoom_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleDomePreBattleRoom_OnFrame: @@ -20,7 +20,7 @@ BattleFrontier_BattleDomePreBattleRoom_EventScript_EnterRoom:: goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleDomePreBattleRoom_EventScript_ReturnFromBattle frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE setvar VAR_TEMP_0, 1 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerEnter + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerEnter waitmovement 0 lockall BattleFrontier_BattleDomePreBattleRoom_EventScript_AskReadyForNextRound:: @@ -150,11 +150,11 @@ BattleFrontier_BattleDomePreBattleRoom_EventScript_ContinueChallenge:: closemessage applymovement LOCALID_DOME_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleDomePreBattleRoom_Movement_AttendantMoveAside waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerWalkToDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerWalkToDoor waitmovement 0 opendoor 5, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleDomePreBattleRoom_Movement_PlayerEnterDoor waitmovement 0 closedoor 5, 1 waitdooranim diff --git a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc index 7330b5c4aa..e6da4070f7 100644 --- a/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_FACTORY_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_FACTORY_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by factory_setopponentgfx. @@ -30,7 +30,7 @@ BattleFrontier_BattleFactoryBattleRoom_OnWarp: BattleFrontier_BattleFactoryBattleRoom_EventScript_HideObjects:: setvar VAR_TEMP_1, 1 - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM + hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM goto_if_ne VAR_TEMP_F, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleFactoryBattleRoom_EventScript_EndHideObjects hideobjectat LOCALID_FACTORY_BATTLE_OPPONENT, MAP_BATTLE_FRONTIER_BATTLE_FACTORY_BATTLE_ROOM BattleFrontier_BattleFactoryBattleRoom_EventScript_EndHideObjects:: @@ -53,7 +53,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle:: closemessage applymovement LOCALID_FACTORY_BATTLE_OPPONENT, BattleFrontier_BattleFactoryBattleRoom_Movement_NolandMoveToBattle applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom waitmovement 0 call BattleFrontier_BattleFactoryBattleRoom_EventScript_ScientistsFaceBattle goto BattleFrontier_BattleFactoryBattleRoom_EventScript_BattleOpponent @@ -62,7 +62,7 @@ BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle:: BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoom:: goto_if_ne VAR_TEMP_F, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleFactoryBattleRoom_EventScript_EnterRoomFactoryHeadBattle applymovement LOCALID_FACTORY_BATTLE_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryBattleRoom_Movement_PlayerEnterRoom waitmovement 0 call BattleFrontier_BattleFactoryBattleRoom_EventScript_ScientistsFaceBattle factory_setopponentgfx diff --git a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc index 4354f4e8e9..e60e730565 100644 --- a/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryLobby/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattleFactoryLobby_OnWarp: BattleFrontier_BattleFactoryLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleFactoryLobby_OnFrame: @@ -167,7 +167,7 @@ BattleFrontier_BattleFactoryLobby_EventScript_EnterChallenge:: call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattleFactoryLobby_EventScript_TalkedToSinglesAttendant call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattleFactoryLobby_EventScript_TalkedToDoublesAttendant applymovement VAR_LAST_TALKED, BattleFrontier_BattleFactoryLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryLobby_Movement_PlayerEnterDoor waitmovement 0 warp MAP_BATTLE_FRONTIER_BATTLE_FACTORY_PRE_BATTLE_ROOM, 8, 13 setvar VAR_TEMP_CHALLENGE_STATUS, 0 diff --git a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc index 4bbddc46b4..07962bed2a 100644 --- a/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleFactoryPreBattleRoom/scripts.inc @@ -13,7 +13,7 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_SetUpObjects:: setobjectxy LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, 8, 7 turnobject LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, DIR_SOUTH BattleFrontier_BattleFactoryPreBattleRoom_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleFactoryPreBattleRoom_OnFrame: @@ -24,7 +24,7 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_EnterRoom:: goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_ReturnToRoomFromBattle setvar VAR_TEMP_0, 1 applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_AttendantEnterRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerEnterRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerEnterRoom waitmovement 0 goto_if_eq VAR_0x8006, 2, BattleFrontier_BattleFactoryPreBattleRoom_EventScript_ResumeChallenge factory_generaterentalmons @@ -377,12 +377,12 @@ BattleFrontier_BattleFactoryPreBattleRoom_EventScript_AskSwapBeforeHead:: BattleFrontier_BattleFactoryPreBattleRoom_EventScript_WalkToBattleRoomLv50:: applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLv50 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLv50 + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLv50 return BattleFrontier_BattleFactoryPreBattleRoom_EventScript_WalkToBattleRoomLvOpen:: applymovement LOCALID_FACTORY_PRE_BATTLE_ATTENDANT, BattleFrontier_BattleFactoryPreBattleRoom_Movement_GuideWalkToBattleRoomLvOpen - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLvOpen + applymovement LOCALID_PLAYER, BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerWalkToBattleRoomLvOpen return BattleFrontier_BattleFactoryPreBattleRoom_Movement_PlayerEnterRoom: diff --git a/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc index d9bae8f0ac..7223b14f3d 100644 --- a/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_PALACE_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_PALACE_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. @@ -291,7 +291,7 @@ BattleFrontier_BattlePalaceBattleRoom_EventScript_SetUpRoomObjects:: hideobjectat LOCALID_PALACE_BATTLE_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM call BattleFrontier_BattlePalaceBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible removeobject LOCALID_PALACE_BATTLE_OPPONENT applymovement LOCALID_PALACE_DUSCLOPS, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible applymovement LOCALID_PALACE_AZURILL, BattleFrontier_BattlePalaceBattleRoom_Movement_SetInvisible diff --git a/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc b/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc index d79d4a66cc..08d5a07a5a 100644 --- a/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceCorridor/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattlePalaceCorridor_OnFrame: BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: delay 16 applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_EnterCorridor waitmovement 0 lockall palace_getcomment @@ -22,12 +22,12 @@ BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: frontier_get FRONTIER_DATA_LVL_MODE goto_if_eq VAR_RESULT, FRONTIER_LVL_OPEN, BattleFrontier_BattlePalaceCorridor_EventScript_WalkToOpenBattleRoom applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkTo50BattleRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkTo50BattleRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkTo50BattleRoom waitmovement 0 opendoor 6, 3 waitdooranim applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom waitmovement 0 closedoor 6, 3 waitdooranim @@ -35,12 +35,12 @@ BattleFrontier_BattlePalaceCorridor_EventScript_WalkThroughCorridor:: BattleFrontier_BattlePalaceCorridor_EventScript_WalkToOpenBattleRoom:: applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantWalkToOpenBattleRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkToOpenBattleRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerWalkToOpenBattleRoom waitmovement 0 opendoor 10, 3 waitdooranim applymovement LOCALID_PALACE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePalaceCorridor_Movement_AttendantEnterBattleRoom - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceCorridor_Movement_PlayerEnterBattleRoom waitmovement 0 closedoor 10, 3 waitdooranim diff --git a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc index db354b5e23..2816718c64 100644 --- a/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePalaceLobby/scripts.inc @@ -9,7 +9,7 @@ BattleFrontier_BattlePalaceLobby_OnWarp: BattleFrontier_BattlePalaceLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePalaceLobby_OnFrame: @@ -238,13 +238,13 @@ BattleFrontier_BattlePalaceLobby_EventScript_WalkToDoor:: call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattlePalaceLobby_EventScript_TalkedToSinglesAttendant call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattlePalaceLobby_EventScript_TalkedToDoublesAttendant applymovement VAR_LAST_TALKED, BattleFrontier_BattlePalaceLobby_Movement_WalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceLobby_Movement_WalkToDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceLobby_Movement_WalkToDoor waitmovement 0 call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattlePalaceLobby_EventScript_OpenSinglesHallDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattlePalaceLobby_EventScript_OpenDoublesHallDoor waitdooranim applymovement VAR_LAST_TALKED, BattleFrontier_BattlePalaceLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePalaceLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePalaceLobby_Movement_PlayerEnterDoor waitmovement 0 call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_SINGLES, BattleFrontier_BattlePalaceLobby_EventScript_CloseSinglesHallDoor call_if_eq VAR_FRONTIER_BATTLE_MODE, FRONTIER_MODE_DOUBLES, BattleFrontier_BattlePalaceLobby_EventScript_CloseDoublesHallDoor diff --git a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc index 00e4f8e22b..5d2db019ce 100644 --- a/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeCorridor/scripts.inc @@ -12,14 +12,14 @@ BattleFrontier_BattlePikeCorridor_EventScript_EnterCorridor:: frontier_set FRONTIER_DATA_BATTLE_NUM, 1 pike_cleartrainerids pike_nohealing TRUE - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerEnterCorridor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerEnterCorridor applymovement LOCALID_PIKE_CORRIDOR_ATTENDANT, BattleFrontier_BattlePikeCorridor_Movement_AttendantEnterCorridor waitmovement 0 lockall msgbox BattleFrontier_BattlePikeCorridor_Text_YourChallengeHasBegun, MSGBOX_DEFAULT closemessage releaseall - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerExitCorridor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeCorridor_Movement_PlayerExitCorridor waitmovement 0 frontier_set FRONTIER_DATA_CHALLENGE_STATUS, 99 call BattleFrontier_BattlePike_EventScript_CloseCurtain @@ -33,7 +33,7 @@ BattleFrontier_BattlePikeCorridor_OnWarp: BattleFrontier_BattlePikeCorridor_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeCorridor_Movement_PlayerEnterCorridor: diff --git a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc index 5b188f3935..ef6869f2c0 100644 --- a/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeLobby/scripts.inc @@ -16,7 +16,7 @@ BattleFrontier_BattlePikeLobby_OnWarp: BattleFrontier_BattlePikeLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeLobby_EventScript_GetChallengeStatus:: @@ -197,7 +197,7 @@ BattleFrontier_BattlePikeLobby_EventScript_ShowResults:: BattleFrontier_BattlePikeLobby_EventScript_WalkToCorridor:: applymovement LOCALID_PIKE_LOBBY_ATTENDANT, BattleFrontier_BattlePikeLobby_Movement_AttendantWalkToCorridor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeLobby_Movement_PlayerWalkToCorridor + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeLobby_Movement_PlayerWalkToCorridor waitmovement 0 return diff --git a/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc index 9f5c02959e..e847f1f6af 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeRoomFinal/scripts.inc @@ -31,7 +31,7 @@ BattleFrontier_BattlePikeRoomFinal_OnWarp: BattleFrontier_BattlePikeRoomFinal_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeRoomFinal_Text_CongratsThisWayPlease: diff --git a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc index 335cb43cc4..44da68a6d7 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeRoomNormal/scripts.inc @@ -103,7 +103,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_LucyEnter:: msgbox BattleFrontier_BattlePikeRoomNormal_Text_ShallFetchOurMaster, MSGBOX_DEFAULT closemessage special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, BattleFrontier_BattlePikeRoomNormal_Movement_CameraPanUp + applymovement LOCALID_CAMERA, BattleFrontier_BattlePikeRoomNormal_Movement_CameraPanUp applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_HealNPCExitForLucy waitmovement 0 playse SE_PIKE_CURTAIN_CLOSE @@ -184,7 +184,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DefeatedLucyGold:: BattleFrontier_BattlePikeRoomNormal_EventScript_DefeatedLucy:: applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_LucyMoveAside waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerWalkUp2 + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerWalkUp2 waitmovement 0 pike_get PIKE_DATA_WIN_STREAK addvar VAR_RESULT, 1 @@ -241,13 +241,13 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterDoubleBattleRoom:: applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1FacePlayer applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2FacePlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer1 + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer1 waitmovement 0 pike_gettrainerintro 0 msgbox gStringVar4, MSGBOX_DEFAULT closemessage delay 16 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer2 + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer2 waitmovement 0 pike_gettrainerintro 1 msgbox gStringVar4, MSGBOX_DEFAULT @@ -262,13 +262,13 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_EnterDoubleBattleRoom:: end BattleFrontier_BattlePikeRoomNormal_EventScript_WonDoubleBattle:: - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer2 + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceTrainer2 waitmovement 0 applymovement LOCALID_PIKE_ROOM_NPC_1, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer1Exit waitmovement 0 applymovement LOCALID_PIKE_ROOM_NPC_2, BattleFrontier_BattlePikeRoomNormal_Movement_Trainer2Exit waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceUp + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerFaceUp waitmovement 0 end @@ -378,7 +378,7 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_DusclopsUsedWillOWisp:: BattleFrontier_BattlePikeRoomNormal_EventScript_DoPikeQueenBattle:: closemessage - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerWalkUp2 + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoomNormal_Movement_PlayerWalkUp2 waitmovement 0 setvar VAR_0x8004, SPECIAL_BATTLE_PIKE_SINGLE setvar VAR_0x8005, 0 diff --git a/data/maps/BattleFrontier_BattlePikeRoomWildMons/scripts.inc b/data/maps/BattleFrontier_BattlePikeRoomWildMons/scripts.inc index 19926b9675..9059ee4387 100644 --- a/data/maps/BattleFrontier_BattlePikeRoomWildMons/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeRoomWildMons/scripts.inc @@ -26,7 +26,7 @@ BattleFrontier_BattlePikeRoomWildMons_OnWarp: BattleFrontier_BattlePikeRoomWildMons_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeRoomWildMons_OnResume: diff --git a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc index 38d01c1e2d..1baed386ba 100644 --- a/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattlePikeThreePathRoom/scripts.inc @@ -18,7 +18,7 @@ BattleFrontier_BattlePikeThreePathRoom_OnWarp: BattleFrontier_BattlePikeThreePathRoom_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeThreePathRoom_EventScript_GetChallengeStatus:: diff --git a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc index deb947245f..8fabf8bc13 100644 --- a/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidLobby/scripts.inc @@ -10,7 +10,7 @@ BattleFrontier_BattlePyramidLobby_OnWarp: BattleFrontier_BattlePyramidLobby_EventScript_TurnPlayerNorth: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePyramidLobby_OnFrame: @@ -364,7 +364,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_ShowResults:: BattleFrontier_BattlePyramidLobby_EventScript_WalkToPanelAndReceiveBag:: applymovement LOCALID_PYRAMID_LOBBY_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantWalkToPanel - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerWalkToPanel + applymovement LOCALID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerWalkToPanel waitmovement 0 msgbox BattleFrontier_BattlePyramidLobby_Text_WeWillHoldBagForSafekeeping, MSGBOX_DEFAULT pyramid_get PYRAMID_DATA_WIN_STREAK @@ -383,7 +383,7 @@ BattleFrontier_BattlePyramidLobby_EventScript_ReceiveBattleBag:: closemessage applymovement LOCALID_PYRAMID_LOBBY_ATTENDANT, BattleFrontier_BattlePyramidLobby_Movement_AttendantMoveAside waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerStepOnPanel + applymovement LOCALID_PLAYER, BattleFrontier_BattlePyramidLobby_Movement_PlayerStepOnPanel waitmovement 0 return diff --git a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc index 8639f429e8..3bf7b7b17e 100644 --- a/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc +++ b/data/maps/BattleFrontier_BattlePyramidTop/scripts.inc @@ -16,7 +16,7 @@ BattleFrontier_BattlePyramidTop_OnWarp: BattleFrontier_BattlePyramidTop_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH goto_if_ne VAR_TEMP_C, 0, BattleFrontier_BattlePyramidTop_EventScript_EndSetUpObjects setobjectxyperm LOCALID_BRANDON, 0, 0 BattleFrontier_BattlePyramidTop_EventScript_EndSetUpObjects:: @@ -72,7 +72,7 @@ BattleFrontier_BattlePyramidTop_EventScript_Attendant:: closemessage applymovement LOCALID_PYRAMID_TOP_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantMoveAside waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePyramidTop_Movement_PlayerClimbToTop + applymovement LOCALID_PLAYER, BattleFrontier_BattlePyramidTop_Movement_PlayerClimbToTop waitmovement 0 applymovement LOCALID_PYRAMID_TOP_ATTENDANT, BattleFrontier_BattlePyramidTop_Movement_AttendantBlockPath waitmovement 0 @@ -108,7 +108,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BattleBrandon:: frontier_get FRONTIER_DATA_HEARD_BRAIN_SPEECH goto_if_ne VAR_RESULT, FALSE, BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardSilverSpeech special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, BattleFrontier_BattlePyramidTop_Movement_CameraPanUp + applymovement LOCALID_CAMERA, BattleFrontier_BattlePyramidTop_Movement_CameraPanUp waitmovement 0 msgbox BattleFrontier_BattlePyramidTop_Text_ExplorationsAreGrandestAdventure, MSGBOX_DEFAULT closemessage @@ -145,7 +145,7 @@ BattleFrontier_BattlePyramidTop_EventScript_BrandonIntroGold:: frontier_get FRONTIER_DATA_HEARD_BRAIN_SPEECH goto_if_ne VAR_RESULT, FALSE, BattleFrontier_BattlePyramidTop_EventScript_BrandonHeardGoldSpeech special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, BattleFrontier_BattlePyramidTop_Movement_CameraPanUp + applymovement LOCALID_CAMERA, BattleFrontier_BattlePyramidTop_Movement_CameraPanUp waitmovement 0 msgbox BattleFrontier_BattlePyramidTop_Text_BrandonYouveReturned, MSGBOX_DEFAULT closemessage diff --git a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc index 996121f0cc..bfa94f04b8 100644 --- a/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerBattleRoom/scripts.inc @@ -18,13 +18,13 @@ BattleFrontier_BattleTowerBattleRoom_OnFrame: BattleFrontier_BattleTowerBattleRoom_EventScript_EnterRoom:: setvar VAR_TEMP_0, 1 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerEnter + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerEnter waitmovement 0 frontier_get FRONTIER_DATA_BATTLE_NUM goto_if_eq VAR_RESULT, 0, BattleFrontier_BattleTowerBattleRoom_EventScript_OpponentEnter applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 setvar VAR_TEMP_2, 1 frontier_set FRONTIER_DATA_RECORD_DISABLED, TRUE @@ -60,7 +60,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_DefeatedOpponent:: call_if_ne VAR_RESULT, FRONTIER_BRAIN_NOT_READY, BattleFrontier_BattleTowerBattleRoom_EventScript_SecondAttendantEnter applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceAttendant waitmovement 0 msgbox BattleFrontier_BattleTowerBattleRoom_Text_RestoreMonsToFullHealth, MSGBOX_DEFAULT playfanfare MUS_HEAL @@ -121,7 +121,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_AskRetireChallenge:: BattleFrontier_BattleTowerBattleRoom_EventScript_ContinueChallenge:: closemessage - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle waitmovement 0 applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos waitmovement 0 @@ -233,7 +233,7 @@ BattleFrontier_BattleTowerBattleRoom_EventScript_AskReadyForMaidenNoRecord:: BattleFrontier_BattleTowerBattleRoom_EventScript_BattleAnabel:: call BattleFrontier_EventScript_SetBrainObjectGfx closemessage - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerBattleRoom_Movement_PlayerFaceBattle waitmovement 0 applymovement LOCALID_TOWER_BATTLE_ATTENDANT_1, BattleFrontier_BattleTowerBattleRoom_Movement_AttendantReturnToPos waitmovement 0 diff --git a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc index c8db4fbd9a..9974510b1b 100644 --- a/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerCorridor/scripts.inc @@ -22,13 +22,13 @@ BattleFrontier_BattleTowerCorridor_EventScript_EnterCorridor:: setvar VAR_TEMP_0, 1 goto_if_eq VAR_0x8006, 1, BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor applymovement LOCALID_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToDoor waitmovement 0 goto BattleFrontier_BattleTowerCorridor_EventScript_WarpToBattleRoom BattleFrontier_BattleTowerCorridor_EventScript_WalkToFarDoor:: applymovement LOCALID_TOWER_CORRIDOR_ATTENDANT, BattleFrontier_BattleTowerCorridor_Movement_AttendantWalkToFarDoor - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToFarDoor + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerCorridor_Movement_PlayerWalkToFarDoor waitmovement 0 BattleFrontier_BattleTowerCorridor_EventScript_WarpToBattleRoom:: diff --git a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc index 8147e21184..a26376eebe 100644 --- a/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerElevator/scripts.inc @@ -10,7 +10,7 @@ BattleFrontier_BattleTowerElevator_OnFrame: BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: setvar VAR_TEMP_0, 1 applymovement LOCALID_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantEnter - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerEnter + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerEnter waitmovement 0 special BufferBattleTowerElevatorFloors waitse @@ -18,7 +18,7 @@ BattleFrontier_BattleTowerElevator_EventScript_EnterElevator:: waitstate delay 48 applymovement LOCALID_TOWER_ELEVATOR_ATTENDANT, BattleFrontier_BattleTowerElevator_Movement_AttendantExit - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerExit + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerElevator_Movement_PlayerExit waitmovement 0 call BattleFrontier_BattleTowerElevator_EventScript_WarpToNextRoom end @@ -81,6 +81,6 @@ BattleFrontier_BattleTowerElevator_OnWarp: BattleFrontier_BattleTowerElevator_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc index f1d386b277..d23f5296d6 100644 --- a/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerLobby/scripts.inc @@ -30,7 +30,7 @@ BattleFrontier_BattleTowerLobby_OnWarp: BattleFrontier_BattleTowerLobby_EventScript_PlayerFaceNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleTowerLobby_OnFrame: @@ -614,12 +614,12 @@ BattleFrontier_BattleTowerLobby_EventScript_WalkToElevator:: call BattleFrontier_BattleTowerLobby_EventScript_SetAttendantTalkedTo call BattleFrontier_BattleTowerLobby_EventScript_GetDoorXCoord applymovement VAR_LAST_TALKED, BattleFrontier_BattleTowerLobby_Movement_WalkToElevator - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerLobby_Movement_WalkToElevator + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerLobby_Movement_WalkToElevator waitmovement 0 opendoor VAR_0x8004, 1 waitdooranim applymovement VAR_LAST_TALKED, BattleFrontier_BattleTowerLobby_Movement_AttendantEnterElevator - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerLobby_Movement_PlayerEnterElevator + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerLobby_Movement_PlayerEnterElevator waitmovement 0 closedoor VAR_0x8004, 1 waitdooranim diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc index 5607cf41f3..bc5dda9fff 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. @ The graphics of the partner are represented with VAR_OBJ_GFX_ID_E, which will ultimately be set by tower_setpartnergfx. @ The graphics of the opponents are represented with VAR_OBJ_GFX_ID_0 and OBJ_EVENT_GFX_VAR_1, which will ultimately be set by tower_setopponent. @@ -35,7 +35,7 @@ BattleFrontier_BattleTowerMultiBattleRoom_OnWarp: .2byte 0 BattleFrontier_BattleTowerMultiBattleRoom_EventScript_HidePlayerObj:: - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM + hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_BATTLE_ROOM end BattleFrontier_BattleTowerMultiBattleRoom_OnFrame: diff --git a/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc index 51a3ffac27..57dcd82d25 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiCorridor/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_CORRIDOR_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_TOWER_MULTI_CORRIDOR_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_F. @ The graphics of the partner are represented with VAR_OBJ_GFX_ID_E, which will ultimately be set by tower_setpartnergfx. @@ -34,7 +34,7 @@ BattleFrontier_BattleTowerMultiCorridor_OnWarp: .2byte 0 BattleFrontier_BattleTowerMultiCorridor_EventScript_SetUpObjects:: - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR + hideobjectat LOCALID_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR hideobjectat LOCALID_TOWER_MULTI_CORRIDOR_PLAYER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR hideobjectat LOCALID_TOWER_MULTI_CORRIDOR_PARTNER, MAP_BATTLE_FRONTIER_BATTLE_TOWER_MULTI_CORRIDOR special OffsetCameraForBattle diff --git a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc index 64a91a9a5a..6cd428c8ed 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiPartnerRoom/scripts.inc @@ -41,7 +41,7 @@ BattleFrontier_BattleTowerMultiPartnerRoom_OnWarp: .2byte 0 BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattleTowerMultiPartnerRoom_OnFrame: @@ -57,12 +57,12 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_ExitRoom:: BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_EnterRoom:: lockall - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterRoom + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterRoom waitmovement 0 applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantBlockExit waitmovement 0 copyobjectxytoperm LOCALID_TOWER_PARTNER_ROOM_ATTENDANT - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox BattleFrontier_BattleTowerMultiPartnerRoom_Text_PleaseFindPartner, MSGBOX_DEFAULT special HealPlayerParty @@ -112,21 +112,21 @@ BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_EnterElevator:: BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevator:: applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevator + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevator waitmovement 0 return @ Unused BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevatorEast: applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevatorEast + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEnterElevatorEast waitmovement 0 return @ Unused BattleFrontier_BattleTowerMultiPartnerRoom_EventScript_MoveToElevatorWest: applymovement LOCALID_TOWER_PARTNER_ROOM_ATTENDANT, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_AttendantEnterElevator - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEneterElevatorWest + applymovement LOCALID_PLAYER, BattleFrontier_BattleTowerMultiPartnerRoom_Movement_PlayerEneterElevatorWest waitmovement 0 return diff --git a/data/maps/BattleFrontier_ReceptionGate/scripts.inc b/data/maps/BattleFrontier_ReceptionGate/scripts.inc index 169fcb07c4..78ebdcd0d2 100644 --- a/data/maps/BattleFrontier_ReceptionGate/scripts.inc +++ b/data/maps/BattleFrontier_ReceptionGate/scripts.inc @@ -21,7 +21,7 @@ BattleFrontier_ReceptionGate_EventScript_FirstTimeEntering:: waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_FirstTimeHereThisWay, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_ReceptionGate_Movement_PlayerApproachCounter + applymovement LOCALID_PLAYER, BattleFrontier_ReceptionGate_Movement_PlayerApproachCounter waitmovement 0 goto BattleFrontier_ReceptionGate_EventScript_ScottScene end @@ -40,18 +40,18 @@ BattleFrontier_ReceptionGate_EventScript_ScottScene:: closemessage applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_WalkInPlaceFasterUp applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 playse SE_PIN applymovement LOCALID_FRONTIER_RECEPTION_GREETER, Common_Movement_ExclamationMark applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, Common_Movement_ExclamationMark - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark + applymovement LOCALID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_OhMrScottGoodDay, MSGBOX_DEFAULT closemessage applymovement LOCALID_FRONTIER_RECEPTION_GREETER, BattleFrontier_ReceptionGate_Movement_GreeterFaceScott applymovement LOCALID_FRONTIER_RECEPTION_GUIDE, BattleFrontier_ReceptionGate_Movement_FacilityGuideFaceScott - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_ReceptionGate_Movement_PlayerFaceScott + applymovement LOCALID_PLAYER, BattleFrontier_ReceptionGate_Movement_PlayerFaceScott applymovement LOCALID_FRONTIER_RECEPTION_SCOTT, BattleFrontier_ReceptionGate_Movement_ScottEnter waitmovement 0 msgbox BattleFrontier_ReceptionGate_Text_ScottGreatToSeeYouHere, MSGBOX_DEFAULT diff --git a/data/maps/ContestHall/scripts.inc b/data/maps/ContestHall/scripts.inc index 7ca6a57f69..f0c807e7b4 100644 --- a/data/maps/ContestHall/scripts.inc +++ b/data/maps/ContestHall/scripts.inc @@ -69,7 +69,7 @@ ContestHall_EventScript_Contest:: ContestHall_EventScript_SetContestObjects:: special LoadLinkContestPlayerPalettes - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_PLAYER, MAP_LITTLEROOT_TOWN call ContestHall_EventScript_CreateAudience end diff --git a/data/maps/DewfordTown/scripts.inc b/data/maps/DewfordTown/scripts.inc index 30c7639003..40873ff668 100644 --- a/data/maps/DewfordTown/scripts.inc +++ b/data/maps/DewfordTown/scripts.inc @@ -112,29 +112,29 @@ DewfordTown_EventScript_FishingNotSoGood:: DewfordTown_EventScript_SailToPetalburg:: call EventScript_BackupMrBrineyLocation setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 - setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN, 0 + setobjectsubpriority LOCALID_PLAYER, MAP_DEWFORD_TOWN, 0 applymovement LOCALID_DEWFORD_BRINEY, DewfordTown_Movement_BrineyBoardBoat waitmovement 0 removeobject LOCALID_DEWFORD_BRINEY - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_PlayerBoardBoat + applymovement LOCALID_PLAYER, DewfordTown_Movement_PlayerBoardBoat waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN + hideobjectat LOCALID_PLAYER, MAP_DEWFORD_TOWN call Common_EventScript_PlayBrineysBoatMusic applymovement LOCALID_DEWFORD_BOAT, DewfordTown_Movement_SailToPetalburg - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_SailToPetalburg + applymovement LOCALID_PLAYER, DewfordTown_Movement_SailToPetalburg waitmovement 0 - showobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 + showobjectat LOCALID_PLAYER, MAP_ROUTE104 call Common_EventScript_StopBrineysBoatMusic - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_ExitBoatPetalburg + applymovement LOCALID_PLAYER, DewfordTown_Movement_ExitBoatPetalburg waitmovement 0 - showobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 + showobjectat LOCALID_PLAYER, MAP_ROUTE104 clearflag FLAG_HIDE_BRINEYS_HOUSE_MR_BRINEY clearflag FLAG_HIDE_BRINEYS_HOUSE_PEEKO clearflag FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT setflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN hideobjectat LOCALID_DEWFORD_BOAT, MAP_DEWFORD_TOWN setvar VAR_BOARD_BRINEY_BOAT_STATE, 2 - resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN + resetobjectsubpriority LOCALID_PLAYER, MAP_DEWFORD_TOWN warp MAP_ROUTE104_MR_BRINEYS_HOUSE, 5, 4 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 waitstate @@ -144,20 +144,20 @@ DewfordTown_EventScript_SailToPetalburg:: DewfordTown_EventScript_SailToSlateport:: call EventScript_BackupMrBrineyLocation setobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN, 0 - setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN, 1 + setobjectsubpriority LOCALID_PLAYER, MAP_DEWFORD_TOWN, 1 applymovement LOCALID_DEWFORD_BRINEY, DewfordTown_Movement_BrineyBoardBoat waitmovement 0 removeobject LOCALID_DEWFORD_BRINEY - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_PlayerBoardBoat + applymovement LOCALID_PLAYER, DewfordTown_Movement_PlayerBoardBoat waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN + hideobjectat LOCALID_PLAYER, MAP_DEWFORD_TOWN call Common_EventScript_PlayBrineysBoatMusic applymovement LOCALID_DEWFORD_BOAT, DewfordTown_Movement_SailToSlateport - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_SailToSlateport + applymovement LOCALID_PLAYER, DewfordTown_Movement_SailToSlateport waitmovement 0 call Common_EventScript_StopBrineysBoatMusic - showobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 - applymovement OBJ_EVENT_ID_PLAYER, DewfordTown_Movement_ExitBoatSlateport + showobjectat LOCALID_PLAYER, MAP_ROUTE109 + applymovement LOCALID_PLAYER, DewfordTown_Movement_ExitBoatSlateport waitmovement 0 setobjectxyperm LOCALID_ROUTE109_BRINEY, 21, 26 addobject LOCALID_ROUTE109_BRINEY @@ -173,7 +173,7 @@ DewfordTown_EventScript_SailToSlateport:: call_if_set FLAG_DELIVERED_DEVON_GOODS, DewfordTown_EventScript_LandedSlateport closemessage copyvar VAR_BRINEY_LOCATION, VAR_0x8008 - resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN + resetobjectsubpriority LOCALID_PLAYER, MAP_DEWFORD_TOWN resetobjectsubpriority LOCALID_ROUTE109_BRINEY, MAP_ROUTE109 copyobjectxytoperm LOCALID_ROUTE109_BRINEY release diff --git a/data/maps/DewfordTown_Hall/scripts.inc b/data/maps/DewfordTown_Hall/scripts.inc index c5a1ea4b82..87fa85440d 100644 --- a/data/maps/DewfordTown_Hall/scripts.inc +++ b/data/maps/DewfordTown_Hall/scripts.inc @@ -194,7 +194,7 @@ DewfordTown_Hall_EventScript_DebateReact1:: DewfordTown_Hall_EventScript_PlayerReactWest:: goto_if_eq VAR_FACING, DIR_EAST, DewfordTown_Hall_EventScript_DontMovePlayer1 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -214,18 +214,18 @@ DewfordTown_Hall_EventScript_PlayerReactNorthSouth:: return DewfordTown_Hall_EventScript_PlayerWalkInPlaceUp:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return DewfordTown_Hall_EventScript_PlayerWalkInPlaceDown:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return DewfordTown_Hall_EventScript_PlayerReactEast:: goto_if_eq VAR_FACING, DIR_WEST, DewfordTown_Hall_EventScript_DontMovePlayer1 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc index b1f0e973b0..dd41b84617 100644 --- a/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc +++ b/data/maps/EverGrandeCity_ChampionsRoom/scripts.inc @@ -13,7 +13,7 @@ EverGrandeCity_ChampionsRoom_OnWarp: .2byte 0 EverGrandeCity_ChampionsRoom_EventScript_PlayerTurnNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_ChampionsRoom_OnFrame: @@ -22,10 +22,10 @@ EverGrandeCity_ChampionsRoom_OnFrame: EverGrandeCity_ChampionsRoom_EventScript_EnterRoom:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkUp4 + applymovement LOCALID_PLAYER, Common_Movement_WalkUp4 waitmovement 0 delay 40 - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerApproachWallace + applymovement LOCALID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerApproachWallace waitmovement 0 setvar VAR_TEMP_1, 1 goto EverGrandeCity_ChampionsRoom_EventScript_Wallace @@ -101,7 +101,7 @@ EverGrandeCity_ChampionsRoom_EventScript_BirchArrivesExitForHoF:: addobject LOCALID_CHAMPIONS_ROOM_BIRCH applymovement LOCALID_CHAMPIONS_ROOM_BIRCH, EverGrandeCity_ChampionsRoom_Movement_BirchArrives waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox EverGrandeCity_ChampionsRoom_Text_BirchArriveRatePokedex, MSGBOX_DEFAULT call ProfBirch_EventScript_RatePokedex @@ -115,12 +115,12 @@ EverGrandeCity_ChampionsRoom_EventScript_BirchArrivesExitForHoF:: closemessage delay 30 applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExitStart - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExitStart + applymovement LOCALID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExitStart applymovement LOCALID_CHAMPIONS_ROOM_BIRCH, Common_Movement_WalkInPlaceFasterUp applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalFollows waitmovement 0 delay 20 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox EverGrandeCity_ChampionsRoom_Text_WallaceWaitOutside, MSGBOX_DEFAULT checkplayergender @@ -128,7 +128,7 @@ EverGrandeCity_ChampionsRoom_EventScript_BirchArrivesExitForHoF:: call_if_eq VAR_RESULT, FEMALE, EverGrandeCity_ChampionsRoom_EventScript_BrendanCongratulations closemessage applymovement LOCALID_CHAMPIONS_ROOM_WALLACE, EverGrandeCity_ChampionsRoom_Movement_WallaceExit - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExit + applymovement LOCALID_PLAYER, EverGrandeCity_ChampionsRoom_Movement_PlayerExit waitmovement 0 setflag FLAG_HIDE_PETALBURG_GYM_GREETER warp MAP_EVER_GRANDE_CITY_HALL_OF_FAME, 7, 16 @@ -147,7 +147,7 @@ EverGrandeCity_ChampionsRoom_EventScript_BrendanCongratulations:: EverGrandeCity_ChampionsRoom_EventScript_RivalApproachPlayer:: applymovement LOCALID_CHAMPIONS_ROOM_RIVAL, EverGrandeCity_ChampionsRoom_Movement_RivalApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc index 80b1f568c8..c7b4e55f9e 100644 --- a/data/maps/EverGrandeCity_DrakesRoom/scripts.inc +++ b/data/maps/EverGrandeCity_DrakesRoom/scripts.inc @@ -10,7 +10,7 @@ EverGrandeCity_DrakesRoom_OnWarp: .2byte 0 EverGrandeCity_DrakesRoom_EventScript_PlayerTurnNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_DrakesRoom_OnFrame: diff --git a/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc b/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc index b2d556448c..5e70c86cf3 100644 --- a/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc +++ b/data/maps/EverGrandeCity_GlaciasRoom/scripts.inc @@ -9,7 +9,7 @@ EverGrandeCity_GlaciasRoom_OnWarp: .2byte 0 EverGrandeCity_GlaciasRoom_EventScript_PlayerTurnNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_GlaciasRoom_OnFrame: diff --git a/data/maps/EverGrandeCity_Hall1/scripts.inc b/data/maps/EverGrandeCity_Hall1/scripts.inc index 0d4b524c83..51c030ee4e 100644 --- a/data/maps/EverGrandeCity_Hall1/scripts.inc +++ b/data/maps/EverGrandeCity_Hall1/scripts.inc @@ -7,6 +7,6 @@ EverGrandeCity_Hall1_OnWarp: .2byte 0 EverGrandeCity_Hall1_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/EverGrandeCity_Hall2/scripts.inc b/data/maps/EverGrandeCity_Hall2/scripts.inc index b81df8b405..847ffcd44f 100644 --- a/data/maps/EverGrandeCity_Hall2/scripts.inc +++ b/data/maps/EverGrandeCity_Hall2/scripts.inc @@ -7,6 +7,6 @@ EverGrandeCity_Hall2_OnWarp: .2byte 0 EverGrandeCity_Hall2_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/EverGrandeCity_Hall3/scripts.inc b/data/maps/EverGrandeCity_Hall3/scripts.inc index 4f9245f646..ad188078c6 100644 --- a/data/maps/EverGrandeCity_Hall3/scripts.inc +++ b/data/maps/EverGrandeCity_Hall3/scripts.inc @@ -7,6 +7,6 @@ EverGrandeCity_Hall3_OnWarp: .2byte 0 EverGrandeCity_Hall3_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/EverGrandeCity_Hall4/scripts.inc b/data/maps/EverGrandeCity_Hall4/scripts.inc index 3d9ab4603b..290a8e0f73 100644 --- a/data/maps/EverGrandeCity_Hall4/scripts.inc +++ b/data/maps/EverGrandeCity_Hall4/scripts.inc @@ -7,6 +7,6 @@ EverGrandeCity_Hall4_OnWarp: .2byte 0 EverGrandeCity_Hall4_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/EverGrandeCity_Hall5/scripts.inc b/data/maps/EverGrandeCity_Hall5/scripts.inc index 9781d114f4..b99b25f2b2 100644 --- a/data/maps/EverGrandeCity_Hall5/scripts.inc +++ b/data/maps/EverGrandeCity_Hall5/scripts.inc @@ -7,6 +7,6 @@ EverGrandeCity_Hall5_OnWarp: .2byte 0 EverGrandeCity_Hall5_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end diff --git a/data/maps/EverGrandeCity_HallOfFame/scripts.inc b/data/maps/EverGrandeCity_HallOfFame/scripts.inc index ad588cdf3b..5abb3d407f 100644 --- a/data/maps/EverGrandeCity_HallOfFame/scripts.inc +++ b/data/maps/EverGrandeCity_HallOfFame/scripts.inc @@ -8,7 +8,7 @@ EverGrandeCity_HallOfFame_OnWarp: .2byte 0 EverGrandeCity_HallOfFame_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_HallOfFame_OnFrame: @@ -18,24 +18,24 @@ EverGrandeCity_HallOfFame_OnFrame: EverGrandeCity_HallOfFame_EventScript_EnterHallOfFame:: lockall applymovement LOCALID_HALL_OF_FAME_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 + applymovement LOCALID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame1 waitmovement 0 applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox EverGrandeCity_HallOfFame_Text_HereWeHonorLeagueChampions, MSGBOX_DEFAULT closemessage applymovement LOCALID_HALL_OF_FAME_WALLACE, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 + applymovement LOCALID_PLAYER, EverGrandeCity_HallOfFame_Movement_WalkIntoHallOfFame2 waitmovement 0 delay 20 applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox EverGrandeCity_HallOfFame_Text_LetsRecordYouAndYourPartnersNames, MSGBOX_DEFAULT closemessage applymovement LOCALID_HALL_OF_FAME_WALLACE, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 20 dofieldeffect FLDEFF_HALL_OF_FAME_RECORD diff --git a/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc b/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc index ed272eb901..4a6582f498 100644 --- a/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc +++ b/data/maps/EverGrandeCity_PhoebesRoom/scripts.inc @@ -9,7 +9,7 @@ EverGrandeCity_PhoebesRoom_OnWarp: .2byte 0 EverGrandeCity_PhoebesRoom_EventScript_PlayerTurnNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_PhoebesRoom_OnFrame: diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 4b3c05848e..d5e6ffe7d0 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -74,12 +74,12 @@ EverGrandeCity_PokemonLeague_1F_EventScript_DoorGuard:: end EverGrandeCity_PokemonLeague_1F_EventScript_PlayerMoveToFrontFromRight:: - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_PokemonLeague_1F_Movement_MoveToFrontFromRight + applymovement LOCALID_PLAYER, EverGrandeCity_PokemonLeague_1F_Movement_MoveToFrontFromRight waitmovement 0 return EverGrandeCity_PokemonLeague_1F_EventScript_PlayerMoveToFrontFromLeft:: - applymovement OBJ_EVENT_ID_PLAYER, EverGrandeCity_PokemonLeague_1F_Movement_MoveToFrontFromLeft + applymovement LOCALID_PLAYER, EverGrandeCity_PokemonLeague_1F_Movement_MoveToFrontFromLeft waitmovement 0 return diff --git a/data/maps/EverGrandeCity_SidneysRoom/scripts.inc b/data/maps/EverGrandeCity_SidneysRoom/scripts.inc index 03b4a4e03b..ac26aa754c 100644 --- a/data/maps/EverGrandeCity_SidneysRoom/scripts.inc +++ b/data/maps/EverGrandeCity_SidneysRoom/scripts.inc @@ -28,7 +28,7 @@ EverGrandeCity_SidneysRoom_OnWarp: .2byte 0 EverGrandeCity_SidneysRoom_EventScript_PlayerTurnNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end EverGrandeCity_SidneysRoom_OnFrame: diff --git a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc index d6e8decf60..4c064c5856 100644 --- a/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc +++ b/data/maps/FallarborTown_BattleTentBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_FALLARBOR_TENT_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_FALLARBOR_TENT_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. FallarborTown_BattleTentBattleRoom_MapScripts:: @@ -230,7 +230,7 @@ FallarborTown_BattleTentBattleRoom_OnWarp: .2byte 0 FallarborTown_BattleTentBattleRoom_EventScript_SetUpObjects:: - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM + hideobjectat LOCALID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM hideobjectat LOCALID_FALLARBOR_TENT_BATTLE_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM removeobject LOCALID_FALLARBOR_TENT_BATTLE_OPPONENT setvar VAR_TEMP_1, 1 diff --git a/data/maps/FallarborTown_BattleTentCorridor/scripts.inc b/data/maps/FallarborTown_BattleTentCorridor/scripts.inc index 4e5739238c..685ffc5a5a 100644 --- a/data/maps/FallarborTown_BattleTentCorridor/scripts.inc +++ b/data/maps/FallarborTown_BattleTentCorridor/scripts.inc @@ -10,12 +10,12 @@ FallarborTown_BattleTentCorridor_EventScript_EnterCorridor:: lockall setvar VAR_TEMP_0, 1 applymovement LOCALID_FALLARBOR_TENT_CORRIDOR_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_WalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentCorridor_Movement_WalkToDoor + applymovement LOCALID_PLAYER, FallarborTown_BattleTentCorridor_Movement_WalkToDoor waitmovement 0 opendoor 2, 1 waitdooranim applymovement LOCALID_FALLARBOR_TENT_CORRIDOR_ATTENDANT, FallarborTown_BattleTentCorridor_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentCorridor_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, FallarborTown_BattleTentCorridor_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 1 waitdooranim diff --git a/data/maps/FallarborTown_BattleTentLobby/scripts.inc b/data/maps/FallarborTown_BattleTentLobby/scripts.inc index c8253eea49..edd6cd8d91 100644 --- a/data/maps/FallarborTown_BattleTentLobby/scripts.inc +++ b/data/maps/FallarborTown_BattleTentLobby/scripts.inc @@ -9,7 +9,7 @@ FallarborTown_BattleTentLobby_OnWarp: FallarborTown_BattleTentLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end FallarborTown_BattleTentLobby_OnFrame: @@ -190,12 +190,12 @@ FallarborTown_BattleTentLobby_EventScript_EndCancelChallenge:: FallarborTown_BattleTentLobby_EventScript_WalkToDoor:: applymovement LOCALID_FALLARBOR_TENT_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantWalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerWalkToDoor + applymovement LOCALID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerWalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim applymovement LOCALID_FALLARBOR_TENT_ATTENDANT, FallarborTown_BattleTentLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, FallarborTown_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 waitdooranim diff --git a/data/maps/GraniteCave_StevensRoom/scripts.inc b/data/maps/GraniteCave_StevensRoom/scripts.inc index f9d2908f8f..68d8b829db 100644 --- a/data/maps/GraniteCave_StevensRoom/scripts.inc +++ b/data/maps/GraniteCave_StevensRoom/scripts.inc @@ -37,13 +37,13 @@ GraniteCave_StevensRoom_EventScript_StevenExitNorth:: return GraniteCave_StevensRoom_EventScript_StevenExitWestEast:: - applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit + applymovement LOCALID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit applymovement LOCALID_GRANITE_CAVE_STEVEN, GraniteCave_StevensRoom_Movement_StevenExit waitmovement 0 return GraniteCave_StevensRoom_EventScript_StevenExitSouth:: - applymovement OBJ_EVENT_ID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit + applymovement LOCALID_PLAYER, GraniteCave_StevensRoom_Movement_PlayerTurnTowardExit applymovement LOCALID_GRANITE_CAVE_STEVEN, GraniteCave_StevensRoom_Movement_StevenExitSouth waitmovement 0 return diff --git a/data/maps/LavaridgeTown/scripts.inc b/data/maps/LavaridgeTown/scripts.inc index 40639a1a86..2ba3f1cb21 100644 --- a/data/maps/LavaridgeTown/scripts.inc +++ b/data/maps/LavaridgeTown/scripts.inc @@ -121,7 +121,7 @@ LavaridgeTown_EventScript_RivalExitHerbShop:: waitmovement 0 applymovement LOCALID_LAVARIDGE_RIVAL, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -136,7 +136,7 @@ LavaridgeTown_EventScript_RivalApproachPlayer2:: return LavaridgeTown_EventScript_RivalExit1:: - applymovement OBJ_EVENT_ID_PLAYER, LavaridgeTown_Movement_PlayerWatchRivalExit + applymovement LOCALID_PLAYER, LavaridgeTown_Movement_PlayerWatchRivalExit applymovement LOCALID_LAVARIDGE_RIVAL_ON_BIKE, LavaridgeTown_Movement_RivalExit1 waitmovement 0 return diff --git a/data/maps/LilycoveCity_ContestLobby/scripts.inc b/data/maps/LilycoveCity_ContestLobby/scripts.inc index 4ea1b9eee9..862a5ef37d 100644 --- a/data/maps/LilycoveCity_ContestLobby/scripts.inc +++ b/data/maps/LilycoveCity_ContestLobby/scripts.inc @@ -37,7 +37,7 @@ LilycoveCity_ContestLobby_EventScript_ContestArtist:: addobject LOCALID_CONTEST_LOBBY_ARTIST applymovement LOCALID_CONTEST_LOBBY_ARTIST, LilycoveCity_ContestLobby_Movement_ArtistApproachPlayer waitmovement LOCALID_CONTEST_LOBBY_ARTIST - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceArtist + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceArtist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT lockall @@ -207,7 +207,7 @@ LilycoveCity_ContestLobby_EventScript_LinkContestArtist:: addobject LOCALID_CONTEST_LOBBY_LINK_ARTIST applymovement LOCALID_CONTEST_LOBBY_LINK_ARTIST, LilycoveCity_ContestLobby_Movement_LinkArtistApproachPlayer waitmovement LOCALID_CONTEST_LOBBY_LINK_ARTIST - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceLinkArtist + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerFaceLinkArtist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_YourPokemonSpurredMeToPaint, MSGBOX_DEFAULT lockall @@ -414,12 +414,12 @@ LilycoveCity_ContestLobby_EventScript_LeadToContestHall:: delay 20 applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistFacePlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachReceptionist + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachReceptionist waitmovement 0 msgbox LilycoveCity_ContestLobby_Text_ComeThroughHere, MSGBOX_DEFAULT closemessage applymovement LOCALID_CONTEST_LOBBY_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_ReceptionistWalkToContestHall - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToContestHall + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToContestHall waitmovement 0 releaseall return @@ -905,7 +905,7 @@ LilycoveCity_ContestLobby_EventScript_LeadToLinkContestHall:: delay 20 applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistFacePlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachLinkReceptionist + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerApproachLinkReceptionist waitmovement 0 messageautoscroll LilycoveCity_ContestLobby_Text_ComeThroughHere waitmessage @@ -913,7 +913,7 @@ LilycoveCity_ContestLobby_EventScript_LeadToLinkContestHall:: closemessage call LilycoveCity_ContestLobby_EventScript_DelayIfContestWithRSPlayer applymovement LOCALID_CONTEST_LOBBY_LINK_RECEPTIONIST, LilycoveCity_ContestLobby_Movement_LinkReceptionistWalkToContestHall - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToLinkContestHall + applymovement LOCALID_PLAYER, LilycoveCity_ContestLobby_Movement_PlayerWalkToLinkContestHall waitmovement 0 release return diff --git a/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc b/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc index 076228ae6e..a6ef6760ea 100644 --- a/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc +++ b/data/maps/LilycoveCity_CoveLilyMotel_1F/scripts.inc @@ -44,11 +44,11 @@ LilycoveCity_CoveLilyMotel_1F_EventScript_BlockingTV:: waitmovement 0 applymovement LOCALID_MOTEL_OWNER, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox LilycoveCity_CoveLilyMotel_1F_Text_CantSeeTheTV, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_CoveLilyMotel_1F_Movement_PlayerPushFromTV + applymovement LOCALID_PLAYER, LilycoveCity_CoveLilyMotel_1F_Movement_PlayerPushFromTV applymovement LOCALID_MOTEL_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerPushPlayer waitmovement 0 applymovement LOCALID_MOTEL_OWNER, LilycoveCity_CoveLilyMotel_1F_Movement_OwnerReturn diff --git a/data/maps/LilycoveCity_Harbor/scripts.inc b/data/maps/LilycoveCity_Harbor/scripts.inc index 9187199296..9388609ab5 100644 --- a/data/maps/LilycoveCity_Harbor/scripts.inc +++ b/data/maps/LilycoveCity_Harbor/scripts.inc @@ -333,7 +333,7 @@ LilycoveCity_Harbor_EventScript_BoardFerryWithSailor:: call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return @@ -393,18 +393,18 @@ LilycoveCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_NORTH, LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast delay 30 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 setvar VAR_0x8004, LOCALID_LILYCOVE_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return LilycoveCity_Harbor_EventScript_PlayerBoardFerryEast:: - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardFerryEast + applymovement LOCALID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardFerryEast waitmovement 0 return LilycoveCity_Harbor_EventScript_PlayerBoardFerryNorth:: - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardFerryNorth + applymovement LOCALID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardFerryNorth waitmovement 0 return @@ -484,14 +484,14 @@ LilycoveCity_Harbor_EventScript_BrineyFacePlayerEast:: LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorNorth:: applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyNorth + applymovement LOCALID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyNorth applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyNorth waitmovement 0 return LilycoveCity_Harbor_EventScript_BoardFerryWithBrineyAndSailorEast:: applymovement LOCALID_LILYCOVE_HARBOR_BRINEY, LilycoveCity_Harbor_Movement_BrineyBoardFerry - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyEast + applymovement LOCALID_PLAYER, LilycoveCity_Harbor_Movement_PlayerBoardWithBrineyEast applymovement LOCALID_LILYCOVE_HARBOR_FERRY_SAILOR, LilycoveCity_Harbor_Movement_SailorBoardWithBrineyEast waitmovement 0 return diff --git a/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc index 1802be417d..052e1e4f3f 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_1F/scripts.inc @@ -43,7 +43,7 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_InterestedInPaintings:: LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorNorth:: lockall - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorNorth + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorNorth waitmovement 0 warp MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F, 11, 8 waitstate @@ -51,7 +51,7 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorNorth:: LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorWest:: lockall - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorWest + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorWest waitmovement 0 warp MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F, 11, 8 waitstate @@ -59,7 +59,7 @@ LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorWest:: LilycoveCity_LilycoveMuseum_1F_EventScript_FollowCuratorEast:: lockall - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorEast + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_1F_Movement_FollowCuratorEast waitmovement 0 warp MAP_LILYCOVE_CITY_LILYCOVE_MUSEUM_2F, 11, 8 waitstate diff --git a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc index 196a48aeb8..e00c7bcb3c 100644 --- a/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc +++ b/data/maps/LilycoveCity_LilycoveMuseum_2F/scripts.inc @@ -63,17 +63,17 @@ LilycoveCity_LilycoveMuseum_2F_OnFrame: LilycoveCity_LilycoveMuseum_2F_EventScript_ShowExhibitHall:: lockall applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ThisIsExhibitHall, MSGBOX_SIGN applymovement LOCALID_MUSEUM_2F_CURATOR, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_FaceExhibitHall waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_ExplainExhibitHall, MSGBOX_SIGN applymovement LOCALID_MUSEUM_2F_CURATOR, Common_Movement_FacePlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft + applymovement LOCALID_PLAYER, LilycoveCity_LilycoveMuseum_2F_Movement_PlayerWalkInPlaceLeft waitmovement 0 msgbox LilycoveCity_LilycoveMuseum_2F_Text_PleaseObtainPaintingsForExhibit, MSGBOX_SIGN copyvar VAR_LILYCOVE_MUSEUM_2F_STATE, 1 diff --git a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc index 27124b7f2d..18d0f73edc 100644 --- a/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc +++ b/data/maps/LilycoveCity_PokemonTrainerFanClub/scripts.inc @@ -17,12 +17,12 @@ LilycoveCity_PokemonTrainerFanClub_EventScript_MeetFirstFans:: applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlWatchPlayer applymovement LOCALID_TRAINER_FAN_CLUB_MAN, LilycoveCity_PokemonTrainerFanClub_Movement_FanApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox LilycoveCity_PokemonTrainerFanClub_Text_HeardAboutYouImYourFan, MSGBOX_DEFAULT applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlMoveCloserToPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_TRAINER_FAN_CLUB_LITTLE_GIRL, LilycoveCity_PokemonTrainerFanClub_Movement_LittleGirlHideFromPlayer waitmovement 0 diff --git a/data/maps/LittlerootTown/scripts.inc b/data/maps/LittlerootTown/scripts.inc index ed7caf127c..fd1d970b13 100644 --- a/data/maps/LittlerootTown/scripts.inc +++ b/data/maps/LittlerootTown/scripts.inc @@ -132,7 +132,7 @@ LittlerootTown_EventScript_StepOffTruckFemale:: LittlerootTown_EventScript_GoInsideWithMom:: delay 15 playse SE_LEDGE - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PlayerStepOffTruck + applymovement LOCALID_PLAYER, LittlerootTown_Movement_PlayerStepOffTruck waitmovement 0 opendoor VAR_0x8004, VAR_0x8005 waitdooranim @@ -147,16 +147,16 @@ LittlerootTown_EventScript_GoInsideWithMom:: msgbox LittlerootTown_Text_OurNewHomeLetsGoInside, MSGBOX_DEFAULT closemessage applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachDoor - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PlayerApproachDoor + applymovement LOCALID_PLAYER, LittlerootTown_Movement_PlayerApproachDoor waitmovement 0 opendoor VAR_0x8004, VAR_0x8005 waitdooranim applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomEnterHouse - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PlayerEnterHouse + applymovement LOCALID_PLAYER, LittlerootTown_Movement_PlayerEnterHouse waitmovement 0 setflag FLAG_HIDE_LITTLEROOT_TOWN_MOM_OUTSIDE setvar VAR_LITTLEROOT_INTRO_STATE, 3 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor VAR_0x8004, VAR_0x8005 waitdooranim clearflag FLAG_HIDE_LITTLEROOT_TOWN_FAT_MAN @@ -294,7 +294,7 @@ LittlerootTown_EventScript_DangerousWithoutPokemon:: msgbox LittlerootTown_Text_IfYouGoInGrassPokemonWillJumpOut, MSGBOX_DEFAULT closemessage applymovement LOCALID_LITTLEROOT_TWIN, LittlerootTown_Movement_TwinPushPlayerFromRoute - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_Movement_PushPlayerBackFromRoute + applymovement LOCALID_PLAYER, LittlerootTown_Movement_PushPlayerBackFromRoute waitmovement 0 msgbox LittlerootTown_Text_DangerousIfYouDontHavePokemon, MSGBOX_DEFAULT closemessage @@ -376,7 +376,7 @@ LittlerootTown_EventScript_GoSaveBirchTrigger:: lockall applymovement LOCALID_LITTLEROOT_TWIN, Common_Movement_WalkInPlaceFasterRight waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 special GetPlayerBigGuyGirlString msgbox LittlerootTown_Text_CanYouGoSeeWhatsHappening, MSGBOX_DEFAULT @@ -523,70 +523,70 @@ LittlerootTown_EventScript_MomApproachPlayerFemale:: return LittlerootTown_EventScript_MomApproachPlayer0:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayer0 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayer1:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayer1 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale2:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale2 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale3:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale3 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale4:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale4 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerMale5:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerMale5 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale2:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale2 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale3:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale3 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale4:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale4 waitmovement 0 return LittlerootTown_EventScript_MomApproachPlayerFemale5:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 applymovement LOCALID_LITTLEROOT_MOM, LittlerootTown_Movement_MomApproachPlayerFemale5 waitmovement 0 diff --git a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc index 7c98a43f23..3b544fdf2d 100644 --- a/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc +++ b/data/maps/LittlerootTown_BrendansHouse_1F/scripts.inc @@ -58,7 +58,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_GoUpstairsToSetClock:: lockall msgbox PlayersHouse_1F_Text_GoSetTheClock, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs applymovement LOCALID_PLAYERS_HOUSE_1F_MOM, LittlerootTown_BrendansHouse_1F_Movement_PushTowardStairs waitmovement 0 warp MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, 7, 1 @@ -91,7 +91,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_YoureNewNeighbor:: waitmovement 0 applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_RIVALS_HOUSE_1F_MOM, LittlerootTown_BrendansHouse_1F_Movement_RivalMomApproach waitmovement 0 special GetRivalSonDaughterString @@ -171,7 +171,7 @@ LittlerootTown_BrendansHouse_1F_EventScript_MeetRival:: end LittlerootTown_BrendansHouse_1F_EventScript_PlayerFaceBrendan:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -217,19 +217,19 @@ LittlerootTown_BrendansHouse_1F_Movement_BrendanApproachPlayer2: step_end LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs0:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit0 + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit0 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs0 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs1:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit1 + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit1 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs1 waitmovement 0 return LittlerootTown_BrendansHouse_1F_EventScript_BrendanGoUpstairs2:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit2 + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_1F_Movement_PlayerWatchBrendanExit2 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_BrendansHouse_1F_Movement_BrendanGoUpstairs2 waitmovement 0 return diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc index abed328fba..2832e9d794 100644 --- a/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc +++ b/data/maps/LittlerootTown_BrendansHouse_2F/scripts.inc @@ -81,11 +81,11 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendan:: LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanNorth:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerNorth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanNorth + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanNorth applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCNorth waitmovement 0 return @@ -93,11 +93,11 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanNorth:: LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanSouth:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerSouth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanSouth + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanSouth applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCSouth waitmovement 0 return @@ -105,11 +105,11 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanSouth:: LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanWest:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerWest waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanWest + applymovement LOCALID_PLAYER, LittlerootTown_BrendansHouse_2F_Movement_PlayerWatchBrendanWest applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanWalkToPCWest waitmovement 0 return @@ -117,7 +117,7 @@ LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanWest:: LittlerootTown_BrendansHouse_2F_EventScript_MeetBrendanEast:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_BrendansHouse_2F_Movement_BrendanApproachPlayerEast waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox RivalsHouse_2F_Text_BrendanWhoAreYou, MSGBOX_DEFAULT closemessage diff --git a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc index 35feceefdf..6a7b6644b9 100644 --- a/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc +++ b/data/maps/LittlerootTown_MaysHouse_1F/scripts.inc @@ -57,7 +57,7 @@ LittlerootTown_MaysHouse_1F_EventScript_GoUpstairsToSetClock:: lockall msgbox PlayersHouse_1F_Text_GoSetTheClock, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs applymovement LOCALID_PLAYERS_HOUSE_1F_MOM, LittlerootTown_MaysHouse_1F_Movement_PushTowardStairs waitmovement 0 warp MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F, 1, 1 @@ -90,7 +90,7 @@ LittlerootTown_MaysHouse_1F_EventScript_YoureNewNeighbor:: waitmovement 0 applymovement LOCALID_RIVALS_HOUSE_1F_MOM, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight applymovement LOCALID_RIVALS_HOUSE_1F_MOM, LittlerootTown_MaysHouse_1F_Movement_RivalMomApproach waitmovement 0 special GetRivalSonDaughterString @@ -204,7 +204,7 @@ LittlerootTown_MaysHouse_1F_EventScript_MeetRival:: end LittlerootTown_MaysHouse_1F_EventScript_PlayerFaceMay:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -250,19 +250,19 @@ LittlerootTown_MaysHouse_1F_Movement_MayApproachPlayer2: step_end LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs0:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit0 + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit0 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs0 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs1:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit1 + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit1 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs1 waitmovement 0 return LittlerootTown_MaysHouse_1F_EventScript_MayGoUpstairs2:: - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit2 + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_1F_Movement_PlayerWatchMayExit2 applymovement LOCALID_RIVALS_HOUSE_1F_RIVAL, LittlerootTown_MaysHouse_1F_Movement_MayGoUpstairs2 waitmovement 0 return diff --git a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc index cc8db687c7..9aa76dc2b4 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc +++ b/data/maps/LittlerootTown_MaysHouse_2F/scripts.inc @@ -80,11 +80,11 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMay:: LittlerootTown_MaysHouse_2F_EventScript_MeetMayNorth:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerNorth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayNorth + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayNorth applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCNorth waitmovement 0 return @@ -92,11 +92,11 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMayNorth:: LittlerootTown_MaysHouse_2F_EventScript_MeetMaySouth:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerSouth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMaySouth + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMaySouth applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCSouth waitmovement 0 return @@ -104,7 +104,7 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMaySouth:: LittlerootTown_MaysHouse_2F_EventScript_MeetMayWest:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerWest waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage @@ -115,11 +115,11 @@ LittlerootTown_MaysHouse_2F_EventScript_MeetMayWest:: LittlerootTown_MaysHouse_2F_EventScript_MeetMayEast:: applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayApproachPlayerEast waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox RivalsHouse_2F_Text_MayWhoAreYou, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayEast + applymovement LOCALID_PLAYER, LittlerootTown_MaysHouse_2F_Movement_PlayerWatchMayEast applymovement LOCALID_RIVALS_HOUSE_2F_RIVAL, LittlerootTown_MaysHouse_2F_Movement_MayWalkToPCEast waitmovement 0 return diff --git a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc index 22e5ac549e..76fda0f323 100644 --- a/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc +++ b/data/maps/LittlerootTown_ProfessorBirchsLab/scripts.inc @@ -59,11 +59,11 @@ LittlerootTown_ProfessorBirchsLab_OnWarp: .2byte 0 LittlerootTown_ProfessorBirchsLab_EventScript_SetPlayerPosForReceiveStarter:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end LittlerootTown_ProfessorBirchsLab_EventScript_SetObjectPosForDexUpgrade:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH addobject LOCALID_BIRCHS_LAB_BIRCH addobject LOCALID_BIRCHS_LAB_RIVAL turnobject LOCALID_BIRCHS_LAB_RIVAL, DIR_NORTH @@ -143,7 +143,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_DeclineSeeingRival:: LittlerootTown_ProfessorBirchsLab_EventScript_GivePokedexEvent:: lockall - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_ProfessorBirchsLab_Movement_PlayerEnterLabForPokedex + applymovement LOCALID_PLAYER, LittlerootTown_ProfessorBirchsLab_Movement_PlayerEnterLabForPokedex waitmovement 0 goto LittlerootTown_ProfessorBirchsLab_EventScript_GivePokedex end @@ -175,7 +175,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_UpgradeToNationalDex:: playse SE_CLICK delay 20 applymovement LOCALID_BIRCHS_LAB_RIVAL, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 checkplayergender call_if_eq VAR_RESULT, MALE, LittlerootTown_ProfessorBirchsLab_EventScript_MayUpgradeComment @@ -186,7 +186,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_UpgradeToNationalDex:: applymovement LOCALID_BIRCHS_LAB_BIRCH, LittlerootTown_ProfessorBirchsLab_Movement_BirchReturnPokedex waitmovement 0 applymovement LOCALID_BIRCHS_LAB_RIVAL, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox LittlerootTown_ProfessorBirchsLab_Text_OkayAllDone, MSGBOX_DEFAULT playfanfare MUS_OBTAIN_ITEM @@ -249,7 +249,7 @@ LittlerootTown_ProfessorBirchsLab_Movement_BirchReturnPokedex: LittlerootTown_ProfessorBirchsLab_EventScript_ChooseJohtoStarter:: lockall - applymovement OBJ_EVENT_ID_PLAYER, LittlerootTown_ProfessorBirchsLab_Movement_PlayerEnterLabForJohtoStarter + applymovement LOCALID_PLAYER, LittlerootTown_ProfessorBirchsLab_Movement_PlayerEnterLabForJohtoStarter waitmovement 0 msgbox LittlerootTown_ProfessorBirchsLab_Text_CompletedDexChoosePokemon, MSGBOX_DEFAULT setvar VAR_DEX_UPGRADE_JOHTO_STARTER_STATE, 5 @@ -510,7 +510,7 @@ LittlerootTown_ProfessorBirchsLab_EventScript_GivePokedex:: closemessage applymovement LOCALID_BIRCHS_LAB_RIVAL, LittlerootTown_ProfessorBirchsLab_Movement_RivalApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 checkplayergender call_if_eq VAR_RESULT, MALE, LittlerootTown_ProfessorBirchsLab_EventScript_MayGivePokeBalls diff --git a/data/maps/MagmaHideout_4F/scripts.inc b/data/maps/MagmaHideout_4F/scripts.inc index 1ec622d0dd..34ed84e0a6 100644 --- a/data/maps/MagmaHideout_4F/scripts.inc +++ b/data/maps/MagmaHideout_4F/scripts.inc @@ -15,7 +15,7 @@ MagmaHideout_4F_EventScript_Maxie:: playfanfare MUS_AWAKEN_LEGEND playse SE_ORB special DoOrbEffect - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 150 removeobject LOCALID_MAGMA_HIDEOUT_4F_GROUDON_SLEEPING @@ -47,7 +47,7 @@ MagmaHideout_4F_EventScript_Maxie:: waitmovement 0 msgbox MagmaHideout_4F_Text_MaxieGroudonWhatsWrong, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 applymovement LOCALID_MAGMA_HIDEOUT_4F_MAXIE, Common_Movement_FacePlayer diff --git a/data/maps/MarineCave_End/scripts.inc b/data/maps/MarineCave_End/scripts.inc index b246038bb3..c3eb109880 100644 --- a/data/maps/MarineCave_End/scripts.inc +++ b/data/maps/MarineCave_End/scripts.inc @@ -24,7 +24,7 @@ MarineCave_End_EventScript_ShowKyogre:: MarineCave_End_EventScript_Kyogre:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 applymovement LOCALID_MARINE_CAVE_KYOGRE, MarineCave_End_Movement_KyogreApproach waitmovement 0 diff --git a/data/maps/MauvilleCity/scripts.inc b/data/maps/MauvilleCity/scripts.inc index 1b91ef609d..ddaf0a1e93 100644 --- a/data/maps/MauvilleCity/scripts.inc +++ b/data/maps/MauvilleCity/scripts.inc @@ -112,19 +112,19 @@ MauvilleCity_EventScript_BattleWallyPrompt:: end MauvilleCity_EventScript_WallyAndUncleExitNorth:: - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth1 + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth1 applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitNorth1 applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth1 waitmovement 0 applymovement LOCALID_MAUVILLE_WALLY, Common_Movement_WalkInPlaceFasterRight waitmovement 0 delay 30 - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerFaceUncleNorth + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerFaceUncleNorth applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleApproachPlayerNorth waitmovement 0 msgbox MauvilleCity_Text_UncleVisitUsSometime, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth2 + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitNorth2 applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitNorth2 applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitNorth2 waitmovement 0 @@ -132,7 +132,7 @@ MauvilleCity_EventScript_WallyAndUncleExitNorth:: end MauvilleCity_EventScript_WallyAndUncleExitEast:: - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast1 + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast1 applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitEast1 applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast1 waitmovement 0 @@ -143,7 +143,7 @@ MauvilleCity_EventScript_WallyAndUncleExitEast:: waitmovement 0 msgbox MauvilleCity_Text_UncleVisitUsSometime, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast2 + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchWallyExitEast2 applymovement LOCALID_MAUVILLE_WALLYS_UNCLE, MauvilleCity_Movement_WallysUncleExitEast2 applymovement LOCALID_MAUVILLE_WALLY, MauvilleCity_Movement_WallyExitEast2 waitmovement 0 @@ -160,7 +160,7 @@ MauvilleCity_EventScript_DefeatedWally:: setflag FLAG_ENABLE_FIRST_WALLY_POKENAV_CALL call_if_eq VAR_FACING, DIR_NORTH, MauvilleCity_EventScript_ScottApproachPlayerNorth call_if_eq VAR_FACING, DIR_EAST, MauvilleCity_EventScript_ScottApproachPlayerEast - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox MauvilleCity_Text_ScottYouDidntHoldBack, MSGBOX_DEFAULT closemessage @@ -185,13 +185,13 @@ MauvilleCity_EventScript_ScottApproachPlayerEast:: return MauvilleCity_EventScript_ScottExitNorth:: - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitNorth + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitNorth applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottExitNorth waitmovement 0 return MauvilleCity_EventScript_ScottExitEast:: - applymovement OBJ_EVENT_ID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitEast + applymovement LOCALID_PLAYER, MauvilleCity_Movement_PlayerWatchScottExitEast applymovement LOCALID_MAUVILLE_SCOTT, MauvilleCity_Movement_ScottExitEast waitmovement 0 return diff --git a/data/maps/MeteorFalls_1F_1R/scripts.inc b/data/maps/MeteorFalls_1F_1R/scripts.inc index 9ac00f57e5..e41c6a6311 100644 --- a/data/maps/MeteorFalls_1F_1R/scripts.inc +++ b/data/maps/MeteorFalls_1F_1R/scripts.inc @@ -16,7 +16,7 @@ MeteorFalls_1F_1R_EventScript_OpenStevensCave:: MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: lockall playbgm MUS_ENCOUNTER_MAGMA, FALSE - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceDown + applymovement LOCALID_PLAYER, Common_Movement_FaceDown waitmovement 0 delay 30 applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceDown @@ -37,7 +37,7 @@ MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: waitmovement 0 msgbox MeteorFalls_1F_1R_Text_HoldItRightThereMagma, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 @@ -54,7 +54,7 @@ MeteorFalls_1F_1R_EventScript_MagmaStealsMeteoriteScene:: waitmovement 0 msgbox MeteorFalls_1F_1R_Text_BeSeeingYouTeamAqua, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, MeteorFalls_1F_1R_Movement_PushPlayerOutOfWay + applymovement LOCALID_PLAYER, MeteorFalls_1F_1R_Movement_PushPlayerOutOfWay applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_1, MeteorFalls_1F_1R_Movement_MagmaGrunt1Exit applymovement LOCALID_METEOR_FALLS_MAGMA_GRUNT_2, MeteorFalls_1F_1R_Movement_MagmaGrunt2Exit waitmovement 0 diff --git a/data/maps/MossdeepCity/scripts.inc b/data/maps/MossdeepCity/scripts.inc index 10e520e347..0d19067e3f 100644 --- a/data/maps/MossdeepCity/scripts.inc +++ b/data/maps/MossdeepCity/scripts.inc @@ -261,13 +261,13 @@ MossdeepCity_EventScript_Scott:: end MossdeepCity_EventScript_ScottExitNorth:: - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit + applymovement LOCALID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit applymovement LOCALID_MOSSDEEP_SCOTT, MossdeepCity_Movement_ScottExitNorth waitmovement 0 return MossdeepCity_EventScript_ScottExitEast:: - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit + applymovement LOCALID_PLAYER, MossdeepCity_Movement_PlayerWatchScottExit applymovement LOCALID_MOSSDEEP_SCOTT, MossdeepCity_Movement_ScottExitEast waitmovement 0 return diff --git a/data/maps/MossdeepCity_Gym/scripts.inc b/data/maps/MossdeepCity_Gym/scripts.inc index f2d08c13b1..8ff582e34d 100644 --- a/data/maps/MossdeepCity_Gym/scripts.inc +++ b/data/maps/MossdeepCity_Gym/scripts.inc @@ -114,7 +114,7 @@ MossdeepCity_Gym_EventScript_Switch1:: lockall goto_if_set FLAG_MOSSDEEP_GYM_SWITCH_1, MossdeepCity_Gym_EventScript_ClearSwitch1 setflag FLAG_MOSSDEEP_GYM_SWITCH_1 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 5, 5, METATILE_RSMossdeepGym_RedArrow_Right, FALSE setmetatile 2, 7, METATILE_RSMossdeepGym_Switch_Down, TRUE @@ -129,7 +129,7 @@ MossdeepCity_Gym_EventScript_DrawMapAfterSwitchUsed:: MossdeepCity_Gym_EventScript_ClearSwitch1:: clearflag FLAG_MOSSDEEP_GYM_SWITCH_1 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 5, 5, METATILE_RSMossdeepGym_RedArrow_Left, FALSE setmetatile 2, 7, METATILE_RSMossdeepGym_Switch_Up, TRUE @@ -140,7 +140,7 @@ MossdeepCity_Gym_EventScript_Switch2:: lockall goto_if_set FLAG_MOSSDEEP_GYM_SWITCH_2, MossdeepCity_Gym_EventScript_ClearSwitch2 setflag FLAG_MOSSDEEP_GYM_SWITCH_2 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 8, 14, METATILE_RSMossdeepGym_RedArrow_Right, FALSE setmetatile 8, 10, METATILE_RSMossdeepGym_Switch_Down, TRUE @@ -149,7 +149,7 @@ MossdeepCity_Gym_EventScript_Switch2:: MossdeepCity_Gym_EventScript_ClearSwitch2:: clearflag FLAG_MOSSDEEP_GYM_SWITCH_2 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 8, 14, METATILE_RSMossdeepGym_RedArrow_Down, FALSE setmetatile 8, 10, METATILE_RSMossdeepGym_Switch_Up, TRUE @@ -160,7 +160,7 @@ MossdeepCity_Gym_EventScript_Switch3:: lockall goto_if_set FLAG_MOSSDEEP_GYM_SWITCH_3, MossdeepCity_Gym_EventScript_ClearSwitch3 setflag FLAG_MOSSDEEP_GYM_SWITCH_3 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 15, 17, METATILE_RSMossdeepGym_RedArrow_Left, FALSE setmetatile 17, 15, METATILE_RSMossdeepGym_Switch_Down, TRUE @@ -169,7 +169,7 @@ MossdeepCity_Gym_EventScript_Switch3:: MossdeepCity_Gym_EventScript_ClearSwitch3:: clearflag FLAG_MOSSDEEP_GYM_SWITCH_3 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 15, 17, METATILE_RSMossdeepGym_RedArrow_Right, FALSE setmetatile 17, 15, METATILE_RSMossdeepGym_Switch_Up, TRUE @@ -180,7 +180,7 @@ MossdeepCity_Gym_EventScript_Switch4:: lockall goto_if_set FLAG_MOSSDEEP_GYM_SWITCH_4, MossdeepCity_Gym_EventScript_ClearSwitch4 setflag FLAG_MOSSDEEP_GYM_SWITCH_4 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 1, 23, METATILE_RSMossdeepGym_RedArrow_Up, FALSE setmetatile 5, 24, METATILE_RSMossdeepGym_Switch_Down, TRUE @@ -189,7 +189,7 @@ MossdeepCity_Gym_EventScript_Switch4:: MossdeepCity_Gym_EventScript_ClearSwitch4:: clearflag FLAG_MOSSDEEP_GYM_SWITCH_4 - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse + applymovement LOCALID_PLAYER, MossdeepCity_Gym_Movement_WaitAfterSwitchUse waitmovement 0 setmetatile 1, 23, METATILE_RSMossdeepGym_RedArrow_Right, FALSE setmetatile 5, 24, METATILE_RSMossdeepGym_Switch_Up, TRUE diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc index 07888c6e43..cbb9cba9af 100644 --- a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc @@ -30,15 +30,15 @@ MossdeepCity_SpaceCenter_2F_OnFrame: MossdeepCity_SpaceCenter_2F_EventScript_ThreeMagmaGrunts:: playse SE_PIN - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark + applymovement LOCALID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay48 + applymovement LOCALID_PLAYER, Common_Movement_Delay48 waitmovement 0 msgbox MossdeepCity_SpaceCenter_2F_Text_YoureOutnumberedTakeUsOn, MSGBOX_YESNO goto_if_eq VAR_RESULT, YES, MossdeepCity_SpaceCenter_2F_EventScript_BattleThreeMagmaGrunts msgbox MossdeepCity_SpaceCenter_2F_Text_GoodAnswer, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, MossdeepCity_SpaceCenter_2F_Movement_PlayerExit + applymovement LOCALID_PLAYER, MossdeepCity_SpaceCenter_2F_Movement_PlayerExit waitmovement 0 warp MAP_MOSSDEEP_CITY_SPACE_CENTER_1F, 13, 1 waitstate @@ -54,13 +54,13 @@ MossdeepCity_SpaceCenter_2F_EventScript_BattleThreeMagmaGrunts:: trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_5, MossdeepCity_SpaceCenter_2F_Text_Grunt5Defeat applymovement LOCALID_SPACE_CENTER_GRUNT_5, MossdeepCity_SpaceCenter_2F_Movement_Grunt5Defeated waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox MossdeepCity_SpaceCenter_2F_Text_Grunt6Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_6, MossdeepCity_SpaceCenter_2F_Text_Grunt6Defeat applymovement LOCALID_SPACE_CENTER_GRUNT_6, MossdeepCity_SpaceCenter_2F_Movement_Grunt6Defeated waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox MossdeepCity_SpaceCenter_2F_Text_Grunt7Intro, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_SPACE_CENTER_7, MossdeepCity_SpaceCenter_2F_Text_Grunt7Defeat diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index fa5e5ff172..9d9e1d4eae 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -58,7 +58,7 @@ MtChimney_EventScript_Maxie:: addobject LOCALID_MT_CHIMNEY_ARCHIE call_if_eq VAR_FACING, DIR_EAST, MtChimney_EventScript_ArchieApproachPlayerEast call_if_eq VAR_FACING, DIR_NORTH, MtChimney_EventScript_ArchieApproachPlayerNorth - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox MtChimney_Text_ArchieThankYou, MSGBOX_DEFAULT closemessage diff --git a/data/maps/MtChimney_CableCarStation/scripts.inc b/data/maps/MtChimney_CableCarStation/scripts.inc index e662716f63..b9d8b1ce2d 100644 --- a/data/maps/MtChimney_CableCarStation/scripts.inc +++ b/data/maps/MtChimney_CableCarStation/scripts.inc @@ -18,7 +18,7 @@ MtChimney_CableCarStation_OnFrame: MtChimney_CableCarStation_EventScript_ExitCableCar:: lockall - applymovement OBJ_EVENT_ID_PLAYER, MtChimney_CableCarStation_Movement_ExitCableCar + applymovement LOCALID_PLAYER, MtChimney_CableCarStation_Movement_ExitCableCar applymovement LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MtChimney_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 @@ -39,7 +39,7 @@ MtChimney_CableCarStation_EventScript_RideCableCar:: msgbox MtChimney_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage applymovement LOCALID_MT_CHIMNEY_CABLE_CAR_ATTENDANT, MtChimney_CableCarStation_Movement_LeadPlayerToCableCar - applymovement OBJ_EVENT_ID_PLAYER, MtChimney_CableCarStation_Movement_BoardCableCar + applymovement LOCALID_PLAYER, MtChimney_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, TRUE @ Going down setvar VAR_CABLE_CAR_STATION_STATE, 2 diff --git a/data/maps/MtPyre_Summit/scripts.inc b/data/maps/MtPyre_Summit/scripts.inc index 06c91fe382..7b0ca2d3a1 100644 --- a/data/maps/MtPyre_Summit/scripts.inc +++ b/data/maps/MtPyre_Summit/scripts.inc @@ -31,7 +31,7 @@ MtPyre_Summit_EventScript_TeamAquaTrigger2:: MtPyre_Summit_EventScript_TeamAquaExits:: playbgm MUS_ENCOUNTER_AQUA, FALSE - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 @@ -80,7 +80,7 @@ MtPyre_Summit_EventScript_ArchieFacePlayer2:: MtPyre_Summit_EventScript_OldLadyApproachPlayer0:: applymovement LOCALID_MT_PYRE_SUMMIT_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer0 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -92,7 +92,7 @@ MtPyre_Summit_EventScript_OldLadyApproachPlayer1:: MtPyre_Summit_EventScript_OldLadyApproachPlayer2:: applymovement LOCALID_MT_PYRE_SUMMIT_OLD_LADY, MtPyre_Summit_Movement_OldLadyApproachPlayer2 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return @@ -196,7 +196,7 @@ MtPyre_Summit_EventScript_ArchieMaxieTrigger2:: end MtPyre_Summit_EventScript_ArchieMaxieReturnOrbs:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 60 call_if_eq VAR_0x8008, 0, MtPyre_Summit_EventScript_ArchieMaxieBeginExit0 @@ -227,49 +227,49 @@ MtPyre_Summit_EventScript_ArchieMaxieReturnOrbs:: end MtPyre_Summit_EventScript_ArchieMaxieBeginExit0:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit0 + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_ArchieMaxieBeginExit1:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit1 + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit1 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_ArchieMaxieBeginExit2:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit2 + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchArchieMaxieExit2 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieExit applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieExit waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer0:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie0 + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer0 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer1:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer1 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachPlayer2:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerFaceMaxie applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, MtPyre_Summit_Movement_ArchieWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachPlayer2 waitmovement 0 return MtPyre_Summit_EventScript_MaxieApproachArchie0:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie0 waitmovement 0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight @@ -277,7 +277,7 @@ MtPyre_Summit_EventScript_MaxieApproachArchie0:: return MtPyre_Summit_EventScript_MaxieApproachArchie1:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie1 waitmovement 0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight @@ -285,7 +285,7 @@ MtPyre_Summit_EventScript_MaxieApproachArchie1:: return MtPyre_Summit_EventScript_MaxieApproachArchie2:: - applymovement OBJ_EVENT_ID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie + applymovement LOCALID_PLAYER, MtPyre_Summit_Movement_PlayerWatchMaxie applymovement LOCALID_MT_PYRE_SUMMIT_MAXIE, MtPyre_Summit_Movement_MaxieApproachArchie2 waitmovement 0 applymovement LOCALID_MT_PYRE_SUMMIT_ARCHIE, Common_Movement_WalkInPlaceFasterRight diff --git a/data/maps/NavelRock_Top/scripts.inc b/data/maps/NavelRock_Top/scripts.inc index 038fc96f1b..f8c69e039d 100644 --- a/data/maps/NavelRock_Top/scripts.inc +++ b/data/maps/NavelRock_Top/scripts.inc @@ -38,7 +38,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE applymovement LOCALID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhAppear - applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanUp + applymovement LOCALID_CAMERA, NavelRock_Top_Movement_CameraPanUp waitmovement 0 delay 50 setweather WEATHER_NONE @@ -51,7 +51,7 @@ NavelRock_Top_EventScript_HoOh:: setvar VAR_0x8004, 3 @ num loops setvar VAR_0x8005, 35 @ delay special LoopWingFlapSE - applymovement OBJ_EVENT_ID_CAMERA, NavelRock_Top_Movement_CameraPanDown + applymovement LOCALID_CAMERA, NavelRock_Top_Movement_CameraPanDown applymovement LOCALID_NAVEL_ROCK_HO_OH, NavelRock_Top_Movement_HoOhApproach waitmovement 0 special RemoveCameraObject diff --git a/data/maps/NewMauville_Entrance/scripts.inc b/data/maps/NewMauville_Entrance/scripts.inc index 4c498190e0..3b0395386f 100644 --- a/data/maps/NewMauville_Entrance/scripts.inc +++ b/data/maps/NewMauville_Entrance/scripts.inc @@ -22,7 +22,7 @@ NewMauville_Entrance_OnTransition: NewMauville_Entrance_EventScript_Door:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox NewMauville_Entrance_Text_DoorIsLocked, MSGBOX_DEFAULT checkitem ITEM_BASEMENT_KEY diff --git a/data/maps/OldaleTown/scripts.inc b/data/maps/OldaleTown/scripts.inc index d19658dc13..a127cd07be 100644 --- a/data/maps/OldaleTown/scripts.inc +++ b/data/maps/OldaleTown/scripts.inc @@ -50,20 +50,20 @@ OldaleTown_EventScript_MartEmployee:: OldaleTown_EventScript_GoToMartSouth:: applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeSouth - applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerSouth + applymovement LOCALID_PLAYER, OldaleTown_Movement_PlayerSouth waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart end OldaleTown_EventScript_GoToMartNorth:: applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeNorth - applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerNorth + applymovement LOCALID_PLAYER, OldaleTown_Movement_PlayerNorth waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart end OldaleTown_EventScript_GoToMartEast:: - applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerEast + applymovement LOCALID_PLAYER, OldaleTown_Movement_PlayerEast applymovement LOCALID_OLDALE_MART_EMPLOYEE, OldaleTown_Movement_EmployeeEast waitmovement 0 goto OldaleTown_EventScript_ExplainPokemonMart @@ -200,7 +200,7 @@ OldaleTown_EventScript_FootprintsMan:: OldaleTown_EventScript_BlockedPath:: lockall - applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_PlayerStepBack + applymovement LOCALID_PLAYER, OldaleTown_Movement_PlayerStepBack applymovement LOCALID_FOOTPRINTS_MAN, OldaleTown_Movement_BackUp waitmovement 0 msgbox OldaleTown_Text_WaitDontComeInHere, MSGBOX_DEFAULT @@ -227,7 +227,7 @@ OldaleTown_EventScript_RivalTrigger1:: lockall applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer1 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 setvar VAR_0x8009, 1 goto OldaleTown_EventScript_ShowRivalMessage @@ -237,7 +237,7 @@ OldaleTown_EventScript_RivalTrigger2:: lockall applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer2 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 setvar VAR_0x8009, 1 goto OldaleTown_EventScript_ShowRivalMessage @@ -247,7 +247,7 @@ OldaleTown_EventScript_RivalTrigger3:: lockall applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalApproachPlayer3 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 setvar VAR_0x8009, 1 goto OldaleTown_EventScript_ShowRivalMessage @@ -288,7 +288,7 @@ OldaleTown_EventScript_DoExitMovement1:: return OldaleTown_EventScript_DoExitMovement2:: - applymovement OBJ_EVENT_ID_PLAYER, OldaleTown_Movement_WatchRivalExit + applymovement LOCALID_PLAYER, OldaleTown_Movement_WatchRivalExit applymovement LOCALID_OLDALE_RIVAL, OldaleTown_Movement_RivalExit waitmovement 0 return diff --git a/data/maps/PetalburgCity/scripts.inc b/data/maps/PetalburgCity/scripts.inc index 45487bcd46..879e780228 100644 --- a/data/maps/PetalburgCity/scripts.inc +++ b/data/maps/PetalburgCity/scripts.inc @@ -34,7 +34,7 @@ PetalburgCity_EventScript_WallyTutorial:: special SavePlayerParty special LoadWallyZigzagoon applymovement LOCALID_PETALBURG_WALLY, PetalburgCity_Movement_WallyTutorialWally - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WallyTutorialPlayer + applymovement LOCALID_PLAYER, PetalburgCity_Movement_WallyTutorialPlayer waitmovement 0 msgbox Route102_Text_WatchMeCatchPokemon, MSGBOX_DEFAULT special StartWallyTutorialBattle @@ -59,17 +59,17 @@ PetalburgCity_EventScript_WalkToWallyHouse:: lockall setflag FLAG_HIDE_MAP_NAME_POPUP applymovement LOCALID_PETALBURG_WALLYS_DAD, PetalburgCity_Movement_WalkToWallyHouseWallysDad - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WalkToWallyHousePlayer + applymovement LOCALID_PLAYER, PetalburgCity_Movement_WalkToWallyHousePlayer waitmovement 0 setvar VAR_0x8004, 7 setvar VAR_0x8005, 5 opendoor VAR_0x8004, VAR_0x8005 waitdooranim applymovement LOCALID_PETALBURG_WALLYS_DAD, PetalburgCity_Movement_WalkInsideHouseWallysDad - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_WalkInsideHousePlayer + applymovement LOCALID_PLAYER, PetalburgCity_Movement_WalkInsideHousePlayer waitmovement 0 setflag FLAG_HIDE_PETALBURG_CITY_WALLYS_DAD - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_PETALBURG_CITY + hideobjectat LOCALID_PLAYER, MAP_PETALBURG_CITY closedoor VAR_0x8004, VAR_0x8005 waitdooranim clearflag FLAG_HIDE_MAP_NAME_POPUP @@ -279,7 +279,7 @@ PetalburgCity_EventScript_ShowGymToPlayer:: call_if_eq VAR_0x8008, 3, PetalburgCity_EventScript_LeadPlayerToGym3 msgbox PetalburgCity_Text_ThisIsPetalburgGym, MSGBOX_DEFAULT applymovement LOCALID_GYM_BOY, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox PetalburgCity_Text_ThisIsGymSign, MSGBOX_DEFAULT closemessage @@ -292,7 +292,7 @@ PetalburgCity_EventScript_ShowGymToPlayer:: PetalburgCity_EventScript_BoyApproachPlayer0:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyApproachPlayer0 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -304,38 +304,38 @@ PetalburgCity_EventScript_BoyApproachPlayer1:: PetalburgCity_EventScript_BoyApproachPlayer2:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyApproachPlayer2 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_EventScript_BoyApproachPlayer3:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyApproachPlayer3 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_EventScript_LeadPlayerToGym0:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyWalkToGym0 - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym0 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym0 waitmovement 0 return PetalburgCity_EventScript_LeadPlayerToGym1:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyWalkToGym1 - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym1 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym1 waitmovement 0 return PetalburgCity_EventScript_LeadPlayerToGym2:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyWalkToGym2 - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym2 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym2 waitmovement 0 return PetalburgCity_EventScript_LeadPlayerToGym3:: applymovement LOCALID_GYM_BOY, PetalburgCity_Movement_BoyWalkToGym3 - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym3 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWalkToGym3 waitmovement 0 return @@ -538,7 +538,7 @@ PetalburgCity_EventScript_Scott:: waitmovement 0 applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 setvar VAR_SCOTT_STATE, 1 msgbox PetalburgCity_Text_AreYouATrainer, MSGBOX_DEFAULT @@ -563,25 +563,25 @@ PetalburgCity_EventScript_Scott:: end PetalburgCity_EventScript_ScottExit0:: - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit0 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit0 applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit0 waitmovement 0 return PetalburgCity_EventScript_ScottExit1:: - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit1 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit1 applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit1 waitmovement 0 return PetalburgCity_EventScript_ScottExit2:: - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit2 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit2 applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit2 waitmovement 0 return PetalburgCity_EventScript_ScottExit3:: - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit3 + applymovement LOCALID_PLAYER, PetalburgCity_Movement_PlayerWatchScottExit3 applymovement LOCALID_PETALBURG_SCOTT, PetalburgCity_Movement_ScottExit3 waitmovement 0 return diff --git a/data/maps/PetalburgCity_Gym/scripts.inc b/data/maps/PetalburgCity_Gym/scripts.inc index 9c0a8a5bf3..ae93d8c8f3 100644 --- a/data/maps/PetalburgCity_Gym/scripts.inc +++ b/data/maps/PetalburgCity_Gym/scripts.inc @@ -66,7 +66,7 @@ PetalburgCity_Gym_OnWarp: .2byte 0 PetalburgCity_Gym_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end PetalburgCity_Gym_OnFrame: @@ -78,14 +78,14 @@ PetalburgCity_Gym_EventScript_ReturnFromWallyTutorial:: msgbox PetalburgCity_Gym_Text_DadSoDidItWorkOut, MSGBOX_DEFAULT msgbox PetalburgCity_Gym_Text_WallyThankYouBye, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitGym waitmovement 0 playse SE_EXIT removeobject LOCALID_PETALBURG_GYM_WALLY setflag FLAG_HIDE_PETALBURG_CITY_WALLY delay 30 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PetalburgCity_Gym_Text_DadGoCollectBadges, MSGBOX_DEFAULT setvar VAR_PETALBURG_GYM_STATE, 2 @@ -201,13 +201,13 @@ PetalburgCity_Gym_EventScript_WallyArriveNorth:: applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyArriveNorth waitmovement 0 applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PetalburgCity_Gym_EventScript_WallyArriveWestEast:: applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyArrive waitmovement 0 return @@ -215,25 +215,25 @@ PetalburgCity_Gym_EventScript_WallyArriveWestEast:: PetalburgCity_Gym_EventScript_ExitGymWithWallySouth:: applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallySouth + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallySouth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyNorth:: applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitNorth - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyNorth + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyNorth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyWest:: applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitSouthWest - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyWest + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyWest waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallyEast:: applymovement LOCALID_PETALBURG_GYM_WALLY, PetalburgCity_Gym_Movement_WallyExitEast - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyEast + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallyEast waitmovement 0 return @@ -244,19 +244,19 @@ PetalburgCity_Gym_EventScript_NormanAddressPlayerSouth:: PetalburgCity_Gym_EventScript_NormanAddressPlayerNorth:: applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerWest:: applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PetalburgCity_Gym_EventScript_NormanAddressPlayerEast:: applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterLeft - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -470,7 +470,7 @@ PetalburgCity_Gym_EventScript_WallysDadFaceNormanWest:: PetalburgCity_Gym_EventScript_WallysDadApproachPlayerNorth:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerNorth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return @@ -478,7 +478,7 @@ PetalburgCity_Gym_EventScript_WallysDadApproachPlayerNorth:: PetalburgCity_Gym_EventScript_WallysDadApproachPlayerEast:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerEast waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -486,7 +486,7 @@ PetalburgCity_Gym_EventScript_WallysDadApproachPlayerEast:: PetalburgCity_Gym_EventScript_WallysDadApproachPlayerWest:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadApproachPlayerWest waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -494,19 +494,19 @@ PetalburgCity_Gym_EventScript_WallysDadApproachPlayerWest:: PetalburgCity_Gym_EventScript_ExitGymWithWallysDadNorth:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitNorth applymovement LOCALID_PETALBURG_GYM_NORMAN, Common_Movement_WalkInPlaceFasterDown - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadNorth + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadNorth waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallysDadEast:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitEast - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadEast + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadEast waitmovement 0 return PetalburgCity_Gym_EventScript_ExitGymWithWallysDadWest:: applymovement LOCALID_PETALBURG_GYM_WALLYS_DAD, PetalburgCity_Gym_Movement_WallysDadExitWest - applymovement OBJ_EVENT_ID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadWest + applymovement LOCALID_PLAYER, PetalburgCity_Gym_Movement_PlayerExitWithWallysDadWest waitmovement 0 return diff --git a/data/maps/PetalburgCity_WallysHouse/scripts.inc b/data/maps/PetalburgCity_WallysHouse/scripts.inc index 21b2247bbd..fd8896064e 100644 --- a/data/maps/PetalburgCity_WallysHouse/scripts.inc +++ b/data/maps/PetalburgCity_WallysHouse/scripts.inc @@ -8,7 +8,7 @@ PetalburgCity_WallysHouse_OnWarp: .2byte 0 PetalburgCity_WallysHouse_EventScript_PlayerWallysDadFaceEachOther:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_EAST + turnobject LOCALID_PLAYER, DIR_EAST turnobject LOCALID_WALLYS_HOUSE_WALLYS_DAD, DIR_WEST end diff --git a/data/maps/PetalburgWoods/scripts.inc b/data/maps/PetalburgWoods/scripts.inc index 85a90c73dc..14cf1aabb4 100644 --- a/data/maps/PetalburgWoods/scripts.inc +++ b/data/maps/PetalburgWoods/scripts.inc @@ -30,7 +30,7 @@ PetalburgWoods_EventScript_DevonResearcherLeft:: applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaBackOff waitmovement 0 call PetalburgWoods_EventScript_DevonResearcherPostBattle - applymovement OBJ_EVENT_ID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave + applymovement LOCALID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitLeft waitmovement 0 goto PetalburgWoods_EventScript_RemoveDevonResearcher @@ -41,7 +41,7 @@ PetalburgWoods_EventScript_DevonResearcherRight:: call PetalburgWoods_EventScript_DevonResearcherIntro applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherApproachPlayerRight waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox PetalburgWoods_Text_HaveYouSeenShroomish, MSGBOX_DEFAULT closemessage @@ -59,14 +59,14 @@ PetalburgWoods_EventScript_DevonResearcherRight:: applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherFleeToPlayerRight waitmovement 0 msgbox PetalburgWoods_Text_YouHaveToHelpMe, MSGBOX_DEFAULT - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PetalburgWoods_Text_NoOneCrossesTeamAqua, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_PETALBURG_WOODS, PetalburgWoods_Text_YoureKiddingMe applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaBackOff waitmovement 0 call PetalburgWoods_EventScript_DevonResearcherPostBattle - applymovement OBJ_EVENT_ID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave + applymovement LOCALID_PLAYER, PetalburgWoods_Movement_WatchResearcherLeave applymovement LOCALID_PETALBURG_WOODS_DEVON_EMPLOYEE, PetalburgWoods_Movement_DevonResearcherExitRight waitmovement 0 goto PetalburgWoods_EventScript_RemoveDevonResearcher @@ -85,7 +85,7 @@ PetalburgWoods_EventScript_DevonResearcherPostBattle:: applymovement LOCALID_PETALBURG_WOODS_GRUNT, PetalburgWoods_Movement_AquaRunAway waitmovement 0 removeobject LOCALID_PETALBURG_WOODS_GRUNT - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox PetalburgWoods_Text_ThatWasAwfullyClose, MSGBOX_DEFAULT giveitem ITEM_GREAT_BALL diff --git a/data/maps/Route101/scripts.inc b/data/maps/Route101/scripts.inc index 6b926c9ee4..b02c69e279 100644 --- a/data/maps/Route101/scripts.inc +++ b/data/maps/Route101/scripts.inc @@ -23,7 +23,7 @@ Route101_EventScript_StartBirchRescue:: closemessage setobjectxy LOCALID_ROUTE101_BIRCH, 0, 15 setobjectxy LOCALID_ROUTE101_ZIGZAGOON, 0, 16 - applymovement OBJ_EVENT_ID_PLAYER, Route101_Movement_EnterScene + applymovement LOCALID_PLAYER, Route101_Movement_EnterScene applymovement LOCALID_ROUTE101_BIRCH, Route101_Movement_BirchRunAway1 applymovement LOCALID_ROUTE101_ZIGZAGOON, Route101_Movement_ZigzagoonChase1 waitmovement 0 @@ -45,7 +45,7 @@ Route101_EventScript_PreventExitSouth:: lockall msgbox Route101_Text_DontLeaveMe, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route101_Movement_PreventExitSouth + applymovement LOCALID_PLAYER, Route101_Movement_PreventExitSouth waitmovement 0 releaseall end @@ -54,7 +54,7 @@ Route101_EventScript_PreventExitWest:: lockall msgbox Route101_Text_DontLeaveMe, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route101_Movement_PreventExitWest + applymovement LOCALID_PLAYER, Route101_Movement_PreventExitWest waitmovement 0 releaseall end @@ -63,7 +63,7 @@ Route101_EventScript_PreventExitNorth:: lockall msgbox Route101_Text_DontLeaveMe, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route101_Movement_PreventExitNorth + applymovement LOCALID_PLAYER, Route101_Movement_PreventExitNorth waitmovement 0 releaseall end @@ -222,8 +222,8 @@ Route101_EventScript_BirchsBag:: setflag FLAG_RESCUED_BIRCH fadescreen FADE_TO_BLACK removeobject LOCALID_ROUTE101_ZIGZAGOON - setobjectxy OBJ_EVENT_ID_PLAYER, 6, 13 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + setobjectxy LOCALID_PLAYER, 6, 13 + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 special ChooseStarter waitstate diff --git a/data/maps/Route103/scripts.inc b/data/maps/Route103/scripts.inc index 5ab46fa7ec..941d464c37 100644 --- a/data/maps/Route103/scripts.inc +++ b/data/maps/Route103/scripts.inc @@ -108,7 +108,7 @@ Route103_EventScript_RivalExit:: end Route103_EventScript_RivalExitFacingNorth:: - applymovement OBJ_EVENT_ID_PLAYER, Route103_Movement_WatchRivalExitFacingNorth + applymovement LOCALID_PLAYER, Route103_Movement_WatchRivalExitFacingNorth applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExitFacingNorth1 waitmovement 0 playse SE_LEDGE @@ -118,7 +118,7 @@ Route103_EventScript_RivalExitFacingNorth:: end Route103_EventScript_RivalExitFacingEastOrWest:: - applymovement OBJ_EVENT_ID_PLAYER, Route103_Movement_WatchRivalExitFacingEastOrWest + applymovement LOCALID_PLAYER, Route103_Movement_WatchRivalExitFacingEastOrWest applymovement LOCALID_ROUTE103_RIVAL, Route103_Movement_RivalExit1 waitmovement 0 playse SE_LEDGE diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc index b5ac270100..e2c66a837c 100644 --- a/data/maps/Route104/scripts.inc +++ b/data/maps/Route104/scripts.inc @@ -50,12 +50,12 @@ Route104_EventScript_RivalTrigger:: setflag FLAG_HIDE_RUSTBORO_CITY_RIVAL setvar VAR_RUSTBORO_CITY_STATE, 8 setvar VAR_ROUTE104_STATE, 2 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 10 addobject LOCALID_ROUTE104_RIVAL clearflag FLAG_HIDE_ROUTE_104_RIVAL - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerBackUp + applymovement LOCALID_PLAYER, Route104_Movement_PlayerBackUp waitmovement 0 applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalExitBrineysCottage waitmovement 0 @@ -103,7 +103,7 @@ Route104_EventScript_MayEncounter:: closemessage delay 30 setflag FLAG_ENABLE_RIVAL_MATCH_CALL - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerFaceRival + applymovement LOCALID_PLAYER, Route104_Movement_PlayerFaceRival applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalWalkSlowLeft msgbox Route104_Text_MayHowsYourPokedex, MSGBOX_DEFAULT closemessage @@ -189,7 +189,7 @@ Route104_EventScript_BrendanEncounter:: closemessage delay 30 setflag FLAG_ENABLE_RIVAL_MATCH_CALL - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerFaceRival + applymovement LOCALID_PLAYER, Route104_Movement_PlayerFaceRival applymovement LOCALID_ROUTE104_RIVAL, Route104_Movement_RivalWalkSlowLeft msgbox Route104_Text_BrendanHowsYourPokedex, MSGBOX_DEFAULT closemessage @@ -344,13 +344,13 @@ Route104_EventScript_Girl2:: Route104_EventScript_SailToDewford:: setobjectsubpriority LOCALID_ROUTE104_BRINEY, MAP_ROUTE104, 0 - setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE104, 0 + setobjectsubpriority LOCALID_PLAYER, MAP_ROUTE104, 0 applymovement LOCALID_ROUTE104_BRINEY, Route104_Movement_BrineyBoardBoat waitmovement 0 removeobject LOCALID_ROUTE104_BRINEY - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerBoardBoat + applymovement LOCALID_PLAYER, Route104_Movement_PlayerBoardBoat waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 + hideobjectat LOCALID_PLAYER, MAP_ROUTE104 call Common_EventScript_PlayBrineysBoatMusic goto_if_set FLAG_ENABLE_NORMAN_MATCH_CALL, Route104_EventScript_SailToDewfordNoCall goto_if_unset FLAG_ENABLE_NORMAN_MATCH_CALL, Route104_EventScript_SailToDewfordDadCalls @@ -358,13 +358,13 @@ Route104_EventScript_SailToDewford:: Route104_EventScript_SailToDewfordNoCall:: applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewford - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewford + applymovement LOCALID_PLAYER, Route104_Movement_SailToDewford waitmovement 0 goto Route104_EventScript_ArriveInDewford Route104_EventScript_SailToDewfordDadCalls:: applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewfordBeforeDadCalls - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewfordBeforeDadCalls + applymovement LOCALID_PLAYER, Route104_Movement_SailToDewfordBeforeDadCalls waitmovement 0 pokenavcall Route104_Text_DadPokenavCall waitmessage @@ -375,7 +375,7 @@ Route104_EventScript_SailToDewfordDadCalls:: closemessage delay 30 setflag FLAG_ENABLE_NORMAN_MATCH_CALL - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_SailToDewfordAfterDadCalls + applymovement LOCALID_PLAYER, Route104_Movement_SailToDewfordAfterDadCalls applymovement LOCALID_ROUTE104_BOAT, Route104_Movement_SailToDewfordAfterDadCalls, MAP_ROUTE104 waitmovement LOCALID_ROUTE104_BOAT, MAP_ROUTE104 waitmovement 0 @@ -383,11 +383,11 @@ Route104_EventScript_SailToDewfordDadCalls:: Route104_EventScript_ArriveInDewford:: delay 50 - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerExitBoat + applymovement LOCALID_PLAYER, Route104_Movement_PlayerExitBoat waitmovement 0 call Common_EventScript_StopBrineysBoatMusic - showobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN - applymovement OBJ_EVENT_ID_PLAYER, Route104_Movement_PlayerMoveForBriney + showobjectat LOCALID_PLAYER, MAP_DEWFORD_TOWN + applymovement LOCALID_PLAYER, Route104_Movement_PlayerMoveForBriney waitmovement 0 setobjectxyperm LOCALID_DEWFORD_BRINEY, 12, 8 addobject LOCALID_DEWFORD_BRINEY @@ -401,7 +401,7 @@ Route104_EventScript_ArriveInDewford:: setflag FLAG_HIDE_ROUTE_104_MR_BRINEY_BOAT hideobjectat LOCALID_ROUTE104_BOAT, MAP_ROUTE104 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 - resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE104 + resetobjectsubpriority LOCALID_PLAYER, MAP_ROUTE104 resetobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN copyobjectxytoperm LOCALID_DEWFORD_BRINEY setvar VAR_BOARD_BRINEY_BOAT_STATE, 0 diff --git a/data/maps/Route109/scripts.inc b/data/maps/Route109/scripts.inc index a7b4f65d48..88b802a8e7 100644 --- a/data/maps/Route109/scripts.inc +++ b/data/maps/Route109/scripts.inc @@ -7,7 +7,7 @@ Route109_MapScripts:: Route109_EventScript_StartDepartForDewford:: call EventScript_BackupMrBrineyLocation setobjectsubpriority LOCALID_ROUTE109_BRINEY, MAP_ROUTE109, 0 - setobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE109, 0 + setobjectsubpriority LOCALID_PLAYER, MAP_ROUTE109, 0 applymovement LOCALID_ROUTE109_BRINEY, Route109_Movement_BrineyEnterBoat waitmovement 0 removeobject LOCALID_ROUTE109_BRINEY @@ -18,33 +18,33 @@ Route109_EventScript_StartDepartForDewford:: end Route109_EventScript_EnterBoatSouth:: - applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_PlayerEnterBoatSouth + applymovement LOCALID_PLAYER, Route109_Movement_PlayerEnterBoatSouth waitmovement 0 goto Route109_EventScript_DoSailToDewford end Route109_EventScript_EnterBoatEast:: - applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_PlayerEnterBoatEast + applymovement LOCALID_PLAYER, Route109_Movement_PlayerEnterBoatEast waitmovement 0 goto Route109_EventScript_DoSailToDewford end Route109_EventScript_EnterBoatWest:: - applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_PlayerEnterBoatWest + applymovement LOCALID_PLAYER, Route109_Movement_PlayerEnterBoatWest waitmovement 0 goto Route109_EventScript_DoSailToDewford end Route109_EventScript_DoSailToDewford:: - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 + hideobjectat LOCALID_PLAYER, MAP_ROUTE109 call Common_EventScript_PlayBrineysBoatMusic applymovement LOCALID_ROUTE109_BOAT, Route109_Movement_SailToDewford - applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_SailToDewford + applymovement LOCALID_PLAYER, Route109_Movement_SailToDewford waitmovement 0 delay 50 call Common_EventScript_StopBrineysBoatMusic - showobjectat OBJ_EVENT_ID_PLAYER, MAP_DEWFORD_TOWN - applymovement OBJ_EVENT_ID_PLAYER, Route109_Movement_PlayerExitBoat + showobjectat LOCALID_PLAYER, MAP_DEWFORD_TOWN + applymovement LOCALID_PLAYER, Route109_Movement_PlayerExitBoat waitmovement 0 addobject LOCALID_DEWFORD_BOAT clearflag FLAG_HIDE_MR_BRINEY_BOAT_DEWFORD_TOWN @@ -59,7 +59,7 @@ Route109_EventScript_DoSailToDewford:: msgbox DewfordTown_Text_BrineyLandedInDewford, MSGBOX_DEFAULT closemessage copyvar VAR_BRINEY_LOCATION, VAR_0x8008 - resetobjectsubpriority OBJ_EVENT_ID_PLAYER, MAP_ROUTE109 + resetobjectsubpriority LOCALID_PLAYER, MAP_ROUTE109 resetobjectsubpriority LOCALID_DEWFORD_BRINEY, MAP_DEWFORD_TOWN copyobjectxytoperm LOCALID_DEWFORD_BRINEY release diff --git a/data/maps/Route110_SeasideCyclingRoadNorthEntrance/scripts.inc b/data/maps/Route110_SeasideCyclingRoadNorthEntrance/scripts.inc index fb1cdc5c71..cc3a867f8b 100644 --- a/data/maps/Route110_SeasideCyclingRoadNorthEntrance/scripts.inc +++ b/data/maps/Route110_SeasideCyclingRoadNorthEntrance/scripts.inc @@ -35,7 +35,7 @@ Route110_SeasideCyclingRoadNorthEntrance_EventScript_OnMachBike:: Route110_SeasideCyclingRoadNorthEntrance_EventScript_NoBike:: msgbox Route110_SeasideCyclingRoadNorthEntrance_Text_TooDangerousToWalk, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route110_SeasideCyclingRoadNorthEntrance_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, Route110_SeasideCyclingRoadNorthEntrance_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end diff --git a/data/maps/Route110_SeasideCyclingRoadSouthEntrance/scripts.inc b/data/maps/Route110_SeasideCyclingRoadSouthEntrance/scripts.inc index 5c4dcfa219..1f88b6e27c 100644 --- a/data/maps/Route110_SeasideCyclingRoadSouthEntrance/scripts.inc +++ b/data/maps/Route110_SeasideCyclingRoadSouthEntrance/scripts.inc @@ -20,7 +20,7 @@ Route110_SeasideCyclingRoadSouthEntrance_EventScript_BikeCheck:: Route110_SeasideCyclingRoadSouthEntrance_EventScript_NoBike:: msgbox Route110_SeasideCyclingRoadSouthEntrance_Text_TooDangerousToWalk, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route110_SeasideCyclingRoadSouthEntrance_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, Route110_SeasideCyclingRoadSouthEntrance_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end diff --git a/data/maps/Route110_TrickHouseEnd/scripts.inc b/data/maps/Route110_TrickHouseEnd/scripts.inc index 1649a11f60..e3b4660dad 100644 --- a/data/maps/Route110_TrickHouseEnd/scripts.inc +++ b/data/maps/Route110_TrickHouseEnd/scripts.inc @@ -228,11 +228,11 @@ Route110_TrickHouseEnd_EventScript_TrickMasterExitTrigger:: applymovement LOCALID_TRICK_MASTER_END, Route110_TrickHouseEnd_Movement_TrickMasterSurprise waitmovement 0 playse SE_M_EXPLOSION - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Route110_TrickHouseEnd_Text_YoureIgnoringMe, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, Route110_TrickHouseEnd_Movement_KeepPlayerInRoom + applymovement LOCALID_PLAYER, Route110_TrickHouseEnd_Movement_KeepPlayerInRoom waitmovement 0 delay 4 turnobject LOCALID_TRICK_MASTER_END, DIR_EAST diff --git a/data/maps/Route110_TrickHouseEntrance/scripts.inc b/data/maps/Route110_TrickHouseEntrance/scripts.inc index 5a020854db..93daa17b0b 100644 --- a/data/maps/Route110_TrickHouseEntrance/scripts.inc +++ b/data/maps/Route110_TrickHouseEntrance/scripts.inc @@ -127,7 +127,7 @@ Route110_TrickHouseEntrance_EventScript_TrickMasterFound:: addobject LOCALID_TRICK_MASTER showobjectat LOCALID_TRICK_MASTER, MAP_ROUTE110_TRICK_HOUSE_ENTRANCE turnobject LOCALID_TRICK_MASTER, DIR_EAST - turnobject OBJ_EVENT_ID_PLAYER, DIR_WEST + turnobject LOCALID_PLAYER, DIR_WEST end Route110_TrickHouseEntrance_EventScript_SetTrickMasterHidingSpot:: @@ -229,9 +229,9 @@ Route110_TrickHouseEntrance_EventScript_TrickMaster:: Route110_TrickHouseEntrance_EventScript_FoundTrickMaster:: playse SE_PIN - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_ExclamationMark + applymovement LOCALID_PLAYER, Common_Movement_ExclamationMark waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay48 + applymovement LOCALID_PLAYER, Common_Movement_Delay48 waitmovement 0 call_if_eq VAR_TRICK_HOUSE_LEVEL, 0, Route110_TrickHouseEntrance_EventScript_FoundBeneathDesk call_if_eq VAR_TRICK_HOUSE_LEVEL, 1, Route110_TrickHouseEntrance_EventScript_FoundBehindTree @@ -465,9 +465,9 @@ Route110_TrickHouseEntrance_EventScript_EnterPuzzleRoom:: setmetatile 5, 1, METATILE_GenericBuilding_TrickHouse_Stairs_Down, FALSE special DrawWholeMapView delay 20 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkUp + applymovement LOCALID_PLAYER, Common_Movement_WalkUp waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Route110_TrickHouseEntrance_Movement_EnterRoom + applymovement LOCALID_PLAYER, Route110_TrickHouseEntrance_Movement_EnterRoom waitmovement 0 switch VAR_TRICK_HOUSE_LEVEL case 0, Route110_TrickHouseEntrance_EventScript_EnterPuzzleRoom1 diff --git a/data/maps/Route111/scripts.inc b/data/maps/Route111/scripts.inc index 8280033228..5e0b5dcda4 100644 --- a/data/maps/Route111/scripts.inc +++ b/data/maps/Route111/scripts.inc @@ -97,7 +97,7 @@ Route111_OnWarp: .2byte 0 Route111_EventScript_HidePlayerForMirageTower:: - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_LITTLEROOT_TOWN + hideobjectat LOCALID_PLAYER, MAP_LITTLEROOT_TOWN end Route111_OnFrame: @@ -113,10 +113,10 @@ Route111_EventScript_MirageTowerDisappear:: addobject LOCALID_ROUTE111_PLAYER_FALLING special StartPlayerDescendMirageTower waitstate - showobjectat OBJ_EVENT_ID_PLAYER, MAP_LITTLEROOT_TOWN + showobjectat LOCALID_PLAYER, MAP_LITTLEROOT_TOWN removeobject LOCALID_ROUTE111_PLAYER_FALLING delay 16 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH delay 16 special StartMirageTowerDisintegration waitstate @@ -208,22 +208,22 @@ Route111_EventScript_PreventRouteAccess:: end Route111_EventScript_PushUpFromRoute:: - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_PushUpFromRoute + applymovement LOCALID_PLAYER, Route111_Movement_PushUpFromRoute waitmovement 0 return Route111_EventScript_PushDownFromRoute:: - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_PushDownFromRoute + applymovement LOCALID_PLAYER, Route111_Movement_PushDownFromRoute waitmovement 0 return Route111_EventScript_PushLeftFromRoute:: - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_PushLeftFromRoute + applymovement LOCALID_PLAYER, Route111_Movement_PushLeftFromRoute waitmovement 0 return Route111_EventScript_PushRightFromRoute:: - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_PushRightFromRoute + applymovement LOCALID_PLAYER, Route111_Movement_PushRightFromRoute waitmovement 0 return @@ -278,7 +278,7 @@ Route111_EventScript_BattleWinstrates:: waitmovement 0 removeobject LOCALID_ROUTE111_VICTOR call Route111_EventScript_CloseWinstrateDoor - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate + applymovement LOCALID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor addobject LOCALID_ROUTE111_VICTORIA @@ -296,7 +296,7 @@ Route111_EventScript_BattleWinstrates:: waitmovement 0 removeobject LOCALID_ROUTE111_VICTORIA call Route111_EventScript_CloseWinstrateDoor - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate + applymovement LOCALID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor addobject LOCALID_ROUTE111_VIVI @@ -314,7 +314,7 @@ Route111_EventScript_BattleWinstrates:: waitmovement 0 removeobject LOCALID_ROUTE111_VIVI call Route111_EventScript_CloseWinstrateDoor - applymovement OBJ_EVENT_ID_PLAYER, Route111_Movement_WaitForNextWinstrate + applymovement LOCALID_PLAYER, Route111_Movement_WaitForNextWinstrate waitmovement 0 call Route111_EventScript_OpenWinstrateDoor addobject LOCALID_ROUTE111_VICKY diff --git a/data/maps/Route112_CableCarStation/scripts.inc b/data/maps/Route112_CableCarStation/scripts.inc index 416b3b5627..63f6673f34 100644 --- a/data/maps/Route112_CableCarStation/scripts.inc +++ b/data/maps/Route112_CableCarStation/scripts.inc @@ -19,7 +19,7 @@ Route112_CableCarStation_OnFrame: Route112_CableCarStation_EventScript_ExitCableCar:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Route112_CableCarStation_Movement_ExitCableCar + applymovement LOCALID_PLAYER, Route112_CableCarStation_Movement_ExitCableCar applymovement LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, Route112_CableCarStation_Movement_FollowPlayerOutFromCableCar waitmovement 0 setvar VAR_CABLE_CAR_STATION_STATE, 0 @@ -40,7 +40,7 @@ Route112_CableCarStation_EventScript_RideCableCar:: msgbox Route112_CableCarStation_Text_StepThisWay, MSGBOX_DEFAULT closemessage applymovement LOCALID_ROUTE112_CABLE_CAR_ATTENDANT, Route112_CableCarStation_Movement_LeadPlayerToCableCar - applymovement OBJ_EVENT_ID_PLAYER, Route112_CableCarStation_Movement_BoardCableCar + applymovement LOCALID_PLAYER, Route112_CableCarStation_Movement_BoardCableCar waitmovement 0 setvar VAR_0x8004, FALSE @ Going up setvar VAR_CABLE_CAR_STATION_STATE, 1 diff --git a/data/maps/Route114_FossilManiacsTunnel/scripts.inc b/data/maps/Route114_FossilManiacsTunnel/scripts.inc index 9ec5247a9f..6961a14714 100644 --- a/data/maps/Route114_FossilManiacsTunnel/scripts.inc +++ b/data/maps/Route114_FossilManiacsTunnel/scripts.inc @@ -24,7 +24,7 @@ Route114_FossilManiacsTunnel_EventScript_CloseDesertUnderpass:: Route114_FossilManiacsTunnel_EventScript_ManiacMentionCaveIn:: lockall applymovement LOCALID_FOSSIL_MANIAC, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox Route114_FossilManiacsTunnel_Text_NotSafeThatWay, MSGBOX_DEFAULT setvar VAR_FOSSIL_MANIAC_STATE, 2 diff --git a/data/maps/Route116/scripts.inc b/data/maps/Route116/scripts.inc index 98206435ee..617ff90d19 100644 --- a/data/maps/Route116/scripts.inc +++ b/data/maps/Route116/scripts.inc @@ -142,7 +142,7 @@ Route116_EventScript_Briney:: Route116_EventScript_BrineyTrigger:: lockall applymovement LOCALID_ROUTE116_BRINEY, Common_Movement_WalkInPlaceFasterRight - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox Route116_Text_ScoundrelMadeOffWithPeeko, MSGBOX_DEFAULT setvar VAR_ROUTE116_STATE, 2 diff --git a/data/maps/Route118/scripts.inc b/data/maps/Route118/scripts.inc index db1c001fdf..3ea728d365 100644 --- a/data/maps/Route118/scripts.inc +++ b/data/maps/Route118/scripts.inc @@ -62,7 +62,7 @@ Route118_EventScript_RouteSign119:: Route118_EventScript_StevenTrigger0:: lockall setvar VAR_0x8008, 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenApproachLedge0 waitmovement 0 @@ -72,7 +72,7 @@ Route118_EventScript_StevenTrigger0:: Route118_EventScript_StevenTrigger1:: lockall setvar VAR_0x8008, 1 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 goto Route118_EventScript_StevenTrigger end @@ -80,7 +80,7 @@ Route118_EventScript_StevenTrigger1:: Route118_EventScript_StevenTrigger2:: lockall setvar VAR_0x8008, 2 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenApproachLedge2 waitmovement 0 @@ -103,19 +103,19 @@ Route118_EventScript_StevenTrigger:: end Route118_EventScript_StevenExit0:: - applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit + applymovement LOCALID_PLAYER, Route118_Movement_PlayerWatchStevenExit applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit0 waitmovement 0 return Route118_EventScript_StevenExit1:: - applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit + applymovement LOCALID_PLAYER, Route118_Movement_PlayerWatchStevenExit applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit1 waitmovement 0 return Route118_EventScript_StevenExit2:: - applymovement OBJ_EVENT_ID_PLAYER, Route118_Movement_PlayerWatchStevenExit + applymovement LOCALID_PLAYER, Route118_Movement_PlayerWatchStevenExit applymovement LOCALID_ROUTE118_STEVEN, Route118_Movement_StevenExit2 waitmovement 0 return diff --git a/data/maps/Route119/scripts.inc b/data/maps/Route119/scripts.inc index 6dd4eb8caa..d218fb60dc 100644 --- a/data/maps/Route119/scripts.inc +++ b/data/maps/Route119/scripts.inc @@ -45,7 +45,7 @@ Route119_EventScript_RivalEncounter:: delay 65 call_if_eq VAR_TEMP_1, 1, Route119_EventScript_RivalEnter1 call_if_eq VAR_TEMP_1, 2, Route119_EventScript_RivalEnter2 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 delay 30 call_if_eq VAR_TEMP_1, 1, Route119_EventScript_SetRivalPos1 @@ -189,13 +189,13 @@ Route119_EventScript_RivalEnter2:: return Route119_EventScript_RivalExit1:: - applymovement OBJ_EVENT_ID_PLAYER, Route119_Movement_PlayerWatchRivalExit1 + applymovement LOCALID_PLAYER, Route119_Movement_PlayerWatchRivalExit1 applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalExit1 waitmovement 0 return Route119_EventScript_RivalExit2:: - applymovement OBJ_EVENT_ID_PLAYER, Route119_Movement_PlayerWatchRivalExit2 + applymovement LOCALID_PLAYER, Route119_Movement_PlayerWatchRivalExit2 applymovement LOCALID_ROUTE119_RIVAL_ON_BIKE, Route119_Movement_RivalExit2 waitmovement 0 return diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc index b651fa626f..ce5e44d077 100644 --- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc +++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc @@ -48,7 +48,7 @@ Route119_WeatherInstitute_2F_EventScript_ShellyDefeated:: closemessage addobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3 applymovement LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3, Route119_WeatherInstitute_2F_Movement_GruntApproachShelly - applymovement OBJ_EVENT_ID_PLAYER, Route119_WeatherInstitute_2F_Movement_ShovePlayerOutOfWay + applymovement LOCALID_PLAYER, Route119_WeatherInstitute_2F_Movement_ShovePlayerOutOfWay waitmovement 0 msgbox Route119_WeatherInstitute_2F_Text_TeamMagmaJustPassedBy, MSGBOX_DEFAULT closemessage @@ -70,7 +70,7 @@ Route119_WeatherInstitute_2F_EventScript_ShellyDefeated:: removeobject LOCALID_WEATHER_INSTITUTE_2F_SHELLY removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_4 removeobject LOCALID_WEATHER_INSTITUTE_2F_GRUNT_3 - applymovement OBJ_EVENT_ID_PLAYER, Route119_WeatherInstitute_2F_Movement_PlayerReturnToPosition + applymovement LOCALID_PLAYER, Route119_WeatherInstitute_2F_Movement_PlayerReturnToPosition waitmovement 0 fadescreen FADE_FROM_BLACK applymovement LOCALID_WEATHER_INSTITUTE_2F_SCIENTIST, Route119_WeatherInstitute_2F_Movement_ScientistApproachPlayer diff --git a/data/maps/Route120/scripts.inc b/data/maps/Route120/scripts.inc index defff8807a..c3162ecd9d 100644 --- a/data/maps/Route120/scripts.inc +++ b/data/maps/Route120/scripts.inc @@ -212,7 +212,7 @@ Route120_EventScript_RemoveBridgeKecleonPostBattle:: Route120_EventScript_StevenGiveDeconScope:: applymovement LOCALID_ROUTE120_STEVEN, Common_Movement_WalkInPlaceFasterDown - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route120_Text_StevenGiveDevonScope, MSGBOX_DEFAULT giveitem ITEM_DEVON_SCOPE @@ -236,12 +236,12 @@ Route120_EventScript_StevenGiveDeconScope:: end Route120_EventScript_PlayerApproachKecleonNorth:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return Route120_EventScript_PlayerApproachKecleonWest:: - applymovement OBJ_EVENT_ID_PLAYER, Route120_Movement_ApproachKecleonWest + applymovement LOCALID_PLAYER, Route120_Movement_ApproachKecleonWest waitmovement 0 return diff --git a/data/maps/Route121_SafariZoneEntrance/scripts.inc b/data/maps/Route121_SafariZoneEntrance/scripts.inc index 92fdc2d0bd..0fb6411406 100644 --- a/data/maps/Route121_SafariZoneEntrance/scripts.inc +++ b/data/maps/Route121_SafariZoneEntrance/scripts.inc @@ -8,7 +8,7 @@ Route121_SafariZoneEntrance_OnFrame: Route121_SafariZoneEntrance_EventScript_ExitSafariZone:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Route121_SafariZoneEntrance_Movement_ExitSafariZone + applymovement LOCALID_PLAYER, Route121_SafariZoneEntrance_Movement_ExitSafariZone waitmovement 0 setvar VAR_SAFARI_ZONE_STATE, 0 releaseall @@ -45,7 +45,7 @@ Route121_SafariZoneEntrance_EventScript_FirstTimeInfo:: Route121_SafariZoneEntrance_EventScript_EntranceCounterTrigger:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 showmoneybox 0, 0 msgbox Route121_SafariZoneEntrance_Text_WouldYouLikeToPlay, MSGBOX_YESNO @@ -71,7 +71,7 @@ Route121_SafariZoneEntrance_EventScript_TryEnterSafariZone:: msgbox Route121_SafariZoneEntrance_Text_PleaseEnjoyYourself, MSGBOX_DEFAULT closemessage hidemoneybox - applymovement OBJ_EVENT_ID_PLAYER, Route121_SafariZoneEntrance_Movement_EnterSafariZone + applymovement LOCALID_PLAYER, Route121_SafariZoneEntrance_Movement_EnterSafariZone waitmovement 0 special EnterSafariMode setvar VAR_SAFARI_ZONE_STATE, 2 @@ -105,7 +105,7 @@ Route121_SafariZoneEntrance_EventScript_NotEnoughMoney:: Route121_SafariZoneEntrance_EventScript_MovePlayerBackFromCounter:: closemessage hidemoneybox - applymovement OBJ_EVENT_ID_PLAYER, Route121_SafariZoneEntrance_Movement_BackAwayFromCounter + applymovement LOCALID_PLAYER, Route121_SafariZoneEntrance_Movement_BackAwayFromCounter waitmovement 0 releaseall end diff --git a/data/maps/Route128/scripts.inc b/data/maps/Route128/scripts.inc index 5816d09df6..06a75d87c4 100644 --- a/data/maps/Route128/scripts.inc +++ b/data/maps/Route128/scripts.inc @@ -30,12 +30,12 @@ Route128_EventScript_KyogreAwakenedScene:: closemessage applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route128_Text_MaxieResposibilityFallsToArchieAndMe, MSGBOX_DEFAULT closemessage applymovement LOCALID_ROUTE128_ARCHIE, Route128_Movement_ArchieRunLeft - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft applymovement LOCALID_ROUTE128_MAXIE, Route128_Movement_MaxieWalkLeft waitmovement 0 msgbox Route128_Text_MaxieThisDefiesBelief, MSGBOX_DEFAULT @@ -53,12 +53,12 @@ Route128_EventScript_KyogreAwakenedScene:: addobject LOCALID_ROUTE128_STEVEN applymovement LOCALID_ROUTE128_STEVEN, Route128_Movement_StevenApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox Route128_Text_StevenWhatIsHappening, MSGBOX_DEFAULT closemessage applymovement LOCALID_ROUTE128_STEVEN, Route128_Movement_StevenWalkUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox Route128_Text_StevenWholeWorldWillDrown, MSGBOX_DEFAULT applymovement LOCALID_ROUTE128_STEVEN, Common_Movement_WalkInPlaceFasterDown diff --git a/data/maps/RustboroCity/scripts.inc b/data/maps/RustboroCity/scripts.inc index 8022083ea5..b502e7b615 100644 --- a/data/maps/RustboroCity/scripts.inc +++ b/data/maps/RustboroCity/scripts.inc @@ -31,7 +31,7 @@ RustboroCity_OnFrame: RustboroCity_EventScript_ScientistAddMatchCall:: lockall setvar VAR_ROUTE104_STATE, 1 - applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_Movement_PlayerWalkDown + applymovement LOCALID_PLAYER, RustboroCity_Movement_PlayerWalkDown waitmovement 0 playse SE_EXIT delay 10 @@ -43,7 +43,7 @@ RustboroCity_EventScript_ScientistAddMatchCall:: waitmovement 0 applymovement LOCALID_RUSTBORO_SCIENTIST, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 applymovement LOCALID_RUSTBORO_SCIENTIST, RustboroCity_Movement_ScientistWalkInPlaceDown waitmovement 0 @@ -350,7 +350,7 @@ RustboroCity_EventScript_EmployeeApproachDown:: RustboroCity_EventScript_EmployeeApproachPlayerFar:: applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerFar waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -516,7 +516,7 @@ RustboroCity_EventScript_EmployeeFacePlayerUp1:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -528,7 +528,7 @@ RustboroCity_EventScript_EmployeeFacePlayerLeft1:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceRight + applymovement LOCALID_PLAYER, Common_Movement_FaceRight waitmovement 0 return @@ -540,7 +540,7 @@ RustboroCity_EventScript_EmployeeFacePlayerDown1:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -554,7 +554,7 @@ RustboroCity_EventScript_EmployeeApproachPlayerDown1:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -618,7 +618,7 @@ RustboroCity_EventScript_EmployeeFacePlayerUp2:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -630,7 +630,7 @@ RustboroCity_EventScript_EmployeeFacePlayerLeft2:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceLeft + applymovement LOCALID_PLAYER, Common_Movement_FaceLeft waitmovement 0 return @@ -642,7 +642,7 @@ RustboroCity_EventScript_EmployeeFacePlayerDown2:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, Common_Movement_Delay48 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -656,7 +656,7 @@ RustboroCity_EventScript_EmployeeApproachPlayerDown2:: waitmovement 0 applymovement LOCALID_RUSTBORO_DEVON_EMPLOYEE, RustboroCity_Movement_EmployeeApproachPlayerDown waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 return @@ -703,7 +703,7 @@ RustboroCity_EventScript_RivalTrigger0:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer0 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -719,7 +719,7 @@ RustboroCity_EventScript_RivalTrigger1:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer1 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -735,7 +735,7 @@ RustboroCity_EventScript_RivalTrigger2:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer2 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -751,7 +751,7 @@ RustboroCity_EventScript_RivalTrigger3:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer3 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -767,7 +767,7 @@ RustboroCity_EventScript_RivalTrigger4:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer4 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -783,7 +783,7 @@ RustboroCity_EventScript_RivalTrigger5:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer5 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -799,7 +799,7 @@ RustboroCity_EventScript_RivalTrigger6:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer6 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter @@ -815,7 +815,7 @@ RustboroCity_EventScript_RivalTrigger7:: waitmovement 0 applymovement LOCALID_RUSTBORO_RIVAL, RustboroCity_Movement_RivalApproachPlayer7 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 goto RustboroCity_EventScript_RivalEncounter diff --git a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc index aba43c575d..91b1ad5222 100644 --- a/data/maps/RustboroCity_DevonCorp_3F/scripts.inc +++ b/data/maps/RustboroCity_DevonCorp_3F/scripts.inc @@ -18,7 +18,7 @@ RustboroCity_DevonCorp_3F_OnWarp: .2byte 0 RustboroCity_DevonCorp_3F_EventScript_PlayerFaceEast:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_EAST + turnobject LOCALID_PLAYER, DIR_EAST end RustboroCity_DevonCorp_3F_OnFrame: @@ -38,13 +38,13 @@ RustboroCity_DevonCorp_3F_EventScript_MeetPresident:: closemessage playbgm MUS_FOLLOW_ME, FALSE applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_LeadPlayerToPresident - applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerFollowToPresident + applymovement LOCALID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerFollowToPresident waitmovement 0 msgbox RustboroCity_DevonCorp_3F_Text_PleaseGoAhead, MSGBOX_DEFAULT closemessage fadedefaultbgm applymovement LOCALID_DEVON_CORP_3F_EMPLOYEE, RustboroCity_DevonCorp_3F_Movement_EmployeeFaceDesk - applymovement OBJ_EVENT_ID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerApproachDesk + applymovement LOCALID_PLAYER, RustboroCity_DevonCorp_3F_Movement_PlayerApproachDesk waitmovement 0 msgbox RustboroCity_DevonCorp_3F_Text_MrStoneIHaveFavor, MSGBOX_DEFAULT giveitem ITEM_LETTER diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index fd54568802..de77c5a996 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -73,13 +73,13 @@ RusturfTunnel_EventScript_ClearTunnelScene:: end RusturfTunnel_EventScript_BoyfriendApproachWanda1:: - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend1 + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend1 applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda1 waitmovement 0 return RusturfTunnel_EventScript_BoyfriendApproachWanda2:: - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda waitmovement 0 applymovement LOCALID_RUSTURF_TUNNEL_WANDA, Common_Movement_WalkInPlaceFasterDown @@ -87,7 +87,7 @@ RusturfTunnel_EventScript_BoyfriendApproachWanda2:: return RusturfTunnel_EventScript_BoyfriendApproachWanda3:: - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerWatchBoyfriend applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_BoyfriendApproachWanda waitmovement 0 applymovement LOCALID_RUSTURF_TUNNEL_WANDA, Common_Movement_WalkInPlaceFasterDown @@ -97,7 +97,7 @@ RusturfTunnel_EventScript_BoyfriendApproachWanda3:: RusturfTunnel_EventScript_FaceWandasBoyfriend1:: applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, Common_Movement_WalkInPlaceFasterUp waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return @@ -122,7 +122,7 @@ RusturfTunnel_EventScript_WandaAndBoyfriendExit1:: return RusturfTunnel_EventScript_WandaAndBoyfriendExit:: - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchWandaExit + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerWatchWandaExit applymovement LOCALID_RUSTURF_TUNNEL_WANDA, RusturfTunnel_Movement_WandaExit applymovement LOCALID_RUSTURF_TUNNEL_WANDAS_BF, RusturfTunnel_Movement_WandasBoyfriendExit waitmovement 0 @@ -304,7 +304,7 @@ RusturfTunnel_EventScript_Grunt:: msgbox RusturfTunnel_Text_GruntTakePackage, MSGBOX_DEFAULT giveitem ITEM_DEVON_GOODS closemessage - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PushPlayerAsideForGrunt + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PushPlayerAsideForGrunt applymovement LOCALID_RUSTURF_TUNNEL_GRUNT, RusturfTunnel_Movement_GruntEscape waitmovement 0 removeobject LOCALID_RUSTURF_TUNNEL_GRUNT @@ -312,7 +312,7 @@ RusturfTunnel_EventScript_Grunt:: addobject LOCALID_RUSTURF_TUNNEL_BRINEY applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko1 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerMoveAsideForBriney + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerMoveAsideForBriney applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyApproachPeeko2 waitmovement 0 msgbox RusturfTunnel_Text_PeekoGladToSeeYouSafe, MSGBOX_DEFAULT @@ -325,7 +325,7 @@ RusturfTunnel_EventScript_Grunt:: waitbuttonpress waitmoncry closemessage - applymovement OBJ_EVENT_ID_PLAYER, RusturfTunnel_Movement_PlayerWatchBrineyExit + applymovement LOCALID_PLAYER, RusturfTunnel_Movement_PlayerWatchBrineyExit applymovement LOCALID_RUSTURF_TUNNEL_BRINEY, RusturfTunnel_Movement_BrineyExit applymovement LOCALID_RUSTURF_TUNNEL_PEEKO, RusturfTunnel_Movement_PeekoExit waitmovement 0 diff --git a/data/maps/SSTidalCorridor/scripts.inc b/data/maps/SSTidalCorridor/scripts.inc index d8012b113b..4d63b7dad8 100644 --- a/data/maps/SSTidalCorridor/scripts.inc +++ b/data/maps/SSTidalCorridor/scripts.inc @@ -187,11 +187,11 @@ SSTidalCorridor_EventScript_ScottScene:: lockall applymovement LOCALID_SS_TIDAL_SCOTT, SSTidalCorridor_Movement_ScottApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox SSTidalCorridor_Text_ScottBattleFrontierInvite, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, SSTidalCorridor_Movement_PlayerWatchScottExit + applymovement LOCALID_PLAYER, SSTidalCorridor_Movement_PlayerWatchScottExit applymovement LOCALID_SS_TIDAL_EXIT_SAILOR, SSTidalCorridor_Movement_SailorMoveForScott applymovement LOCALID_SS_TIDAL_SCOTT, SSTidalCorridor_Movement_ScottExit waitmovement 0 diff --git a/data/maps/SafariZone_South/scripts.inc b/data/maps/SafariZone_South/scripts.inc index c839789511..446175add6 100644 --- a/data/maps/SafariZone_South/scripts.inc +++ b/data/maps/SafariZone_South/scripts.inc @@ -9,7 +9,7 @@ SafariZone_South_OnFrame: SafariZone_South_EventScript_EnterSafariZone:: lockall - applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerEnter + applymovement LOCALID_PLAYER, SafariZone_South_Movement_PlayerEnter waitmovement 0 applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_ExitAttendantBlockDoor waitmovement 0 @@ -74,7 +74,7 @@ SafariZone_South_EventScript_ExitEarly:: SafariZone_South_EventScript_ExitEarlyNorth:: applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantNorth waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerExitNorth + applymovement LOCALID_PLAYER, SafariZone_South_Movement_PlayerExitNorth waitmovement 0 goto SafariZone_South_EventScript_Exit end @@ -82,7 +82,7 @@ SafariZone_South_EventScript_ExitEarlyNorth:: SafariZone_South_EventScript_ExitEarlyEast:: applymovement LOCALID_SAFARI_EXIT_ATTENDANT, SafariZone_South_Movement_MoveExitAttendantEast waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, SafariZone_South_Movement_PlayerExitEast + applymovement LOCALID_PLAYER, SafariZone_South_Movement_PlayerExitEast waitmovement 0 goto SafariZone_South_EventScript_Exit end diff --git a/data/maps/SeafloorCavern_Room9/scripts.inc b/data/maps/SeafloorCavern_Room9/scripts.inc index 5e07275242..a14faa71d5 100644 --- a/data/maps/SeafloorCavern_Room9/scripts.inc +++ b/data/maps/SeafloorCavern_Room9/scripts.inc @@ -7,15 +7,15 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: setvar VAR_0x8005, LOCALID_SEAFLOOR_CAVERN_MAXIE setvar VAR_0x8006, LOCALID_SEAFLOOR_CAVERN_GRUNT_1 setvar VAR_0x8007, LOCALID_SEAFLOOR_CAVERN_GRUNT_2 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, SeafloorCavern_Room9_Movement_Delay32 + applymovement LOCALID_PLAYER, SeafloorCavern_Room9_Movement_Delay32 waitmovement 0 playbgm MUS_ENCOUNTER_AQUA, FALSE msgbox SeafloorCavern_Room9_Text_ArchieHoldItRightThere, MSGBOX_DEFAULT closemessage addobject VAR_0x8004 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 applymovement VAR_0x8004, SeafloorCavern_Room9_Movement_ArchieApproachPlayer waitmovement 0 @@ -45,7 +45,7 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: playse SE_ORB special DoOrbEffect applymovement VAR_0x8004, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 delay 150 removeobject LOCALID_SEAFLOOR_CAVERN_KYOGRE_SLEEPING @@ -79,7 +79,7 @@ SeafloorCavern_Room9_EventScript_ArchieAwakenKyogre:: setvar VAR_0x8007, LOCALID_SEAFLOOR_CAVERN_GRUNT_2 msgbox SeafloorCavern_Room9_Text_ArchieWhereDidKyogreGo, MSGBOX_DEFAULT playse SE_PC_LOGIN - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox SeafloorCavern_Room9_Text_ArchieAMessageFromOutside, MSGBOX_DEFAULT closemessage diff --git a/data/maps/SkyPillar_Outside/scripts.inc b/data/maps/SkyPillar_Outside/scripts.inc index 4309c3dd4d..cfacf141d1 100644 --- a/data/maps/SkyPillar_Outside/scripts.inc +++ b/data/maps/SkyPillar_Outside/scripts.inc @@ -34,7 +34,7 @@ SkyPillar_Outside_EventScript_WallaceScene:: lockall applymovement LOCALID_SKY_PILLAR_WALLACE, SkyPillar_Outside_Movement_WallaceApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox SkyPillar_Outside_Text_OpenedDoorToSkyPillar, MSGBOX_DEFAULT closemessage @@ -48,7 +48,7 @@ SkyPillar_Outside_EventScript_WallaceScene:: delay 40 msgbox SkyPillar_Outside_Text_EarthquakeNotMomentToWaste, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, SkyPillar_Outside_Movement_PlayerClimbSkyPillar + applymovement LOCALID_PLAYER, SkyPillar_Outside_Movement_PlayerClimbSkyPillar applymovement LOCALID_SKY_PILLAR_WALLACE, SkyPillar_Outside_Movement_WallaceClimbSkyPillar waitmovement 0 setvar VAR_0x8004, 1 @ vertical pan diff --git a/data/maps/SkyPillar_Top/scripts.inc b/data/maps/SkyPillar_Top/scripts.inc index 8b2f1bcc9b..3975cc0512 100644 --- a/data/maps/SkyPillar_Top/scripts.inc +++ b/data/maps/SkyPillar_Top/scripts.inc @@ -88,10 +88,10 @@ SkyPillar_Top_EventScript_RanFromRayquaza2:: SkyPillar_Top_EventScript_AwakenRayquaza:: lockall fadeoutbgm 1 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SkyPillar_Top_Movement_CameraPanUp + applymovement LOCALID_CAMERA, SkyPillar_Top_Movement_CameraPanUp waitmovement 0 special RemoveCameraObject applymovement LOCALID_RAYQUAZA_SLEEPING, SkyPillar_Top_Movement_RayquazaStir @@ -121,7 +121,7 @@ SkyPillar_Top_EventScript_AwakenRayquaza:: delay 20 fadeinbgm 1 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SkyPillar_Top_Movement_CameraPanDown + applymovement LOCALID_CAMERA, SkyPillar_Top_Movement_CameraPanDown waitmovement 0 special RemoveCameraObject setvar VAR_SOOTOPOLIS_CITY_STATE, 5 diff --git a/data/maps/SlateportCity/scripts.inc b/data/maps/SlateportCity/scripts.inc index bfbd428732..5af1446cf9 100644 --- a/data/maps/SlateportCity/scripts.inc +++ b/data/maps/SlateportCity/scripts.inc @@ -53,7 +53,7 @@ SlateportCity_OnFrame: SlateportCity_EventScript_ScottScene:: lockall addobject LOCALID_SLATEPORT_SCOTT - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerFaceScott + applymovement LOCALID_PLAYER, SlateportCity_Movement_PlayerFaceScott applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottApproachPlayer waitmovement 0 msgbox SlateportCity_Text_YouDroveTeamAquaAway, MSGBOX_DEFAULT @@ -562,7 +562,7 @@ SlateportCity_EventScript_CaptStern:: waitmovement 0 delay 25 applymovement LOCALID_SLATEPORT_CAPT_STERN, SlateportCity_Movement_SternWatchGabbyAndTyExit - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerFaceStern + applymovement LOCALID_PLAYER, SlateportCity_Movement_PlayerFaceStern applymovement LOCALID_SLATEPORT_GABBY, SlateportCity_Movement_GabbyExit applymovement LOCALID_SLATEPORT_TY, SlateportCity_Movement_TyExit waitmovement 0 @@ -594,7 +594,7 @@ SlateportCity_EventScript_CaptStern:: msgbox SlateportCity_Text_PleaseComeWithMe, MSGBOX_DEFAULT closemessage applymovement LOCALID_SLATEPORT_CAPT_STERN, SlateportCity_Movement_SternEnterHarbor - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerEnterHarbor + applymovement LOCALID_PLAYER, SlateportCity_Movement_PlayerEnterHarbor waitmovement 0 removeobject LOCALID_SLATEPORT_CAPT_STERN clearflag FLAG_HIDE_SLATEPORT_CITY_HARBOR_CAPTAIN_STERN @@ -872,19 +872,19 @@ SlateportCity_EventScript_NotEnoughBerryPowder:: SlateportCity_EventScript_ScottBattleTentScene:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 opendoor 10, 12 waitdooranim addobject LOCALID_SLATEPORT_SCOTT - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PushPlayerDown + applymovement LOCALID_PLAYER, SlateportCity_Movement_PushPlayerDown applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottExitBattleTent waitmovement 0 closedoor 10, 12 waitdooranim msgbox SlateportCity_Text_TakingBattleTentChallenge, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Movement_PlayerWatchScottExit + applymovement LOCALID_PLAYER, SlateportCity_Movement_PlayerWatchScottExit applymovement LOCALID_SLATEPORT_SCOTT, SlateportCity_Movement_ScottExitAfterBattleTent waitmovement 0 removeobject LOCALID_SLATEPORT_SCOTT diff --git a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc index 2f9f57d809..ba73c89d06 100644 --- a/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc +++ b/data/maps/SlateportCity_BattleTentBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_SLATEPORT_TENT_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_SLATEPORT_TENT_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by factory_setopponentgfx. @@ -33,7 +33,7 @@ SlateportCity_BattleTentBattleRoom_OnWarp: SlateportCity_BattleTentBattleRoom_EventScript_SetUpObjects:: setvar VAR_TEMP_1, 1 - hideobjectat OBJ_EVENT_ID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM + hideobjectat LOCALID_PLAYER, MAP_FALLARBOR_TOWN_BATTLE_TENT_BATTLE_ROOM hideobjectat LOCALID_SLATEPORT_TENT_BATTLE_OPPONENT, MAP_SLATEPORT_CITY_BATTLE_TENT_BATTLE_ROOM end diff --git a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc index ca714b767e..d0c90a8b7a 100644 --- a/data/maps/SlateportCity_BattleTentCorridor/scripts.inc +++ b/data/maps/SlateportCity_BattleTentCorridor/scripts.inc @@ -15,7 +15,7 @@ SlateportCity_BattleTentCorridor_EventScript_SetUpObjects:: setobjectxy LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, 2, 2 turnobject LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, DIR_SOUTH SlateportCity_BattleTentCorridor_EventScript_TurnPlayerNorth:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end SlateportCity_BattleTentCorridor_OnFrame: @@ -26,7 +26,7 @@ SlateportCity_BattleTentCorridor_EventScript_EnterCorridor:: goto_if_eq VAR_0x8006, 1, SlateportCity_BattleTentCorridor_EventScript_ReturnToRoomFromBattle setvar VAR_TEMP_0, 1 applymovement LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantEnter - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerEnter + applymovement LOCALID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerEnter waitmovement 0 goto_if_eq VAR_0x8006, 2, SlateportCity_BattleTentCorridor_EventScript_ResumeChallenge slateporttent_generaterentalmons @@ -43,7 +43,7 @@ SlateportCity_BattleTentCorridor_EventScript_EnterBattleRoom:: opendoor 2, 1 waitdooranim applymovement LOCALID_SLATEPORT_TENT_CORRIDOR_ATTENDANT, SlateportCity_BattleTentCorridor_Movement_AttendantExit - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerExit + applymovement LOCALID_PLAYER, SlateportCity_BattleTentCorridor_Movement_PlayerExit waitmovement 0 closedoor 2, 1 waitdooranim diff --git a/data/maps/SlateportCity_BattleTentLobby/scripts.inc b/data/maps/SlateportCity_BattleTentLobby/scripts.inc index 3e6793f95a..26c6e56f47 100644 --- a/data/maps/SlateportCity_BattleTentLobby/scripts.inc +++ b/data/maps/SlateportCity_BattleTentLobby/scripts.inc @@ -9,7 +9,7 @@ SlateportCity_BattleTentLobby_OnWarp: SlateportCity_BattleTentLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end SlateportCity_BattleTentLobby_OnFrame: @@ -137,12 +137,12 @@ SlateportCity_BattleTentLobby_EventScript_EnterChallenge:: SlateportCity_BattleTentLobby_EventScript_WalkToDoor:: applymovement LOCALID_SLATEPORT_TENT_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantWalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerWalkToDoor + applymovement LOCALID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerWalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim applymovement LOCALID_SLATEPORT_TENT_ATTENDANT, SlateportCity_BattleTentLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, SlateportCity_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 waitdooranim diff --git a/data/maps/SlateportCity_Harbor/scripts.inc b/data/maps/SlateportCity_Harbor/scripts.inc index ca90fa897e..ebcd40ab0c 100644 --- a/data/maps/SlateportCity_Harbor/scripts.inc +++ b/data/maps/SlateportCity_Harbor/scripts.inc @@ -41,7 +41,7 @@ SlateportCity_Harbor_EventScript_AquaEscapeTrigger2:: SlateportCity_Harbor_EventScript_AquaEscapeTrigger3:: lockall setvar VAR_0x8008, 3 - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Harbor_Movement_PlayerWalkUp + applymovement LOCALID_PLAYER, SlateportCity_Harbor_Movement_PlayerWalkUp waitmovement 0 goto SlateportCity_Harbor_EventScript_AquaEscapeScene end @@ -50,7 +50,7 @@ SlateportCity_Harbor_EventScript_AquaEscapeScene:: applymovement LOCALID_SLATEPORT_HARBOR_ARCHIE, Common_Movement_WalkInPlaceFasterDown waitmovement 0 applymovement LOCALID_SLATEPORT_HARBOR_GRUNT, Common_Movement_WalkInPlaceFasterDown - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox SlateportCity_Harbor_Text_ArchieYouAgainHideoutInLilycove, MSGBOX_DEFAULT closemessage @@ -80,21 +80,21 @@ SlateportCity_Harbor_EventScript_AquaEscapeScene:: SlateportCity_Harbor_EventScript_SternApproachPlayer0:: applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer0 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 return SlateportCity_Harbor_EventScript_SternApproachPlayer1:: applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer1 waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return SlateportCity_Harbor_EventScript_SternApproachPlayer:: applymovement LOCALID_SLATEPORT_HARBOR_CAPT_STERN, SlateportCity_Harbor_Movement_SternApproachPlayer waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -228,7 +228,7 @@ SlateportCity_Harbor_EventScript_BoardFerry:: call_if_eq VAR_FACING, DIR_NORTH, SlateportCity_Harbor_EventScript_BoardFerryNorth call_if_eq VAR_FACING, DIR_EAST, SlateportCity_Harbor_EventScript_BoardFerryEast delay 30 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 setvar VAR_0x8004, LOCALID_SLATEPORT_HARBOR_SS_TIDAL call Common_EventScript_FerryDepart return @@ -239,12 +239,12 @@ SlateportCity_Harbor_EventScript_CancelDestinationSelect:: end SlateportCity_Harbor_EventScript_BoardFerryEast:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Harbor_Movement_BoardFerryEast + applymovement LOCALID_PLAYER, SlateportCity_Harbor_Movement_BoardFerryEast waitmovement 0 return SlateportCity_Harbor_EventScript_BoardFerryNorth:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_Harbor_Movement_BoardFerryNorth + applymovement LOCALID_PLAYER, SlateportCity_Harbor_Movement_BoardFerryNorth waitmovement 0 return diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc index 5c0244288a..08c8c41ff1 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc @@ -7,14 +7,14 @@ SlateportCity_OceanicMuseum_1F_EventScript_EntranceAttendant:: SlateportCity_OceanicMuseum_1F_EventScript_PayEntranceFeeLeft:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_PayEntranceFee end SlateportCity_OceanicMuseum_1F_EventScript_PayEntranceFeeRight:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_PayEntranceFee end @@ -25,7 +25,7 @@ SlateportCity_OceanicMuseum_1F_EventScript_PayEntranceFee:: goto_if_eq VAR_RESULT, YES, SlateportCity_OceanicMuseum_1F_EventScript_CheckMoneyForFee closemessage hidemoneybox - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end @@ -47,7 +47,7 @@ SlateportCity_OceanicMuseum_1F_EventScript_NotEnoughMoney:: msgbox SlateportCity_OceanicMuseum_1F_Text_NotEnoughMoney, MSGBOX_DEFAULT closemessage hidemoneybox - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end @@ -161,7 +161,7 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGrunt:: end SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitNorth:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitNorth + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitNorth applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExitNorth waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited @@ -174,7 +174,7 @@ SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitSouth:: end SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExitWestEast:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitWestEast + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_PlayerWatchGruntExitWestEast applymovement LOCALID_OCEANIC_MUSEUM_FAMILIAR_GRUNT, SlateportCity_OceanicMuseum_1F_Movement_FamiliarGruntExit waitmovement 0 goto SlateportCity_OceanicMuseum_1F_EventScript_FamiliarGruntExited diff --git a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc index 95f7cdec7d..dbc6307d8d 100644 --- a/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_2F/scripts.inc @@ -63,7 +63,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_CaptStern:: fadescreen FADE_FROM_BLACK delay 30 setflag FLAG_HIDE_SLATEPORT_CITY_OCEANIC_MUSEUM_AQUA_GRUNTS - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox SlateportCity_OceanicMuseum_2F_Text_SternThankYouForSavingUs, MSGBOX_DEFAULT setvar VAR_0x8004, ITEM_DEVON_GOODS @@ -90,7 +90,7 @@ SlateportCity_OceanicMuseum_2F_EventScript_ReadyRegisterBirch:: return SlateportCity_OceanicMuseum_2F_EventScript_PlayerFaceGrunts:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return @@ -100,12 +100,12 @@ SlateportCity_OceanicMuseum_2F_EventScript_SternFaceGrunts:: return SlateportCity_OceanicMuseum_2F_EventScript_PlayerApproachGruntSouth:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_2F_Movement_PlayerApproachGruntSouth + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_2F_Movement_PlayerApproachGruntSouth waitmovement 0 return SlateportCity_OceanicMuseum_2F_EventScript_PlayerApproachGruntWest:: - applymovement OBJ_EVENT_ID_PLAYER, SlateportCity_OceanicMuseum_2F_Movement_PlayerApproachGruntWest + applymovement LOCALID_PLAYER, SlateportCity_OceanicMuseum_2F_Movement_PlayerApproachGruntWest waitmovement 0 return diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index ada86689ad..7566fc0088 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -150,11 +150,11 @@ SootopolisCity_EventScript_PlayerFaceLegendaries:: end SootopolisCity_EventScript_PlayerFaceLegendaries1:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH return SootopolisCity_EventScript_PlayerFaceLegendaries2:: - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH setvar VAR_SKY_PILLAR_STATE, 3 return @@ -179,7 +179,7 @@ SootopolisCity_EventScript_StartLegendariesScene:: SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: delay 60 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanToActionFromPokeCenter + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanToActionFromPokeCenter waitmovement 0 special RemoveCameraObject delay 60 @@ -238,7 +238,7 @@ SootopolisCity_EventScript_LegendariesSceneFromPokeCenter:: special SpawnCameraObject applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreIdle applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonIdle - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanBackToPokeCenter + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanBackToPokeCenter waitmovement 0 special RemoveCameraObject setvar VAR_SOOTOPOLIS_CITY_STATE, 2 @@ -279,7 +279,7 @@ SootopolisCity_Movement_PanBackToPokeCenter: SootopolisCity_EventScript_LegendariesSceneFromDive:: delay 60 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanToActionFromDive + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanToActionFromDive waitmovement 0 special RemoveCameraObject delay 60 @@ -338,7 +338,7 @@ SootopolisCity_EventScript_LegendariesSceneFromDive:: special SpawnCameraObject applymovement LOCALID_SOOTOPOLIS_KYOGRE, SootopolisCity_Movement_KyogreIdle applymovement LOCALID_SOOTOPOLIS_GROUDON, SootopolisCity_Movement_GroudonIdle - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanBackToDive + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanBackToDive waitmovement 0 special RemoveCameraObject setvar VAR_SOOTOPOLIS_CITY_STATE, 2 @@ -468,7 +468,7 @@ SootopolisCity_EventScript_StartRayquazaScene:: SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: delay 60 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanToActionFromPokeCenter + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanToActionFromPokeCenter waitmovement 0 special RemoveCameraObject delay 60 @@ -482,7 +482,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: waitstate playse SE_THUNDER special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanUp + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanUp waitmovement 0 waitse playmoncry SPECIES_RAYQUAZA, CRY_MODE_ENCOUNTER @@ -521,7 +521,7 @@ SootopolisCity_EventScript_RayquazaSceneFromPokeCenter:: SootopolisCity_EventScript_RayquazaSceneFromDive:: delay 60 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanToActionFromDive + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanToActionFromDive waitmovement 0 special RemoveCameraObject delay 60 @@ -534,8 +534,8 @@ SootopolisCity_EventScript_RayquazaSceneFromDive:: special Script_DoRayquazaScene waitstate special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SootopolisCity_Movement_PanUp - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerApproachLegendaries + applymovement LOCALID_CAMERA, SootopolisCity_Movement_PanUp + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerApproachLegendaries waitmovement 0 waitse playmoncry SPECIES_RAYQUAZA, CRY_MODE_ENCOUNTER @@ -911,18 +911,18 @@ SootopolisCity_EventScript_StevenLeadPlayerCaveOfOrigin:: msgbox SootopolisCity_Text_DoesThisMakeYourFearPokemon, MSGBOX_DEFAULT closemessage applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenWalkToCaveOfOrigin - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerWalkToCaveOfOrigin + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerWalkToCaveOfOrigin waitmovement 0 delay 120 applymovement LOCALID_SOOTOPOLIS_EXPERT, SootopolisCity_Movement_ExpertMoveAside waitmovement 0 applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenArriveCaveEntrance - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerArriveCaveEntrance + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerArriveCaveEntrance waitmovement 0 msgbox SootopolisCity_Text_HereWereAreHelpWallace, MSGBOX_DEFAULT closemessage setflag FLAG_STEVEN_GUIDES_TO_CAVE_OF_ORIGIN - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerEnterCaveOfOrigin + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerEnterCaveOfOrigin waitmovement 0 warp MAP_CAVE_OF_ORIGIN_ENTRANCE, 9, 20 waitstate @@ -930,13 +930,13 @@ SootopolisCity_EventScript_StevenLeadPlayerCaveOfOrigin:: SootopolisCity_EventScript_StartWalkToCaveOfOriginWest:: applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginWest + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginWest waitmovement 0 return SootopolisCity_EventScript_StartWalkToCaveOfOriginNorth:: applymovement LOCALID_SOOTOPOLIS_STEVEN, SootopolisCity_Movement_StevenStartWalkToCaveOfOrigin - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginNorth + applymovement LOCALID_PLAYER, SootopolisCity_Movement_PlayerStartWalkToCaveOfOriginNorth waitmovement 0 return diff --git a/data/maps/SootopolisCity_Gym_1F/scripts.inc b/data/maps/SootopolisCity_Gym_1F/scripts.inc index 5ae8145299..22fae5922c 100644 --- a/data/maps/SootopolisCity_Gym_1F/scripts.inc +++ b/data/maps/SootopolisCity_Gym_1F/scripts.inc @@ -67,7 +67,7 @@ SootopolisCity_Gym_1F_EventScript_UnlockThirdStairs:: SootopolisCity_Gym_1F_EventScript_FallThroughIce:: lockall delay 20 - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_Gym_1F_Movement_FallThroughIce + applymovement LOCALID_PLAYER, SootopolisCity_Gym_1F_Movement_FallThroughIce waitmovement 0 playse SE_FALL delay 60 diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc index 2df40a5188..9553fd9f77 100644 --- a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc +++ b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc @@ -29,12 +29,12 @@ SootopolisCity_MysteryEventsHouse_1F_OnFrame: SootopolisCity_MysteryEventsHouse_1F_EventScript_OldManCommentOnBattle:: lockall - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerExitStairs + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerExitStairs waitmovement 0 applymovement LOCALID_MYSTERY_EVENTS_OLD_MAN, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManWalkBehindPlayer waitmovement 0 copyobjectxytoperm LOCALID_MYSTERY_EVENTS_OLD_MAN - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 call_if_eq VAR_SOOTOPOLIS_MYSTERY_EVENTS_STATE, 1, SootopolisCity_MysteryEventsHouse_1F_EventScript_BattleWonComment call_if_eq VAR_SOOTOPOLIS_MYSTERY_EVENTS_STATE, 2, SootopolisCity_MysteryEventsHouse_1F_EventScript_BattleLostComment @@ -119,19 +119,19 @@ SootopolisCity_MysteryEventsHouse_1F_EventScript_ChooseParty:: SootopolisCity_MysteryEventsHouse_1F_EventScript_EnterBasementNorth:: applymovement VAR_LAST_TALKED, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManMoveAsideLeft - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementNorth + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementNorth waitmovement 0 return SootopolisCity_MysteryEventsHouse_1F_EventScript_EnterBasementEast:: applymovement VAR_LAST_TALKED, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManMoveAsideRight - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementEast + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementEast waitmovement 0 return SootopolisCity_MysteryEventsHouse_1F_EventScript_EnterBasementWest:: applymovement VAR_LAST_TALKED, SootopolisCity_MysteryEventsHouse_1F_Movement_OldManMoveAsideLeft - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementWest + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_1F_Movement_PlayerEnterBasementWest waitmovement 0 return diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc index 533eb7cfa5..32ee8da2b9 100644 --- a/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc +++ b/data/maps/SootopolisCity_MysteryEventsHouse_B1F/scripts.inc @@ -13,7 +13,7 @@ SootopolisCity_MysteryEventsHouse_B1F_OnFrame: SootopolisCity_MysteryEventsHouse_B1F_EventScript_BattleVisitingTrainer:: lockall - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_B1F_Movement_PlayerEnterBasement + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_B1F_Movement_PlayerEnterBasement waitmovement 0 special CopyEReaderTrainerGreeting msgbox gStringVar4, MSGBOX_DEFAULT @@ -27,7 +27,7 @@ SootopolisCity_MysteryEventsHouse_B1F_EventScript_BattleVisitingTrainer:: call_if_eq VAR_RESULT, B_OUTCOME_LOST, SootopolisCity_MysteryEventsHouse_B1F_EventScript_BattleLost closemessage special HealPlayerParty - applymovement OBJ_EVENT_ID_PLAYER, SootopolisCity_MysteryEventsHouse_B1F_Movement_PlayerExitBasement + applymovement LOCALID_PLAYER, SootopolisCity_MysteryEventsHouse_B1F_Movement_PlayerExitBasement waitmovement 0 special LoadPlayerParty setvar VAR_TEMP_1, 1 diff --git a/data/maps/SouthernIsland_Exterior/scripts.inc b/data/maps/SouthernIsland_Exterior/scripts.inc index c5c6ad2d80..f6d8436dbe 100644 --- a/data/maps/SouthernIsland_Exterior/scripts.inc +++ b/data/maps/SouthernIsland_Exterior/scripts.inc @@ -30,12 +30,12 @@ SouthernIsland_Exterior_EventScript_AsYouLike:: end Ferry_EventScript_DepartIslandSouth:: - applymovement OBJ_EVENT_ID_PLAYER, Ferry_Movement_DepartIslandBoardSouth + applymovement LOCALID_PLAYER, Ferry_Movement_DepartIslandBoardSouth waitmovement 0 return Ferry_EventScript_DepartIslandWest:: - applymovement OBJ_EVENT_ID_PLAYER, Ferry_Movement_DepartIslandBoardWest + applymovement LOCALID_PLAYER, Ferry_Movement_DepartIslandBoardWest waitmovement 0 return diff --git a/data/maps/SouthernIsland_Interior/scripts.inc b/data/maps/SouthernIsland_Interior/scripts.inc index 749bfb2549..f92d3f080e 100644 --- a/data/maps/SouthernIsland_Interior/scripts.inc +++ b/data/maps/SouthernIsland_Interior/scripts.inc @@ -57,7 +57,7 @@ SouthernIsland_Interior_EventScript_Lati:: setflag FLAG_ENCOUNTERED_LATIAS_OR_LATIOS setflag FLAG_TEMP_2 special SpawnCameraObject - applymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanUp + applymovement LOCALID_CAMERA, SouthernIsland_Interior_Movement_CameraPanUp waitmovement 0 delay 50 waitse @@ -66,7 +66,7 @@ SouthernIsland_Interior_EventScript_Lati:: waitmoncry addobject LOCALID_SOUTHERN_ISLAND_LATI delay 30 - applymovement OBJ_EVENT_ID_CAMERA, SouthernIsland_Interior_Movement_CameraPanDown + applymovement LOCALID_CAMERA, SouthernIsland_Interior_Movement_CameraPanDown applymovement LOCALID_SOUTHERN_ISLAND_LATI, SouthernIsland_Interior_Movement_LatiApproach waitmovement 0 delay 50 diff --git a/data/maps/TerraCave_End/scripts.inc b/data/maps/TerraCave_End/scripts.inc index e635441e43..e1e1cd684b 100644 --- a/data/maps/TerraCave_End/scripts.inc +++ b/data/maps/TerraCave_End/scripts.inc @@ -24,7 +24,7 @@ TerraCave_End_EventScript_ShowGroudon:: TerraCave_End_EventScript_Groudon:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_FaceUp + applymovement LOCALID_PLAYER, Common_Movement_FaceUp waitmovement 0 applymovement LOCALID_TERRA_CAVE_GROUDON, TerraCave_End_Movement_GroudonApproach waitmovement 0 diff --git a/data/maps/TrainerHill_Elevator/scripts.inc b/data/maps/TrainerHill_Elevator/scripts.inc index 49483d8150..c394fc4736 100644 --- a/data/maps/TrainerHill_Elevator/scripts.inc +++ b/data/maps/TrainerHill_Elevator/scripts.inc @@ -10,7 +10,7 @@ TrainerHill_Elevator_EventScript_Attendant:: end TrainerHill_Elevator_EventScript_ExitToRoof:: - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerExitElevatorToRoof + applymovement LOCALID_PLAYER, TrainerHill_Elevator_Movement_PlayerExitElevatorToRoof waitmovement 0 releaseall warp MAP_TRAINER_HILL_ROOF, 15, 5 @@ -18,7 +18,7 @@ TrainerHill_Elevator_EventScript_ExitToRoof:: end TrainerHill_Elevator_EventScript_EnterElevator:: - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerApproachAttendant + applymovement LOCALID_PLAYER, TrainerHill_Elevator_Movement_PlayerApproachAttendant waitmovement 0 applymovement LOCALID_TRAINER_HILL_ELEVATOR_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFacePlayer waitmovement 0 @@ -28,11 +28,11 @@ TrainerHill_Elevator_EventScript_EnterElevator:: releaseall applymovement LOCALID_TRAINER_HILL_ELEVATOR_ATTENDANT, TrainerHill_Elevator_Movement_AttendantFaceDown waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerMoveToCenterOfElevator + applymovement LOCALID_PLAYER, TrainerHill_Elevator_Movement_PlayerMoveToCenterOfElevator waitmovement 0 call TrainerHill_Elevator_EventScript_MoveElevator delay 25 - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Elevator_Movement_PlayerExitElevator + applymovement LOCALID_PLAYER, TrainerHill_Elevator_Movement_PlayerExitElevator waitmovement 0 warp MAP_TRAINER_HILL_ENTRANCE, 17, 8 waitstate diff --git a/data/maps/TrainerHill_Entrance/scripts.inc b/data/maps/TrainerHill_Entrance/scripts.inc index 474df29eba..8b9a3f9a02 100644 --- a/data/maps/TrainerHill_Entrance/scripts.inc +++ b/data/maps/TrainerHill_Entrance/scripts.inc @@ -20,14 +20,14 @@ TrainerHill_Entrance_OnResume: setvar VAR_TEMP_0, 0 trainerhill_getusingereader goto_if_eq VAR_RESULT, FALSE, TrainerHill_Entrance_EventScript_TryFaceAttendant @ VAR_RESULT always FALSE here - setobjectxy OBJ_EVENT_ID_PLAYER, 9, 6 - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant + setobjectxy LOCALID_PLAYER, 9, 6 + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant end TrainerHill_Entrance_EventScript_TryFaceAttendant:: trainerhill_getwon goto_if_eq VAR_RESULT, TRUE, TrainerHill_Entrance_EventScript_PlayerDontFaceAttendant - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant end TrainerHill_Entrance_EventScript_PlayerDontFaceAttendant:: @@ -57,7 +57,7 @@ TrainerHill_Entrance_OnFrame: TrainerHill_Entrance_EventScript_ExitElevator:: lockall - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerExitElevator + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerExitElevator waitmovement 0 setmetatile 17, 10, METATILE_TrainerHill_CounterDoor, TRUE special DrawWholeMapView @@ -77,17 +77,17 @@ TrainerHill_Entrance_EventScript_ExitChallenge:: TrainerHill_Entrance_EventScript_ExitChallengeLost:: lockall - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant msgbox TrainerHill_Entrance_Text_TooBadTremendousEffort, MSGBOX_DEFAULT goto TrainerHill_Entrance_EventScript_PlayerExitChallenge TrainerHill_Entrance_EventScript_ExitChallengeECard:: lockall - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant msgbox TrainerHill_Entrance_Text_MovedReceptionHereForSwitch, MSGBOX_DEFAULT TrainerHill_Entrance_EventScript_PlayerExitChallenge:: closemessage - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter waitmovement 0 setvar VAR_TRAINER_HILL_IS_ACTIVE, 0 special HealPlayerParty @@ -119,7 +119,7 @@ TrainerHill_Entrance_EventScript_AttendantEnd:: TrainerHill_Entrance_EventScript_EntryTrigger:: lockall - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PlayerFaceAttendant goto_if_unset FLAG_SYS_GAME_CLEAR, TrainerHill_Entrance_EventScript_Closed msgbox TrainerHill_Entrance_Text_WelcomeToTrainerHill, MSGBOX_DEFAULT trainerhill_getsaved @@ -165,7 +165,7 @@ TrainerHill_Entrance_EventScript_CancelEntry:: setvar VAR_TEMP_5, 0 msgbox TrainerHill_Entrance_Text_PleaseVisitUsAgain, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end @@ -187,7 +187,7 @@ TrainerHill_Entrance_EventScript_SaveFailed:: TrainerHill_Entrance_EventScript_Closed:: msgbox TrainerHill_Entrance_Text_StillGettingReady, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter + applymovement LOCALID_PLAYER, TrainerHill_Entrance_Movement_PushPlayerBackFromCounter waitmovement 0 releaseall end diff --git a/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc b/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc index faeda4b42d..8caf65eebc 100644 --- a/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentBattleRoom/scripts.inc @@ -1,5 +1,5 @@ @ On this map the player will automatically walk into the room, but the camera is supposed to remain still. -@ To do this GF sets the player (OBJ_EVENT_ID_PLAYER) invisible and creates a fake player object (LOCALID_VERDANTURF_TENT_BATTLE_PLAYER). +@ To do this GF sets the player (LOCALID_PLAYER) invisible and creates a fake player object (LOCALID_VERDANTURF_TENT_BATTLE_PLAYER). @ The graphics of this fake player object are represented with VAR_OBJ_GFX_ID_1. @ The graphics of the opponent are represented with VAR_OBJ_GFX_ID_0, which will ultimately be set by tower_setopponent. VerdanturfTown_BattleTentBattleRoom_MapScripts:: @@ -132,7 +132,7 @@ VerdanturfTown_BattleTentBattleRoom_EventScript_SetUpObjects:: hideobjectat LOCALID_VERDANTURF_TENT_BATTLE_PLAYER, MAP_VERDANTURF_TOWN_BATTLE_TENT_BATTLE_ROOM call VerdanturfTown_BattleTentBattleRoom_EventScript_SetPlayerGfx setvar VAR_TEMP_1, 1 - applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentBattleRoom_Movement_SetInvisible + applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentBattleRoom_Movement_SetInvisible removeobject LOCALID_VERDANTURF_TENT_BATTLE_OPPONENT end diff --git a/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc b/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc index 8be8fd11b0..028e56037a 100644 --- a/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentCorridor/scripts.inc @@ -10,12 +10,12 @@ VerdanturfTown_BattleTentCorridor_EventScript_EnterCorridor:: lockall setvar VAR_TEMP_0, 1 applymovement LOCALID_VERDANTURF_TENT_CORRIDOR_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor + applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_WalkToDoor waitmovement 0 opendoor 2, 1 waitdooranim applymovement LOCALID_VERDANTURF_TENT_CORRIDOR_ATTENDANT, VerdanturfTown_BattleTentCorridor_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentCorridor_Movement_PlayerEnterDoor waitmovement 0 closedoor 2, 1 waitdooranim diff --git a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc index 979b2a84d6..61901bbfaa 100644 --- a/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc +++ b/data/maps/VerdanturfTown_BattleTentLobby/scripts.inc @@ -9,7 +9,7 @@ VerdanturfTown_BattleTentLobby_OnWarp: VerdanturfTown_BattleTentLobby_EventScript_TurnPlayerNorth:: setvar VAR_TEMP_1, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end VerdanturfTown_BattleTentLobby_OnFrame: @@ -192,12 +192,12 @@ VerdanturfTown_BattleTentLobby_EventScript_EndCancelChallenge:: VerdanturfTown_BattleTentLobby_EventScript_WalkToDoor:: applymovement LOCALID_VERDANTURF_TENT_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor - applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor + applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_WalkToDoor waitmovement 0 opendoor 6, 1 waitdooranim applymovement LOCALID_VERDANTURF_TENT_ATTENDANT, VerdanturfTown_BattleTentLobby_Movement_AttendantEnterDoor - applymovement OBJ_EVENT_ID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_PlayerEnterDoor + applymovement LOCALID_PLAYER, VerdanturfTown_BattleTentLobby_Movement_PlayerEnterDoor waitmovement 0 closedoor 6, 1 waitdooranim diff --git a/data/maps/VictoryRoad_1F/scripts.inc b/data/maps/VictoryRoad_1F/scripts.inc index 4a069960ad..3b16f26d90 100644 --- a/data/maps/VictoryRoad_1F/scripts.inc +++ b/data/maps/VictoryRoad_1F/scripts.inc @@ -36,7 +36,7 @@ VictoryRoad_1F_EventScript_WallyBattleTrigger2:: end VictoryRoad_1F_EventScript_WallyEntranceBattle:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterDown + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterDown waitmovement 0 msgbox VictoryRoad_1F_Text_WallyNotGoingToLoseAnymore, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_WALLY_VR_1, VictoryRoad_1F_Text_WallyEntranceDefeat diff --git a/data/scripts/battle_pike.inc b/data/scripts/battle_pike.inc index 5fb7dcd8a8..c39b255eca 100644 --- a/data/scripts/battle_pike.inc +++ b/data/scripts/battle_pike.inc @@ -55,17 +55,17 @@ BattleFrontier_BattlePikeRoomNormal_EventScript_InitRoomObjects:: goto_if_eq VAR_RESULT, PIKE_ROOM_BRAIN, BattleFrontier_BattlePikeRoomNormal_EventScript_InitBrainRoomObjects hideobjectat LOCALID_PIKE_ROOM_NPC_2, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeRoomNormal_EventScript_InitTwoObjectRoom:: setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH end BattleFrontier_BattlePikeRoomNormal_EventScript_InitBrainRoomObjects:: setvar VAR_TEMP_4, 1 - turnobject OBJ_EVENT_ID_PLAYER, DIR_NORTH + turnobject LOCALID_PLAYER, DIR_NORTH hideobjectat LOCALID_PIKE_ROOM_NPC_1, MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL @ Pike Queen hidden initially end @@ -106,7 +106,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_RoomWarp:: end BattleFrontier_BattlePikeThreePathRoom_EventScript_WarpNPCRoom:: - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer waitmovement 0 call BattleFrontier_BattlePike_EventScript_CloseCurtain warpsilent MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_NORMAL, 4, 7 @@ -114,7 +114,7 @@ BattleFrontier_BattlePikeThreePathRoom_EventScript_WarpNPCRoom:: end BattleFrontier_BattlePikeThreePathRoom_EventScript_WarpWildMonRoom:: - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer waitmovement 0 call BattleFrontier_BattlePike_EventScript_CloseCurtain warpsilent MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_WILD_MONS, 4, 19 @@ -172,14 +172,14 @@ BattleFrontier_BattlePikeRoom_EventScript_EnableHealing:: return BattleFrontier_BattlePikeRoom_EventScript_WarpToFinalRoom:: - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer waitmovement 0 call BattleFrontier_BattlePike_EventScript_CloseCurtain warpsilent MAP_BATTLE_FRONTIER_BATTLE_PIKE_ROOM_FINAL, 2, 7 return BattleFrontier_BattlePikeRoom_EventScript_WarpToThreePathRoom:: - applymovement OBJ_EVENT_ID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer + applymovement LOCALID_PLAYER, BattleFrontier_BattlePikeRoom_Movement_HidePlayer waitmovement 0 call BattleFrontier_BattlePike_EventScript_CloseCurtain warpsilent MAP_BATTLE_FRONTIER_BATTLE_PIKE_THREE_PATH_ROOM, 6, 10 diff --git a/data/scripts/cable_club.inc b/data/scripts/cable_club.inc index e810e354a5..68d619097f 100644 --- a/data/scripts/cable_club.inc +++ b/data/scripts/cable_club.inc @@ -138,7 +138,7 @@ CableClub_EventScript_CloseLinkAndExitLinkRoom:: goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceDown waitmovement 0 @@ -158,7 +158,7 @@ CableClub_EventScript_PlayerExitTradeCenter:: special CloseLink setvar VAR_CABLE_CLUB_STATE, 0 goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight + applymovement LOCALID_PLAYER, Movement_PlayerFaceAttendantRight waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 @@ -178,7 +178,7 @@ CableClub_EventScript_ExitRecordCorner:: CableClub_EventScript_PlayerExitRecordCorner:: special CloseLink setvar VAR_CABLE_CLUB_STATE, 0 - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 goto_if_eq VAR_0x8007, 0, CableClub_EventScript_ExitRecordCornerRet applymovement VAR_0x8007, Movement_AttendantFaceDown @@ -199,7 +199,7 @@ CableClub_EventScript_ExitUnionRoom:: CableClub_EventScript_PlayerExitUnionRoom:: setvar VAR_CABLE_CLUB_STATE, 0 goto_if_eq VAR_0x8007, 0, CableClub_EventScript_PlayerExitLinkRoom - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerFaceAttendantRight + applymovement LOCALID_PLAYER, Movement_PlayerFaceAttendantRight waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceLeft waitmovement 0 @@ -213,24 +213,24 @@ CableClub_EventScript_TrainerCardDataOverwritten:: delay 60 message CableClub_Text_HopeToSeeYouAgain waitmessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 applymovement VAR_0x8007, Movement_AttendantFaceDown waitmovement 0 return CableClub_EventScript_PlayerExitLinkRoom:: - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerExitLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerExitLinkRoom waitmovement 0 return CableClub_EventScript_Tutorial:: lockall - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox CableClub_Text_FirstTimeRightThisWay, MSGBOX_DEFAULT closemessage - applymovement OBJ_EVENT_ID_PLAYER, CableClub_Movement_PlayerApproachCounter + applymovement LOCALID_PLAYER, CableClub_Movement_PlayerApproachCounter waitmovement 0 delay 30 msgbox CableClub_Text_ExplainWirelessClubFirstTime, MSGBOX_DEFAULT @@ -350,13 +350,13 @@ CableClub_EventScript_EnterColosseum:: applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor 9, 1 waitdooranim release @@ -369,7 +369,7 @@ CableClub_EventScript_EnterColosseum:: @ Unused CableClub_EventScript_PlayerApproachLinkRoomRight:: - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomRight + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomRight waitmovement 0 return @@ -444,13 +444,13 @@ CableClub_EventScript_EnterTradeCenter:: applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor 9, 1 waitdooranim release @@ -509,13 +509,13 @@ CableClub_EventScript_EnterRecordCorner:: applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor 9, 1 waitdooranim release @@ -896,13 +896,13 @@ CableClub_EventScript_EnterUnionRoom:: delay 60 applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 5, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor 5, 1 waitdooranim special Script_ResetUnionRoomTrade @@ -1196,13 +1196,13 @@ CableClub_EventScript_EnterWirelessLinkRoom:: applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerApproachLinkRoomLeft + applymovement LOCALID_PLAYER, Movement_PlayerApproachLinkRoomLeft waitmovement 0 opendoor 9, 1 waitdooranim - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterLinkRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterLinkRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 closedoor 9, 1 waitdooranim release @@ -1378,9 +1378,9 @@ MossdeepCity_GameCorner_1F_EventScript_EnterMinigameRoom:: applymovement VAR_LAST_TALKED, Movement_AttendantFaceLeft waitmovement 0 closemessage - applymovement OBJ_EVENT_ID_PLAYER, Movement_PlayerEnterMinigameRoom + applymovement LOCALID_PLAYER, Movement_PlayerEnterMinigameRoom waitmovement 0 - hideobjectat OBJ_EVENT_ID_PLAYER, 0 + hideobjectat LOCALID_PLAYER, 0 release waitstate end diff --git a/data/scripts/cave_hole.inc b/data/scripts/cave_hole.inc index d7acf29d96..fc4962912a 100644 --- a/data/scripts/cave_hole.inc +++ b/data/scripts/cave_hole.inc @@ -9,7 +9,7 @@ CaveHole_FixCrackedGround: EventScript_FallDownHole:: lockall delay 20 - applymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible + applymovement LOCALID_PLAYER, Movement_SetInvisible waitmovement 0 playse SE_FALL delay 60 @@ -20,7 +20,7 @@ EventScript_FallDownHole:: EventScript_FallDownHoleMtPyre:: lockall delay 20 - applymovement OBJ_EVENT_ID_PLAYER, Movement_SetInvisible + applymovement LOCALID_PLAYER, Movement_SetInvisible waitmovement 0 playse SE_FALL delay 60 diff --git a/data/scripts/elite_four.inc b/data/scripts/elite_four.inc index 97d7f41314..1d1f7ab3eb 100644 --- a/data/scripts/elite_four.inc +++ b/data/scripts/elite_four.inc @@ -1,5 +1,5 @@ PokemonLeague_EliteFour_SetAdvanceToNextRoomMetatiles:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_Delay32 + applymovement LOCALID_PLAYER, Common_Movement_Delay32 waitmovement 0 playse SE_DOOR setmetatile 6, 1, METATILE_EliteFour_OpenDoor_Frame, FALSE @@ -18,7 +18,7 @@ PokemonLeague_EliteFour_SetAdvanceToNextRoomMetatiles:: return PokemonLeague_EliteFour_EventScript_WalkInCloseDoor:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkUp6 + applymovement LOCALID_PLAYER, Common_Movement_WalkUp6 waitmovement 0 playse SE_TRUCK_DOOR setmetatile 5, 12, METATILE_EliteFour_EntryDoor_ClosedTop, TRUE diff --git a/data/scripts/players_house.inc b/data/scripts/players_house.inc index 2d906e5705..4bcb31aa24 100644 --- a/data/scripts/players_house.inc +++ b/data/scripts/players_house.inc @@ -11,19 +11,19 @@ PlayersHouse_1F_EventScript_EnterHouseMovingIn:: msgbox PlayersHouse_1F_Text_MoversPokemonGoSetClock, MSGBOX_DEFAULT closemessage setvar VAR_LITTLEROOT_INTRO_STATE, 4 - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerWalkIn + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerWalkIn applymovement VAR_0x8004, Common_Movement_WalkInPlaceFasterUp waitmovement 0 releaseall end PlayersHouse_1F_EventScript_MomFacePlayerMovingInMale:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PlayersHouse_1F_EventScript_MomFacePlayerMovingInFemale:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return @@ -35,7 +35,7 @@ PlayersHouse_1F_EventScript_MomGoSeeRoom:: msgbox PlayersHouse_1F_Text_ArentYouInterestedInRoom, MSGBOX_DEFAULT closemessage applymovement VAR_0x8004, Common_Movement_WalkInPlaceFasterUp - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_MovePlayerAwayFromDoor + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_MovePlayerAwayFromDoor waitmovement 0 releaseall end @@ -74,7 +74,7 @@ PlayersHouse_2F_EventScript_MomComesUpstairsMale:: addobject VAR_0x8008 applymovement VAR_0x8008, PlayersHouse_2F_Movement_MomEntersMale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox PlayersHouse_2F_Text_HowDoYouLikeYourRoom, MSGBOX_DEFAULT closemessage @@ -87,7 +87,7 @@ PlayersHouse_2F_EventScript_MomComesUpstairsFemale:: addobject VAR_0x8008 applymovement VAR_0x8008, PlayersHouse_2F_Movement_MomEntersFemale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox PlayersHouse_2F_Text_HowDoYouLikeYourRoom, MSGBOX_DEFAULT closemessage @@ -148,17 +148,17 @@ PlayersHouse_1F_EventScript_PetalburgGymReportMale:: applymovement VAR_0x8005, Common_Movement_WalkInPlaceFasterRight waitmovement 0 call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymMale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymMale waitmovement 0 playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT closemessage applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVMale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerMoveToTVMale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerMoveToTVMale waitmovement 0 call PlayersHouse_1F_EventScript_WatchGymBroadcast - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 msgbox PlayersHouse_1F_Text_ItsOverWeMissedHim, MSGBOX_DEFAULT msgbox PlayersHouse_1F_Text_GoIntroduceYourselfNextDoor, MSGBOX_DEFAULT @@ -173,17 +173,17 @@ PlayersHouse_1F_EventScript_PetalburgGymReportFemale:: applymovement VAR_0x8005, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 call PlayersHouse_1F_EventScript_MomNoticeGymBroadcast - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymFemale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForGymFemale waitmovement 0 playbgm MUS_ENCOUNTER_INTERVIEWER, FALSE msgbox PlayersHouse_1F_Text_MaybeDadWillBeOn, MSGBOX_DEFAULT closemessage applymovement VAR_0x8005, PlayersHouse_1F_Movement_MomMakeRoomToSeeTVFemale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerMoveToTVFemale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerMoveToTVFemale waitmovement 0 call PlayersHouse_1F_EventScript_WatchGymBroadcast - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 msgbox PlayersHouse_1F_Text_ItsOverWeMissedHim, MSGBOX_DEFAULT msgbox PlayersHouse_1F_Text_GoIntroduceYourselfNextDoor, MSGBOX_DEFAULT @@ -205,7 +205,7 @@ PlayersHouse_1F_EventScript_MomNoticeGymBroadcast:: return PlayersHouse_1F_EventScript_WatchGymBroadcast:: - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterUp + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterUp waitmovement 0 msgbox PlayersHouse_1F_Text_ReportFromPetalburgGym, MSGBOX_DEFAULT fadedefaultbgm @@ -522,38 +522,38 @@ PlayersHouse_1F_EventScript_MomApproachDadFemale:: return PlayersHouse_1F_EventScript_DadExitsMale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit applymovement VAR_0x8009, PlayersHouse_1F_Movement_DadExitsMale waitmovement 0 return PlayersHouse_1F_EventScript_DadExitsFemale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomAndPlayerWatchDadExit applymovement VAR_0x8009, PlayersHouse_1F_Movement_DadExitsFemale waitmovement 0 return PlayersHouse_1F_EventScript_PlayerEnterRoomMale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerEnterRoomMale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerEnterRoomMale waitmovement 0 return PlayersHouse_1F_EventScript_PlayerEnterRoomFemale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerEnterRoomFemale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerEnterRoomFemale waitmovement 0 return PlayersHouse_1F_EventScript_PlayerApproachTVForLatiMale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForLatiMale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForLatiMale waitmovement 0 applymovement VAR_0x800A, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PlayersHouse_1F_EventScript_PlayerApproachTVForLatiFemale:: - applymovement OBJ_EVENT_ID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForLatiFemale + applymovement LOCALID_PLAYER, PlayersHouse_1F_Movement_PlayerApproachTVForLatiFemale waitmovement 0 applymovement VAR_0x800A, Common_Movement_WalkInPlaceFasterRight waitmovement 0 @@ -562,14 +562,14 @@ PlayersHouse_1F_EventScript_PlayerApproachTVForLatiFemale:: PlayersHouse_1F_EventScript_MomApproachPlayerMale:: applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomApproachPlayerMale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return PlayersHouse_1F_EventScript_MomApproachPlayerFemale:: applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomApproachPlayerFemale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return @@ -586,14 +586,14 @@ PlayersHouse_1F_EventScript_MomNoticesLatiBroadcastFemale:: PlayersHouse_1F_EventScript_MomApproachPlayerAfterTVMale:: applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomApproachPlayerAfterTVMale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterRight + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterRight waitmovement 0 return PlayersHouse_1F_EventScript_MomApproachPlayerAfterTVFemale:: applymovement VAR_0x800A, PlayersHouse_1F_Movement_MomApproachPlayerAfterTVFemale waitmovement 0 - applymovement OBJ_EVENT_ID_PLAYER, Common_Movement_WalkInPlaceFasterLeft + applymovement LOCALID_PLAYER, Common_Movement_WalkInPlaceFasterLeft waitmovement 0 return diff --git a/data/scripts/secret_base.inc b/data/scripts/secret_base.inc index 918a9d6301..3387e380ef 100644 --- a/data/scripts/secret_base.inc +++ b/data/scripts/secret_base.inc @@ -144,7 +144,7 @@ SecretBase_EventScript_InitSecretBase:: end SecretBase_EventScript_FirstEntrance:: - applymovement OBJ_EVENT_ID_PLAYER, SecretBase_Movement_EnterBase + applymovement LOCALID_PLAYER, SecretBase_Movement_EnterBase waitmovement 0 setvar VAR_INIT_SECRET_BASE, 1 msgbox SecretBase_Text_WantToMakeYourSecretBaseHere, MSGBOX_YESNO diff --git a/include/constants/event_objects.h b/include/constants/event_objects.h index 3efcf1d989..60a23041fa 100644 --- a/include/constants/event_objects.h +++ b/include/constants/event_objects.h @@ -300,8 +300,12 @@ // in regular offline play, five for linked players while playing Berry Blender, and one for an invisible object that // can be spawned for the camera to track instead of the player. Additionally, the value 0 is reserved as an "empty" indicator. #define LOCALID_NONE 0 -#define OBJ_EVENT_ID_CAMERA 127 +#define LOCALID_CAMERA 127 #define LOCALID_BERRY_BLENDER_PLAYER_END 240 // This will use 5 (MAX_RFU_PLAYERS) IDs ending at 240, i.e. 236-240 -#define OBJ_EVENT_ID_PLAYER 255 +#define LOCALID_PLAYER 255 + +// Aliases for old names. "object event id" normally refers to an index into gObjectEvents, which these are not. +#define OBJ_EVENT_ID_CAMERA LOCALID_CAMERA +#define OBJ_EVENT_ID_PLAYER LOCALID_PLAYER #endif // GUARD_CONSTANTS_EVENT_OBJECTS_H diff --git a/src/event_object_lock.c b/src/event_object_lock.c index 29575111fb..7cb260757c 100644 --- a/src/event_object_lock.c +++ b/src/event_object_lock.c @@ -98,7 +98,7 @@ void FreezeObjects_WaitForPlayerAndSelected(void) void ScriptUnfreezeObjectEvents(void) { - u8 playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + u8 playerObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); @@ -110,7 +110,7 @@ void UnionRoom_UnlockPlayerAndChatPartner(void) if (gObjectEvents[gSelectedObjectEvent].active) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); - playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + playerObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); diff --git a/src/event_object_movement.c b/src/event_object_movement.c index df399d2c23..626e968971 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -30,8 +30,8 @@ #include "constants/trainer_types.h" #include "constants/union_room.h" -#define SPECIAL_LOCALIDS_START (min(OBJ_EVENT_ID_CAMERA, \ - min(OBJ_EVENT_ID_PLAYER, \ +#define SPECIAL_LOCALIDS_START (min(LOCALID_CAMERA, \ + min(LOCALID_PLAYER, \ LOCALID_BERRY_BLENDER_PLAYER_END - MAX_RFU_PLAYERS + 1))) // The object event templates on a map cannot use the special IDs listed above or they can behave unexpectedly. @@ -1182,7 +1182,7 @@ static const u8 sPlayerDirectionToCopyDirection[][4] = { static void ClearObjectEvent(struct ObjectEvent *objectEvent) { *objectEvent = (struct ObjectEvent){}; - objectEvent->localId = OBJ_EVENT_ID_PLAYER; + objectEvent->localId = LOCALID_PLAYER; objectEvent->mapNum = MAP_NUM(MAP_UNDEFINED); objectEvent->mapGroup = MAP_GROUP(MAP_UNDEFINED); objectEvent->movementActionId = MOVEMENT_ACTION_NONE; @@ -1233,7 +1233,7 @@ u8 GetFirstInactiveObjectEventId(void) u8 GetObjectEventIdByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroupId) { - if (localId < OBJ_EVENT_ID_PLAYER) + if (localId < LOCALID_PLAYER) return GetObjectEventIdByLocalIdAndMapInternal(localId, mapNum, mapGroupId); return GetObjectEventIdByLocalId(localId); @@ -6182,7 +6182,7 @@ bool8 MovementAction_FacePlayer_Step0(struct ObjectEvent *objectEvent, struct Sp { u8 playerObjectId; - if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) + if (!TryGetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0, &playerObjectId)) FaceDirection(objectEvent, sprite, GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, @@ -6195,7 +6195,7 @@ bool8 MovementAction_FaceAwayPlayer_Step0(struct ObjectEvent *objectEvent, struc { u8 playerObjectId; - if (!TryGetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0, &playerObjectId)) + if (!TryGetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0, &playerObjectId)) FaceDirection(objectEvent, sprite, GetOppositeDirection(GetDirectionToFace(objectEvent->currentCoords.x, objectEvent->currentCoords.y, gObjectEvents[playerObjectId].currentCoords.x, diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index db362179dd..2c8037eeb0 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -268,7 +268,7 @@ const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatil 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) + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == LOCALID_PLAYER) return NULL; for (i = 0; i < 4; i++) @@ -289,14 +289,14 @@ static const u8 *GetInteractedObjectEventScript(struct MapPosition *position, u8 const u8 *script; objectEventId = GetObjectEventIdByPosition(position->x, position->y, position->elevation); - if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == OBJ_EVENT_ID_PLAYER) + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == LOCALID_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) + if (objectEventId == OBJECT_EVENTS_COUNT || gObjectEvents[objectEventId].localId == LOCALID_PLAYER) return NULL; } diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 9636a2f5ad..36dfcb0ff8 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -1363,7 +1363,7 @@ void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender) u8 objectEventId; struct ObjectEvent *objectEvent; - playerObjEventTemplate.localId = OBJ_EVENT_ID_PLAYER; + playerObjEventTemplate.localId = LOCALID_PLAYER; playerObjEventTemplate.graphicsId = GetPlayerAvatarGraphicsIdByStateIdAndGender(PLAYER_AVATAR_STATE_NORMAL, gender); playerObjEventTemplate.x = x - MAP_OFFSET; playerObjEventTemplate.y = y - MAP_OFFSET; diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index 616444116c..bd354c8a44 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -334,7 +334,7 @@ static void Task_ExitDoor(u8 taskId) { u8 objEventId; SetPlayerVisibility(TRUE); - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], MOVEMENT_ACTION_WALK_NORMAL_DOWN); task->tState = 2; } @@ -344,7 +344,7 @@ static void Task_ExitDoor(u8 taskId) { u8 objEventId; task->data[1] = FieldAnimateDoorClose(*x, *y); - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]); task->tState = 3; } @@ -382,7 +382,7 @@ static void Task_ExitNonAnimDoor(u8 taskId) { u8 objEventId; SetPlayerVisibility(TRUE); - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], GetWalkNormalMovementAction(GetPlayerFacingDirection())); task->tState = 2; } @@ -693,9 +693,9 @@ static void Task_DoDoorWarp(u8 taskId) if (task->data[1] < 0 || gTasks[task->data[1]].isActive != TRUE) { u8 objEventId; - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfActive(&gObjectEvents[objEventId]); - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventSetHeldMovement(&gObjectEvents[objEventId], MOVEMENT_ACTION_WALK_NORMAL_UP); task->tState = 2; } @@ -705,7 +705,7 @@ static void Task_DoDoorWarp(u8 taskId) { u8 objEventId; task->data[1] = FieldAnimateDoorClose(*x, *y - 1); - objEventId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + objEventId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[objEventId]); SetPlayerVisibility(FALSE); task->tState = 3; diff --git a/src/field_special_scene.c b/src/field_special_scene.c index a2b3d6366f..ccb15f02b4 100644 --- a/src/field_special_scene.c +++ b/src/field_special_scene.c @@ -312,7 +312,7 @@ void Task_HandlePorthole(u8 taskId) case IDLE_CHECK: if (JOY_NEW(A_BUTTON)) data[1] = 1; - if (!ScriptMovement_IsObjectMovementFinished(OBJ_EVENT_ID_PLAYER, location->mapNum, location->mapGroup)) + if (!ScriptMovement_IsObjectMovementFinished(LOCALID_PLAYER, location->mapNum, location->mapGroup)) return; if (CountSSTidalStep(1) == TRUE) { @@ -334,12 +334,12 @@ void Task_HandlePorthole(u8 taskId) if (*cruiseState == SS_TIDAL_DEPART_SLATEPORT) { - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_PLAYER, location->mapNum, location->mapGroup, sSSTidalSailEastMovementScript); + ScriptMovement_StartObjectMovementScript(LOCALID_PLAYER, location->mapNum, location->mapGroup, sSSTidalSailEastMovementScript); data[0] = IDLE_CHECK; } else { - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_PLAYER, location->mapNum, location->mapGroup, sSSTidalSailWestMovementScript); + ScriptMovement_StartObjectMovementScript(LOCALID_PLAYER, location->mapNum, location->mapGroup, sSSTidalSailWestMovementScript); data[0] = IDLE_CHECK; } break; diff --git a/src/field_specials.c b/src/field_specials.c index f5abeb8bc1..d41e83a164 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1252,7 +1252,7 @@ void SpawnCameraObject(void) { u8 obj = SpawnSpecialObjectEventParameterized(OBJ_EVENT_GFX_BOY_1, MOVEMENT_TYPE_FACE_DOWN, - OBJ_EVENT_ID_CAMERA, + LOCALID_CAMERA, gSaveBlock1Ptr->pos.x + MAP_OFFSET, gSaveBlock1Ptr->pos.y + MAP_OFFSET, 3); // elevation @@ -1263,7 +1263,7 @@ void SpawnCameraObject(void) void RemoveCameraObject(void) { CameraObjectSetFollowedSpriteId(GetPlayerAvatarSpriteId()); - RemoveObjectEventByLocalIdAndMap(OBJ_EVENT_ID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); + RemoveObjectEventByLocalIdAndMap(LOCALID_CAMERA, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } u8 GetPokeblockNameByMonNature(void) diff --git a/src/item_use.c b/src/item_use.c index abd80e0eae..f1e0708b28 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -569,15 +569,15 @@ static u8 GetDirectionToHiddenItem(s16 itemDistanceX, s16 itemDistanceY) static void PlayerFaceHiddenItem(u8 direction) { - ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); - ObjectEventClearHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); - UnfreezeObjectEvent(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]); + ObjectEventClearHeldMovementIfFinished(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0)]); + ObjectEventClearHeldMovement(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0)]); + UnfreezeObjectEvent(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0)]); PlayerTurnInPlace(direction); } static void Task_HiddenItemNearby(u8 taskId) { - if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]) == TRUE) + if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0)]) == TRUE) DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, Task_CloseItemfinderMessage); } @@ -585,7 +585,7 @@ static void Task_StandingOnHiddenItem(u8 taskId) { s16 *data = gTasks[taskId].data; - if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0)]) == TRUE + if (ObjectEventCheckHeldMovementStatus(&gObjectEvents[GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0)]) == TRUE || tItemFound == FALSE) { // Spin player around on item diff --git a/src/match_call.c b/src/match_call.c index 88766d516b..e6a141a1bc 100644 --- a/src/match_call.c +++ b/src/match_call.c @@ -1368,7 +1368,7 @@ static bool32 MatchCall_EndCall(u8 taskId) if (!sMatchCallState.triggeredFromScript) { LoadMessageBoxAndBorderGfx(); - playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + playerObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); diff --git a/src/rotating_tile_puzzle.c b/src/rotating_tile_puzzle.c index 65ef687fdb..0eb58f9c1e 100644 --- a/src/rotating_tile_puzzle.c +++ b/src/rotating_tile_puzzle.c @@ -100,7 +100,7 @@ void FreeRotatingTilePuzzle(void) TRY_FREE_AND_SET_NULL(sRotatingTilePuzzle); - id = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + id = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[id]); ScriptMovement_UnfreezeObjectEvents(); } diff --git a/src/scrcmd.c b/src/scrcmd.c index bc741b3e43..fde75e3d0e 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1241,7 +1241,7 @@ bool8 ScrCmd_releaseall(struct ScriptContext *ctx) u8 playerObjectId; HideFieldMessageBox(); - playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + playerObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); @@ -1255,7 +1255,7 @@ bool8 ScrCmd_release(struct ScriptContext *ctx) HideFieldMessageBox(); if (gObjectEvents[gSelectedObjectEvent].active) ObjectEventClearHeldMovementIfFinished(&gObjectEvents[gSelectedObjectEvent]); - playerObjectId = GetObjectEventIdByLocalIdAndMap(OBJ_EVENT_ID_PLAYER, 0, 0); + playerObjectId = GetObjectEventIdByLocalIdAndMap(LOCALID_PLAYER, 0, 0); ObjectEventClearHeldMovementIfFinished(&gObjectEvents[playerObjectId]); ScriptMovement_UnfreezeObjectEvents(); UnfreezeObjectEvents(); diff --git a/src/script.c b/src/script.c index 1f70bf37da..130ad5315b 100644 --- a/src/script.c +++ b/src/script.c @@ -420,7 +420,7 @@ const u8 *GetRamScript(u8 localId, const u8 *script) } } -#define NO_OBJECT OBJ_EVENT_ID_PLAYER +#define NO_OBJECT LOCALID_PLAYER bool32 ValidateSavedRamScript(void) { diff --git a/src/script_movement.c b/src/script_movement.c index 10517dfc8e..19e058aa19 100644 --- a/src/script_movement.c +++ b/src/script_movement.c @@ -89,7 +89,7 @@ static bool8 ScriptMovement_TryAddNewMovement(u8 taskId, u8 objEventId, const u8 return FALSE; } } - moveScrId = GetMovementScriptIdFromObjectEventId(taskId, OBJ_EVENT_ID_PLAYER); + moveScrId = GetMovementScriptIdFromObjectEventId(taskId, LOCALID_PLAYER); if (moveScrId == OBJECT_EVENTS_COUNT) { return TRUE; diff --git a/src/trainer_see.c b/src/trainer_see.c index 51cc64f4a0..b8ae01117f 100644 --- a/src/trainer_see.c +++ b/src/trainer_see.c @@ -800,15 +800,15 @@ void PlayerFaceTrainerAfterBattle(void) objEvent = &gObjectEvents[gApproachingTrainers[gWhichTrainerToFaceAfterBattle].objectEventId]; gPostBattleMovementScript[0] = GetFaceDirectionMovementAction(GetOppositeDirection(objEvent->facingDirection)); gPostBattleMovementScript[1] = MOVEMENT_ACTION_STEP_END; - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_PLAYER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gPostBattleMovementScript); + ScriptMovement_StartObjectMovementScript(LOCALID_PLAYER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gPostBattleMovementScript); } else { objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; gPostBattleMovementScript[0] = GetFaceDirectionMovementAction(objEvent->facingDirection); gPostBattleMovementScript[1] = MOVEMENT_ACTION_STEP_END; - ScriptMovement_StartObjectMovementScript(OBJ_EVENT_ID_PLAYER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gPostBattleMovementScript); + ScriptMovement_StartObjectMovementScript(LOCALID_PLAYER, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, gPostBattleMovementScript); } - SetMovingNpcId(OBJ_EVENT_ID_PLAYER); + SetMovingNpcId(LOCALID_PLAYER); } From 0ee9b3cf084031042654c071b97b3a60853a367c Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 15 Oct 2024 22:17:38 -0400 Subject: [PATCH 012/187] Fix event_constants recipe running twice --- map_data_rules.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/map_data_rules.mk b/map_data_rules.mk index 7c26c1f769..4c255c098b 100755 --- a/map_data_rules.mk +++ b/map_data_rules.mk @@ -37,6 +37,9 @@ $(LAYOUTS_OUTDIR)/layouts.inc $(LAYOUTS_OUTDIR)/layouts_table.inc $(INCLUDECONST # Generate files that depends on data that's distributed across the map.json files. # There's a lot of map.json files, so we print an abbreviated output with echo. -$(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h: $(MAP_JSONS) +# We're also not using a pattern rule, and we only want this to run once for both targets, +# so we use a separate target 'event_constants'. +$(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h: .event_constants ; +.event_constants: $(MAP_JSONS) @$(MAPJSON) event_constants emerald $^ $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h @echo "$(MAPJSON) event_constants emerald $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h" From b89fda79ea29142ff076eb3b012a082ee8d0a26d Mon Sep 17 00:00:00 2001 From: GriffinR Date: Wed, 6 Nov 2024 21:41:43 -0500 Subject: [PATCH 013/187] Generate MAPSEC constants from JSON --- include/constants/.gitignore | 3 +- include/constants/region_map_sections.h | 227 ---------- json_data_rules.mk | 4 + .../region_map_sections.constants.json.txt | 22 + src/data/region_map/region_map_sections.json | 426 +++++++++--------- .../region_map/region_map_sections.json.txt | 10 +- 6 files changed, 248 insertions(+), 444 deletions(-) delete mode 100644 include/constants/region_map_sections.h create mode 100644 src/data/region_map/region_map_sections.constants.json.txt diff --git a/include/constants/.gitignore b/include/constants/.gitignore index 761af9db76..3cf23a061d 100644 --- a/include/constants/.gitignore +++ b/include/constants/.gitignore @@ -1,3 +1,4 @@ # Will be moved to build/ eventually map_groups.h -layouts.h \ No newline at end of file +layouts.h +region_map_sections.h diff --git a/include/constants/region_map_sections.h b/include/constants/region_map_sections.h deleted file mode 100644 index 5b8029acf5..0000000000 --- a/include/constants/region_map_sections.h +++ /dev/null @@ -1,227 +0,0 @@ -#ifndef GUARD_REGIONMAPSEC_H -#define GUARD_REGIONMAPSEC_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 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 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_FRLG 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_FRLG 0xB7 -#define MAPSEC_TANOBY_CHAMBERS 0xB8 -#define MAPSEC_THREE_ISLE_PATH 0xB9 -#define MAPSEC_TANOBY_KEY 0xBA -#define MAPSEC_BIRTH_ISLAND_FRLG 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 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 0xD2 -#define MAPSEC_NAVEL_ROCK 0xD3 -#define MAPSEC_TRAINER_HILL 0xD4 -#define MAPSEC_NONE 0xD5 - -#define METLOC_SPECIAL_EGG 0xFD -#define METLOC_IN_GAME_TRADE 0xFE -#define METLOC_FATEFUL_ENCOUNTER 0xFF - -#define KANTO_MAPSEC_START MAPSEC_PALLET_TOWN -#define KANTO_MAPSEC_END MAPSEC_SPECIAL_AREA -#define KANTO_MAPSEC_COUNT (KANTO_MAPSEC_END - KANTO_MAPSEC_START + 1) - -#endif //GUARD_REGIONMAPSEC_H diff --git a/json_data_rules.mk b/json_data_rules.mk index aa9e5b3a25..5847914c7c 100755 --- a/json_data_rules.mk +++ b/json_data_rules.mk @@ -12,3 +12,7 @@ $(DATA_SRC_SUBDIR)/region_map/region_map_entries.h: $(DATA_SRC_SUBDIR)/region_ma $(JSONPROC) $^ $@ $(C_BUILDDIR)/region_map.o: c_dep += $(DATA_SRC_SUBDIR)/region_map/region_map_entries.h + +AUTO_GEN_TARGETS += include/constants/region_map_sections.h +include/constants/region_map_sections.h: $(DATA_SRC_SUBDIR)/region_map/region_map_sections.json $(DATA_SRC_SUBDIR)/region_map/region_map_sections.constants.json.txt + $(JSONPROC) $^ $@ diff --git a/src/data/region_map/region_map_sections.constants.json.txt b/src/data/region_map/region_map_sections.constants.json.txt new file mode 100644 index 0000000000..340c29b33d --- /dev/null +++ b/src/data/region_map/region_map_sections.constants.json.txt @@ -0,0 +1,22 @@ +{{ doNotModifyHeader }} +#ifndef GUARD_CONSTANTS_REGION_MAP_SECTIONS_H +#define GUARD_CONSTANTS_REGION_MAP_SECTIONS_H + +enum { +## for map_section in map_sections + {{ map_section.id }}, +## endfor + MAPSEC_NONE, + MAPSEC_COUNT +}; + +// Special location IDs that use the same value space as MAPSECs. +#define METLOC_SPECIAL_EGG 0xFD +#define METLOC_IN_GAME_TRADE 0xFE +#define METLOC_FATEFUL_ENCOUNTER 0xFF + +#define KANTO_MAPSEC_START MAPSEC_PALLET_TOWN +#define KANTO_MAPSEC_END MAPSEC_SPECIAL_AREA +#define KANTO_MAPSEC_COUNT (KANTO_MAPSEC_END - KANTO_MAPSEC_START + 1) + +#endif // GUARD_CONSTANTS_REGION_MAP_SECTIONS_H diff --git a/src/data/region_map/region_map_sections.json b/src/data/region_map/region_map_sections.json index 8fa0079117..fa7eb5efa4 100644 --- a/src/data/region_map/region_map_sections.json +++ b/src/data/region_map/region_map_sections.json @@ -1,7 +1,7 @@ { "map_sections": [ { - "map_section": "MAPSEC_LITTLEROOT_TOWN", + "id": "MAPSEC_LITTLEROOT_TOWN", "name": "LITTLEROOT TOWN", "x": 4, "y": 11, @@ -9,7 +9,7 @@ "height": 1 }, { - "map_section": "MAPSEC_OLDALE_TOWN", + "id": "MAPSEC_OLDALE_TOWN", "name": "OLDALE TOWN", "x": 4, "y": 9, @@ -17,7 +17,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DEWFORD_TOWN", + "id": "MAPSEC_DEWFORD_TOWN", "name": "DEWFORD TOWN", "x": 2, "y": 14, @@ -25,7 +25,7 @@ "height": 1 }, { - "map_section": "MAPSEC_LAVARIDGE_TOWN", + "id": "MAPSEC_LAVARIDGE_TOWN", "name": "LAVARIDGE TOWN", "x": 5, "y": 3, @@ -33,7 +33,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FALLARBOR_TOWN", + "id": "MAPSEC_FALLARBOR_TOWN", "name": "FALLARBOR TOWN", "x": 3, "y": 0, @@ -41,7 +41,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VERDANTURF_TOWN", + "id": "MAPSEC_VERDANTURF_TOWN", "name": "VERDANTURF TOWN", "x": 4, "y": 6, @@ -49,7 +49,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PACIFIDLOG_TOWN", + "id": "MAPSEC_PACIFIDLOG_TOWN", "name": "PACIFIDLOG TOWN", "x": 17, "y": 10, @@ -57,7 +57,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PETALBURG_CITY", + "id": "MAPSEC_PETALBURG_CITY", "name": "PETALBURG CITY", "x": 1, "y": 9, @@ -65,7 +65,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SLATEPORT_CITY", + "id": "MAPSEC_SLATEPORT_CITY", "name": "SLATEPORT CITY", "x": 8, "y": 10, @@ -73,7 +73,7 @@ "height": 2 }, { - "map_section": "MAPSEC_MAUVILLE_CITY", + "id": "MAPSEC_MAUVILLE_CITY", "name": "MAUVILLE CITY", "x": 8, "y": 6, @@ -81,7 +81,7 @@ "height": 1 }, { - "map_section": "MAPSEC_RUSTBORO_CITY", + "id": "MAPSEC_RUSTBORO_CITY", "name": "RUSTBORO CITY", "x": 0, "y": 5, @@ -89,7 +89,7 @@ "height": 2 }, { - "map_section": "MAPSEC_FORTREE_CITY", + "id": "MAPSEC_FORTREE_CITY", "name": "FORTREE CITY", "x": 12, "y": 0, @@ -97,7 +97,7 @@ "height": 1 }, { - "map_section": "MAPSEC_LILYCOVE_CITY", + "id": "MAPSEC_LILYCOVE_CITY", "name": "LILYCOVE CITY", "x": 18, "y": 3, @@ -105,7 +105,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MOSSDEEP_CITY", + "id": "MAPSEC_MOSSDEEP_CITY", "name": "MOSSDEEP CITY", "x": 24, "y": 5, @@ -113,7 +113,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SOOTOPOLIS_CITY", + "id": "MAPSEC_SOOTOPOLIS_CITY", "name": "SOOTOPOLIS CITY", "x": 21, "y": 7, @@ -121,7 +121,7 @@ "height": 1 }, { - "map_section": "MAPSEC_EVER_GRANDE_CITY", + "id": "MAPSEC_EVER_GRANDE_CITY", "name": "EVER GRANDE CITY", "x": 27, "y": 8, @@ -129,7 +129,7 @@ "height": 2 }, { - "map_section": "MAPSEC_ROUTE_101", + "id": "MAPSEC_ROUTE_101", "name": "ROUTE 101", "x": 4, "y": 10, @@ -137,7 +137,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_102", + "id": "MAPSEC_ROUTE_102", "name": "ROUTE 102", "x": 2, "y": 9, @@ -145,7 +145,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_103", + "id": "MAPSEC_ROUTE_103", "name": "ROUTE 103", "x": 4, "y": 8, @@ -153,7 +153,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_104", + "id": "MAPSEC_ROUTE_104", "name": "ROUTE 104", "x": 0, "y": 7, @@ -161,7 +161,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_105", + "id": "MAPSEC_ROUTE_105", "name": "ROUTE 105", "x": 0, "y": 10, @@ -169,7 +169,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_106", + "id": "MAPSEC_ROUTE_106", "name": "ROUTE 106", "x": 0, "y": 13, @@ -177,7 +177,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_107", + "id": "MAPSEC_ROUTE_107", "name": "ROUTE 107", "x": 3, "y": 14, @@ -185,7 +185,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_108", + "id": "MAPSEC_ROUTE_108", "name": "ROUTE 108", "x": 6, "y": 14, @@ -193,7 +193,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_109", + "id": "MAPSEC_ROUTE_109", "name": "ROUTE 109", "x": 8, "y": 12, @@ -201,7 +201,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_110", + "id": "MAPSEC_ROUTE_110", "name": "ROUTE 110", "x": 8, "y": 7, @@ -209,7 +209,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_111", + "id": "MAPSEC_ROUTE_111", "name": "ROUTE 111", "x": 8, "y": 0, @@ -217,7 +217,7 @@ "height": 6 }, { - "map_section": "MAPSEC_ROUTE_112", + "id": "MAPSEC_ROUTE_112", "name": "ROUTE 112", "x": 6, "y": 3, @@ -225,7 +225,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_113", + "id": "MAPSEC_ROUTE_113", "name": "ROUTE 113", "x": 4, "y": 0, @@ -233,7 +233,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_114", + "id": "MAPSEC_ROUTE_114", "name": "ROUTE 114", "x": 1, "y": 0, @@ -241,7 +241,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_115", + "id": "MAPSEC_ROUTE_115", "name": "ROUTE 115", "x": 0, "y": 2, @@ -249,7 +249,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_116", + "id": "MAPSEC_ROUTE_116", "name": "ROUTE 116", "x": 1, "y": 5, @@ -257,7 +257,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_117", + "id": "MAPSEC_ROUTE_117", "name": "ROUTE 117", "x": 5, "y": 6, @@ -265,7 +265,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_118", + "id": "MAPSEC_ROUTE_118", "name": "ROUTE 118", "x": 10, "y": 6, @@ -273,7 +273,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_119", + "id": "MAPSEC_ROUTE_119", "name": "ROUTE 119", "x": 11, "y": 0, @@ -281,7 +281,7 @@ "height": 6 }, { - "map_section": "MAPSEC_ROUTE_120", + "id": "MAPSEC_ROUTE_120", "name": "ROUTE 120", "x": 13, "y": 0, @@ -289,7 +289,7 @@ "height": 4 }, { - "map_section": "MAPSEC_ROUTE_121", + "id": "MAPSEC_ROUTE_121", "name": "ROUTE 121", "x": 14, "y": 3, @@ -297,7 +297,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_122", + "id": "MAPSEC_ROUTE_122", "name": "ROUTE 122", "x": 16, "y": 4, @@ -305,7 +305,7 @@ "height": 2 }, { - "map_section": "MAPSEC_ROUTE_123", + "id": "MAPSEC_ROUTE_123", "name": "ROUTE 123", "x": 12, "y": 6, @@ -313,7 +313,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_124", + "id": "MAPSEC_ROUTE_124", "name": "ROUTE 124", "x": 20, "y": 3, @@ -321,7 +321,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_125", + "id": "MAPSEC_ROUTE_125", "name": "ROUTE 125", "x": 24, "y": 3, @@ -329,7 +329,7 @@ "height": 2 }, { - "map_section": "MAPSEC_ROUTE_126", + "id": "MAPSEC_ROUTE_126", "name": "ROUTE 126", "x": 20, "y": 6, @@ -337,7 +337,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_127", + "id": "MAPSEC_ROUTE_127", "name": "ROUTE 127", "x": 23, "y": 6, @@ -345,7 +345,7 @@ "height": 3 }, { - "map_section": "MAPSEC_ROUTE_128", + "id": "MAPSEC_ROUTE_128", "name": "ROUTE 128", "x": 23, "y": 9, @@ -353,7 +353,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_129", + "id": "MAPSEC_ROUTE_129", "name": "ROUTE 129", "x": 24, "y": 10, @@ -361,7 +361,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_130", + "id": "MAPSEC_ROUTE_130", "name": "ROUTE 130", "x": 21, "y": 10, @@ -369,7 +369,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_131", + "id": "MAPSEC_ROUTE_131", "name": "ROUTE 131", "x": 18, "y": 10, @@ -377,7 +377,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_132", + "id": "MAPSEC_ROUTE_132", "name": "ROUTE 132", "x": 15, "y": 10, @@ -385,7 +385,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_133", + "id": "MAPSEC_ROUTE_133", "name": "ROUTE 133", "x": 12, "y": 10, @@ -393,7 +393,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_134", + "id": "MAPSEC_ROUTE_134", "name": "ROUTE 134", "x": 9, "y": 10, @@ -401,7 +401,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_124", + "id": "MAPSEC_UNDERWATER_124", "name": "UNDERWATER", "x": 20, "y": 3, @@ -409,7 +409,7 @@ "height": 3 }, { - "map_section": "MAPSEC_UNDERWATER_126", + "id": "MAPSEC_UNDERWATER_126", "name": "UNDERWATER", "x": 20, "y": 6, @@ -417,7 +417,7 @@ "height": 3 }, { - "map_section": "MAPSEC_UNDERWATER_127", + "id": "MAPSEC_UNDERWATER_127", "name": "UNDERWATER", "x": 23, "y": 6, @@ -425,7 +425,7 @@ "height": 3 }, { - "map_section": "MAPSEC_UNDERWATER_128", + "id": "MAPSEC_UNDERWATER_128", "name": "UNDERWATER", "x": 23, "y": 9, @@ -433,7 +433,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_SOOTOPOLIS", + "id": "MAPSEC_UNDERWATER_SOOTOPOLIS", "name": "UNDERWATER", "x": 21, "y": 7, @@ -441,7 +441,7 @@ "height": 1 }, { - "map_section": "MAPSEC_GRANITE_CAVE", + "id": "MAPSEC_GRANITE_CAVE", "name": "GRANITE CAVE", "x": 1, "y": 13, @@ -449,7 +449,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MT_CHIMNEY", + "id": "MAPSEC_MT_CHIMNEY", "name": "MT. CHIMNEY", "x": 6, "y": 2, @@ -457,7 +457,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SAFARI_ZONE", + "id": "MAPSEC_SAFARI_ZONE", "name": "SAFARI ZONE", "x": 16, "y": 2, @@ -465,7 +465,7 @@ "height": 1 }, { - "map_section": "MAPSEC_BATTLE_FRONTIER", + "id": "MAPSEC_BATTLE_FRONTIER", "name": "BATTLE FRONTIER", "x": 22, "y": 12, @@ -473,7 +473,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PETALBURG_WOODS", + "id": "MAPSEC_PETALBURG_WOODS", "name": "PETALBURG WOODS", "x": 0, "y": 8, @@ -481,7 +481,7 @@ "height": 1 }, { - "map_section": "MAPSEC_RUSTURF_TUNNEL", + "id": "MAPSEC_RUSTURF_TUNNEL", "name": "RUSTURF TUNNEL", "x": 2, "y": 5, @@ -489,7 +489,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ABANDONED_SHIP", + "id": "MAPSEC_ABANDONED_SHIP", "name": "ABANDONED SHIP", "x": 6, "y": 14, @@ -497,7 +497,7 @@ "height": 1 }, { - "map_section": "MAPSEC_NEW_MAUVILLE", + "id": "MAPSEC_NEW_MAUVILLE", "name": "NEW MAUVILLE", "x": 8, "y": 7, @@ -505,7 +505,7 @@ "height": 1 }, { - "map_section": "MAPSEC_METEOR_FALLS", + "id": "MAPSEC_METEOR_FALLS", "name": "METEOR FALLS", "x": 0, "y": 3, @@ -513,7 +513,7 @@ "height": 1 }, { - "map_section": "MAPSEC_METEOR_FALLS2", + "id": "MAPSEC_METEOR_FALLS2", "name": "METEOR FALLS", "x": 1, "y": 2, @@ -521,7 +521,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MT_PYRE", + "id": "MAPSEC_MT_PYRE", "name": "MT. PYRE", "x": 16, "y": 4, @@ -529,7 +529,7 @@ "height": 1 }, { - "map_section": "MAPSEC_AQUA_HIDEOUT_OLD", + "id": "MAPSEC_AQUA_HIDEOUT_OLD", "name": "{AQUA} HIDEOUT", "name_clone": true, "x": 19, @@ -538,7 +538,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SHOAL_CAVE", + "id": "MAPSEC_SHOAL_CAVE", "name": "SHOAL CAVE", "x": 24, "y": 4, @@ -546,7 +546,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEAFLOOR_CAVERN", + "id": "MAPSEC_SEAFLOOR_CAVERN", "name": "SEAFLOOR CAVERN", "x": 24, "y": 9, @@ -554,7 +554,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_SEAFLOOR_CAVERN", + "id": "MAPSEC_UNDERWATER_SEAFLOOR_CAVERN", "name": "UNDERWATER", "x": 24, "y": 9, @@ -562,7 +562,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VICTORY_ROAD", + "id": "MAPSEC_VICTORY_ROAD", "name": "VICTORY ROAD", "x": 27, "y": 9, @@ -570,7 +570,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MIRAGE_ISLAND", + "id": "MAPSEC_MIRAGE_ISLAND", "name": "MIRAGE ISLAND", "x": 17, "y": 10, @@ -578,7 +578,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CAVE_OF_ORIGIN", + "id": "MAPSEC_CAVE_OF_ORIGIN", "name": "CAVE OF ORIGIN", "x": 21, "y": 7, @@ -586,7 +586,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SOUTHERN_ISLAND", + "id": "MAPSEC_SOUTHERN_ISLAND", "name": "SOUTHERN ISLAND", "x": 12, "y": 14, @@ -594,7 +594,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FIERY_PATH", + "id": "MAPSEC_FIERY_PATH", "name": "FIERY PATH", "x": 6, "y": 3, @@ -602,7 +602,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FIERY_PATH2", + "id": "MAPSEC_FIERY_PATH2", "name": "FIERY PATH", "x": 7, "y": 3, @@ -610,7 +610,7 @@ "height": 1 }, { - "map_section": "MAPSEC_JAGGED_PASS", + "id": "MAPSEC_JAGGED_PASS", "name": "JAGGED PASS", "x": 6, "y": 3, @@ -618,7 +618,7 @@ "height": 1 }, { - "map_section": "MAPSEC_JAGGED_PASS2", + "id": "MAPSEC_JAGGED_PASS2", "name": "JAGGED PASS", "x": 7, "y": 2, @@ -626,7 +626,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEALED_CHAMBER", + "id": "MAPSEC_SEALED_CHAMBER", "name": "SEALED CHAMBER", "x": 11, "y": 10, @@ -634,7 +634,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_SEALED_CHAMBER", + "id": "MAPSEC_UNDERWATER_SEALED_CHAMBER", "name": "UNDERWATER", "x": 11, "y": 10, @@ -642,7 +642,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SCORCHED_SLAB", + "id": "MAPSEC_SCORCHED_SLAB", "name": "SCORCHED SLAB", "x": 13, "y": 0, @@ -650,7 +650,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ISLAND_CAVE", + "id": "MAPSEC_ISLAND_CAVE", "name": "ISLAND CAVE", "x": 0, "y": 10, @@ -658,7 +658,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DESERT_RUINS", + "id": "MAPSEC_DESERT_RUINS", "name": "DESERT RUINS", "x": 8, "y": 3, @@ -666,7 +666,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ANCIENT_TOMB", + "id": "MAPSEC_ANCIENT_TOMB", "name": "ANCIENT TOMB", "x": 13, "y": 2, @@ -674,7 +674,7 @@ "height": 1 }, { - "map_section": "MAPSEC_INSIDE_OF_TRUCK", + "id": "MAPSEC_INSIDE_OF_TRUCK", "name": "INSIDE OF TRUCK", "x": 0, "y": 0, @@ -682,7 +682,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SKY_PILLAR", + "id": "MAPSEC_SKY_PILLAR", "name": "SKY PILLAR", "x": 19, "y": 10, @@ -690,7 +690,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SECRET_BASE", + "id": "MAPSEC_SECRET_BASE", "name": "SECRET BASE", "x": 0, "y": 0, @@ -698,7 +698,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DYNAMIC", + "id": "MAPSEC_DYNAMIC", "name": "", "x": 0, "y": 0, @@ -706,7 +706,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PALLET_TOWN", + "id": "MAPSEC_PALLET_TOWN", "name": "PALLET TOWN", "x": 0, "y": 0, @@ -714,7 +714,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VIRIDIAN_CITY", + "id": "MAPSEC_VIRIDIAN_CITY", "name": "VIRIDIAN CITY", "x": 0, "y": 0, @@ -722,7 +722,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PEWTER_CITY", + "id": "MAPSEC_PEWTER_CITY", "name": "PEWTER CITY", "x": 0, "y": 0, @@ -730,7 +730,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CERULEAN_CITY", + "id": "MAPSEC_CERULEAN_CITY", "name": "CERULEAN CITY", "x": 0, "y": 0, @@ -738,7 +738,7 @@ "height": 1 }, { - "map_section": "MAPSEC_LAVENDER_TOWN", + "id": "MAPSEC_LAVENDER_TOWN", "name": "LAVENDER TOWN", "x": 0, "y": 0, @@ -746,7 +746,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VERMILION_CITY", + "id": "MAPSEC_VERMILION_CITY", "name": "VERMILION CITY", "x": 0, "y": 0, @@ -754,7 +754,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CELADON_CITY", + "id": "MAPSEC_CELADON_CITY", "name": "CELADON CITY", "x": 0, "y": 0, @@ -762,7 +762,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FUCHSIA_CITY", + "id": "MAPSEC_FUCHSIA_CITY", "name": "FUCHSIA CITY", "x": 0, "y": 0, @@ -770,7 +770,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CINNABAR_ISLAND", + "id": "MAPSEC_CINNABAR_ISLAND", "name": "CINNABAR ISLAND", "x": 0, "y": 0, @@ -778,7 +778,7 @@ "height": 1 }, { - "map_section": "MAPSEC_INDIGO_PLATEAU", + "id": "MAPSEC_INDIGO_PLATEAU", "name": "INDIGO PLATEAU", "x": 0, "y": 0, @@ -786,7 +786,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SAFFRON_CITY", + "id": "MAPSEC_SAFFRON_CITY", "name": "SAFFRON CITY", "x": 0, "y": 0, @@ -794,7 +794,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_4_POKECENTER", + "id": "MAPSEC_ROUTE_4_POKECENTER", "name": "ROUTE 4", "name_clone": true, "x": 0, @@ -803,7 +803,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_10_POKECENTER", + "id": "MAPSEC_ROUTE_10_POKECENTER", "name": "ROUTE 10", "name_clone": true, "x": 0, @@ -812,7 +812,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_1", + "id": "MAPSEC_ROUTE_1", "name": "ROUTE 1", "x": 0, "y": 0, @@ -820,7 +820,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_2", + "id": "MAPSEC_ROUTE_2", "name": "ROUTE 2", "x": 0, "y": 0, @@ -828,7 +828,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_3", + "id": "MAPSEC_ROUTE_3", "name": "ROUTE 3", "x": 0, "y": 0, @@ -836,7 +836,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_4", + "id": "MAPSEC_ROUTE_4", "name": "ROUTE 4", "x": 0, "y": 0, @@ -844,7 +844,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_5", + "id": "MAPSEC_ROUTE_5", "name": "ROUTE 5", "x": 0, "y": 0, @@ -852,7 +852,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_6", + "id": "MAPSEC_ROUTE_6", "name": "ROUTE 6", "x": 0, "y": 0, @@ -860,7 +860,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_7", + "id": "MAPSEC_ROUTE_7", "name": "ROUTE 7", "x": 0, "y": 0, @@ -868,7 +868,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_8", + "id": "MAPSEC_ROUTE_8", "name": "ROUTE 8", "x": 0, "y": 0, @@ -876,7 +876,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_9", + "id": "MAPSEC_ROUTE_9", "name": "ROUTE 9", "x": 0, "y": 0, @@ -884,7 +884,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_10", + "id": "MAPSEC_ROUTE_10", "name": "ROUTE 10", "x": 0, "y": 0, @@ -892,7 +892,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_11", + "id": "MAPSEC_ROUTE_11", "name": "ROUTE 11", "x": 0, "y": 0, @@ -900,7 +900,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_12", + "id": "MAPSEC_ROUTE_12", "name": "ROUTE 12", "x": 0, "y": 0, @@ -908,7 +908,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_13", + "id": "MAPSEC_ROUTE_13", "name": "ROUTE 13", "x": 0, "y": 0, @@ -916,7 +916,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_14", + "id": "MAPSEC_ROUTE_14", "name": "ROUTE 14", "x": 0, "y": 0, @@ -924,7 +924,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_15", + "id": "MAPSEC_ROUTE_15", "name": "ROUTE 15", "x": 0, "y": 0, @@ -932,7 +932,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_16", + "id": "MAPSEC_ROUTE_16", "name": "ROUTE 16", "x": 0, "y": 0, @@ -940,7 +940,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_17", + "id": "MAPSEC_ROUTE_17", "name": "ROUTE 17", "x": 0, "y": 0, @@ -948,7 +948,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_18", + "id": "MAPSEC_ROUTE_18", "name": "ROUTE 18", "x": 0, "y": 0, @@ -956,7 +956,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_19", + "id": "MAPSEC_ROUTE_19", "name": "ROUTE 19", "x": 0, "y": 0, @@ -964,7 +964,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_20", + "id": "MAPSEC_ROUTE_20", "name": "ROUTE 20", "x": 0, "y": 0, @@ -972,7 +972,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_21", + "id": "MAPSEC_ROUTE_21", "name": "ROUTE 21", "x": 0, "y": 0, @@ -980,7 +980,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_22", + "id": "MAPSEC_ROUTE_22", "name": "ROUTE 22", "x": 0, "y": 0, @@ -988,7 +988,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_23", + "id": "MAPSEC_ROUTE_23", "name": "ROUTE 23", "x": 0, "y": 0, @@ -996,7 +996,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_24", + "id": "MAPSEC_ROUTE_24", "name": "ROUTE 24", "x": 0, "y": 0, @@ -1004,7 +1004,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROUTE_25", + "id": "MAPSEC_ROUTE_25", "name": "ROUTE 25", "x": 0, "y": 0, @@ -1012,7 +1012,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VIRIDIAN_FOREST", + "id": "MAPSEC_VIRIDIAN_FOREST", "name": "VIRIDIAN FOREST", "x": 0, "y": 0, @@ -1020,7 +1020,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MT_MOON", + "id": "MAPSEC_MT_MOON", "name": "MT. MOON", "x": 0, "y": 0, @@ -1028,7 +1028,7 @@ "height": 1 }, { - "map_section": "MAPSEC_S_S_ANNE", + "id": "MAPSEC_S_S_ANNE", "name": "S.S. ANNE", "x": 0, "y": 0, @@ -1036,7 +1036,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERGROUND_PATH", + "id": "MAPSEC_UNDERGROUND_PATH", "name": "UNDERGROUND PATH", "x": 0, "y": 0, @@ -1044,7 +1044,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERGROUND_PATH_2", + "id": "MAPSEC_UNDERGROUND_PATH_2", "name": "UNDERGROUND PATH", "name_clone": true, "x": 0, @@ -1053,7 +1053,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DIGLETTS_CAVE", + "id": "MAPSEC_DIGLETTS_CAVE", "name": "DIGLETT'S CAVE", "x": 0, "y": 0, @@ -1061,7 +1061,7 @@ "height": 1 }, { - "map_section": "MAPSEC_KANTO_VICTORY_ROAD", + "id": "MAPSEC_KANTO_VICTORY_ROAD", "name": "VICTORY ROAD", "name_clone": true, "x": 0, @@ -1070,7 +1070,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROCKET_HIDEOUT", + "id": "MAPSEC_ROCKET_HIDEOUT", "name": "ROCKET HIDEOUT", "x": 0, "y": 0, @@ -1078,7 +1078,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SILPH_CO", + "id": "MAPSEC_SILPH_CO", "name": "SILPH CO.", "x": 0, "y": 0, @@ -1086,7 +1086,7 @@ "height": 1 }, { - "map_section": "MAPSEC_POKEMON_MANSION", + "id": "MAPSEC_POKEMON_MANSION", "name": "POKΓ©MON MANSION", "x": 0, "y": 0, @@ -1094,7 +1094,7 @@ "height": 1 }, { - "map_section": "MAPSEC_KANTO_SAFARI_ZONE", + "id": "MAPSEC_KANTO_SAFARI_ZONE", "name": "SAFARI ZONE", "name_clone": true, "x": 0, @@ -1103,7 +1103,7 @@ "height": 1 }, { - "map_section": "MAPSEC_POKEMON_LEAGUE", + "id": "MAPSEC_POKEMON_LEAGUE", "name": "POKΓ©MON LEAGUE", "x": 0, "y": 0, @@ -1111,7 +1111,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROCK_TUNNEL", + "id": "MAPSEC_ROCK_TUNNEL", "name": "ROCK TUNNEL", "x": 0, "y": 0, @@ -1119,7 +1119,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEAFOAM_ISLANDS", + "id": "MAPSEC_SEAFOAM_ISLANDS", "name": "SEAFOAM ISLANDS", "x": 0, "y": 0, @@ -1127,7 +1127,7 @@ "height": 1 }, { - "map_section": "MAPSEC_POKEMON_TOWER", + "id": "MAPSEC_POKEMON_TOWER", "name": "POKΓ©MON TOWER", "x": 0, "y": 0, @@ -1135,7 +1135,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CERULEAN_CAVE", + "id": "MAPSEC_CERULEAN_CAVE", "name": "CERULEAN CAVE", "x": 0, "y": 0, @@ -1143,7 +1143,7 @@ "height": 1 }, { - "map_section": "MAPSEC_POWER_PLANT", + "id": "MAPSEC_POWER_PLANT", "name": "POWER PLANT", "x": 0, "y": 0, @@ -1151,7 +1151,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ONE_ISLAND", + "id": "MAPSEC_ONE_ISLAND", "name": "ONE ISLAND", "x": 0, "y": 0, @@ -1159,7 +1159,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TWO_ISLAND", + "id": "MAPSEC_TWO_ISLAND", "name": "TWO ISLAND", "x": 0, "y": 0, @@ -1167,7 +1167,7 @@ "height": 1 }, { - "map_section": "MAPSEC_THREE_ISLAND", + "id": "MAPSEC_THREE_ISLAND", "name": "THREE ISLAND", "x": 0, "y": 0, @@ -1175,7 +1175,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FOUR_ISLAND", + "id": "MAPSEC_FOUR_ISLAND", "name": "FOUR ISLAND", "x": 0, "y": 0, @@ -1183,7 +1183,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FIVE_ISLAND", + "id": "MAPSEC_FIVE_ISLAND", "name": "FIVE ISLAND", "x": 0, "y": 0, @@ -1191,7 +1191,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVEN_ISLAND", + "id": "MAPSEC_SEVEN_ISLAND", "name": "SEVEN ISLAND", "x": 0, "y": 0, @@ -1199,7 +1199,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SIX_ISLAND", + "id": "MAPSEC_SIX_ISLAND", "name": "SIX ISLAND", "x": 0, "y": 0, @@ -1207,7 +1207,7 @@ "height": 1 }, { - "map_section": "MAPSEC_KINDLE_ROAD", + "id": "MAPSEC_KINDLE_ROAD", "name": "KINDLE ROAD", "x": 0, "y": 0, @@ -1215,7 +1215,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TREASURE_BEACH", + "id": "MAPSEC_TREASURE_BEACH", "name": "TREASURE BEACH", "x": 0, "y": 0, @@ -1223,7 +1223,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CAPE_BRINK", + "id": "MAPSEC_CAPE_BRINK", "name": "CAPE BRINK", "x": 0, "y": 0, @@ -1231,7 +1231,7 @@ "height": 1 }, { - "map_section": "MAPSEC_BOND_BRIDGE", + "id": "MAPSEC_BOND_BRIDGE", "name": "BOND BRIDGE", "x": 0, "y": 0, @@ -1239,7 +1239,7 @@ "height": 1 }, { - "map_section": "MAPSEC_THREE_ISLE_PORT", + "id": "MAPSEC_THREE_ISLE_PORT", "name": "THREE ISLE PORT", "x": 0, "y": 0, @@ -1247,7 +1247,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_6", + "id": "MAPSEC_SEVII_ISLE_6", "name": "SEVII ISLE 6", "x": 0, "y": 0, @@ -1255,7 +1255,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_7", + "id": "MAPSEC_SEVII_ISLE_7", "name": "SEVII ISLE 7", "x": 0, "y": 0, @@ -1263,7 +1263,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_8", + "id": "MAPSEC_SEVII_ISLE_8", "name": "SEVII ISLE 8", "x": 0, "y": 0, @@ -1271,7 +1271,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_9", + "id": "MAPSEC_SEVII_ISLE_9", "name": "SEVII ISLE 9", "x": 0, "y": 0, @@ -1279,7 +1279,7 @@ "height": 1 }, { - "map_section": "MAPSEC_RESORT_GORGEOUS", + "id": "MAPSEC_RESORT_GORGEOUS", "name": "RESORT GORGEOUS", "x": 0, "y": 0, @@ -1287,7 +1287,7 @@ "height": 1 }, { - "map_section": "MAPSEC_WATER_LABYRINTH", + "id": "MAPSEC_WATER_LABYRINTH", "name": "WATER LABYRINTH", "x": 0, "y": 0, @@ -1295,7 +1295,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FIVE_ISLE_MEADOW", + "id": "MAPSEC_FIVE_ISLE_MEADOW", "name": "FIVE ISLE MEADOW", "x": 0, "y": 0, @@ -1303,7 +1303,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MEMORIAL_PILLAR", + "id": "MAPSEC_MEMORIAL_PILLAR", "name": "MEMORIAL PILLAR", "x": 0, "y": 0, @@ -1311,7 +1311,7 @@ "height": 1 }, { - "map_section": "MAPSEC_OUTCAST_ISLAND", + "id": "MAPSEC_OUTCAST_ISLAND", "name": "OUTCAST ISLAND", "x": 0, "y": 0, @@ -1319,7 +1319,7 @@ "height": 1 }, { - "map_section": "MAPSEC_GREEN_PATH", + "id": "MAPSEC_GREEN_PATH", "name": "GREEN PATH", "x": 0, "y": 0, @@ -1327,7 +1327,7 @@ "height": 1 }, { - "map_section": "MAPSEC_WATER_PATH", + "id": "MAPSEC_WATER_PATH", "name": "WATER PATH", "x": 0, "y": 0, @@ -1335,7 +1335,7 @@ "height": 1 }, { - "map_section": "MAPSEC_RUIN_VALLEY", + "id": "MAPSEC_RUIN_VALLEY", "name": "RUIN VALLEY", "x": 0, "y": 0, @@ -1343,7 +1343,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TRAINER_TOWER", + "id": "MAPSEC_TRAINER_TOWER", "name": "TRAINER TOWER", "x": 0, "y": 0, @@ -1351,7 +1351,7 @@ "height": 1 }, { - "map_section": "MAPSEC_CANYON_ENTRANCE", + "id": "MAPSEC_CANYON_ENTRANCE", "name": "CANYON ENTRANCE", "x": 0, "y": 0, @@ -1359,7 +1359,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVAULT_CANYON", + "id": "MAPSEC_SEVAULT_CANYON", "name": "SEVAULT CANYON", "x": 0, "y": 0, @@ -1367,7 +1367,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TANOBY_RUINS", + "id": "MAPSEC_TANOBY_RUINS", "name": "TANOBY RUINS", "x": 0, "y": 0, @@ -1375,7 +1375,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_22", + "id": "MAPSEC_SEVII_ISLE_22", "name": "SEVII ISLE 22", "x": 0, "y": 0, @@ -1383,7 +1383,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_23", + "id": "MAPSEC_SEVII_ISLE_23", "name": "SEVII ISLE 23", "x": 0, "y": 0, @@ -1391,7 +1391,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SEVII_ISLE_24", + "id": "MAPSEC_SEVII_ISLE_24", "name": "SEVII ISLE 24", "x": 0, "y": 0, @@ -1399,7 +1399,7 @@ "height": 1 }, { - "map_section": "MAPSEC_NAVEL_ROCK_FRLG", + "id": "MAPSEC_NAVEL_ROCK_FRLG", "name": "NAVEL ROCK", "x": 0, "y": 0, @@ -1407,7 +1407,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MT_EMBER", + "id": "MAPSEC_MT_EMBER", "name": "MT. EMBER", "x": 0, "y": 0, @@ -1415,7 +1415,7 @@ "height": 1 }, { - "map_section": "MAPSEC_BERRY_FOREST", + "id": "MAPSEC_BERRY_FOREST", "name": "BERRY FOREST", "x": 0, "y": 0, @@ -1423,7 +1423,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ICEFALL_CAVE", + "id": "MAPSEC_ICEFALL_CAVE", "name": "ICEFALL CAVE", "x": 0, "y": 0, @@ -1431,7 +1431,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ROCKET_WAREHOUSE", + "id": "MAPSEC_ROCKET_WAREHOUSE", "name": "ROCKET WAREHOUSE", "x": 0, "y": 0, @@ -1439,7 +1439,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TRAINER_TOWER_2", + "id": "MAPSEC_TRAINER_TOWER_2", "name": "TRAINER TOWER", "name_clone": true, "x": 0, @@ -1448,7 +1448,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DOTTED_HOLE", + "id": "MAPSEC_DOTTED_HOLE", "name": "DOTTED HOLE", "x": 0, "y": 0, @@ -1456,7 +1456,7 @@ "height": 1 }, { - "map_section": "MAPSEC_LOST_CAVE", + "id": "MAPSEC_LOST_CAVE", "name": "LOST CAVE", "x": 0, "y": 0, @@ -1464,7 +1464,7 @@ "height": 1 }, { - "map_section": "MAPSEC_PATTERN_BUSH", + "id": "MAPSEC_PATTERN_BUSH", "name": "PATTERN BUSH", "x": 0, "y": 0, @@ -1472,7 +1472,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ALTERING_CAVE_FRLG", + "id": "MAPSEC_ALTERING_CAVE_FRLG", "name": "ALTERING CAVE", "x": 0, "y": 0, @@ -1480,7 +1480,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TANOBY_CHAMBERS", + "id": "MAPSEC_TANOBY_CHAMBERS", "name": "TANOBY CHAMBERS", "x": 0, "y": 0, @@ -1488,7 +1488,7 @@ "height": 1 }, { - "map_section": "MAPSEC_THREE_ISLE_PATH", + "id": "MAPSEC_THREE_ISLE_PATH", "name": "THREE ISLE PATH", "x": 0, "y": 0, @@ -1496,7 +1496,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TANOBY_KEY", + "id": "MAPSEC_TANOBY_KEY", "name": "TANOBY KEY", "x": 0, "y": 0, @@ -1504,7 +1504,7 @@ "height": 1 }, { - "map_section": "MAPSEC_BIRTH_ISLAND_FRLG", + "id": "MAPSEC_BIRTH_ISLAND_FRLG", "name": "BIRTH ISLAND", "x": 0, "y": 0, @@ -1512,7 +1512,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MONEAN_CHAMBER", + "id": "MAPSEC_MONEAN_CHAMBER", "name": "MONEAN CHAMBER", "x": 0, "y": 0, @@ -1520,7 +1520,7 @@ "height": 1 }, { - "map_section": "MAPSEC_LIPTOO_CHAMBER", + "id": "MAPSEC_LIPTOO_CHAMBER", "name": "LIPTOO CHAMBER", "x": 0, "y": 0, @@ -1528,7 +1528,7 @@ "height": 1 }, { - "map_section": "MAPSEC_WEEPTH_CHAMBER", + "id": "MAPSEC_WEEPTH_CHAMBER", "name": "WEEPTH CHAMBER", "x": 0, "y": 0, @@ -1536,7 +1536,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DILFORD_CHAMBER", + "id": "MAPSEC_DILFORD_CHAMBER", "name": "DILFORD CHAMBER", "x": 0, "y": 0, @@ -1544,7 +1544,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SCUFIB_CHAMBER", + "id": "MAPSEC_SCUFIB_CHAMBER", "name": "SCUFIB CHAMBER", "x": 0, "y": 0, @@ -1552,7 +1552,7 @@ "height": 1 }, { - "map_section": "MAPSEC_RIXY_CHAMBER", + "id": "MAPSEC_RIXY_CHAMBER", "name": "RIXY CHAMBER", "x": 0, "y": 0, @@ -1560,7 +1560,7 @@ "height": 1 }, { - "map_section": "MAPSEC_VIAPOIS_CHAMBER", + "id": "MAPSEC_VIAPOIS_CHAMBER", "name": "VIAPOIS CHAMBER", "x": 0, "y": 0, @@ -1568,7 +1568,7 @@ "height": 1 }, { - "map_section": "MAPSEC_EMBER_SPA", + "id": "MAPSEC_EMBER_SPA", "name": "EMBER SPA", "x": 0, "y": 0, @@ -1576,7 +1576,7 @@ "height": 1 }, { - "map_section": "MAPSEC_SPECIAL_AREA", + "id": "MAPSEC_SPECIAL_AREA", "name": "SPECIAL AREA", "x": 0, "y": 0, @@ -1584,7 +1584,7 @@ "height": 1 }, { - "map_section": "MAPSEC_AQUA_HIDEOUT", + "id": "MAPSEC_AQUA_HIDEOUT", "name": "AQUA HIDEOUT", "x": 19, "y": 3, @@ -1592,7 +1592,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MAGMA_HIDEOUT", + "id": "MAPSEC_MAGMA_HIDEOUT", "name": "MAGMA HIDEOUT", "x": 6, "y": 3, @@ -1600,7 +1600,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MIRAGE_TOWER", + "id": "MAPSEC_MIRAGE_TOWER", "name": "MIRAGE TOWER", "x": 8, "y": 2, @@ -1608,7 +1608,7 @@ "height": 1 }, { - "map_section": "MAPSEC_BIRTH_ISLAND", + "id": "MAPSEC_BIRTH_ISLAND", "name": "BIRTH ISLAND", "x": 0, "y": 0, @@ -1616,7 +1616,7 @@ "height": 1 }, { - "map_section": "MAPSEC_FARAWAY_ISLAND", + "id": "MAPSEC_FARAWAY_ISLAND", "name": "FARAWAY ISLAND", "x": 0, "y": 0, @@ -1624,7 +1624,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ARTISAN_CAVE", + "id": "MAPSEC_ARTISAN_CAVE", "name": "ARTISAN CAVE", "x": 22, "y": 12, @@ -1632,7 +1632,7 @@ "height": 1 }, { - "map_section": "MAPSEC_MARINE_CAVE", + "id": "MAPSEC_MARINE_CAVE", "name": "MARINE CAVE", "x": 0, "y": 0, @@ -1640,7 +1640,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_MARINE_CAVE", + "id": "MAPSEC_UNDERWATER_MARINE_CAVE", "name": "UNDERWATER", "x": 0, "y": 0, @@ -1648,7 +1648,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TERRA_CAVE", + "id": "MAPSEC_TERRA_CAVE", "name": "TERRA CAVE", "x": 0, "y": 0, @@ -1656,7 +1656,7 @@ "height": 1 }, { - "map_section": "MAPSEC_UNDERWATER_105", + "id": "MAPSEC_UNDERWATER_105", "name": "UNDERWATER", "x": 0, "y": 10, @@ -1664,7 +1664,7 @@ "height": 3 }, { - "map_section": "MAPSEC_UNDERWATER_125", + "id": "MAPSEC_UNDERWATER_125", "name": "UNDERWATER", "x": 24, "y": 3, @@ -1672,7 +1672,7 @@ "height": 2 }, { - "map_section": "MAPSEC_UNDERWATER_129", + "id": "MAPSEC_UNDERWATER_129", "name": "UNDERWATER", "x": 24, "y": 10, @@ -1680,7 +1680,7 @@ "height": 1 }, { - "map_section": "MAPSEC_DESERT_UNDERPASS", + "id": "MAPSEC_DESERT_UNDERPASS", "name": "DESERT UNDERPASS", "x": 2, "y": 0, @@ -1688,7 +1688,7 @@ "height": 1 }, { - "map_section": "MAPSEC_ALTERING_CAVE", + "id": "MAPSEC_ALTERING_CAVE", "name": "ALTERING CAVE", "x": 6, "y": 8, @@ -1696,7 +1696,7 @@ "height": 1 }, { - "map_section": "MAPSEC_NAVEL_ROCK", + "id": "MAPSEC_NAVEL_ROCK", "name": "NAVEL ROCK", "x": 0, "y": 0, @@ -1704,7 +1704,7 @@ "height": 1 }, { - "map_section": "MAPSEC_TRAINER_HILL", + "id": "MAPSEC_TRAINER_HILL", "name": "TRAINER HILL", "x": 8, "y": 4, diff --git a/src/data/region_map/region_map_sections.json.txt b/src/data/region_map/region_map_sections.json.txt index e9c372cb54..b73f992d6d 100644 --- a/src/data/region_map/region_map_sections.json.txt +++ b/src/data/region_map/region_map_sections.json.txt @@ -3,21 +3,25 @@ #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 %} +{% if existsIn(map_section, "name") and isEmptyString(getVar(map_section.name)) and not existsIn(map_section, "name_clone") %}{{ setVar(map_section.name, map_section.id) }}{% endif %} ## endfor ## for map_section in map_sections -{% if getVar(map_section.name) == map_section.map_section %} +{% if existsIn(map_section, "name") %} +{% if getVar(map_section.name) == map_section.id %} static const u8 sMapName_{{ cleanString(map_section.name) }}[] = _("{{ map_section.name }}"); {% endif %} {% if existsIn(map_section, "name_clone") %} static const u8 sMapName_{{ cleanString(map_section.name) }}_Clone[] = _("{{ map_section.name }}"); {% endif %} +{% endif %} ## endfor const struct RegionMapLocation gRegionMapEntries[] = { ## for map_section in map_sections - [{{ map_section.map_section }}] = { {{ map_section.x }}, {{ map_section.y }}, {{ map_section.width }}, {{ map_section.height }}, sMapName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %} }, +{% if existsIn(map_section, "x") and existsIn(map_section, "y") and existsIn(map_section, "width") and existsIn(map_section, "height") and existsIn(map_section, "name") %} + [{{ map_section.id }}] = { {{ map_section.x }}, {{ map_section.y }}, {{ map_section.width }}, {{ map_section.height }}, sMapName_{{ cleanString(map_section.name) }}{% if existsIn(map_section, "name_clone") %}_Clone{% endif %} }, +{% endif %} ## endfor }; From 039bc0254674cac0eea7a3dbb3c1f94a8f33df47 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Tue, 12 Nov 2024 22:28:01 -0500 Subject: [PATCH 014/187] Use size constants for MAPSEC popup theme array --- src/map_name_popup.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index d004b18d56..6ecd923eb9 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -69,7 +69,10 @@ static const u16 sMapPopUp_PaletteTable[][16] = static const u16 sMapPopUp_Palette_Underwater[16] = INCBIN_U16("graphics/map_popup/underwater.gbapal"); -static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping[] = +// -1 in the size excludes MAPSEC_NONE. +// The MAPSEC values for Kanto (between MAPSEC_DYNAMIC and MAPSEC_AQUA_HIDEOUT) are also excluded, +// and this is then handled by subtracting KANTO_MAPSEC_COUNT here and in LoadMapNamePopUpWindowBg. +static const u8 sMapSectionToThemeId[MAPSEC_COUNT - KANTO_MAPSEC_COUNT - 1] = { [MAPSEC_LITTLEROOT_TOWN] = MAPPOPUP_THEME_WOOD, [MAPSEC_OLDALE_TOWN] = MAPPOPUP_THEME_WOOD, @@ -174,7 +177,7 @@ static const u8 sRegionMapSectionId_To_PopUpThemeIdMapping[] = [MAPSEC_DESERT_UNDERPASS - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, [MAPSEC_ALTERING_CAVE - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, [MAPSEC_NAVEL_ROCK - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_STONE, - [MAPSEC_TRAINER_HILL - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_MARBLE + [MAPSEC_TRAINER_HILL - KANTO_MAPSEC_COUNT] = MAPPOPUP_THEME_MARBLE, }; static const u8 sText_PyramidFloor1[] = _("PYRAMID FLOOR 1"); @@ -410,7 +413,7 @@ static void LoadMapNamePopUpWindowBg(void) else regionMapSectionId = 0; // Discard kanto region sections; } - popUpThemeId = sRegionMapSectionId_To_PopUpThemeIdMapping[regionMapSectionId]; + popUpThemeId = sMapSectionToThemeId[regionMapSectionId]; LoadBgTiles(GetWindowAttribute(popupWindowId, WINDOW_BG), sMapPopUp_OutlineTable[popUpThemeId], 0x400, 0x21D); CallWindowFunction(popupWindowId, DrawMapNamePopUpFrame); From cdadd7d2ed7c59a639679daa7d7906442f265612 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Mon, 3 Feb 2025 20:18:34 -0500 Subject: [PATCH 015/187] Generate heal location constants automatically, move data back to a single file. --- data/maps/BattleFrontier_OutsideEast/map.json | 7 - data/maps/DewfordTown/map.json | 7 - data/maps/EverGrandeCity/map.json | 12 -- data/maps/FallarborTown/map.json | 7 - data/maps/FortreeCity/map.json | 7 - data/maps/LavaridgeTown/map.json | 7 - data/maps/LilycoveCity/map.json | 7 - data/maps/LittlerootTown/map.json | 12 -- .../LittlerootTown_BrendansHouse_2F/map.json | 7 - .../maps/LittlerootTown_MaysHouse_2F/map.json | 7 - data/maps/MauvilleCity/map.json | 7 - data/maps/MossdeepCity/map.json | 7 - data/maps/OldaleTown/map.json | 7 - data/maps/PacifidlogTown/map.json | 7 - data/maps/PetalburgCity/map.json | 7 - data/maps/RustboroCity/map.json | 7 - data/maps/SlateportCity/map.json | 7 - data/maps/SootopolisCity/map.json | 7 - data/maps/SouthernIsland_Exterior/map.json | 7 - data/maps/VerdanturfTown/map.json | 7 - include/constants/.gitignore | 1 + include/constants/heal_locations.h | 30 ---- json_data_rules.mk | 10 ++ map_data_rules.mk | 12 +- src/data/heal_locations.constants.json.txt | 14 ++ src/data/heal_locations.json | 136 ++++++++++++++++++ src/data/heal_locations.json.txt | 28 ++++ tools/mapjson/mapjson.cpp | 67 +-------- 28 files changed, 199 insertions(+), 249 deletions(-) delete mode 100644 include/constants/heal_locations.h create mode 100644 src/data/heal_locations.constants.json.txt create mode 100644 src/data/heal_locations.json create mode 100644 src/data/heal_locations.json.txt diff --git a/data/maps/BattleFrontier_OutsideEast/map.json b/data/maps/BattleFrontier_OutsideEast/map.json index 06cbfe2d36..ab871be653 100644 --- a/data/maps/BattleFrontier_OutsideEast/map.json +++ b/data/maps/BattleFrontier_OutsideEast/map.json @@ -526,12 +526,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "Common_EventScript_ShowPokemonCenterSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST", - "x": 3, - "y": 52 - } ] } diff --git a/data/maps/DewfordTown/map.json b/data/maps/DewfordTown/map.json index ec2e879561..ac958202a8 100644 --- a/data/maps/DewfordTown/map.json +++ b/data/maps/DewfordTown/map.json @@ -172,12 +172,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "DewfordTown_EventScript_HallSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_DEWFORD_TOWN", - "x": 2, - "y": 11 - } ] } diff --git a/data/maps/EverGrandeCity/map.json b/data/maps/EverGrandeCity/map.json index ed2d9bb9ce..58978b7ff8 100644 --- a/data/maps/EverGrandeCity/map.json +++ b/data/maps/EverGrandeCity/map.json @@ -192,17 +192,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemonCenterSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_EVER_GRANDE_CITY", - "x": 27, - "y": 49 - }, - { - "id": "HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE", - "x": 18, - "y": 6 - } ] } diff --git a/data/maps/FallarborTown/map.json b/data/maps/FallarborTown/map.json index 41e55a3ce4..4888640a59 100644 --- a/data/maps/FallarborTown/map.json +++ b/data/maps/FallarborTown/map.json @@ -181,12 +181,5 @@ "item": "ITEM_NUGGET", "flag": "FLAG_HIDDEN_ITEM_FALLARBOR_TOWN_NUGGET" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_FALLARBOR_TOWN", - "x": 14, - "y": 8 - } ] } diff --git a/data/maps/FortreeCity/map.json b/data/maps/FortreeCity/map.json index 39483a94b5..007d8b22d7 100644 --- a/data/maps/FortreeCity/map.json +++ b/data/maps/FortreeCity/map.json @@ -232,12 +232,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemartSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_FORTREE_CITY", - "x": 5, - "y": 7 - } ] } diff --git a/data/maps/LavaridgeTown/map.json b/data/maps/LavaridgeTown/map.json index f039af170c..1009c8c9d9 100644 --- a/data/maps/LavaridgeTown/map.json +++ b/data/maps/LavaridgeTown/map.json @@ -260,12 +260,5 @@ "item": "ITEM_ICE_HEAL", "flag": "FLAG_HIDDEN_ITEM_LAVARIDGE_TOWN_ICE_HEAL" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_LAVARIDGE_TOWN", - "x": 9, - "y": 7 - } ] } diff --git a/data/maps/LilycoveCity/map.json b/data/maps/LilycoveCity/map.json index 4115e31fe3..2eff099ab9 100644 --- a/data/maps/LilycoveCity/map.json +++ b/data/maps/LilycoveCity/map.json @@ -520,12 +520,5 @@ "item": "ITEM_POKE_BALL", "flag": "FLAG_HIDDEN_ITEM_LILYCOVE_CITY_POKE_BALL" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_LILYCOVE_CITY", - "x": 24, - "y": 15 - } ] } diff --git a/data/maps/LittlerootTown/map.json b/data/maps/LittlerootTown/map.json index e897b714a4..f5c8c7846d 100644 --- a/data/maps/LittlerootTown/map.json +++ b/data/maps/LittlerootTown/map.json @@ -268,17 +268,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LittlerootTown_EventScript_MaysHouseSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE", - "x": 5, - "y": 9 - }, - { - "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE", - "x": 14, - "y": 9 - } ] } diff --git a/data/maps/LittlerootTown_BrendansHouse_2F/map.json b/data/maps/LittlerootTown_BrendansHouse_2F/map.json index 5bd46deeb9..9b3852767a 100644 --- a/data/maps/LittlerootTown_BrendansHouse_2F/map.json +++ b/data/maps/LittlerootTown_BrendansHouse_2F/map.json @@ -268,12 +268,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "PlayersHouse_2F_EventScript_GameCube" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", - "x": 4, - "y": 2 - } ] } diff --git a/data/maps/LittlerootTown_MaysHouse_2F/map.json b/data/maps/LittlerootTown_MaysHouse_2F/map.json index 02d5ab06db..3cec7006c1 100644 --- a/data/maps/LittlerootTown_MaysHouse_2F/map.json +++ b/data/maps/LittlerootTown_MaysHouse_2F/map.json @@ -268,12 +268,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "LittlerootTown_MaysHouse_2F_EventScript_PC" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F", - "x": 4, - "y": 2 - } ] } diff --git a/data/maps/MauvilleCity/map.json b/data/maps/MauvilleCity/map.json index b6340a2715..cac4bf8067 100644 --- a/data/maps/MauvilleCity/map.json +++ b/data/maps/MauvilleCity/map.json @@ -299,12 +299,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "MauvilleCity_EventScript_GameCornerSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_MAUVILLE_CITY", - "x": 22, - "y": 6 - } ] } diff --git a/data/maps/MossdeepCity/map.json b/data/maps/MossdeepCity/map.json index 993f0c5520..446d2b9966 100644 --- a/data/maps/MossdeepCity/map.json +++ b/data/maps/MossdeepCity/map.json @@ -487,12 +487,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "MossdeepCity_EventScript_WhiteRock" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_MOSSDEEP_CITY", - "x": 28, - "y": 17 - } ] } diff --git a/data/maps/OldaleTown/map.json b/data/maps/OldaleTown/map.json index 991d2e50ca..d368e0bcbf 100644 --- a/data/maps/OldaleTown/map.json +++ b/data/maps/OldaleTown/map.json @@ -195,12 +195,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemartSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_OLDALE_TOWN", - "x": 6, - "y": 17 - } ] } diff --git a/data/maps/PacifidlogTown/map.json b/data/maps/PacifidlogTown/map.json index e1f5700f17..37cfe8ad08 100644 --- a/data/maps/PacifidlogTown/map.json +++ b/data/maps/PacifidlogTown/map.json @@ -135,12 +135,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "Common_EventScript_ShowPokemonCenterSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_PACIFIDLOG_TOWN", - "x": 8, - "y": 16 - } ] } diff --git a/data/maps/PetalburgCity/map.json b/data/maps/PetalburgCity/map.json index 57238192dc..3d9f2cc361 100644 --- a/data/maps/PetalburgCity/map.json +++ b/data/maps/PetalburgCity/map.json @@ -331,12 +331,5 @@ "item": "ITEM_RARE_CANDY", "flag": "FLAG_HIDDEN_ITEM_PETALBURG_CITY_RARE_CANDY" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_PETALBURG_CITY", - "x": 20, - "y": 17 - } ] } diff --git a/data/maps/RustboroCity/map.json b/data/maps/RustboroCity/map.json index 49f8a7d601..b4eadc2a77 100644 --- a/data/maps/RustboroCity/map.json +++ b/data/maps/RustboroCity/map.json @@ -603,12 +603,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "RustboroCity_EventScript_CuttersHouseSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_RUSTBORO_CITY", - "x": 16, - "y": 39 - } ] } diff --git a/data/maps/SlateportCity/map.json b/data/maps/SlateportCity/map.json index 90835cef3b..aa281c6bb8 100644 --- a/data/maps/SlateportCity/map.json +++ b/data/maps/SlateportCity/map.json @@ -702,12 +702,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_NORTH", "script": "SlateportCity_EventScript_BerryCrushRankingsSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_SLATEPORT_CITY", - "x": 19, - "y": 20 - } ] } diff --git a/data/maps/SootopolisCity/map.json b/data/maps/SootopolisCity/map.json index d1d9242a57..35bd4d51eb 100644 --- a/data/maps/SootopolisCity/map.json +++ b/data/maps/SootopolisCity/map.json @@ -409,12 +409,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SootopolisCity_EventScript_CitySign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_SOOTOPOLIS_CITY", - "x": 43, - "y": 32 - } ] } diff --git a/data/maps/SouthernIsland_Exterior/map.json b/data/maps/SouthernIsland_Exterior/map.json index d7cdb1238a..f6775f2483 100644 --- a/data/maps/SouthernIsland_Exterior/map.json +++ b/data/maps/SouthernIsland_Exterior/map.json @@ -69,12 +69,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "SouthernIsland_Exterior_EventScript_Sign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR", - "x": 15, - "y": 20 - } ] } diff --git a/data/maps/VerdanturfTown/map.json b/data/maps/VerdanturfTown/map.json index 60e9d1b9be..1b29ea7153 100644 --- a/data/maps/VerdanturfTown/map.json +++ b/data/maps/VerdanturfTown/map.json @@ -196,12 +196,5 @@ "player_facing_dir": "BG_EVENT_PLAYER_FACING_ANY", "script": "VerdanturfTown_EventScript_RusturfTunnelSign" } - ], - "heal_locations": [ - { - "id": "HEAL_LOCATION_VERDANTURF_TOWN", - "x": 16, - "y": 4 - } ] } diff --git a/include/constants/.gitignore b/include/constants/.gitignore index ff77d833c7..5923892b4f 100644 --- a/include/constants/.gitignore +++ b/include/constants/.gitignore @@ -3,3 +3,4 @@ map_groups.h layouts.h region_map_sections.h map_event_ids.h +heal_locations.h diff --git a/include/constants/heal_locations.h b/include/constants/heal_locations.h deleted file mode 100644 index 4a9771d810..0000000000 --- a/include/constants/heal_locations.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H -#define GUARD_CONSTANTS_HEAL_LOCATIONS_H - -enum { - HEAL_LOCATION_NONE, - HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F, - HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F, - HEAL_LOCATION_PETALBURG_CITY, - HEAL_LOCATION_SLATEPORT_CITY, - HEAL_LOCATION_MAUVILLE_CITY, - HEAL_LOCATION_RUSTBORO_CITY, - HEAL_LOCATION_FORTREE_CITY, - HEAL_LOCATION_LILYCOVE_CITY, - HEAL_LOCATION_MOSSDEEP_CITY, - HEAL_LOCATION_SOOTOPOLIS_CITY, - HEAL_LOCATION_EVER_GRANDE_CITY, - HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE, - HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE, - HEAL_LOCATION_OLDALE_TOWN, - HEAL_LOCATION_DEWFORD_TOWN, - HEAL_LOCATION_LAVARIDGE_TOWN, - HEAL_LOCATION_FALLARBOR_TOWN, - HEAL_LOCATION_VERDANTURF_TOWN, - HEAL_LOCATION_PACIFIDLOG_TOWN, - HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE, - HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR, - HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST, -}; - -#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H diff --git a/json_data_rules.mk b/json_data_rules.mk index 5847914c7c..08a2d00210 100755 --- a/json_data_rules.mk +++ b/json_data_rules.mk @@ -16,3 +16,13 @@ $(C_BUILDDIR)/region_map.o: c_dep += $(DATA_SRC_SUBDIR)/region_map/region_map_en AUTO_GEN_TARGETS += include/constants/region_map_sections.h include/constants/region_map_sections.h: $(DATA_SRC_SUBDIR)/region_map/region_map_sections.json $(DATA_SRC_SUBDIR)/region_map/region_map_sections.constants.json.txt $(JSONPROC) $^ $@ + +AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/heal_locations.h +$(DATA_SRC_SUBDIR)/heal_locations.h: $(DATA_SRC_SUBDIR)/heal_locations.json $(DATA_SRC_SUBDIR)/heal_locations.json.txt + $(JSONPROC) $^ $@ + +$(C_BUILDDIR)/heal_location.o: c_dep += $(DATA_SRC_SUBDIR)/heal_locations.h + +AUTO_GEN_TARGETS += include/constants/heal_locations.h +include/constants/heal_locations.h: $(DATA_SRC_SUBDIR)/heal_locations.json $(DATA_SRC_SUBDIR)/heal_locations.constants.json.txt + $(JSONPROC) $^ $@ diff --git a/map_data_rules.mk b/map_data_rules.mk index 4c255c098b..cad0531689 100755 --- a/map_data_rules.mk +++ b/map_data_rules.mk @@ -12,7 +12,6 @@ INCLUDECONSTS_OUTDIR := include/constants AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/map_groups.h AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/layouts.h AUTO_GEN_TARGETS += $(INCLUDECONSTS_OUTDIR)/map_event_ids.h -AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/heal_locations.h MAP_DIRS := $(dir $(wildcard $(MAPS_DIR)/*/map.json)) MAP_CONNECTIONS := $(patsubst $(MAPS_DIR)/%/,$(MAPS_DIR)/%/connections.inc,$(MAP_DIRS)) @@ -35,11 +34,8 @@ $(MAPS_OUTDIR)/connections.inc $(MAPS_OUTDIR)/groups.inc $(MAPS_OUTDIR)/events.i $(LAYOUTS_OUTDIR)/layouts.inc $(LAYOUTS_OUTDIR)/layouts_table.inc $(INCLUDECONSTS_OUTDIR)/layouts.h: $(LAYOUTS_DIR)/layouts.json $(MAPJSON) layouts emerald $< $(LAYOUTS_OUTDIR) $(INCLUDECONSTS_OUTDIR) -# Generate files that depends on data that's distributed across the map.json files. +# Generate constants for map events, which depend on data that's distributed across the map.json files. # There's a lot of map.json files, so we print an abbreviated output with echo. -# We're also not using a pattern rule, and we only want this to run once for both targets, -# so we use a separate target 'event_constants'. -$(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h: .event_constants ; -.event_constants: $(MAP_JSONS) - @$(MAPJSON) event_constants emerald $^ $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h - @echo "$(MAPJSON) event_constants emerald $(INCLUDECONSTS_OUTDIR)/map_event_ids.h $(DATA_SRC_SUBDIR)/heal_locations.h" +$(INCLUDECONSTS_OUTDIR)/map_event_ids.h: $(MAP_JSONS) + @$(MAPJSON) event_constants emerald $^ $(INCLUDECONSTS_OUTDIR)/map_event_ids.h + @echo "$(MAPJSON) event_constants emerald $(INCLUDECONSTS_OUTDIR)/map_event_ids.h" diff --git a/src/data/heal_locations.constants.json.txt b/src/data/heal_locations.constants.json.txt new file mode 100644 index 0000000000..e9ca860b35 --- /dev/null +++ b/src/data/heal_locations.constants.json.txt @@ -0,0 +1,14 @@ +#ifndef GUARD_CONSTANTS_HEAL_LOCATIONS_H +#define GUARD_CONSTANTS_HEAL_LOCATIONS_H + +{{ doNotModifyHeader }} + +enum { + HEAL_LOCATION_NONE, +## for heal_location in heal_locations + {{ heal_location.id }}, +## endfor + NUM_HEAL_LOCATIONS +}; + +#endif // GUARD_CONSTANTS_HEAL_LOCATIONS_H diff --git a/src/data/heal_locations.json b/src/data/heal_locations.json new file mode 100644 index 0000000000..c465ff65c3 --- /dev/null +++ b/src/data/heal_locations.json @@ -0,0 +1,136 @@ +{ + "heal_locations": [ + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", + "map": "MAP_LITTLEROOT_TOWN_BRENDANS_HOUSE_2F", + "x": 4, + "y": 2 + }, + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE_2F", + "map": "MAP_LITTLEROOT_TOWN_MAYS_HOUSE_2F", + "x": 4, + "y": 2 + }, + { + "id": "HEAL_LOCATION_PETALBURG_CITY", + "map": "MAP_PETALBURG_CITY", + "x": 20, + "y": 17 + }, + { + "id": "HEAL_LOCATION_SLATEPORT_CITY", + "map": "MAP_SLATEPORT_CITY", + "x": 19, + "y": 20 + }, + { + "id": "HEAL_LOCATION_MAUVILLE_CITY", + "map": "MAP_MAUVILLE_CITY", + "x": 22, + "y": 6 + }, + { + "id": "HEAL_LOCATION_RUSTBORO_CITY", + "map": "MAP_RUSTBORO_CITY", + "x": 16, + "y": 39 + }, + { + "id": "HEAL_LOCATION_FORTREE_CITY", + "map": "MAP_FORTREE_CITY", + "x": 5, + "y": 7 + }, + { + "id": "HEAL_LOCATION_LILYCOVE_CITY", + "map": "MAP_LILYCOVE_CITY", + "x": 24, + "y": 15 + }, + { + "id": "HEAL_LOCATION_MOSSDEEP_CITY", + "map": "MAP_MOSSDEEP_CITY", + "x": 28, + "y": 17 + }, + { + "id": "HEAL_LOCATION_SOOTOPOLIS_CITY", + "map": "MAP_SOOTOPOLIS_CITY", + "x": 43, + "y": 32 + }, + { + "id": "HEAL_LOCATION_EVER_GRANDE_CITY", + "map": "MAP_EVER_GRANDE_CITY", + "x": 27, + "y": 49 + }, + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_BRENDANS_HOUSE", + "map": "MAP_LITTLEROOT_TOWN", + "x": 5, + "y": 9 + }, + { + "id": "HEAL_LOCATION_LITTLEROOT_TOWN_MAYS_HOUSE", + "map": "MAP_LITTLEROOT_TOWN", + "x": 14, + "y": 9 + }, + { + "id": "HEAL_LOCATION_OLDALE_TOWN", + "map": "MAP_OLDALE_TOWN", + "x": 6, + "y": 17 + }, + { + "id": "HEAL_LOCATION_DEWFORD_TOWN", + "map": "MAP_DEWFORD_TOWN", + "x": 2, + "y": 11 + }, + { + "id": "HEAL_LOCATION_LAVARIDGE_TOWN", + "map": "MAP_LAVARIDGE_TOWN", + "x": 9, + "y": 7 + }, + { + "id": "HEAL_LOCATION_FALLARBOR_TOWN", + "map": "MAP_FALLARBOR_TOWN", + "x": 14, + "y": 8 + }, + { + "id": "HEAL_LOCATION_VERDANTURF_TOWN", + "map": "MAP_VERDANTURF_TOWN", + "x": 16, + "y": 4 + }, + { + "id": "HEAL_LOCATION_PACIFIDLOG_TOWN", + "map": "MAP_PACIFIDLOG_TOWN", + "x": 8, + "y": 16 + }, + { + "id": "HEAL_LOCATION_EVER_GRANDE_CITY_POKEMON_LEAGUE", + "map": "MAP_EVER_GRANDE_CITY", + "x": 18, + "y": 6 + }, + { + "id": "HEAL_LOCATION_SOUTHERN_ISLAND_EXTERIOR", + "map": "MAP_SOUTHERN_ISLAND_EXTERIOR", + "x": 15, + "y": 20 + }, + { + "id": "HEAL_LOCATION_BATTLE_FRONTIER_OUTSIDE_EAST", + "map": "MAP_BATTLE_FRONTIER_OUTSIDE_EAST", + "x": 3, + "y": 52 + } + ] +} diff --git a/src/data/heal_locations.json.txt b/src/data/heal_locations.json.txt new file mode 100644 index 0000000000..fd63228e33 --- /dev/null +++ b/src/data/heal_locations.json.txt @@ -0,0 +1,28 @@ +{{ doNotModifyHeader }} + +static const struct HealLocation sHealLocations[NUM_HEAL_LOCATIONS - 1] = { +## for heal_location in heal_locations + [{{ heal_location.id }} - 1] = { + .mapGroup = MAP_GROUP({{ heal_location.map }}), + .mapNum = MAP_NUM({{ heal_location.map }}), + .x = {{ heal_location.x }}, + .y = {{ heal_location.y }}, + }, +## endfor +}; + +static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] = { +## for heal_location in heal_locations +{% if existsIn(heal_location, "respawn_map") %} + [{{ heal_location.id }} - 1] = { MAP_GROUP({{ heal_location.respawn_map }}), MAP_NUM({{ heal_location.respawn_map }})}, +{% endif %} +## endfor +}; + +static const u8 sWhiteoutRespawnHealerNpcIds[] = { +## for heal_location in heal_locations +{% if existsIn(heal_location, "respawn_npc") %} + [{{ heal_location.id }} - 1] = {{ heal_location.respawn_npc }}, +{% endif %} +## endfor +}; diff --git a/tools/mapjson/mapjson.cpp b/tools/mapjson/mapjson.cpp index 99b67d82ea..8d8ec4e4e6 100644 --- a/tools/mapjson/mapjson.cpp +++ b/tools/mapjson/mapjson.cpp @@ -391,18 +391,13 @@ void process_map(string map_filepath, string layouts_filepath, string output_dir write_text_file(out_dir + "connections.inc", connections_text); } -void process_event_constants(const vector &map_filepaths, string output_ids_file, string output_heal_locations_file) { +void process_event_constants(const vector &map_filepaths, string output_ids_file) { string warning = get_generated_warning("data/maps/*/map.json", false); - ostringstream heal_locations_arr_text; - ostringstream respawn_maps_arr_text; - ostringstream respawn_npcs_arr_text; - string guard_name = "CONSTANTS_MAP_EVENT_IDS"; ostringstream ids_file_text; ids_file_text << get_include_guard_start(guard_name) << warning; - // Get heal location data from each map for (const string &filepath : map_filepaths) { string err; string map_json_text = read_text_file(filepath); @@ -432,59 +427,10 @@ void process_event_constants(const vector &map_filepaths, string output_ if (!temp.empty()) { ids_file_text << "// " << map_id << "\n" << temp << "\n"; } - - // Process heal locations. Maps are not required to have a heal locations array, so we check if it exists first. - if (map_data.object_items().find("heal_locations") != map_data.object_items().end()) { - for (auto &heal_location : map_data["heal_locations"].array_items()) { - // Each array is indexed with the heal location's ID, e.g. '[HEAL_LOCATION_NAME - 1] = ' - string index_text = "\t[" + json_to_string(heal_location, "id") + " - 1] ="; - - // Add element to main heal locations array - heal_locations_arr_text << index_text << "\n\t{\n" - << "\t\t.mapGroup = MAP_GROUP(" << map_id << "),\n" - << "\t\t.mapNum = MAP_NUM(" << map_id << "),\n" - << "\t\t.x = " << json_to_string(heal_location, "x") << ",\n" - << "\t\t.y = " << json_to_string(heal_location, "y") << ",\n" - << "\t},\n"; - - // Add element to respawn map array (if field is present) - if (heal_location.object_items().find("respawn_map") != heal_location.object_items().end()) { - string respawn_map_id = json_to_string(heal_location, "respawn_map"); - respawn_maps_arr_text << index_text << " {" - << "MAP_GROUP(" << respawn_map_id << "), " - << "MAP_NUM(" << respawn_map_id << ")" - << "},\n"; - } - - // Add element to respawn NPC array (if field is present) - if (heal_location.object_items().find("respawn_npc") != heal_location.object_items().end()) { - respawn_npcs_arr_text << index_text << " " << json_to_string(heal_location, "respawn_npc") << ",\n"; - } - } - } } - // Write event ids file ids_file_text << get_include_guard_end(guard_name); write_text_file(output_ids_file, ids_file_text.str()); - - - // Write heal locations data file - ostringstream heal_locations_file_text; - heal_locations_file_text << warning; - - string arr_body = heal_locations_arr_text.str(); - heal_locations_file_text << "static const struct HealLocation sHealLocations[] =\n{\n" << arr_body << "};\n\n"; - - arr_body = respawn_maps_arr_text.str(); - if (!arr_body.empty()) - heal_locations_file_text << "static const u16 sWhiteoutRespawnHealCenterMapIdxs[][2] =\n{\n" << arr_body << "};\n\n"; - - arr_body = respawn_npcs_arr_text.str(); - if (!arr_body.empty()) - heal_locations_file_text << "static const u8 sWhiteoutRespawnHealerNpcIds[] =\n{\n" << arr_body << "};\n\n"; - - write_text_file(output_heal_locations_file, heal_locations_file_text.str()); } string generate_groups_text(Json groups_data) { @@ -771,21 +717,20 @@ int main(int argc, char *argv[]) { process_layouts(filepath, output_asm, output_c); } else if (mode == "event_constants") { - if (argc < 6) - FATAL_ERROR("USAGE: mapjson event_constants [additional_map_files] "); + if (argc < 5) + FATAL_ERROR("USAGE: mapjson event_constants [additional_map_files] "); infer_separator(argv[3]); vector filepaths; const int firstMapFileArg = 3; - const int lastMapFileArg = argc - 3; + const int lastMapFileArg = argc - 2; for (int i = firstMapFileArg; i <= lastMapFileArg; i++) { filepaths.push_back(argv[i]); } - string output_ids_file(argv[argc - 2]); - string output_heal_locations_file(argv[argc - 1]); + string output_ids_file(argv[argc - 1]); - process_event_constants(filepaths, output_ids_file, output_heal_locations_file); + process_event_constants(filepaths, output_ids_file); } else { FATAL_ERROR("ERROR: must be 'layouts', 'map', 'event_constants', or 'groups'.\n"); From 9dc48899d3baa4052c1072f4813ffe480131e3a7 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 00:13:42 -0400 Subject: [PATCH 016/187] BUFFER_A/B -> BATTLELINKMSGTYPE; link send/recv. task data names Replaced the BUFFER_A and BUFFER_B constants with the BATTLELINKMSGTYPE enum, which also identifies the "controller becoming idle" message type. Named the task data for the link send task and the link receive task. Added macros to functions related to those tasks, for legibility. --- include/battle_controllers.h | 7 +- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 26 +-- src/battle_controller_player.c | 48 ++--- src/battle_controller_player_partner.c | 12 +- src/battle_controller_recorded_opponent.c | 12 +- src/battle_controller_recorded_player.c | 14 +- src/battle_controller_safari.c | 12 +- src/battle_controller_wally.c | 16 +- src/battle_controllers.c | 220 ++++++++++++++-------- src/battle_main.c | 32 ++-- src/battle_script_commands.c | 160 ++++++++-------- src/battle_util.c | 24 +-- src/battle_util2.c | 2 +- 15 files changed, 325 insertions(+), 268 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 6e295a7590..91b4ab1e56 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -66,9 +66,10 @@ enum { // Special arguments for Battle Controller functions. -enum { // Values given to the emit functions to choose gBattleBufferA or gBattleBufferB - BUFFER_A, - BUFFER_B +enum { + BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER = 0, // gBattleBufferA + BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE = 1, // gBattleBufferB + BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE = 2, }; enum { diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 236db2a428..280b1e2103 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -518,7 +518,7 @@ static void LinkOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -548,7 +548,7 @@ static void LinkOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); LinkOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 7a437b958c..7e5eb37e91 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -400,7 +400,7 @@ static void LinkPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -442,7 +442,7 @@ static void LinkPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); LinkPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index c01dcb442f..12603f72bc 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -531,7 +531,7 @@ static void OpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -561,7 +561,7 @@ static void OpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); OpponentBufferExecCompleted(); } @@ -881,7 +881,7 @@ static void OpponentHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleBufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } @@ -1552,7 +1552,7 @@ static void OpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); OpponentBufferExecCompleted(); } else @@ -1569,13 +1569,13 @@ static void OpponentHandleChooseMove(void) switch (chosenMoveId) { case AI_CHOICE_WATCH: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; case AI_CHOICE_FLEE: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_RUN, 0); break; case 6: - BtlController_EmitTwoReturnValues(BUFFER_B, 15, gBattlerTarget); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 15, gBattlerTarget); break; default: if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) @@ -1586,7 +1586,7 @@ static void OpponentHandleChooseMove(void) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); @@ -1601,11 +1601,11 @@ static void OpponentHandleChooseMove(void) } while (move == MOVE_NONE); if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) - BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (gActiveBattler << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); else - BtlController_EmitTwoReturnValues(BUFFER_B, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(); } @@ -1614,7 +1614,7 @@ static void OpponentHandleChooseMove(void) static void OpponentHandleChooseItem(void) { - BtlController_EmitOneReturnValue(BUFFER_B, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); OpponentBufferExecCompleted(); } @@ -1671,7 +1671,7 @@ static void OpponentHandleChoosePokemon(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BUFFER_B, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, chosenMonId, NULL); OpponentBufferExecCompleted(); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e447858fc8..9c4d755110 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -204,7 +204,7 @@ static void PlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -249,16 +249,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: // Top left - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); break; case 1: // Top right - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_ITEM, 0); break; case 2: // Bottom left - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SWITCH, 0); break; case 3: // Bottom right - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_RUN, 0); break; } PlayerBufferExecCompleted(); @@ -319,7 +319,7 @@ static void HandleInputChooseAction(void) return; } PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_CANCEL_PARTNER, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_CANCEL_PARTNER, 0); PlayerBufferExecCompleted(); } } @@ -365,7 +365,7 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - BtlController_EmitTwoReturnValues(BUFFER_B, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } @@ -523,7 +523,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - BtlController_EmitTwoReturnValues(BUFFER_B, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else @@ -543,7 +543,7 @@ static void HandleInputChooseMove(void) else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, 0xFFFF); PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) @@ -1174,7 +1174,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE @@ -1253,7 +1253,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -1361,9 +1361,9 @@ static void WaitForMonSelection(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) - BtlController_EmitChosenMonReturnValue(BUFFER_B, gSelectedMonPartyId, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSelectedMonPartyId, gBattlePartyCurrentOrder); else - BtlController_EmitChosenMonReturnValue(BUFFER_B, PARTY_SIZE, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_SIZE, NULL); if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); @@ -1387,7 +1387,7 @@ static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BUFFER_B, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); PlayerBufferExecCompleted(); } } @@ -1439,9 +1439,9 @@ static void PlayerHandleYesNoInput(void) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(BUFFER_B, 0xE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0xE, 0); else - BtlController_EmitTwoReturnValues(BUFFER_B, 0xD, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0xD, 0); PlayerBufferExecCompleted(); } @@ -1600,7 +1600,7 @@ static void PlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); PlayerBufferExecCompleted(); } @@ -1920,7 +1920,7 @@ void PlayerHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BUFFER_B, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleBufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } @@ -2621,7 +2621,7 @@ static void PlayerChooseMoveInBattlePalace(void) if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); PlayerBufferExecCompleted(); } } @@ -2671,7 +2671,7 @@ static void PlayerHandleChoosePokemon(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) { - BtlController_EmitChosenMonReturnValue(BUFFER_B, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(); } else @@ -2828,25 +2828,25 @@ static void PlayerHandleCmd32(void) static void PlayerHandleTwoReturnValues(void) { - BtlController_EmitTwoReturnValues(BUFFER_B, 0, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0, 0); PlayerBufferExecCompleted(); } static void PlayerHandleChosenMonReturnValue(void) { - BtlController_EmitChosenMonReturnValue(BUFFER_B, 0, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0, NULL); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue(void) { - BtlController_EmitOneReturnValue(BUFFER_B, 0); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue_Duplicate(void) { - BtlController_EmitOneReturnValue_Duplicate(BUFFER_B, 0); + BtlController_EmitOneReturnValue_Duplicate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0); PlayerBufferExecCompleted(); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 307eeca26a..37a72e3aaa 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -332,7 +332,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE @@ -411,7 +411,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BUFFER_B, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -584,7 +584,7 @@ static void PlayerPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -626,7 +626,7 @@ static void PlayerPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); PlayerPartnerBufferExecCompleted(); } @@ -1527,7 +1527,7 @@ static void PlayerPartnerHandleChooseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - BtlController_EmitTwoReturnValues(BUFFER_B, 10, chosenMoveId | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, chosenMoveId | (gBattlerTarget << 8)); PlayerPartnerBufferExecCompleted(); } @@ -1557,7 +1557,7 @@ static void PlayerPartnerHandleChoosePokemon(void) } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BUFFER_B, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, chosenMonId, NULL); PlayerPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 7cb5839bc5..2a04c9d219 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -504,7 +504,7 @@ static void RecordedOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -534,7 +534,7 @@ static void RecordedOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); RecordedOpponentBufferExecCompleted(); } @@ -1402,7 +1402,7 @@ static void RecordedOpponentHandlePrintSelectionString(void) static void RecordedOpponentHandleChooseAction(void) { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedOpponentBufferExecCompleted(); } @@ -1415,13 +1415,13 @@ static void RecordedOpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, moveId | (target << 8)); } RecordedOpponentBufferExecCompleted(); @@ -1435,7 +1435,7 @@ static void RecordedOpponentHandleChooseItem(void) static void RecordedOpponentHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BUFFER_B, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 5a7be7f347..fda899712e 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -475,7 +475,7 @@ static void RecordedPlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -517,7 +517,7 @@ static void RecordedPlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); RecordedPlayerBufferExecCompleted(); } @@ -1414,7 +1414,7 @@ static void ChooseActionInBattlePalace(void) { if (gBattleCommunication[4] >= gBattlersCount / 2) { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1427,7 +1427,7 @@ static void RecordedPlayerHandleChooseAction(void) } else { - BtlController_EmitTwoReturnValues(BUFFER_B, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1441,13 +1441,13 @@ static void RecordedPlayerHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BUFFER_B, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, moveId | (target << 8)); } RecordedPlayerBufferExecCompleted(); @@ -1461,7 +1461,7 @@ static void RecordedPlayerHandleChooseItem(void) static void RecordedPlayerHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BUFFER_B, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedPlayerBufferExecCompleted(); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 157bb6954c..09727b6cfd 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -176,16 +176,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SAFARI_BALL, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_BALL, 0); break; case 1: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SAFARI_POKEBLOCK, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_POKEBLOCK, 0); break; case 2: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SAFARI_GO_NEAR, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_GO_NEAR, 0); break; case 3: - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SAFARI_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_RUN, 0); break; } SafariBufferExecCompleted(); @@ -280,7 +280,7 @@ static void CompleteWhenChosePokeblock(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BUFFER_B, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); SafariBufferExecCompleted(); } } @@ -298,7 +298,7 @@ static void SafariBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 67950b8965..e0dabb23c4 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -196,7 +196,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -207,7 +207,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -217,7 +217,7 @@ static void WallyHandleActions(void) case 3: if (--gBattleStruct->wallyWaitFrames == 0) { - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_WALLY_THROW, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_WALLY_THROW, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -238,7 +238,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_ITEM, 0); WallyBufferExecCompleted(); } break; @@ -278,7 +278,7 @@ static void CompleteOnChosenItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BUFFER_B, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); WallyBufferExecCompleted(); } } @@ -408,7 +408,7 @@ static void WallyBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(2, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -444,7 +444,7 @@ static void WallyHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BUFFER_B, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); WallyBufferExecCompleted(); } @@ -1241,7 +1241,7 @@ static void WallyHandleChooseMove(void) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BUFFER_B, 10, 0x100); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, 0x100); WallyBufferExecCompleted(); } break; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 02276a7e14..8247e278bf 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -659,11 +659,11 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) { switch (bufferId) { - case BUFFER_A: + case BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER: for (i = 0; i < size; data++, i++) gBattleBufferA[gActiveBattler][i] = *data; break; - case BUFFER_B: + case BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE: for (i = 0; i < size; data++, i++) gBattleBufferB[gActiveBattler][i] = *data; break; @@ -671,20 +671,41 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) } } +#define tInitialDelayTimer data[10] +#define tState data[11] +#define tCurrentBlock_WrapFrom data[12] +#define tBlockSendDelayTimer data[13] +#define tCurrentBlock_End data[14] +#define tCurrentBlock_Start data[15] +// +// Inbound communications are stored in one buffer; outbound communications +// in another. Both buffers work pretty similarly: the next message will be +// written into the buffer after the previous message (with 4-byte alignment), +// unless we're too close to the end of the buffer, in which case we jump back +// to the start. +// +// Regarding the task variable names above: these variables are altered in- +// place, so the precise operational definition of "current" depends on when +// the variables are being accessed. When data is present in the send and +// receive buffers, "current" refers to the most recently received message; +// but when a message is actually being placed in the buffers, "current" +// refers to the previous message, until such time that we finish updating it +// to refer to the new message. + 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; + gTasks[sLinkSendTaskId].tState = 0; + gTasks[sLinkSendTaskId].tCurrentBlock_WrapFrom = 0; + gTasks[sLinkSendTaskId].tBlockSendDelayTimer = 0; + gTasks[sLinkSendTaskId].tCurrentBlock_End = 0; + gTasks[sLinkSendTaskId].tCurrentBlock_Start = 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; + gTasks[sLinkReceiveTaskId].tCurrentBlock_WrapFrom = 0; + gTasks[sLinkReceiveTaskId].tBlockSendDelayTimer = 0; // not used by "receive" task + gTasks[sLinkReceiveTaskId].tCurrentBlock_End = 0; + gTasks[sLinkReceiveTaskId].tCurrentBlock_Start = 0; sUnused = 0; } @@ -702,52 +723,72 @@ enum LINK_BUFF_DATA, }; +// We want to send a message. Place it into the "send" buffer. +// First argument is a BATTLELINKMSGTYPE_... 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) + if (gTasks[sLinkSendTaskId].tCurrentBlock_End + alignedSize + LINK_BUFF_DATA + 1 > BATTLE_BUFFER_LINK_SIZE) { - gTasks[sLinkSendTaskId].data[12] = gTasks[sLinkSendTaskId].data[14]; - gTasks[sLinkSendTaskId].data[14] = 0; + gTasks[sLinkSendTaskId].tCurrentBlock_WrapFrom = gTasks[sLinkSendTaskId].tCurrentBlock_End; + gTasks[sLinkSendTaskId].tCurrentBlock_End = 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; + + #define BYTE_TO_SEND(offset) \ + gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].tCurrentBlock_End + offset] + + BYTE_TO_SEND(LINK_BUFF_BUFFER_ID) = bufferId; + BYTE_TO_SEND(LINK_BUFF_ACTIVE_BATTLER) = gActiveBattler; + BYTE_TO_SEND(LINK_BUFF_ATTACKER) = gBattlerAttacker; + BYTE_TO_SEND(LINK_BUFF_TARGET) = gBattlerTarget; + BYTE_TO_SEND(LINK_BUFF_SIZE_LO) = alignedSize; + BYTE_TO_SEND(LINK_BUFF_SIZE_HI) = (alignedSize & 0x0000FF00) >> 8; + BYTE_TO_SEND(LINK_BUFF_ABSENT_BATTLER_FLAGS) = gAbsentBattlerFlags; + BYTE_TO_SEND(LINK_BUFF_EFFECT_BATTLER) = gEffectBattler; for (i = 0; i < size; i++) - gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].data[14] + LINK_BUFF_DATA + i] = data[i]; + BYTE_TO_SEND(LINK_BUFF_DATA + i) = data[i]; + + #undef BYTE_TO_SEND - gTasks[sLinkSendTaskId].data[14] = gTasks[sLinkSendTaskId].data[14] + alignedSize + LINK_BUFF_DATA; + gTasks[sLinkSendTaskId].tCurrentBlock_End = gTasks[sLinkSendTaskId].tCurrentBlock_End + alignedSize + LINK_BUFF_DATA; } +enum { + SENDTASK_STATE_INITIALIZE = 0, + SENDTASK_STATE_INITIAL_DELAY = 1, + SENDTASK_STATE_COUNT_PLAYERS = 2, + SENDTASK_STATE_BEGIN_SEND_BLOCK = 3, + SENDTASK_STATE_FINISH_SEND_BLOCK = 4, + SENDTASK_STATE_UNUSED_STATE = 5, +}; + static void Task_HandleSendLinkBuffersData(u8 taskId) { u16 numPlayers; u16 blockSize; + + #define BYTE_TO_SEND(offset) \ + gLinkBattleSendBuffer[gTasks[taskId].tCurrentBlock_Start + offset] - switch (gTasks[taskId].data[11]) + switch (gTasks[taskId].tState) { - case 0: - gTasks[taskId].data[10] = 100; - gTasks[taskId].data[11]++; + case SENDTASK_STATE_INITIALIZE: + gTasks[taskId].tInitialDelayTimer = 100; + gTasks[taskId].tState++; break; - case 1: - gTasks[taskId].data[10]--; - if (gTasks[taskId].data[10] == 0) - gTasks[taskId].data[11]++; + case SENDTASK_STATE_INITIAL_DELAY: + gTasks[taskId].tInitialDelayTimer--; + if (gTasks[taskId].tInitialDelayTimer == 0) + gTasks[taskId].tState++; break; - case 2: + case SENDTASK_STATE_COUNT_PLAYERS: if (gWirelessCommType) { - gTasks[taskId].data[11]++; + gTasks[taskId].tState++; } else { @@ -761,56 +802,59 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) if (IsLinkMaster()) { CheckShouldAdvanceLinkState(); - gTasks[taskId].data[11]++; + gTasks[taskId].tState++; } else { - gTasks[taskId].data[11]++; + gTasks[taskId].tState++; } } } break; - case 3: - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + case SENDTASK_STATE_BEGIN_SEND_BLOCK: + if (gTasks[taskId].tCurrentBlock_Start != gTasks[taskId].tCurrentBlock_End) { - if (gTasks[taskId].data[13] == 0) + if (gTasks[taskId].tBlockSendDelayTimer == 0) { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + if (gTasks[taskId].tCurrentBlock_Start > gTasks[taskId].tCurrentBlock_End + && gTasks[taskId].tCurrentBlock_Start == gTasks[taskId].tCurrentBlock_WrapFrom) { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; + gTasks[taskId].tCurrentBlock_WrapFrom = 0; + gTasks[taskId].tCurrentBlock_Start = 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]++; + blockSize = (BYTE_TO_SEND(LINK_BUFF_SIZE_LO) | (BYTE_TO_SEND(LINK_BUFF_SIZE_HI) << 8)) + LINK_BUFF_DATA; + SendBlock(BitmaskAllOtherLinkPlayers(), &BYTE_TO_SEND(0), blockSize); + gTasks[taskId].tState++; } else { - gTasks[taskId].data[13]--; + gTasks[taskId].tBlockSendDelayTimer--; break; } } break; - case 4: + case SENDTASK_STATE_FINISH_SEND_BLOCK: 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] = 1; - gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; - gTasks[taskId].data[11] = 3; + blockSize = BYTE_TO_SEND(LINK_BUFF_SIZE_LO) | (BYTE_TO_SEND(LINK_BUFF_SIZE_HI) << 8); + gTasks[taskId].tBlockSendDelayTimer = 1; + gTasks[taskId].tCurrentBlock_Start = gTasks[taskId].tCurrentBlock_Start + blockSize + LINK_BUFF_DATA; + gTasks[taskId].tState = SENDTASK_STATE_BEGIN_SEND_BLOCK; } break; - case 5: - if (--gTasks[taskId].data[13] == 0) + case SENDTASK_STATE_UNUSED_STATE: + if (--gTasks[taskId].tBlockSendDelayTimer == 0) { - gTasks[taskId].data[13] = 1; - gTasks[taskId].data[11] = 3; + gTasks[taskId].tBlockSendDelayTimer = 1; + gTasks[taskId].tState = SENDTASK_STATE_BEGIN_SEND_BLOCK; } break; } + + #undef BYTE_TO_SEND } +// We have received a message. Place it into the "receive" buffer. void TryReceiveLinkBattleData(void) { u8 i; @@ -830,19 +874,19 @@ void TryReceiveLinkBattleData(void) u8 *dest, *src; u16 dataSize = gBlockRecvBuffer[i][2]; - if (gTasks[sLinkReceiveTaskId].data[14] + 9 + dataSize > 0x1000) + if (gTasks[sLinkReceiveTaskId].tCurrentBlock_End + 9 + dataSize > 0x1000) { - gTasks[sLinkReceiveTaskId].data[12] = gTasks[sLinkReceiveTaskId].data[14]; - gTasks[sLinkReceiveTaskId].data[14] = 0; + gTasks[sLinkReceiveTaskId].tCurrentBlock_WrapFrom = gTasks[sLinkReceiveTaskId].tCurrentBlock_End; + gTasks[sLinkReceiveTaskId].tCurrentBlock_End = 0; } - dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].data[14]]; + dest = &gLinkBattleRecvBuffer[gTasks[sLinkReceiveTaskId].tCurrentBlock_End]; src = recvBuffer; for (j = 0; j < dataSize + 8; j++) dest[j] = src[j]; - gTasks[sLinkReceiveTaskId].data[14] = gTasks[sLinkReceiveTaskId].data[14] + dataSize + 8; + gTasks[sLinkReceiveTaskId].tCurrentBlock_End = gTasks[sLinkReceiveTaskId].tCurrentBlock_End + dataSize + 8; } } } @@ -853,49 +897,61 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) { u16 blockSize; u8 battlerId; - u8 var; + u8 playerId; + + #define BYTE_TO_RECEIVE(offset) \ + gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + offset] - if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + if (gTasks[taskId].tCurrentBlock_Start != gTasks[taskId].tCurrentBlock_End) { - if (gTasks[taskId].data[15] > gTasks[taskId].data[14] - && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + if (gTasks[taskId].tCurrentBlock_Start > gTasks[taskId].tCurrentBlock_End + && gTasks[taskId].tCurrentBlock_Start == gTasks[taskId].tCurrentBlock_WrapFrom) { - gTasks[taskId].data[12] = 0; - gTasks[taskId].data[15] = 0; + gTasks[taskId].tCurrentBlock_WrapFrom = 0; + gTasks[taskId].tCurrentBlock_Start = 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); + battlerId = BYTE_TO_RECEIVE(LINK_BUFF_ACTIVE_BATTLER); + blockSize = BYTE_TO_RECEIVE(LINK_BUFF_SIZE_LO) | (BYTE_TO_RECEIVE(LINK_BUFF_SIZE_HI) << 8); - switch (gLinkBattleRecvBuffer[gTasks[taskId].data[15] + 0]) + switch (BYTE_TO_RECEIVE(0)) { - case 0: + case BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER: if (gBattleControllerExecFlags & gBitTable[battlerId]) return; - memcpy(gBattleBufferA[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); + memcpy(gBattleBufferA[battlerId], &BYTE_TO_RECEIVE(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]; + gBattlerAttacker = BYTE_TO_RECEIVE(LINK_BUFF_ATTACKER); + gBattlerTarget = BYTE_TO_RECEIVE(LINK_BUFF_TARGET); + gAbsentBattlerFlags = BYTE_TO_RECEIVE(LINK_BUFF_ABSENT_BATTLER_FLAGS); + gEffectBattler = BYTE_TO_RECEIVE(LINK_BUFF_EFFECT_BATTLER); } break; - case 1: - memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA], blockSize); + case BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE: + memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + LINK_BUFF_DATA], blockSize); break; - case 2: - var = gLinkBattleRecvBuffer[gTasks[taskId].data[15] + LINK_BUFF_DATA]; - gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (var * 4)); + case BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE: + playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); + gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (playerId * 4)); break; } - gTasks[taskId].data[15] = gTasks[taskId].data[15] + blockSize + LINK_BUFF_DATA; + gTasks[taskId].tCurrentBlock_Start = gTasks[taskId].tCurrentBlock_Start + blockSize + LINK_BUFF_DATA; } + + #undef BYTE_TO_RECEIVE } +#undef tInitialDelayTimer +#undef tState +#undef tCurrentBlock_WrapFrom +#undef tBlockSendDelayTimer +#undef tCurrentBlock_End +#undef tCurrentBlock_Start + void BtlController_EmitGetMonData(u8 bufferId, u8 requestId, u8 monToCheck) { sBattleBuffersTransferData[0] = CONTROLLER_GETMONDATA; diff --git a/src/battle_main.c b/src/battle_main.c index 87fa0d3981..46f163586f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3360,7 +3360,7 @@ static void BattleIntroGetMonsData(void) { case 0: gActiveBattler = gBattleCommunication[1]; - BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTIUSE_STATE]++; break; @@ -3382,7 +3382,7 @@ static void BattleIntroPrepareBackgroundSlide(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(0); - BtlController_EmitIntroSlide(BUFFER_A, gBattleEnvironment); + BtlController_EmitIntroSlide(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleEnvironment); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -3513,7 +3513,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); for (i = 0; i < PARTY_SIZE; i++) @@ -3531,7 +3531,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; @@ -3825,7 +3825,7 @@ static void UNUSED BattleIntroSwitchInPlayerMons(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], FALSE); + BtlController_EmitSwitchInAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4165,7 +4165,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseAction(BUFFER_A, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); + BtlController_EmitChooseAction(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } @@ -4214,7 +4214,7 @@ static void HandleTurnActionSelectionState(void) i); } - BtlController_EmitChooseMove(BUFFER_A, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); + BtlController_EmitChooseMove(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4233,7 +4233,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseItem(BUFFER_A, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4243,7 +4243,7 @@ static void HandleTurnActionSelectionState(void) || gBattleTypeFlags & BATTLE_TYPE_ARENA || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { - BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, 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)) @@ -4252,16 +4252,16 @@ static void HandleTurnActionSelectionState(void) || ((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, PARTY_SIZE, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, 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]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 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]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else - BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; @@ -4276,7 +4276,7 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_SAFARI_POKEBLOCK: - BtlController_EmitChooseItem(BUFFER_A, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); break; case B_ACTION_CANCEL_PARTNER: @@ -4471,11 +4471,11 @@ static void HandleTurnActionSelectionState(void) || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])) { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_STOP_BOUNCE, i); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); } else { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_STOP_BOUNCE_ONLY, i); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_STOP_BOUNCE_ONLY, i); } MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9665479140..48951f0732 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1239,7 +1239,7 @@ static void Cmd_ppreduce(void) if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); MarkBattlerForControllerExec(gBattlerAttacker); @@ -1784,7 +1784,7 @@ static void Cmd_attackanimation(void) multihit = gMultiHitCounter; } - BtlController_EmitMoveAnimation(BUFFER_A, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); + BtlController_EmitMoveAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -1829,7 +1829,7 @@ static void Cmd_healthbarupdate(void) else healthValue = maxPossibleDmgValue; - BtlController_EmitHealthBarUpdate(BUFFER_A, healthValue); + BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, healthValue); MarkBattlerForControllerExec(gActiveBattler); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) @@ -1971,7 +1971,7 @@ static void Cmd_datahpupdate(void) gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; // Send updated HP - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } } @@ -2009,11 +2009,11 @@ static void Cmd_effectivenesssound(void) switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: - BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: - BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_DOESNT_AFFECT_FOE: @@ -2026,17 +2026,17 @@ static void Cmd_effectivenesssound(void) default: if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { - BtlController_EmitPlaySE(BUFFER_A, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) { - BtlController_EmitPlaySE(BUFFER_A, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) { - BtlController_EmitPlaySE(BUFFER_A, SE_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -2149,7 +2149,7 @@ static void Cmd_printselectionstring(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPrintSelectionString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -2199,7 +2199,7 @@ static void Cmd_printselectionstringfromtable(void) ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BUFFER_A, *ptr); + BtlController_EmitPrintSelectionString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *ptr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -2485,7 +2485,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBattler = gEffectBattler; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) @@ -2787,11 +2787,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].item = ITEM_NONE; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 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); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2829,7 +2829,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -3036,7 +3036,7 @@ static void Cmd_tryfaintmon(void) 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]); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) @@ -3069,7 +3069,7 @@ static void Cmd_cleareffectsonfaint(void) if (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || gBattleMons[gActiveBattler].hp == 0) { gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } @@ -3438,7 +3438,7 @@ static void Cmd_getexp(void) gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); gActiveBattler = gBattleStruct->expGetterBattlerId; - BtlController_EmitExpUpdate(BUFFER_A, gBattleStruct->expGetterMonId, gBattleMoveDamage); + BtlController_EmitExpUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->expGetterMonId, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); } gBattleScripting.getexpState++; @@ -3937,7 +3937,7 @@ static void Cmd_healthbar_update(void) else gActiveBattler = gBattlerAttacker; - BtlController_EmitHealthBarUpdate(BUFFER_A, gBattleMoveDamage); + BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -4012,7 +4012,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4026,7 +4026,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4036,7 +4036,7 @@ static void Cmd_playanimation(void) } else { - BtlController_EmitBattleAnimation(BUFFER_A, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4056,7 +4056,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4069,7 +4069,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES || *animationIdPtr == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4079,7 +4079,7 @@ static void Cmd_playanimation_var(void) } else { - BtlController_EmitBattleAnimation(BUFFER_A, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4195,7 +4195,7 @@ static void Cmd_playstatchangeanimation(void) } else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) { - BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_STATS_CHANGE, statAnimId); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; @@ -4264,7 +4264,7 @@ static void Cmd_moveend(void) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; @@ -4343,7 +4343,7 @@ static void Cmd_moveend(void) && gHitMarker & HITMARKER_NO_ANIMATIONS) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BUFFER_A, TRUE); + BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattleScripting.moveendState++; return; @@ -4356,7 +4356,7 @@ static void Cmd_moveend(void) || WasUnableToUseMove(gBattlerAttacker)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; @@ -4370,7 +4370,7 @@ static void Cmd_moveend(void) && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; - BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; gBattleScripting.moveendState++; @@ -4597,7 +4597,7 @@ static void Cmd_returnatktoball(void) gActiveBattler = gBattlerAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) { - BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr++; @@ -4612,7 +4612,7 @@ static void Cmd_getswitchedmondata(void) gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); - BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); + BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -4688,7 +4688,7 @@ static void Cmd_switchinanim(void) gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - BtlController_EmitSwitchInAnim(BUFFER_A, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); + BtlController_EmitSwitchInAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -4858,7 +4858,7 @@ static void ChooseMonToSendOut(u8 slotId) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BUFFER_A, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } @@ -4885,7 +4885,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4896,7 +4896,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4924,7 +4924,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 1; } @@ -4946,7 +4946,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 1)) { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4967,7 +4967,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 2; } @@ -4989,7 +4989,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 2)) { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5005,7 +5005,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 0; - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } @@ -5021,7 +5021,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 1; - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5117,7 +5117,7 @@ static void Cmd_openpartyscreen(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BUFFER_A, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 6; @@ -5131,7 +5131,7 @@ static void Cmd_openpartyscreen(void) { if (gActiveBattler != battlerId) { - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5142,7 +5142,7 @@ static void Cmd_openpartyscreen(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; - BtlController_EmitLinkStandbyMsg(BUFFER_A, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5310,7 +5310,7 @@ static void Cmd_trainerslidein(void) static void Cmd_playse(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlaySE(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5319,7 +5319,7 @@ static void Cmd_playse(void) static void Cmd_fanfare(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlayFanfareOrBGM(BUFFER_A, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); + BtlController_EmitPlayFanfareOrBGM(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5337,7 +5337,7 @@ static void Cmd_playfaintcry(void) static void Cmd_endlinkbattle(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitEndLinkBattle(BUFFER_A, gBattleOutcome); + BtlController_EmitEndLinkBattle(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 1; @@ -5346,7 +5346,7 @@ static void Cmd_endlinkbattle(void) static void Cmd_returntoball(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitReturnMonToBall(BUFFER_A, TRUE); + BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5652,7 +5652,7 @@ static void Cmd_updatebattlermoves(void) switch (gBattleCommunication[0]) { case 0: - BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[0]++; break; @@ -5725,7 +5725,7 @@ static void Cmd_drawpartystatussummary(void) } } - BtlController_EmitDrawPartyStatusSummary(BUFFER_A, hpStatuses, 1); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatuses, 1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5759,7 +5759,7 @@ static void Cmd_statusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BUFFER_A, FALSE, gBattleMons[gActiveBattler].status1); + BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE, gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 2; @@ -5778,7 +5778,7 @@ static void Cmd_status2animation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BUFFER_A, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); + BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 6; @@ -5797,7 +5797,7 @@ static void Cmd_chosenstatusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BUFFER_A, gBattlescriptCurrInstr[2], wantedStatus); + BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], wantedStatus); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 7; @@ -5908,7 +5908,7 @@ static void Cmd_removeitem(void) *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = ITEM_NONE; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6217,7 +6217,7 @@ static void Cmd_setatktoplayer0(void) static void Cmd_makevisible(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitSpriteInvisibility(BUFFER_A, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6456,7 +6456,7 @@ static void Cmd_various(void) gActiveBattler = 1; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -6466,7 +6466,7 @@ static void Cmd_various(void) gActiveBattler = 3; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BUFFER_A, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -6491,7 +6491,7 @@ static void Cmd_various(void) gBattleOutcome = B_OUTCOME_MON_TELEPORTED; break; case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - BtlController_EmitPlayFanfareOrBGM(BUFFER_A, MUS_VICTORY_TRAINER, TRUE); + BtlController_EmitPlayFanfareOrBGM(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -6552,7 +6552,7 @@ static void Cmd_tryexplosion(void) // 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); + BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6581,7 +6581,7 @@ static void Cmd_setatkhptozero(void) gActiveBattler = gBattlerAttacker; gBattleMons[gActiveBattler].hp = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6777,7 +6777,7 @@ static void Cmd_trysetrest(void) 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); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -7727,7 +7727,7 @@ static void Cmd_updatestatusicon(void) if (gBattlescriptCurrInstr[1] != BS_ATTACKER_WITH_PARTNER) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -7736,7 +7736,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = gBattlerAttacker; if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -7744,7 +7744,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BUFFER_A, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } } @@ -7822,7 +7822,7 @@ static void Cmd_transformdataexecution(void) } gActiveBattler = gBattlerAttacker; - BtlController_EmitResetActionMoveSelection(BUFFER_A, RESET_MOVE_SELECTION); + BtlController_EmitResetActionMoveSelection(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } @@ -8202,7 +8202,7 @@ static void Cmd_copymovepermanently(void) } movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) @@ -8370,7 +8370,7 @@ static void Cmd_tryspiteppreduce(void) 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]); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); MarkBattlerForControllerExec(gActiveBattler); } @@ -8481,7 +8481,7 @@ static void Cmd_healpartystatus(void) if (toHeal) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); MarkBattlerForControllerExec(gActiveBattler); } @@ -9106,7 +9106,7 @@ static void Cmd_trymemento(void) // Success, drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(BUFFER_A, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -9146,7 +9146,7 @@ static void Cmd_cureifburnedparalysedorpoisoned(void) gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } else @@ -9268,11 +9268,11 @@ static void Cmd_tryswapitems(void) gBattleMons[gBattlerTarget].item = oldItemAtk; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 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); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; @@ -9618,7 +9618,7 @@ static void Cmd_switchoutabilities(void) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); @@ -9758,7 +9758,7 @@ static void Cmd_docastformchangeanimation(void) if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE; - BtlController_EmitBattleAnimation(BUFFER_A, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); + BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -9840,7 +9840,7 @@ static void Cmd_tryrecycleitem(void) *usedHeldItem = ITEM_NONE; gBattleMons[gActiveBattler].item = gLastUsedItem; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -9937,13 +9937,13 @@ static void Cmd_handleballthrow(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - BtlController_EmitBallThrowAnim(BUFFER_A, BALL_TRAINER_BLOCK); + BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_TRAINER_BLOCK); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) { - BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_WallyBallThrow; } @@ -10031,7 +10031,7 @@ static void Cmd_handleballthrow(void) if (odds > 254) // mon caught { - BtlController_EmitBallThrowAnim(BUFFER_A, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); @@ -10053,7 +10053,7 @@ static void Cmd_handleballthrow(void) if (gLastUsedItem == ITEM_MASTER_BALL) shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? - BtlController_EmitBallThrowAnim(BUFFER_A, shakes); + BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, shakes); MarkBattlerForControllerExec(gActiveBattler); if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above diff --git a/src/battle_util.c b/src/battle_util.c index 6e201a2956..46a2dba310 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -759,7 +759,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move) if (MOVE_IS_PERMANENT(attacker, moveIndex)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -791,7 +791,7 @@ void PressurePPLoseOnUsingImprison(u8 attacker) 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]); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -822,7 +822,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) 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]); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -893,7 +893,7 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { gActiveBattler = battler; - BtlController_EmitPrintString(BUFFER_A, stringId); + BtlController_EmitPrintString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, stringId); MarkBattlerForControllerExec(gActiveBattler); } @@ -1622,7 +1622,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -1747,7 +1747,7 @@ u8 DoBattlerEndTurnEffects(void) { 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); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gEffectBattler = gActiveBattler; BattleScriptExecute(BattleScript_YawnMakesAsleep); @@ -2257,7 +2257,7 @@ u8 AtkCanceller_UnableToUseMove(void) if (effect == 2) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } return effect; @@ -2621,7 +2621,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA 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); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); effect++; } @@ -2933,7 +2933,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; gBattleScripting.battler = battler; gActiveBattler = battler; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; } @@ -3361,7 +3361,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); BattleScriptExecute(BattleScript_BerryPPHealEnd2); - BtlController_EmitSetMonData(BUFFER_A, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(gActiveBattler); effect = ITEM_PP_CHANGE; } @@ -3596,7 +3596,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (effect) { case ITEM_STATUS_CHANGE: - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: @@ -3747,7 +3747,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = battlerId; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } diff --git a/src/battle_util2.c b/src/battle_util2.c index 8ecb0a79b4..7ec395cd96 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -204,7 +204,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) if (effect == 2) { gActiveBattler = battlerId; - BtlController_EmitSetMonData(BUFFER_A, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } From a4370ffcdef9250ed55ec716c8eb065c514d5998 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 00:45:03 -0400 Subject: [PATCH 017/187] gBattleControllerExecFlags bits now identified via helper macros Created "exposition" macros to describe operations performed on gBattleControllerExecFlags. Updated the battle engine internals to use them, to more clearly document how battle link communications actually work. --- include/battle_controllers.h | 41 ++++++++++++++++++++++++++++++++++++ src/battle_controllers.c | 11 ++++++++-- src/battle_main.c | 18 ++++++---------- src/battle_util.c | 22 ++++++++++++++----- 4 files changed, 74 insertions(+), 18 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 91b4ab1e56..2706fbf284 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -64,6 +64,47 @@ enum { REQUEST_TOUGH_RIBBON_BATTLE, }; +// Accessors for gBattleControllerExecFlags. +// +// These are provided for documentation purposes, to make the battle +// controller internals and the link communication internals more +// legible. Several of these have functions that you should call +// (e.g. MarkBattlerForControllerExec) instead of using these macros +// directly. + +#define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ + do { gBattleControllerExecFlags |= gBitTable[battlerId] } while (0) + +#define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battlerId) \ + do { gBattleControllerExecFlags &= ~gBitTable(battlerId) } while (0) + +#define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ + (gBattleControllerExecFlags & gBitTable[battlerId]) + +#define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battlerId) \ + do { gBattleControllerExecFlags |= gBitTable[battlerId] << 28; } while (0) + +#define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId) \ + do { gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)); } + +#define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ + do { gBattleControllerExecFlags |= gBitTable[battlerId] << ((playerId) << 2); } while (0) + +#define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId) \ + do { gBattleControllerExecFlags &= ~(gBitTable[battlerId] << ((playerId) * 4)); } while (0) + +#define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ + (gBattleControllerExecFlags & (gBitTable[battlerId] << ((playerId) * 4))) + +#define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battlerId) \ + (gBattleControllerExecFlags & ( \ + (gBitTable[battlerId]) \ + | (0xF << 28) \ + | (gBitTable[battlerId] << 4) \ + | (gBitTable[battlerId] << 8) \ + | (gBitTable[battlerId] << 12) \ + ) + // Special arguments for Battle Controller functions. enum { diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 8247e278bf..40eb22770b 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -855,6 +855,13 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) } // We have received a message. Place it into the "receive" buffer. +// +// Counterintuitively, we also "receive" the outbound messages that +// we send to other players. The GBA basically stores communicated +// data for all four players, so inbound and outbound data can be +// handled uniformly unless a game specifically decides to do +// otherwise. Pokemon, evidently, did not specifically decide to do +// otherwise. void TryReceiveLinkBattleData(void) { u8 i; @@ -916,7 +923,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) switch (BYTE_TO_RECEIVE(0)) { case BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER: - if (gBattleControllerExecFlags & gBitTable[battlerId]) + if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId)) return; memcpy(gBattleBufferA[battlerId], &BYTE_TO_RECEIVE(LINK_BUFF_DATA), blockSize); @@ -935,7 +942,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) break; case BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE: playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); - gBattleControllerExecFlags &= ~(gBitTable[battlerId] << (playerId * 4)); + MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId); break; } diff --git a/src/battle_main.c b/src/battle_main.c index 46f163586f..eb5fdbf43d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4173,7 +4173,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { RecordedBattle_SetBattlerAction(gActiveBattler, gBattleBufferB[gActiveBattler][1]); gChosenActionByBattler[gActiveBattler] = gBattleBufferB[gActiveBattler][1]; @@ -4352,7 +4352,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CASE_CHOSEN: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { switch (gChosenActionByBattler[gActiveBattler]) { @@ -4456,11 +4456,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED_STANDBY: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) - | (0xF << 28) - | (gBitTable[gActiveBattler] << 4) - | (gBitTable[gActiveBattler] << 8) - | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { if (AllAtActionConfirmed()) i = TRUE; @@ -4482,7 +4478,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++; } @@ -4496,7 +4492,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = gActiveBattler; gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -4504,7 +4500,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_SET_BEFORE_ACTION: - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { gBattleCommunication[gActiveBattler] = STATE_BEFORE_ACTION_CHOSEN; } @@ -4528,7 +4524,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = gActiveBattler; gBattlescriptCurrInstr = gSelectionBattleScripts[gActiveBattler]; - if (!(gBattleControllerExecFlags & ((gBitTable[gActiveBattler]) | (0xF << 28) | (gBitTable[gActiveBattler] << 4) | (gBitTable[gActiveBattler] << 8) | (gBitTable[gActiveBattler] << 12)))) + if (!IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(gActiveBattler)) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } diff --git a/src/battle_util.c b/src/battle_util.c index 46a2dba310..31cd5026ef 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -839,26 +839,38 @@ static void UNUSED MarkAllBattlersForControllerExec(void) else { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= gBitTable[i]; + MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(i); } } +// Called when the battle engine dispatches a message to a battle controller. +// +// During a singleplayer battle, we just immediately mark the controller as +// active. During a multiplayer link, we do things a little differently. We +// set a bit indicating that we're sending a message over the link. That +// message will be received by all other players... *and* by us, the player +// sending it, at which point we'll invoke MarkBattlerReceivedLinkData, +// below, to clear the "we're sending a message" bit and set the "controller +// is now active" bit. void MarkBattlerForControllerExec(u8 battlerId) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT); + MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battlerId); else - gBattleControllerExecFlags |= gBitTable[battlerId]; + MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId); } +// Called when a message dispatched from the battle engine to a battle +// controller is received over link communications. All players assume +// that if they've received the message, everyone else has as well. void MarkBattlerReceivedLinkData(u8 battlerId) { s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleControllerExecFlags |= gBitTable[battlerId] << (i << 2); + MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, i); - gBattleControllerExecFlags &= ~((1 << 28) << battlerId); + MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId); } void CancelMultiTurnMoves(u8 battler) From bab9f0cfef416f01f3d87b231b8e0e3def23633b Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 00:46:06 -0400 Subject: [PATCH 018/187] gBattleControllerExecFlags macro in MarkAllBattlersForControllerExec whoops, missed one --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 31cd5026ef..7182b725c6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -834,7 +834,7 @@ static void UNUSED MarkAllBattlersForControllerExec(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= gBitTable[i] << (32 - MAX_BATTLERS_COUNT); + gBattleControllerExecFlags |= MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(i); } else { From 2738d11b0f32ff644a3bcfea5c7137b3ee67e3c5 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 01:00:16 -0400 Subject: [PATCH 019/187] Additional fixes to last few commits ROM now compiles, but it's not comparing as equal... --- include/battle_controllers.h | 8 ++++---- src/battle_ai_switch_items.c | 18 +++++++++--------- src/battle_main.c | 22 +++++++++++----------- src/battle_script_commands.c | 26 +++++++++++++------------- src/battle_util.c | 2 +- src/pokemon.c | 2 +- 6 files changed, 39 insertions(+), 39 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 2706fbf284..bc57fdc36e 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -73,10 +73,10 @@ enum { // directly. #define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ - do { gBattleControllerExecFlags |= gBitTable[battlerId] } while (0) + do { gBattleControllerExecFlags |= gBitTable[battlerId]; } while (0) #define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battlerId) \ - do { gBattleControllerExecFlags &= ~gBitTable(battlerId) } while (0) + do { gBattleControllerExecFlags &= ~gBitTable(battlerId); } while (0) #define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ (gBattleControllerExecFlags & gBitTable[battlerId]) @@ -85,7 +85,7 @@ enum { do { gBattleControllerExecFlags |= gBitTable[battlerId] << 28; } while (0) #define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId) \ - do { gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)); } + do { gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)); } while (0) #define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ do { gBattleControllerExecFlags |= gBitTable[battlerId] << ((playerId) << 2); } while (0) @@ -103,7 +103,7 @@ enum { | (gBitTable[battlerId] << 4) \ | (gBitTable[battlerId] << 8) \ | (gBitTable[battlerId] << 12) \ - ) + )) // Special arguments for Battle Controller functions. diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index eeb28f8f0f..76461ba8fc 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -23,7 +23,7 @@ static bool8 ShouldSwitchIfPerishSong(void) && gDisableStructs[gActiveBattler].perishSongTimer == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else @@ -107,7 +107,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) { // We found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -207,7 +207,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) { // we found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -229,14 +229,14 @@ static bool8 ShouldSwitchIfNaturalCure(void) && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -248,7 +248,7 @@ static bool8 ShouldSwitchIfNaturalCure(void) if (Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -416,7 +416,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -599,7 +599,7 @@ void AI_TrySwitchOrUseItem(void) } } - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); } static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) @@ -933,7 +933,7 @@ static bool8 ShouldUseItem(void) if (shouldUse) { - BtlController_EmitTwoReturnValues(BUFFER_B, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; gBattleResources->battleHistory->trainerItems[i] = ITEM_NONE; return shouldUse; diff --git a/src/battle_main.c b/src/battle_main.c index eb5fdbf43d..562a0162b4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3427,7 +3427,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - BtlController_EmitDrawTrainerPic(BUFFER_A); + BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3435,7 +3435,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { - BtlController_EmitDrawTrainerPic(BUFFER_A); + BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT @@ -3460,7 +3460,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } - BtlController_EmitLoadMonSprite(BUFFER_A); + BtlController_EmitLoadMonSprite(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); } @@ -3471,14 +3471,14 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BUFFER_A); + BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BUFFER_A); + BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3631,7 +3631,7 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BUFFER_A); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3669,7 +3669,7 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BUFFER_A); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) { @@ -3761,7 +3761,7 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BUFFER_A); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3800,7 +3800,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BUFFER_A); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI)) { @@ -4286,7 +4286,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE) { - BtlController_EmitEndBounceEffect(BUFFER_A); + BtlController_EmitEndBounceEffect(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4314,7 +4314,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - BtlController_EmitEndBounceEffect(BUFFER_A); + BtlController_EmitEndBounceEffect(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 48951f0732..26d5eb2753 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3054,7 +3054,7 @@ static void Cmd_dofaintanimation(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintAnimation(BUFFER_A); + BtlController_EmitFaintAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -4914,7 +4914,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4936,7 +4936,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4957,7 +4957,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4979,7 +4979,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5042,7 +5042,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5058,7 +5058,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BUFFER_A); + BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5301,7 +5301,7 @@ static void Cmd_switchineffects(void) static void Cmd_trainerslidein(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlide(BUFFER_A); + BtlController_EmitTrainerSlide(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5328,7 +5328,7 @@ static void Cmd_fanfare(void) static void Cmd_playfaintcry(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintingCry(BUFFER_A); + BtlController_EmitFaintingCry(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5565,7 +5565,7 @@ static void Cmd_hitanimation(void) } else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) { - BtlController_EmitHitAnimation(BUFFER_A); + BtlController_EmitHitAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -5734,7 +5734,7 @@ static void Cmd_drawpartystatussummary(void) static void Cmd_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitHidePartyStatusSummary(BUFFER_A); + BtlController_EmitHidePartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6431,7 +6431,7 @@ static void Cmd_various(void) gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_EMIT_YESNOBOX: - BtlController_EmitYesNoBox(BUFFER_A); + BtlController_EmitYesNoBox(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); break; case VARIOUS_DRAW_ARENA_REF_TEXT_BOX: @@ -10342,7 +10342,7 @@ static void Cmd_finishturn(void) static void Cmd_trainerslideout(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlideBack(BUFFER_A); + BtlController_EmitTrainerSlideBack(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index 7182b725c6..3142d22a0c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -834,7 +834,7 @@ static void UNUSED MarkAllBattlersForControllerExec(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(i); + MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(i); } else { diff --git a/src/pokemon.c b/src/pokemon.c index e98182b0ae..0d31ede159 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5074,7 +5074,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov temp2 = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitGetMonData(BUFFER_A, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = temp2; } From 8f5c1a452d8d8deb2c83931997e4bffc08c0ee0a Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 01:33:17 -0400 Subject: [PATCH 020/187] Update battle_controllers.h Simplified macros. --- include/battle_controllers.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index bc57fdc36e..a21d8e00a0 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -73,25 +73,25 @@ enum { // directly. #define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ - do { gBattleControllerExecFlags |= gBitTable[battlerId]; } while (0) + gBattleControllerExecFlags |= gBitTable[battlerId] #define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battlerId) \ - do { gBattleControllerExecFlags &= ~gBitTable(battlerId); } while (0) + gBattleControllerExecFlags &= ~gBitTable(battlerId) #define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ (gBattleControllerExecFlags & gBitTable[battlerId]) #define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battlerId) \ - do { gBattleControllerExecFlags |= gBitTable[battlerId] << 28; } while (0) + gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT) #define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId) \ - do { gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)); } while (0) + gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)) #define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ - do { gBattleControllerExecFlags |= gBitTable[battlerId] << ((playerId) << 2); } while (0) + gBattleControllerExecFlags |= gBitTable[battlerId] << ((playerId) << 2) #define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId) \ - do { gBattleControllerExecFlags &= ~(gBitTable[battlerId] << ((playerId) * 4)); } while (0) + gBattleControllerExecFlags &= ~(gBitTable[battlerId] << ((playerId) * 4)) #define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ (gBattleControllerExecFlags & (gBitTable[battlerId] << ((playerId) * 4))) @@ -108,9 +108,9 @@ enum { // Special arguments for Battle Controller functions. enum { - BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER = 0, // gBattleBufferA - BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE = 1, // gBattleBufferB - BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE = 2, + BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, // gBattleBufferA + BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, // gBattleBufferB + BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE }; enum { From d8721b668e3a7ca04b3d40d6f4a8e22da10989e5 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 10:54:22 -0400 Subject: [PATCH 021/187] Fixed find-and-replace mistake Functions were using the wrong constant. --- src/battle_controller_link_opponent.c | 2 +- src/battle_controller_link_partner.c | 2 +- src/battle_controller_opponent.c | 24 ++++++------ src/battle_controller_player.c | 46 +++++++++++------------ src/battle_controller_player_partner.c | 10 ++--- src/battle_controller_recorded_opponent.c | 10 ++--- src/battle_controller_recorded_player.c | 12 +++--- src/battle_controller_safari.c | 10 ++--- src/battle_controller_wally.c | 14 +++---- 9 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 280b1e2103..fb29cc0432 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -548,7 +548,7 @@ static void LinkOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); LinkOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 7e5eb37e91..950552ea72 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -442,7 +442,7 @@ static void LinkPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); LinkPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 12603f72bc..284d3eeded 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -561,7 +561,7 @@ static void OpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); OpponentBufferExecCompleted(); } @@ -881,7 +881,7 @@ static void OpponentHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } @@ -1552,7 +1552,7 @@ static void OpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); OpponentBufferExecCompleted(); } else @@ -1569,13 +1569,13 @@ static void OpponentHandleChooseMove(void) switch (chosenMoveId) { case AI_CHOICE_WATCH: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; case AI_CHOICE_FLEE: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); break; case 6: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 15, gBattlerTarget); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 15, gBattlerTarget); break; default: if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) @@ -1586,7 +1586,7 @@ static void OpponentHandleChooseMove(void) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); @@ -1601,11 +1601,11 @@ static void OpponentHandleChooseMove(void) } while (move == MOVE_NONE); if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (gActiveBattler << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); else - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(); } @@ -1614,7 +1614,7 @@ static void OpponentHandleChooseMove(void) static void OpponentHandleChooseItem(void) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); OpponentBufferExecCompleted(); } @@ -1671,7 +1671,7 @@ static void OpponentHandleChoosePokemon(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); OpponentBufferExecCompleted(); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 9c4d755110..a71b2c251d 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -249,16 +249,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: // Top left - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); break; case 1: // Top right - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); break; case 2: // Bottom left - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); break; case 3: // Bottom right - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); break; } PlayerBufferExecCompleted(); @@ -319,7 +319,7 @@ static void HandleInputChooseAction(void) return; } PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_CANCEL_PARTNER, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); PlayerBufferExecCompleted(); } } @@ -365,7 +365,7 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } @@ -523,7 +523,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else @@ -543,7 +543,7 @@ static void HandleInputChooseMove(void) else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, 0xFFFF); PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) @@ -1174,7 +1174,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE @@ -1253,7 +1253,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -1361,9 +1361,9 @@ static void WaitForMonSelection(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSelectedMonPartyId, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); else - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_SIZE, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, PARTY_SIZE, NULL); if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); @@ -1387,7 +1387,7 @@ static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); PlayerBufferExecCompleted(); } } @@ -1439,9 +1439,9 @@ static void PlayerHandleYesNoInput(void) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0xE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0xE, 0); else - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0xD, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0xD, 0); PlayerBufferExecCompleted(); } @@ -1600,7 +1600,7 @@ static void PlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); PlayerBufferExecCompleted(); } @@ -1920,7 +1920,7 @@ void PlayerHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } @@ -2621,7 +2621,7 @@ static void PlayerChooseMoveInBattlePalace(void) if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); PlayerBufferExecCompleted(); } } @@ -2671,7 +2671,7 @@ static void PlayerHandleChoosePokemon(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) { - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(); } else @@ -2828,25 +2828,25 @@ static void PlayerHandleCmd32(void) static void PlayerHandleTwoReturnValues(void) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0, 0); PlayerBufferExecCompleted(); } static void PlayerHandleChosenMonReturnValue(void) { - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0, NULL); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue(void) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue_Duplicate(void) { - BtlController_EmitOneReturnValue_Duplicate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 0); + BtlController_EmitOneReturnValue_Duplicate(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0); PlayerBufferExecCompleted(); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 37a72e3aaa..1c1c38c4e2 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -332,7 +332,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE @@ -411,7 +411,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -626,7 +626,7 @@ static void PlayerPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); PlayerPartnerBufferExecCompleted(); } @@ -1527,7 +1527,7 @@ static void PlayerPartnerHandleChooseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, chosenMoveId | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, chosenMoveId | (gBattlerTarget << 8)); PlayerPartnerBufferExecCompleted(); } @@ -1557,7 +1557,7 @@ static void PlayerPartnerHandleChoosePokemon(void) } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); PlayerPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 2a04c9d219..1ce5a02b7c 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -534,7 +534,7 @@ static void RecordedOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); RecordedOpponentBufferExecCompleted(); } @@ -1402,7 +1402,7 @@ static void RecordedOpponentHandlePrintSelectionString(void) static void RecordedOpponentHandleChooseAction(void) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedOpponentBufferExecCompleted(); } @@ -1415,13 +1415,13 @@ static void RecordedOpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); } RecordedOpponentBufferExecCompleted(); @@ -1435,7 +1435,7 @@ static void RecordedOpponentHandleChooseItem(void) static void RecordedOpponentHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index fda899712e..063ce882e0 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -517,7 +517,7 @@ static void RecordedPlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); RecordedPlayerBufferExecCompleted(); } @@ -1414,7 +1414,7 @@ static void ChooseActionInBattlePalace(void) { if (gBattleCommunication[4] >= gBattlersCount / 2) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1427,7 +1427,7 @@ static void RecordedPlayerHandleChooseAction(void) } else { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1441,13 +1441,13 @@ static void RecordedPlayerHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); } RecordedPlayerBufferExecCompleted(); @@ -1461,7 +1461,7 @@ static void RecordedPlayerHandleChooseItem(void) static void RecordedPlayerHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedPlayerBufferExecCompleted(); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 09727b6cfd..485a806b5e 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -176,16 +176,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_BALL, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_BALL, 0); break; case 1: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_POKEBLOCK, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_POKEBLOCK, 0); break; case 2: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_GO_NEAR, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_GO_NEAR, 0); break; case 3: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_SAFARI_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); break; } SafariBufferExecCompleted(); @@ -280,7 +280,7 @@ static void CompleteWhenChosePokeblock(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); SafariBufferExecCompleted(); } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index e0dabb23c4..4a2b293787 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -196,7 +196,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -207,7 +207,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -217,7 +217,7 @@ static void WallyHandleActions(void) case 3: if (--gBattleStruct->wallyWaitFrames == 0) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_WALLY_THROW, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_WALLY_THROW, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -238,7 +238,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); WallyBufferExecCompleted(); } break; @@ -278,7 +278,7 @@ static void CompleteOnChosenItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); WallyBufferExecCompleted(); } } @@ -444,7 +444,7 @@ static void WallyHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, size, monData); + BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); WallyBufferExecCompleted(); } @@ -1241,7 +1241,7 @@ static void WallyHandleChooseMove(void) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, 10, 0x100); + BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, 0x100); WallyBufferExecCompleted(); } break; From b4ee45f3e8086d8043fdd98df1cded47367839b1 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 11:37:20 -0400 Subject: [PATCH 022/187] Renamed BATTLELINKMSGTYPE_ to BATTLELINKCOMMTYPE_ I want to avoid the word "message" since PRET has already chosen "battle message" as the term for predefined strings usable in the battle scripts and UI. I was considering the term "battle link packet" instead, but the library for wireless communications already uses the word "packet" even though GBATEK does not. I'm going with "battle link communication type" instead. For this particular context, I don't think we need a compound noun ("X type"); the singular noun "type" is fine enough. --- include/battle_controllers.h | 6 +- src/battle_ai_switch_items.c | 18 +-- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 26 +-- src/battle_controller_player.c | 48 +++--- src/battle_controller_player_partner.c | 12 +- src/battle_controller_recorded_opponent.c | 12 +- src/battle_controller_recorded_player.c | 14 +- src/battle_controller_safari.c | 12 +- src/battle_controller_wally.c | 16 +- src/battle_controllers.c | 12 +- src/battle_main.c | 54 +++---- src/battle_script_commands.c | 186 +++++++++++----------- src/battle_util.c | 24 +-- src/battle_util2.c | 2 +- src/pokemon.c | 2 +- 17 files changed, 226 insertions(+), 226 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index a21d8e00a0..3d8d13d3a9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -108,9 +108,9 @@ enum { // Special arguments for Battle Controller functions. enum { - BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, // gBattleBufferA - BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, // gBattleBufferB - BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE + BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, // gBattleBufferA + BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, // gBattleBufferB + BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE }; enum { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 76461ba8fc..73f0b3e929 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -23,7 +23,7 @@ static bool8 ShouldSwitchIfPerishSong(void) && gDisableStructs[gActiveBattler].perishSongTimer == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else @@ -107,7 +107,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) { // We found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -207,7 +207,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) { // we found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -229,14 +229,14 @@ static bool8 ShouldSwitchIfNaturalCure(void) && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -248,7 +248,7 @@ static bool8 ShouldSwitchIfNaturalCure(void) if (Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -416,7 +416,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -599,7 +599,7 @@ void AI_TrySwitchOrUseItem(void) } } - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); } static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) @@ -933,7 +933,7 @@ static bool8 ShouldUseItem(void) if (shouldUse) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; gBattleResources->battleHistory->trainerItems[i] = ITEM_NONE; return shouldUse; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index fb29cc0432..1a364d4f98 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -518,7 +518,7 @@ static void LinkOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -548,7 +548,7 @@ static void LinkOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); LinkOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 950552ea72..73331c86e2 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -400,7 +400,7 @@ static void LinkPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -442,7 +442,7 @@ static void LinkPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); LinkPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 284d3eeded..16c748cc64 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -531,7 +531,7 @@ static void OpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -561,7 +561,7 @@ static void OpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); OpponentBufferExecCompleted(); } @@ -881,7 +881,7 @@ static void OpponentHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } @@ -1552,7 +1552,7 @@ static void OpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); OpponentBufferExecCompleted(); } else @@ -1569,13 +1569,13 @@ static void OpponentHandleChooseMove(void) switch (chosenMoveId) { case AI_CHOICE_WATCH: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; case AI_CHOICE_FLEE: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); break; case 6: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 15, gBattlerTarget); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 15, gBattlerTarget); break; default: if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) @@ -1586,7 +1586,7 @@ static void OpponentHandleChooseMove(void) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); @@ -1601,11 +1601,11 @@ static void OpponentHandleChooseMove(void) } while (move == MOVE_NONE); if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gActiveBattler << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); else - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(); } @@ -1614,7 +1614,7 @@ static void OpponentHandleChooseMove(void) static void OpponentHandleChooseItem(void) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); + BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); OpponentBufferExecCompleted(); } @@ -1671,7 +1671,7 @@ static void OpponentHandleChoosePokemon(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); OpponentBufferExecCompleted(); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index a71b2c251d..65144b16e3 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -204,7 +204,7 @@ static void PlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -249,16 +249,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: // Top left - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); break; case 1: // Top right - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); break; case 2: // Bottom left - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); break; case 3: // Bottom right - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); break; } PlayerBufferExecCompleted(); @@ -319,7 +319,7 @@ static void HandleInputChooseAction(void) return; } PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); PlayerBufferExecCompleted(); } } @@ -365,7 +365,7 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } @@ -523,7 +523,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else @@ -543,7 +543,7 @@ static void HandleInputChooseMove(void) else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, 0xFFFF); PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) @@ -1174,7 +1174,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE @@ -1253,7 +1253,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -1361,9 +1361,9 @@ static void WaitForMonSelection(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); else - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, PARTY_SIZE, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, PARTY_SIZE, NULL); if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); @@ -1387,7 +1387,7 @@ static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); PlayerBufferExecCompleted(); } } @@ -1439,9 +1439,9 @@ static void PlayerHandleYesNoInput(void) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0xE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0xE, 0); else - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0xD, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0xD, 0); PlayerBufferExecCompleted(); } @@ -1600,7 +1600,7 @@ static void PlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); PlayerBufferExecCompleted(); } @@ -1920,7 +1920,7 @@ void PlayerHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } @@ -2621,7 +2621,7 @@ static void PlayerChooseMoveInBattlePalace(void) if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); PlayerBufferExecCompleted(); } } @@ -2671,7 +2671,7 @@ static void PlayerHandleChoosePokemon(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) { - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(); } else @@ -2828,25 +2828,25 @@ static void PlayerHandleCmd32(void) static void PlayerHandleTwoReturnValues(void) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0, 0); PlayerBufferExecCompleted(); } static void PlayerHandleChosenMonReturnValue(void) { - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0, NULL); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue(void) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0); + BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue_Duplicate(void) { - BtlController_EmitOneReturnValue_Duplicate(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 0); + BtlController_EmitOneReturnValue_Duplicate(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0); PlayerBufferExecCompleted(); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 1c1c38c4e2..1c39d9fc76 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -332,7 +332,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE @@ -411,7 +411,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -584,7 +584,7 @@ static void PlayerPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -626,7 +626,7 @@ static void PlayerPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); PlayerPartnerBufferExecCompleted(); } @@ -1527,7 +1527,7 @@ static void PlayerPartnerHandleChooseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, chosenMoveId | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, chosenMoveId | (gBattlerTarget << 8)); PlayerPartnerBufferExecCompleted(); } @@ -1557,7 +1557,7 @@ static void PlayerPartnerHandleChoosePokemon(void) } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); PlayerPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1ce5a02b7c..283827d326 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -504,7 +504,7 @@ static void RecordedOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -534,7 +534,7 @@ static void RecordedOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); RecordedOpponentBufferExecCompleted(); } @@ -1402,7 +1402,7 @@ static void RecordedOpponentHandlePrintSelectionString(void) static void RecordedOpponentHandleChooseAction(void) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedOpponentBufferExecCompleted(); } @@ -1415,13 +1415,13 @@ static void RecordedOpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); } RecordedOpponentBufferExecCompleted(); @@ -1435,7 +1435,7 @@ static void RecordedOpponentHandleChooseItem(void) static void RecordedOpponentHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 063ce882e0..92442ae445 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -475,7 +475,7 @@ static void RecordedPlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -517,7 +517,7 @@ static void RecordedPlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); RecordedPlayerBufferExecCompleted(); } @@ -1414,7 +1414,7 @@ static void ChooseActionInBattlePalace(void) { if (gBattleCommunication[4] >= gBattlersCount / 2) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1427,7 +1427,7 @@ static void RecordedPlayerHandleChooseAction(void) } else { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1441,13 +1441,13 @@ static void RecordedPlayerHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); } RecordedPlayerBufferExecCompleted(); @@ -1461,7 +1461,7 @@ static void RecordedPlayerHandleChooseItem(void) static void RecordedPlayerHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedPlayerBufferExecCompleted(); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 485a806b5e..fe6e1278db 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -176,16 +176,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_BALL, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_BALL, 0); break; case 1: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_POKEBLOCK, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_POKEBLOCK, 0); break; case 2: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_GO_NEAR, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_GO_NEAR, 0); break; case 3: - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); break; } SafariBufferExecCompleted(); @@ -280,7 +280,7 @@ static void CompleteWhenChosePokeblock(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); SafariBufferExecCompleted(); } } @@ -298,7 +298,7 @@ static void SafariBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 4a2b293787..d95eb6d5c4 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -196,7 +196,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -207,7 +207,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -217,7 +217,7 @@ static void WallyHandleActions(void) case 3: if (--gBattleStruct->wallyWaitFrames == 0) { - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_WALLY_THROW, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_WALLY_THROW, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -238,7 +238,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); WallyBufferExecCompleted(); } break; @@ -278,7 +278,7 @@ static void CompleteOnChosenItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); WallyBufferExecCompleted(); } } @@ -408,7 +408,7 @@ static void WallyBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -444,7 +444,7 @@ static void WallyHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); WallyBufferExecCompleted(); } @@ -1241,7 +1241,7 @@ static void WallyHandleChooseMove(void) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE, 10, 0x100); + BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, 0x100); WallyBufferExecCompleted(); } break; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 40eb22770b..339d68ff9e 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -659,11 +659,11 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) { switch (bufferId) { - case BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER: + case BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER: for (i = 0; i < size; data++, i++) gBattleBufferA[gActiveBattler][i] = *data; break; - case BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE: + case BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE: for (i = 0; i < size; data++, i++) gBattleBufferB[gActiveBattler][i] = *data; break; @@ -724,7 +724,7 @@ enum }; // We want to send a message. Place it into the "send" buffer. -// First argument is a BATTLELINKMSGTYPE_... +// First argument is a BATTLELINKCOMMTYPE_... void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data) { s32 alignedSize; @@ -922,7 +922,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) switch (BYTE_TO_RECEIVE(0)) { - case BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER: + case BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER: if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId)) return; @@ -937,10 +937,10 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) gEffectBattler = BYTE_TO_RECEIVE(LINK_BUFF_EFFECT_BATTLER); } break; - case BATTLELINKMSGTYPE_CONTROLLER_TO_ENGINE: + case BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE: memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + LINK_BUFF_DATA], blockSize); break; - case BATTLELINKMSGTYPE_CONTROLLER_BECOMING_IDLE: + case BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE: playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId); break; diff --git a/src/battle_main.c b/src/battle_main.c index 562a0162b4..890d3fb4bf 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3360,7 +3360,7 @@ static void BattleIntroGetMonsData(void) { case 0: gActiveBattler = gBattleCommunication[1]; - BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTIUSE_STATE]++; break; @@ -3382,7 +3382,7 @@ static void BattleIntroPrepareBackgroundSlide(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(0); - BtlController_EmitIntroSlide(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleEnvironment); + BtlController_EmitIntroSlide(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleEnvironment); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -3427,7 +3427,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3435,7 +3435,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { - BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT @@ -3460,7 +3460,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } - BtlController_EmitLoadMonSprite(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitLoadMonSprite(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); } @@ -3471,14 +3471,14 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3513,7 +3513,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); for (i = 0; i < PARTY_SIZE; i++) @@ -3531,7 +3531,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; @@ -3631,7 +3631,7 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3669,7 +3669,7 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) { @@ -3761,7 +3761,7 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3800,7 +3800,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI)) { @@ -3825,7 +3825,7 @@ static void UNUSED BattleIntroSwitchInPlayerMons(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - BtlController_EmitSwitchInAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], FALSE); + BtlController_EmitSwitchInAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4165,7 +4165,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseAction(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); + BtlController_EmitChooseAction(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } @@ -4214,7 +4214,7 @@ static void HandleTurnActionSelectionState(void) i); } - BtlController_EmitChooseMove(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); + BtlController_EmitChooseMove(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4233,7 +4233,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseItem(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4243,7 +4243,7 @@ static void HandleTurnActionSelectionState(void) || gBattleTypeFlags & BATTLE_TYPE_ARENA || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, 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)) @@ -4252,16 +4252,16 @@ static void HandleTurnActionSelectionState(void) || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else { if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; @@ -4276,7 +4276,7 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_SAFARI_POKEBLOCK: - BtlController_EmitChooseItem(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); break; case B_ACTION_CANCEL_PARTNER: @@ -4286,7 +4286,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE) { - BtlController_EmitEndBounceEffect(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitEndBounceEffect(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4314,7 +4314,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - BtlController_EmitEndBounceEffect(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitEndBounceEffect(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4467,11 +4467,11 @@ static void HandleTurnActionSelectionState(void) || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])) { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_STOP_BOUNCE_ONLY, i); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_STOP_BOUNCE_ONLY, i); } MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 26d5eb2753..4639783468 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1239,7 +1239,7 @@ static void Cmd_ppreduce(void) if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); MarkBattlerForControllerExec(gBattlerAttacker); @@ -1784,7 +1784,7 @@ static void Cmd_attackanimation(void) multihit = gMultiHitCounter; } - BtlController_EmitMoveAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); + BtlController_EmitMoveAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -1829,7 +1829,7 @@ static void Cmd_healthbarupdate(void) else healthValue = maxPossibleDmgValue; - BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, healthValue); + BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, healthValue); MarkBattlerForControllerExec(gActiveBattler); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) @@ -1971,7 +1971,7 @@ static void Cmd_datahpupdate(void) gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; // Send updated HP - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } } @@ -2009,11 +2009,11 @@ static void Cmd_effectivenesssound(void) switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_DOESNT_AFFECT_FOE: @@ -2026,17 +2026,17 @@ static void Cmd_effectivenesssound(void) default: if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) { - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) { - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, SE_EFFECTIVE); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -2149,7 +2149,7 @@ static void Cmd_printselectionstring(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPrintSelectionString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -2199,7 +2199,7 @@ static void Cmd_printselectionstringfromtable(void) ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *ptr); + BtlController_EmitPrintSelectionString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *ptr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -2485,7 +2485,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBattler = gEffectBattler; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) @@ -2787,11 +2787,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].item = ITEM_NONE; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2829,7 +2829,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -3036,7 +3036,7 @@ static void Cmd_tryfaintmon(void) BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) @@ -3054,7 +3054,7 @@ static void Cmd_dofaintanimation(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitFaintAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -3069,7 +3069,7 @@ static void Cmd_cleareffectsonfaint(void) if (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || gBattleMons[gActiveBattler].hp == 0) { gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } @@ -3438,7 +3438,7 @@ static void Cmd_getexp(void) gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); gActiveBattler = gBattleStruct->expGetterBattlerId; - BtlController_EmitExpUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->expGetterMonId, gBattleMoveDamage); + BtlController_EmitExpUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->expGetterMonId, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); } gBattleScripting.getexpState++; @@ -3937,7 +3937,7 @@ static void Cmd_healthbar_update(void) else gActiveBattler = gBattlerAttacker; - BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMoveDamage); + BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -4012,7 +4012,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4026,7 +4026,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4036,7 +4036,7 @@ static void Cmd_playanimation(void) } else { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4056,7 +4056,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4069,7 +4069,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES || *animationIdPtr == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4079,7 +4079,7 @@ static void Cmd_playanimation_var(void) } else { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4195,7 +4195,7 @@ static void Cmd_playstatchangeanimation(void) } else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) { - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; @@ -4264,7 +4264,7 @@ static void Cmd_moveend(void) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; @@ -4343,7 +4343,7 @@ static void Cmd_moveend(void) && gHitMarker & HITMARKER_NO_ANIMATIONS) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE); + BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattleScripting.moveendState++; return; @@ -4356,7 +4356,7 @@ static void Cmd_moveend(void) || WasUnableToUseMove(gBattlerAttacker)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; @@ -4370,7 +4370,7 @@ static void Cmd_moveend(void) && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; - BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; gBattleScripting.moveendState++; @@ -4597,7 +4597,7 @@ static void Cmd_returnatktoball(void) gActiveBattler = gBattlerAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) { - BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr++; @@ -4612,7 +4612,7 @@ static void Cmd_getswitchedmondata(void) gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); - BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); + BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -4688,7 +4688,7 @@ static void Cmd_switchinanim(void) gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - BtlController_EmitSwitchInAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); + BtlController_EmitSwitchInAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -4858,7 +4858,7 @@ static void ChooseMonToSendOut(u8 slotId) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } @@ -4885,7 +4885,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4896,7 +4896,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4914,7 +4914,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4924,7 +4924,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 1; } @@ -4936,7 +4936,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4946,7 +4946,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 1)) { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4957,7 +4957,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4967,7 +4967,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 2; } @@ -4979,7 +4979,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4989,7 +4989,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 2)) { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5005,7 +5005,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 0; - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } @@ -5021,7 +5021,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 1; - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5042,7 +5042,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5058,7 +5058,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5117,7 +5117,7 @@ static void Cmd_openpartyscreen(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 6; @@ -5131,7 +5131,7 @@ static void Cmd_openpartyscreen(void) { if (gActiveBattler != battlerId) { - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5142,7 +5142,7 @@ static void Cmd_openpartyscreen(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; - BtlController_EmitLinkStandbyMsg(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5301,7 +5301,7 @@ static void Cmd_switchineffects(void) static void Cmd_trainerslidein(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlide(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitTrainerSlide(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5310,7 +5310,7 @@ static void Cmd_trainerslidein(void) static void Cmd_playse(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlaySE(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5319,7 +5319,7 @@ static void Cmd_playse(void) static void Cmd_fanfare(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlayFanfareOrBGM(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); + BtlController_EmitPlayFanfareOrBGM(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5328,7 +5328,7 @@ static void Cmd_fanfare(void) static void Cmd_playfaintcry(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintingCry(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitFaintingCry(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5337,7 +5337,7 @@ static void Cmd_playfaintcry(void) static void Cmd_endlinkbattle(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitEndLinkBattle(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleOutcome); + BtlController_EmitEndLinkBattle(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 1; @@ -5346,7 +5346,7 @@ static void Cmd_endlinkbattle(void) static void Cmd_returntoball(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE); + BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5565,7 +5565,7 @@ static void Cmd_hitanimation(void) } else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) { - BtlController_EmitHitAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitHitAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -5652,7 +5652,7 @@ static void Cmd_updatebattlermoves(void) switch (gBattleCommunication[0]) { case 0: - BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[0]++; break; @@ -5725,7 +5725,7 @@ static void Cmd_drawpartystatussummary(void) } } - BtlController_EmitDrawPartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, hpStatuses, 1); + BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatuses, 1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5734,7 +5734,7 @@ static void Cmd_drawpartystatussummary(void) static void Cmd_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitHidePartyStatusSummary(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitHidePartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5759,7 +5759,7 @@ static void Cmd_statusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE, gBattleMons[gActiveBattler].status1); + BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE, gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 2; @@ -5778,7 +5778,7 @@ static void Cmd_status2animation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); + BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 6; @@ -5797,7 +5797,7 @@ static void Cmd_chosenstatusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], wantedStatus); + BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], wantedStatus); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 7; @@ -5908,7 +5908,7 @@ static void Cmd_removeitem(void) *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = ITEM_NONE; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6217,7 +6217,7 @@ static void Cmd_setatktoplayer0(void) static void Cmd_makevisible(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitSpriteInvisibility(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6431,7 +6431,7 @@ static void Cmd_various(void) gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_EMIT_YESNOBOX: - BtlController_EmitYesNoBox(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitYesNoBox(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); break; case VARIOUS_DRAW_ARENA_REF_TEXT_BOX: @@ -6456,7 +6456,7 @@ static void Cmd_various(void) gActiveBattler = 1; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -6466,7 +6466,7 @@ static void Cmd_various(void) gActiveBattler = 3; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -6491,7 +6491,7 @@ static void Cmd_various(void) gBattleOutcome = B_OUTCOME_MON_TELEPORTED; break; case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - BtlController_EmitPlayFanfareOrBGM(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); + BtlController_EmitPlayFanfareOrBGM(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -6552,7 +6552,7 @@ static void Cmd_tryexplosion(void) // Success, no battlers with Damp. Drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6581,7 +6581,7 @@ static void Cmd_setatkhptozero(void) gActiveBattler = gBattlerAttacker; gBattleMons[gActiveBattler].hp = 0; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6777,7 +6777,7 @@ static void Cmd_trysetrest(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -7727,7 +7727,7 @@ static void Cmd_updatestatusicon(void) if (gBattlescriptCurrInstr[1] != BS_ATTACKER_WITH_PARTNER) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -7736,7 +7736,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = gBattlerAttacker; if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -7744,7 +7744,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } } @@ -7822,7 +7822,7 @@ static void Cmd_transformdataexecution(void) } gActiveBattler = gBattlerAttacker; - BtlController_EmitResetActionMoveSelection(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, RESET_MOVE_SELECTION); + BtlController_EmitResetActionMoveSelection(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } @@ -8202,7 +8202,7 @@ static void Cmd_copymovepermanently(void) } movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) @@ -8370,7 +8370,7 @@ static void Cmd_tryspiteppreduce(void) if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i]) && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); MarkBattlerForControllerExec(gActiveBattler); } @@ -8481,7 +8481,7 @@ static void Cmd_healpartystatus(void) if (toHeal) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); MarkBattlerForControllerExec(gActiveBattler); } @@ -9106,7 +9106,7 @@ static void Cmd_trymemento(void) // Success, drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -9146,7 +9146,7 @@ static void Cmd_cureifburnedparalysedorpoisoned(void) gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } else @@ -9268,11 +9268,11 @@ static void Cmd_tryswapitems(void) gBattleMons[gBattlerTarget].item = oldItemAtk; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; @@ -9618,7 +9618,7 @@ static void Cmd_switchoutabilities(void) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); @@ -9758,7 +9758,7 @@ static void Cmd_docastformchangeanimation(void) if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE; - BtlController_EmitBattleAnimation(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); + BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -9840,7 +9840,7 @@ static void Cmd_tryrecycleitem(void) *usedHeldItem = ITEM_NONE; gBattleMons[gActiveBattler].item = gLastUsedItem; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -9937,13 +9937,13 @@ static void Cmd_handleballthrow(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_TRAINER_BLOCK); + BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_TRAINER_BLOCK); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) { - BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_WallyBallThrow; } @@ -10031,7 +10031,7 @@ static void Cmd_handleballthrow(void) if (odds > 254) // mon caught { - BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); @@ -10053,7 +10053,7 @@ static void Cmd_handleballthrow(void) if (gLastUsedItem == ITEM_MASTER_BALL) shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? - BtlController_EmitBallThrowAnim(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, shakes); + BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, shakes); MarkBattlerForControllerExec(gActiveBattler); if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above @@ -10342,7 +10342,7 @@ static void Cmd_finishturn(void) static void Cmd_trainerslideout(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlideBack(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitTrainerSlideBack(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index 3142d22a0c..e9edfe06ff 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -759,7 +759,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move) if (MOVE_IS_PERMANENT(attacker, moveIndex)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -791,7 +791,7 @@ void PressurePPLoseOnUsingImprison(u8 attacker) if (imprisonPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, imprisonPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -822,7 +822,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) if (perishSongPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, perishSongPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -905,7 +905,7 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { gActiveBattler = battler; - BtlController_EmitPrintString(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, stringId); + BtlController_EmitPrintString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, stringId); MarkBattlerForControllerExec(gActiveBattler); } @@ -1634,7 +1634,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -1759,7 +1759,7 @@ u8 DoBattlerEndTurnEffects(void) { CancelMultiTurnMoves(gActiveBattler); gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gEffectBattler = gActiveBattler; BattleScriptExecute(BattleScript_YawnMakesAsleep); @@ -2269,7 +2269,7 @@ u8 AtkCanceller_UnableToUseMove(void) if (effect == 2) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } return effect; @@ -2633,7 +2633,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); effect++; } @@ -2945,7 +2945,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; gBattleScripting.battler = battler; gActiveBattler = battler; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; } @@ -3373,7 +3373,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); BattleScriptExecute(BattleScript_BerryPPHealEnd2); - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(gActiveBattler); effect = ITEM_PP_CHANGE; } @@ -3608,7 +3608,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (effect) { case ITEM_STATUS_CHANGE: - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: @@ -3759,7 +3759,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = battlerId; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } diff --git a/src/battle_util2.c b/src/battle_util2.c index 7ec395cd96..977835d1db 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -204,7 +204,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) if (effect == 2) { gActiveBattler = battlerId; - BtlController_EmitSetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } diff --git a/src/pokemon.c b/src/pokemon.c index 0d31ede159..018b189f1a 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5074,7 +5074,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov temp2 = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitGetMonData(BATTLELINKMSGTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = temp2; } From 286440806086329f569e03c1740292854af79874 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 11:40:14 -0400 Subject: [PATCH 023/187] Tweaks to documentation comments --- include/battle_controllers.h | 3 +++ src/battle_util.c | 1 + 2 files changed, 4 insertions(+) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 3d8d13d3a9..e7a0d50b12 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -96,6 +96,9 @@ enum { #define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ (gBattleControllerExecFlags & (gBitTable[battlerId] << ((playerId) * 4))) +// This actually checks if a specific controller is active on any player or if +// *any* controlleris pending sync over link communications, but the macro name +// can only be so specific before it just gets ridiculous. #define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battlerId) \ (gBattleControllerExecFlags & ( \ (gBitTable[battlerId]) \ diff --git a/src/battle_util.c b/src/battle_util.c index e9edfe06ff..f2e55cea27 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -827,6 +827,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) } } +// See comments for MarkBattlerForControllerExec. static void UNUSED MarkAllBattlersForControllerExec(void) { int i; From 7ee3043c58e75e95a012b06e08da012e6354d3d6 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Sat, 26 Apr 2025 11:47:48 -0400 Subject: [PATCH 024/187] Update battle_controllers.h typo --- include/battle_controllers.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index e7a0d50b12..ca82e487d9 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -97,7 +97,7 @@ enum { (gBattleControllerExecFlags & (gBitTable[battlerId] << ((playerId) * 4))) // This actually checks if a specific controller is active on any player or if -// *any* controlleris pending sync over link communications, but the macro name +// *any* controller is pending sync over link communications, but the macro name // can only be so specific before it just gets ridiculous. #define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battlerId) \ (gBattleControllerExecFlags & ( \ From 35b33a46e9233f81b5009bcaca8cabc4868c374b Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Mon, 28 Apr 2025 05:39:52 -0400 Subject: [PATCH 025/187] Identified task and sprite fields related to battle weather animations Named task and sprite fields related to the animations for Hail, Rain Dance, and Sandstorm. --- src/battle_anim_ice.c | 138 ++++++++++++++++++++++++++-------------- src/battle_anim_rock.c | 95 +++++++++++++++++---------- src/battle_anim_water.c | 28 ++++++-- 3 files changed, 172 insertions(+), 89 deletions(-) diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 273721e162..7579246588 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -13,11 +13,16 @@ #include "constants/battle_anim.h" #include "constants/rgb.h" +enum { + HAILSTRUCTTYPE_NEGATIVE_POS_MOD = 0, + HAILSTRUCTTYPE_POSITIVE_POS_MOD = 1, + HAILSTRUCTTYPE_FIXED_POSITION = 2, +}; struct HailStruct { s32 x:10; s32 y:10; s32 bPosition:8; - s32 unk3:4; + s32 type:4; }; static void AnimUnusedIceCrystalThrow(struct Sprite *); @@ -371,16 +376,16 @@ const struct SpriteTemplate gPoisonGasCloudSpriteTemplate = 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}, + {.x = 100, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .type = HAILSTRUCTTYPE_FIXED_POSITION}, + {.x = 85, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD}, + {.x = 242, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD}, + {.x = 66, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD}, + {.x = 182, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD}, + {.x = 60, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .type = HAILSTRUCTTYPE_FIXED_POSITION}, + {.x = 214, .y = 120, .bPosition = B_POSITION_OPPONENT_LEFT, .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD}, + {.x = 113, .y = 120, .bPosition = B_POSITION_PLAYER_LEFT, .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD}, + {.x = 210, .y = 120, .bPosition = B_POSITION_OPPONENT_RIGHT, .type = HAILSTRUCTTYPE_POSITIVE_POS_MOD}, + {.x = 38, .y = 120, .bPosition = B_POSITION_PLAYER_RIGHT, .type = HAILSTRUCTTYPE_NEGATIVE_POS_MOD}, }; static const union AffineAnimCmd sAffineAnim_HailParticle_0[] = @@ -1332,6 +1337,13 @@ static void MovePoisonGasCloud(struct Sprite *sprite) } } +#define tState data[0] +#define tSpriteCount data[1] +#define tHailAffineAnimNum data[2] +#define tHailStructId data[3] +#define tInitialDelayTimer data[4] +#define tHailSpawnTimer data[5] + void AnimTask_Hail(u8 taskId) { struct Task *task = &gTasks[taskId]; @@ -1342,71 +1354,86 @@ void AnimTask_Hail(u8 taskId) static void AnimTask_Hail2(u8 taskId) { struct Task *task = &gTasks[taskId]; - switch (task->data[0]) + switch (task->tState) { case 0: - if (++task->data[4] > 2) + if (++task->tInitialDelayTimer > 2) { - task->data[4] = 0; - task->data[5] = 0; - task->data[2] = 0; - task->data[0]++; + task->tInitialDelayTimer = 0; + task->tHailSpawnTimer = 0; + task->tHailAffineAnimNum = 0; + task->tState++; } break; case 1: - if (task->data[5] == 0) + if (task->tHailSpawnTimer == 0) { - if (GenerateHailParticle(task->data[3], task->data[2], taskId, 1)) - task->data[1]++; + if (GenerateHailParticle(task->tHailStructId, task->tHailAffineAnimNum, taskId, 1)) + task->tSpriteCount++; - if (++task->data[2] == 3) + if (++task->tHailAffineAnimNum == 3) // i.e. ARRAY_COUNT(sAffineAnims_HailParticle) { - if (++task->data[3] == 10) - task->data[0]++; + if (++task->tHailStructId == 10) // i.e. ARRAY_COUNT(sHailCoordData) + task->tState++; else - task->data[0]--; + task->tState--; } else { - task->data[5] = 1; + task->tHailSpawnTimer = 1; } } else { - task->data[5]--; + task->tHailSpawnTimer--; } break; case 2: - if (task->data[1] == 0) + if (task->tSpriteCount == 0) DestroyAnimVisualTask(taskId); break; } } +#undef tState +#undef tSpriteCount +#undef tHailAffineAnimNum +#undef tHailStructId +#undef tInitialDelayTimer +#undef tHailSpawnTimer + +// Hail falling particle sprite vars +#define sSpawnImpactEffect data[0] +#define sTargetX data[3] +#define sTargetY data[4] +#define sAffineAnimNum data[5] +#define sOwnerTaskId data[6] +#define sOwnerTaskSpriteCountField data[7] + 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; + bool8 shouldSpawnImpactEffect = FALSE; + s8 type = sHailCoordData[hailStructId].type; - if (unk != 2) + if (type != HAILSTRUCTTYPE_FIXED_POSITION) { id = GetBattlerAtPosition(sHailCoordData[hailStructId].bPosition); if (IsBattlerSpriteVisible(id)) { - possibleBool = TRUE; + shouldSpawnImpactEffect = TRUE; battlerX = GetBattlerSpriteCoord(id, BATTLER_COORD_X_2); battlerY = GetBattlerSpriteCoord(id, BATTLER_COORD_Y_PIC_OFFSET); - switch (unk) + switch (type) { - case 0: + case HAILSTRUCTTYPE_NEGATIVE_POS_MOD: battlerX -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; battlerY -= GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; break; - case 1: + case HAILSTRUCTTYPE_POSITIVE_POS_MOD: battlerX += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_WIDTH) / 6; battlerY += GetBattlerSpriteCoordAttr(id, BATTLER_COORD_ATTR_HEIGHT) / 6; break; @@ -1432,12 +1459,12 @@ static bool8 GenerateHailParticle(u8 hailStructId, u8 affineAnimNum, u8 taskId, 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; + gSprites[id].sSpawnImpactEffect = shouldSpawnImpactEffect; + gSprites[id].sTargetX = battlerX; + gSprites[id].sTargetY = battlerY; + gSprites[id].sAffineAnimNum = affineAnimNum; + gSprites[id].sOwnerTaskId = taskId; + gSprites[id].sOwnerTaskSpriteCountField = c; return TRUE; } } @@ -1449,20 +1476,23 @@ static void AnimHailBegin(struct Sprite *sprite) sprite->x += 4; sprite->y += 8; - if (sprite->x < sprite->data[3] && sprite->y < sprite->data[4]) + if (sprite->x < sprite->sTargetX && sprite->y < sprite->sTargetY) return; - if (sprite->data[0] == 1 && sprite->data[5] == 0) + if (sprite->sSpawnImpactEffect == 1 && sprite->sAffineAnimNum == 0) { spriteId = CreateSprite(&gIceCrystalHitLargeSpriteTemplate, - sprite->data[3], sprite->data[4], sprite->subpriority); + sprite->sTargetX, sprite->sTargetY, sprite->subpriority); sprite->data[0] = spriteId; if (spriteId != MAX_SPRITES) { + // The sprite template we're using is shared amongst a few other + // places, which make the sprite flicker. That's not what we want + // here, though. Override the callback. gSprites[sprite->data[0]].callback = AnimHailContinue; - gSprites[sprite->data[0]].data[6] = sprite->data[6]; - gSprites[sprite->data[0]].data[7] = sprite->data[7]; + gSprites[sprite->data[0]].sOwnerTaskId = sprite->sOwnerTaskId; + gSprites[sprite->data[0]].sOwnerTaskSpriteCountField = sprite->sOwnerTaskSpriteCountField; } FreeOamMatrix(sprite->oam.matrixNum); @@ -1470,22 +1500,34 @@ static void AnimHailBegin(struct Sprite *sprite) } else { - gTasks[sprite->data[6]].data[sprite->data[7]]--; + gTasks[sprite->sOwnerTaskId].data[sprite->sOwnerTaskSpriteCountField]--; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } +#undef sSpawnImpactEffect +#undef sTargetX +#undef sTargetY +#undef sAffineAnimNum + +// Hail impact VFX sprite vars +#define sTimer data[0] + static void AnimHailContinue(struct Sprite *sprite) { - if (++sprite->data[0] == 20) + if (++sprite->sTimer == 20) { - gTasks[sprite->data[6]].data[sprite->data[7]]--; + gTasks[sprite->sOwnerTaskId].data[sprite->sOwnerTaskSpriteCountField]--; FreeOamMatrix(sprite->oam.matrixNum); DestroySprite(sprite); } } +#undef sTimer +#undef sOwnerTaskId +#undef sOwnerTaskSpriteCountField + // Initializes the animation for Ice Ball. // arg 0: initial x pixel offset // arg 1: initial y pixel offset diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index bb8c3aa2f6..376edfc0eb 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -388,6 +388,11 @@ static void AnimParticleInVortex_Step(struct Sprite *sprite) } } +#define tBlendTimer data[10] +#define tBlend data[11] +#define tFullAlphaTimer data[11] // not a typo; this data field is used for multiple purposes +#define tState data[12] + void AnimTask_LoadSandstormBackground(u8 taskId) { int var0; @@ -430,45 +435,45 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId) gBattle_BG1_Y += -1; - switch (gTasks[taskId].data[12]) + switch (gTasks[taskId].tState) { case 0: - if (++gTasks[taskId].data[10] == 4) + if (++gTasks[taskId].tBlendTimer == 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].tBlendTimer = 0; + gTasks[taskId].tBlend++; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend)); + if (gTasks[taskId].tBlend == 7) { - gTasks[taskId].data[12]++; - gTasks[taskId].data[11] = 0; + gTasks[taskId].tState++; + gTasks[taskId].tFullAlphaTimer = 0; } } break; case 1: - if (++gTasks[taskId].data[11] == 101) + if (++gTasks[taskId].tFullAlphaTimer == 101) { - gTasks[taskId].data[11] = 7; - gTasks[taskId].data[12]++; + gTasks[taskId].tBlend = 7; + gTasks[taskId].tState++; } break; case 2: - if (++gTasks[taskId].data[10] == 4) + if (++gTasks[taskId].tBlendTimer == 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].tBlendTimer = 0; + gTasks[taskId].tBlend--; + SetGpuReg(REG_OFFSET_BLDALPHA, BLDALPHA_BLEND(gTasks[taskId].tBlend, 16 - gTasks[taskId].tBlend)); + if (gTasks[taskId].tBlend == 0) { - gTasks[taskId].data[12]++; - gTasks[taskId].data[11] = 0; + gTasks[taskId].tState++; + gTasks[taskId].tFullAlphaTimer = 0; } } break; case 3: GetBattleAnimBg1Data(&animBg); ClearBattleAnimBg(animBg.bgId); - gTasks[taskId].data[12]++; + gTasks[taskId].tState++; break; case 4: if (!IsContest()) @@ -484,21 +489,36 @@ static void AnimTask_LoadSandstormBackground_Step(u8 taskId) } } +#undef tBlendTimer +#undef tBlend +#undef tFullAlphaTimer +#undef tState + // 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) + +#define sState data[0] +#define sVelocityX data[1] // 256ths of a pixel // init'd from gBattleAnimArgs[1] +#define sVelocityY data[2] // 256ths of a pixel // init'd from gBattleAnimArgs[2] +#define sFractionalX data[3] // 256ths of a pixel +#define sFractionalY data[4] // 256ths of a pixel +#define sMirroredX data[5] // init'd from gBattleAnimArgs[3] + +// The fields named "velocity" are arguably more like "acceleration," +// and the fields named "fractional" are arguably more like "velocity." +// +// ...is what I WOULD say if the "fractional" fields weren't AND'd with +// 0xFF after every frame. + static void AnimFlyingSandCrescent(struct Sprite *sprite) { - if (sprite->data[0] == 0) + if (sprite->sState == 0) { if (gBattleAnimArgs[3] != 0 && GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) { sprite->x = DISPLAY_WIDTH + 64; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; - sprite->data[5] = 1; + sprite->sMirroredX = 1; sprite->oam.matrixNum = ST_OAM_HFLIP; } else @@ -508,18 +528,18 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite) sprite->y = gBattleAnimArgs[0]; SetSubspriteTables(sprite, sFlyingSandSubspriteTable); - sprite->data[1] = gBattleAnimArgs[1]; - sprite->data[2] = gBattleAnimArgs[2]; - sprite->data[0]++; + sprite->sVelocityX = gBattleAnimArgs[1]; + sprite->sVelocityY = gBattleAnimArgs[2]; + sprite->sState++; } 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; + sprite->sFractionalX += sprite->sVelocityX; + sprite->sFractionalY += sprite->sVelocityY; + sprite->x2 += (sprite->sFractionalX >> 8); + sprite->y2 += (sprite->sFractionalY >> 8); + sprite->sFractionalX &= 0xFF; + sprite->sFractionalY &= 0xFF; if (sprite->data[5] == 0) { @@ -535,6 +555,13 @@ static void AnimFlyingSandCrescent(struct Sprite *sprite) } } +#undef sState +#undef sVelocityX +#undef sVelocityY +#undef sFractionalX +#undef sFractionalY +#undef sMirroredX + // Animates the rising rocks in Ancient Power. // arg 0: initial x pixel offset // arg 1: initial y pixel offset diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index dc793f70a5..fda3558e4d 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -473,27 +473,37 @@ const struct SpriteTemplate gWeatherBallWaterDownSpriteTemplate = .callback = AnimWeatherBallDown, }; +#define tRaindropSpawnTimer data[0] +#define tRaindropUnused data[1] +#define tRaindropSpawnInterval data[2] +#define tRaindropSpawnDuration data[3] // number of frames over which we spawn raindrops + void AnimTask_CreateRaindrops(u8 taskId) { u8 x, y; - if (gTasks[taskId].data[0] == 0) + if (gTasks[taskId].tRaindropSpawnTimer == 0) { - gTasks[taskId].data[1] = gBattleAnimArgs[0]; - gTasks[taskId].data[2] = gBattleAnimArgs[1]; - gTasks[taskId].data[3] = gBattleAnimArgs[2]; + gTasks[taskId].tRaindropUnused = gBattleAnimArgs[0]; + gTasks[taskId].tRaindropSpawnInterval = gBattleAnimArgs[1]; + gTasks[taskId].tRaindropSpawnDuration = gBattleAnimArgs[2]; } - gTasks[taskId].data[0]++; - if (gTasks[taskId].data[0] % gTasks[taskId].data[2] == 1) + gTasks[taskId].tRaindropSpawnTimer++; + if (gTasks[taskId].tRaindropSpawnTimer % gTasks[taskId].tRaindropSpawnInterval == 1) { x = Random2() % DISPLAY_WIDTH; y = Random2() % (DISPLAY_HEIGHT / 2); CreateSprite(&gRainDropSpriteTemplate, x, y, 4); } - if (gTasks[taskId].data[0] == gTasks[taskId].data[3]) + if (gTasks[taskId].tRaindropSpawnTimer == gTasks[taskId].tRaindropSpawnDuration) DestroyAnimVisualTask(taskId); } +#undef tRaindropSpawnTimer +#undef tRaindropUnused +#undef tRaindropSpawnInterval +#undef tRaindropSpawnDuration + static void AnimRainDrop(struct Sprite *sprite) { sprite->callback = AnimRainDrop_Step; @@ -503,6 +513,10 @@ static void AnimRainDrop_Step(struct Sprite *sprite) { if (++sprite->data[0] <= 13) { + // + // Make the raindrop fall, but only until it reaches the + // impact/splash frames of its animation. + // sprite->x2++; sprite->y2 += 4; } From 182d42642d14ee30a0004435164772ebd3f51757 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Thu, 1 May 2025 11:22:57 +0200 Subject: [PATCH 026/187] Move out ai struct out of BattleResources --- docs/changelogs/1.6.x/1.6.0.md | 2 +- docs/changelogs/1.9.x/1.9.0.md | 2 +- include/battle.h | 24 +- include/battle_ai_main.h | 8 +- include/config/debug.h | 2 +- src/battle_ai_main.c | 286 +++++++++--------- src/battle_ai_switch_items.c | 228 +++++++-------- src/battle_ai_util.c | 480 +++++++++++++++---------------- src/battle_controller_opponent.c | 4 +- src/battle_debug.c | 24 +- src/battle_main.c | 15 +- src/battle_script_commands.c | 10 +- src/battle_util.c | 6 +- src/battle_util2.c | 16 +- src/recorded_battle.c | 2 +- test/battle/ai/ai.c | 4 +- 16 files changed, 558 insertions(+), 555 deletions(-) diff --git a/docs/changelogs/1.6.x/1.6.0.md b/docs/changelogs/1.6.x/1.6.0.md index f215ffb673..f391940205 100644 --- a/docs/changelogs/1.6.x/1.6.0.md +++ b/docs/changelogs/1.6.x/1.6.0.md @@ -143,7 +143,7 @@ * Prevent certain status moves when item is known + Fake Out changes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3219 * Improve AI switching with bad moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3213 * Fixed `CanTargetFaintAi` index issue by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306 -* Transform updates `AI_PARTY` data by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3295 +* Transform updates `gAiPartyData` data by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3295 * Greatly reduce AI lag by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3308 ### Cleanup diff --git a/docs/changelogs/1.9.x/1.9.0.md b/docs/changelogs/1.9.x/1.9.0.md index b0815c6e2a..44d5a8aec7 100644 --- a/docs/changelogs/1.9.x/1.9.0.md +++ b/docs/changelogs/1.9.x/1.9.0.md @@ -510,7 +510,7 @@ * `AI_STRIKES_FIRST` is also replaced by `AI_IsFaster`. * Switch AI uses trapping abilities aggressively by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4669 * Use 9th roll instead of average in AI calcs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4679 -* Use `AI_DATA->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 +* Use `gAiLogicData->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 * Minor switch AI cleanup by @Pawkkie, @DizzyEggg, @AlexOn1ine and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4849 * Removed `SetBattlerData` from `AI_CalcDamage` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4881 * Removed unused `AI_FLAG_HELP_PARTNER` by @pkmnsnfrn and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4918 diff --git a/include/battle.h b/include/battle.h index 0d3cc543f0..eb26509b9d 100644 --- a/include/battle.h +++ b/include/battle.h @@ -289,16 +289,17 @@ struct AiPartyMon u16 item; u16 heldEffect; u16 ability; - u16 gender; u16 level; u16 moves[MAX_MON_MOVES]; u32 status; - bool8 isFainted; - bool8 wasSentInBattle; u8 switchInCount; // Counts how many times this Pokemon has been sent out or switched into in a battle. + u8 gender:2; + u8 isFainted:1; + u8 wasSentInBattle:1; + u8 padding:4; }; -struct AIPartyData // Opposing battlers - party mons. +struct AiPartyData // Opposing battlers - party mons. { struct AiPartyMon mons[NUM_BATTLE_SIDES][PARTY_SIZE]; // 2 parties(player, opponent). Used to save information on opposing party. u8 count[NUM_BATTLE_SIDES]; @@ -346,7 +347,7 @@ struct AiLogicData u8 battlerDoingPrediction; // Stores which battler is currently running its prediction calcs }; -struct AI_ThinkingStruct +struct AiThinkingStruct { u8 aiState; u8 movesetIndex; @@ -397,20 +398,11 @@ struct BattleResources struct BattleScriptsStack* battleScriptsStack; struct BattleCallbacksStack* battleCallbackStack; struct StatsArray* beforeLvlUp; - struct AI_ThinkingStruct *ai; - struct AiLogicData *aiData; - struct AIPartyData *aiParty; - struct BattleHistory *battleHistory; u8 bufferA[MAX_BATTLERS_COUNT][0x200]; u8 bufferB[MAX_BATTLERS_COUNT][0x200]; u8 transferBuffer[0x100]; }; -#define AI_THINKING_STRUCT ((struct AI_ThinkingStruct *)(gBattleResources->ai)) -#define AI_DATA ((struct AiLogicData *)(gBattleResources->aiData)) -#define AI_PARTY ((struct AIPartyData *)(gBattleResources->aiParty)) -#define BATTLE_HISTORY ((struct BattleHistory *)(gBattleResources->battleHistory)) - struct BattleResults { u8 playerFaintCounter; // 0x0 @@ -1127,6 +1119,10 @@ extern struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT]; extern struct BattleScripting gBattleScripting; extern struct BattleStruct *gBattleStruct; extern struct AiBattleData *gAiBattleData; +extern struct AiThinkingStruct *gAiThinkingStruct; +extern struct AiLogicData *gAiLogicData; +extern struct AiPartyData *gAiPartyData; +extern struct BattleHistory *gBattleHistory; extern u8 *gLinkBattleSendBuffer; extern u8 *gLinkBattleRecvBuffer; extern struct BattleResources *gBattleResources; diff --git a/include/battle_ai_main.h b/include/battle_ai_main.h index a385d7ce21..31d6437b97 100644 --- a/include/battle_ai_main.h +++ b/include/battle_ai_main.h @@ -60,7 +60,7 @@ enum AIScore { \ TestRunner_Battle_AISetScore(__FILE__, __LINE__, battler, movesetIndex, val); \ } \ - AI_THINKING_STRUCT->score[movesetIndex] = val; \ + gAiThinkingStruct->score[movesetIndex] = val; \ } while (0) \ #define ADJUST_SCORE(val) \ @@ -68,7 +68,7 @@ enum AIScore { \ if (TESTING) \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, gAiThinkingStruct->movesetIndex, val); \ } \ score += val; \ } while (0) \ @@ -78,7 +78,7 @@ enum AIScore { \ if (TESTING) \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, gAiThinkingStruct->movesetIndex, val); \ } \ score += val; \ return score; \ @@ -89,7 +89,7 @@ enum AIScore { \ if (TESTING) \ { \ - TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, AI_THINKING_STRUCT->movesetIndex, val); \ + TestRunner_Battle_AIAdjustScore(__FILE__, __LINE__, battlerAtk, gAiThinkingStruct->movesetIndex, val); \ } \ (*score) += val; \ } while (0) \ diff --git a/include/config/debug.h b/include/config/debug.h index 2446b9360c..1542015e50 100644 --- a/include/config/debug.h +++ b/include/config/debug.h @@ -9,7 +9,7 @@ // Battle Debug Menu #define DEBUG_BATTLE_MENU TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. -#define DEBUG_AI_DELAY_TIMER FALSE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. +#define DEBUG_AI_DELAY_TIMER TRUE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. // PokΓ©mon Debug #define DEBUG_POKEMON_SPRITE_VISUALIZER TRUE // Enables a debug menu for PokΓ©mon sprites and icons, accessed by pressing Select in the summary screen. diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 8acfe60858..93f5ddc933 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -34,8 +34,8 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi); static u32 ChooseMoveOrAction_Doubles(u32 battlerAi); -static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef); -static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAi, u32 battlerDef); +static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef); +static inline void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAi, u32 battlerDef); static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect); // ewram @@ -99,7 +99,7 @@ static s32 (*const sBattleAiFuncTable[])(u32, u32, u32, s32) = void BattleAI_SetupItems(void) { s32 i; - u8 *data = (u8 *)BATTLE_HISTORY; + u8 *data = (u8 *)gBattleHistory; const u16 *items = GetTrainerItemsFromId(TRAINER_BATTLE_PARAM.opponentA); for (i = 0; i < sizeof(struct BattleHistory); i++) @@ -117,8 +117,8 @@ void BattleAI_SetupItems(void) { if (items[i] != ITEM_NONE) { - BATTLE_HISTORY->trainerItems[BATTLE_HISTORY->itemsNo] = items[i]; - BATTLE_HISTORY->itemsNo++; + gBattleHistory->trainerItems[gBattleHistory->itemsNo] = items[i]; + gBattleHistory->itemsNo++; } } } @@ -196,43 +196,43 @@ static u32 GetAiFlags(u16 trainerId) void BattleAI_SetupFlags(void) { if (IsAiVsAiBattle()) - AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); else - AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI if (DEBUG_OVERWORLD_MENU && gIsDebugBattle) { - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = gDebugAIFlags; - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = gDebugAIFlags; + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = gDebugAIFlags; + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gDebugAIFlags; return; } if (IsWildMonSmart() && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) { // smart wild AI - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); } else { - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); if (TRAINER_BATTLE_PARAM.opponentB != 0) - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); else - AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] = AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT]; + gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); } else if (IsDoubleBattle() && IsAiVsAiBattle()) { - AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_RIGHT] = AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_LEFT]; + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT]; } else { - AI_THINKING_STRUCT->aiFlags[B_POSITION_PLAYER_RIGHT] = 0; // player + gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = 0; // player } } @@ -242,11 +242,11 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) u32 flags[MAX_BATTLERS_COUNT]; // Clear AI data but preserve the flags. - memcpy(&flags[0], &AI_THINKING_STRUCT->aiFlags[0], sizeof(u32) * MAX_BATTLERS_COUNT); - memset(AI_THINKING_STRUCT, 0, sizeof(struct AI_ThinkingStruct)); - memcpy(&AI_THINKING_STRUCT->aiFlags[0], &flags[0], sizeof(u32) * MAX_BATTLERS_COUNT); + memcpy(&flags[0], &gAiThinkingStruct->aiFlags[0], sizeof(u32) * MAX_BATTLERS_COUNT); + memset(gAiThinkingStruct, 0, sizeof(struct AiThinkingStruct)); + memcpy(&gAiThinkingStruct->aiFlags[0], &flags[0], sizeof(u32) * MAX_BATTLERS_COUNT); - moveLimitations = AI_DATA->moveLimitations[battler]; + moveLimitations = gAiLogicData->moveLimitations[battler]; // Conditional score reset, unlike Ruby. for (u32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) @@ -267,13 +267,13 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) bool32 BattlerChoseNonMoveAction(void) { - if (AI_THINKING_STRUCT->aiAction & AI_ACTION_FLEE) + if (gAiThinkingStruct->aiAction & AI_ACTION_FLEE) { gAiBattleData->actionFlee = TRUE; return TRUE; } - if (AI_THINKING_STRUCT->aiAction & AI_ACTION_WATCH) + if (gAiThinkingStruct->aiAction & AI_ACTION_WATCH) { gAiBattleData->choiceWatch = TRUE; return TRUE; @@ -287,24 +287,24 @@ void SetupAISwitchingData(u32 battler, enum SwitchType switchType) s32 opposingBattler = GetOppositeBattler(battler); // AI's predicting data - if ((AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) + if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) { - AI_DATA->aiSwitchPredictionInProgress = TRUE; - AI_DATA->battlerDoingPrediction = battler; - AI_DATA->mostSuitableMonId[opposingBattler] = GetMostSuitableMonToSwitchInto(opposingBattler, switchType); + gAiLogicData->aiSwitchPredictionInProgress = TRUE; + gAiLogicData->battlerDoingPrediction = battler; + gAiLogicData->mostSuitableMonId[opposingBattler] = GetMostSuitableMonToSwitchInto(opposingBattler, switchType); if (ShouldSwitch(opposingBattler)) - AI_DATA->shouldSwitch |= (1u << opposingBattler); - AI_DATA->aiSwitchPredictionInProgress = FALSE; + gAiLogicData->shouldSwitch |= (1u << opposingBattler); + gAiLogicData->aiSwitchPredictionInProgress = FALSE; gBattleStruct->prevTurnSpecies[opposingBattler] = gBattleMons[opposingBattler].species; // Determine whether AI will use predictions this turn - AI_DATA->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); + gAiLogicData->predictingSwitch = RandomPercentage(RNG_AI_PREDICT_SWITCH, PREDICT_SWITCH_CHANCE); } // AI's data - AI_DATA->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); + gAiLogicData->mostSuitableMonId[battler] = GetMostSuitableMonToSwitchInto(battler, switchType); if (ShouldSwitch(battler)) - AI_DATA->shouldSwitch |= (1u << battler); + gAiLogicData->shouldSwitch |= (1u << battler); gBattleStruct->prevTurnSpecies[battler] = gBattleMons[battler].species; } @@ -319,13 +319,13 @@ void ComputeBattlerDecisions(u32 battler) return; // Risky AI switches aggressively even mid battle - enum SwitchType switchType = (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; + enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; - AI_DATA->aiCalcInProgress = TRUE; + gAiLogicData->aiCalcInProgress = TRUE; BattleAI_SetupAIData(0xF, battler); SetupAISwitchingData(battler, switchType); gAiBattleData->chosenMoveIndex[battler] = BattleAI_ChooseMoveIndex(battler); // Calculate score and chose move index - AI_DATA->aiCalcInProgress = FALSE; + gAiLogicData->aiCalcInProgress = FALSE; } } @@ -351,7 +351,7 @@ u32 BattleAI_ChooseMoveIndex(u32 battler) static void CopyBattlerDataToAIParty(u32 bPosition, u32 side) { u32 battler = GetBattlerAtPosition(bPosition); - struct AiPartyMon *aiMon = &AI_PARTY->mons[side][gBattlerPartyIndexes[battler]]; + struct AiPartyMon *aiMon = &gAiPartyData->mons[side][gBattlerPartyIndexes[battler]]; struct BattlePokemon *bMon = &gBattleMons[battler]; aiMon->species = bMon->species; @@ -366,11 +366,11 @@ static void CopyBattlerDataToAIParty(u32 bPosition, u32 side) void Ai_InitPartyStruct(void) { u32 i; - bool32 isOmniscient = (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); + bool32 isOmniscient = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); struct Pokemon *mon; - AI_PARTY->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); - AI_PARTY->count[B_SIDE_OPPONENT] = CalculateEnemyPartyCount(); + gAiPartyData->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); + gAiPartyData->count[B_SIDE_OPPONENT] = CalculateEnemyPartyCount(); // Save first 2 or 4(in doubles) mons CopyBattlerDataToAIParty(B_POSITION_PLAYER_LEFT, B_SIDE_PLAYER); @@ -385,20 +385,20 @@ void Ai_InitPartyStruct(void) } // Find fainted mons - for (i = 0; i < AI_PARTY->count[B_SIDE_PLAYER]; i++) + for (i = 0; i < gAiPartyData->count[B_SIDE_PLAYER]; i++) { if (GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) - AI_PARTY->mons[B_SIDE_PLAYER][i].isFainted = TRUE; + gAiPartyData->mons[B_SIDE_PLAYER][i].isFainted = TRUE; if (isOmniscient) { u32 j; mon = &gPlayerParty[i]; - AI_PARTY->mons[B_SIDE_PLAYER][i].item = GetMonData(mon, MON_DATA_HELD_ITEM); - AI_PARTY->mons[B_SIDE_PLAYER][i].heldEffect = ItemId_GetHoldEffect(AI_PARTY->mons[B_SIDE_PLAYER][i].item); - AI_PARTY->mons[B_SIDE_PLAYER][i].ability = GetMonAbility(mon); + gAiPartyData->mons[B_SIDE_PLAYER][i].item = GetMonData(mon, MON_DATA_HELD_ITEM); + gAiPartyData->mons[B_SIDE_PLAYER][i].heldEffect = ItemId_GetHoldEffect(gAiPartyData->mons[B_SIDE_PLAYER][i].item); + gAiPartyData->mons[B_SIDE_PLAYER][i].ability = GetMonAbility(mon); for (j = 0; j < MAX_MON_MOVES; j++) - AI_PARTY->mons[B_SIDE_PLAYER][i].moves[j] = GetMonData(mon, MON_DATA_MOVE1 + j); + gAiPartyData->mons[B_SIDE_PLAYER][i].moves[j] = GetMonData(mon, MON_DATA_MOVE1 + j); } } } @@ -407,19 +407,19 @@ void Ai_UpdateSwitchInData(u32 battler) { u32 i; u32 side = GetBattlerSide(battler); - struct AiPartyMon *aiMon = &AI_PARTY->mons[side][gBattlerPartyIndexes[battler]]; + struct AiPartyMon *aiMon = &gAiPartyData->mons[side][gBattlerPartyIndexes[battler]]; // See if the switched-in mon has been already in battle if (aiMon->wasSentInBattle) { if (aiMon->ability) - BATTLE_HISTORY->abilities[battler] = aiMon->ability; + gBattleHistory->abilities[battler] = aiMon->ability; if (aiMon->heldEffect) - BATTLE_HISTORY->itemEffects[battler] = aiMon->heldEffect; + gBattleHistory->itemEffects[battler] = aiMon->heldEffect; for (i = 0; i < MAX_MON_MOVES; i++) { if (aiMon->moves[i]) - BATTLE_HISTORY->usedMoves[battler][i] = aiMon->moves[i]; + gBattleHistory->usedMoves[battler][i] = aiMon->moves[i]; } aiMon->switchInCount++; aiMon->status = gBattleMons[battler].status1; // Copy status, because it could've been changed in battle. @@ -435,7 +435,7 @@ void Ai_UpdateSwitchInData(u32 battler) void Ai_UpdateFaintData(u32 battler) { - struct AiPartyMon *aiMon = &AI_PARTY->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]]; + struct AiPartyMon *aiMon = &gAiPartyData->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]]; ClearBattlerMoveHistory(battler); ClearBattlerAbilityHistory(battler); ClearBattlerItemEffectHistory(battler); @@ -530,7 +530,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) // get/assume all battler data and simulate AI damage battlersCount = gBattlersCount; - AI_DATA->aiCalcInProgress = TRUE; + gAiLogicData->aiCalcInProgress = TRUE; if (DEBUG_AI_DELAY_TIMER) CycleCountStart(); for (battlerAtk = 0; battlerAtk < battlersCount; battlerAtk++) @@ -551,7 +551,7 @@ void SetAiLogicDataForTurn(struct AiLogicData *aiData) if (DEBUG_AI_DELAY_TIMER) // We add to existing to compound multiple calls gBattleStruct->aiDelayCycles += CycleCountEnd(); - AI_DATA->aiCalcInProgress = FALSE; + gAiLogicData->aiCalcInProgress = FALSE; } static u32 ChooseMoveOrAction_Singles(u32 battlerAi) @@ -560,29 +560,29 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi) u8 consideredMoveArray[MAX_MON_MOVES]; u32 numOfBestMoves; s32 i; - u32 flags = AI_THINKING_STRUCT->aiFlags[battlerAi]; + u32 flags = gAiThinkingStruct->aiFlags[battlerAi]; - AI_DATA->partnerMove = 0; // no ally + gAiLogicData->partnerMove = 0; // no ally while (flags != 0) { if (flags & 1) { - if (IsBattlerPredictedToSwitch(gBattlerTarget) && (AI_THINKING_STRUCT->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) - BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battlerAi, gBattlerTarget); else - BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + BattleAI_DoAIProcessing(gAiThinkingStruct, battlerAi, gBattlerTarget); } flags >>= 1; - AI_THINKING_STRUCT->aiLogicId++; + gAiThinkingStruct->aiLogicId++; } for (i = 0; i < MAX_MON_MOVES; i++) { - gAiBattleData->finalScore[battlerAi][gBattlerTarget][i] = AI_THINKING_STRUCT->score[i]; + gAiBattleData->finalScore[battlerAi][gBattlerTarget][i] = gAiThinkingStruct->score[i]; } numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[0]; + currentMoveArray[0] = gAiThinkingStruct->score[0]; consideredMoveArray[0] = 0; for (i = 1; i < MAX_MON_MOVES; i++) @@ -590,15 +590,15 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi) if (gBattleMons[battlerAi].moves[i] != MOVE_NONE) { // In ruby, the order of these if statements is reversed. - if (currentMoveArray[0] == AI_THINKING_STRUCT->score[i]) + if (currentMoveArray[0] == gAiThinkingStruct->score[i]) { - currentMoveArray[numOfBestMoves] = AI_THINKING_STRUCT->score[i]; + currentMoveArray[numOfBestMoves] = gAiThinkingStruct->score[i]; consideredMoveArray[numOfBestMoves++] = i; } - if (currentMoveArray[0] < AI_THINKING_STRUCT->score[i]) + if (currentMoveArray[0] < gAiThinkingStruct->score[i]) { numOfBestMoves = 1; - currentMoveArray[0] = AI_THINKING_STRUCT->score[i]; + currentMoveArray[0] = gAiThinkingStruct->score[i]; consideredMoveArray[0] = i; } } @@ -635,25 +635,25 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) gBattlerTarget = i; - AI_DATA->partnerMove = GetAllyChosenMove(battlerAi); - AI_THINKING_STRUCT->aiLogicId = 0; - AI_THINKING_STRUCT->movesetIndex = 0; - flags = AI_THINKING_STRUCT->aiFlags[battlerAi]; + gAiLogicData->partnerMove = GetAllyChosenMove(battlerAi); + gAiThinkingStruct->aiLogicId = 0; + gAiThinkingStruct->movesetIndex = 0; + flags = gAiThinkingStruct->aiFlags[battlerAi]; while (flags != 0) { if (flags & 1) { - if (IsBattlerPredictedToSwitch(gBattlerTarget) && (AI_THINKING_STRUCT->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) - BattleAI_DoAIProcessing_PredictedSwitchin(AI_THINKING_STRUCT, AI_DATA, battlerAi, gBattlerTarget); + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battlerAi, gBattlerTarget); else - BattleAI_DoAIProcessing(AI_THINKING_STRUCT, battlerAi, gBattlerTarget); + BattleAI_DoAIProcessing(gAiThinkingStruct, battlerAi, gBattlerTarget); } flags >>= 1; - AI_THINKING_STRUCT->aiLogicId++; + gAiThinkingStruct->aiLogicId++; } - mostViableMovesScores[0] = AI_THINKING_STRUCT->score[0]; + mostViableMovesScores[0] = gAiThinkingStruct->score[0]; mostViableMovesIndices[0] = 0; mostViableMovesNo = 1; for (j = 1; j < MAX_MON_MOVES; j++) @@ -663,15 +663,15 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) if (!CanTargetBattler(battlerAi, i, gBattleMons[battlerAi].moves[j])) continue; - if (mostViableMovesScores[0] == AI_THINKING_STRUCT->score[j]) + if (mostViableMovesScores[0] == gAiThinkingStruct->score[j]) { - mostViableMovesScores[mostViableMovesNo] = AI_THINKING_STRUCT->score[j]; + mostViableMovesScores[mostViableMovesNo] = gAiThinkingStruct->score[j]; mostViableMovesIndices[mostViableMovesNo] = j; mostViableMovesNo++; } - if (mostViableMovesScores[0] < AI_THINKING_STRUCT->score[j]) + if (mostViableMovesScores[0] < gAiThinkingStruct->score[j]) { - mostViableMovesScores[0] = AI_THINKING_STRUCT->score[j]; + mostViableMovesScores[0] = gAiThinkingStruct->score[j]; mostViableMovesIndices[0] = j; mostViableMovesNo = 1; } @@ -688,7 +688,7 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) for (j = 0; j < MAX_MON_MOVES; j++) { - gAiBattleData->finalScore[battlerAi][gBattlerTarget][j] = AI_THINKING_STRUCT->score[j]; + gAiBattleData->finalScore[battlerAi][gBattlerTarget][j] = gAiThinkingStruct->score[j]; } } } @@ -728,7 +728,7 @@ static inline bool32 ShouldConsiderMoveForBattler(u32 battlerAi, u32 battlerDef, return TRUE; } -static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef) +static inline void BattleAI_DoAIProcessing(struct AiThinkingStruct *aiThink, u32 battlerAi, u32 battlerDef) { do { @@ -763,7 +763,7 @@ static inline void BattleAI_DoAIProcessing(struct AI_ThinkingStruct *aiThink, u3 aiThink->movesetIndex = 0; } -void BattleAI_DoAIProcessing_PredictedSwitchin(struct AI_ThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) +void BattleAI_DoAIProcessing_PredictedSwitchin(struct AiThinkingStruct *aiThink, struct AiLogicData *aiData, u32 battlerAtk, u32 battlerDef) { struct BattlePokemon switchoutCandidate = gBattleMons[battlerDef]; struct SimulatedDamage simulatedDamageSwitchout[MAX_MON_MOVES]; @@ -881,8 +881,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) enum BattleMoveEffects moveEffect = GetMoveEffect(move); s32 moveType; u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); - struct AiLogicData *aiData = AI_DATA; - uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + struct AiLogicData *aiData = gAiLogicData; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; u32 weather; @@ -1151,7 +1151,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-20); break; case EFFECT_EXPLOSION: - if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); if (effectiveness == UQ_4_12(0.0)) @@ -1501,7 +1501,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-1); if ((predictedMove == MOVE_NONE || GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_STATUS || DoesSubstituteBlockMove(battlerAtk, BATTLE_PARTNER(battlerDef), predictedMove)) - && !(predictedMove == MOVE_NONE && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY))) // Let Risky AI predict blindly based on stats + && !(predictedMove == MOVE_NONE && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY))) // Let Risky AI predict blindly based on stats ADJUST_SCORE(-10); break; @@ -2006,8 +2006,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); //No point in healing, but should at least do it if nothing better break; case EFFECT_RECOIL_IF_MISS: - if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] < 75 - && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] < 75 + && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) ADJUST_SCORE(-6); break; case EFFECT_TRANSFORM: @@ -2122,7 +2122,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } - /*if (AI_THINKING_STRUCT->aiFlags[battlerAtk] == AI_SCRIPT_CHECK_BAD_MOVE //Only basic AI + /*if (gAiThinkingStruct->aiFlags[battlerAtk] == AI_SCRIPT_CHECK_BAD_MOVE //Only basic AI && IsDoubleBattle()) //Make the regular AI know how to use Protect minimally in Doubles { u8 shouldProtect = ShouldProtect(battlerAtk, battlerDef, move); @@ -2436,7 +2436,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); } - else if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) + else if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) // Trick Room Up { @@ -2759,7 +2759,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // Don't use a status move if the mon is the last one in the party, has no good switchin, or is trapped else if (GetBattleMoveCategory(move) == DAMAGE_CATEGORY_STATUS && (CountUsablePartyMons(battlerAtk) < 1 - || AI_DATA->mostSuitableMonId[battlerAtk] == PARTY_SIZE + || gAiLogicData->mostSuitableMonId[battlerAtk] == PARTY_SIZE || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk)))) ADJUST_SCORE(-30); } @@ -2772,7 +2772,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; + u32 movesetIndex = gAiThinkingStruct->movesetIndex; if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; @@ -2791,7 +2791,7 @@ static s32 AI_TryToFaint(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } else if (CanTargetFaintAi(battlerDef, battlerAtk) && GetWhichBattlerFasterOrTies(battlerAtk, battlerDef, TRUE) != AI_IS_FASTER - && GetBattleMovePriority(battlerAtk, AI_DATA->abilities[battlerAtk], move) > 0) + && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) > 0) { ADJUST_SCORE(LAST_CHANCE); } @@ -2808,7 +2808,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); // ally data u32 battlerAtkPartner = BATTLE_PARTNER(battlerAtk); - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; u32 atkPartnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; enum BattleMoveEffects partnerEffect = GetMoveEffect(aiData->partnerMove); @@ -2949,13 +2949,13 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && AI_IsFaster(battlerAtk, battlerAtkPartner, move) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING)) + && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { RETURN_SCORE_PLUS(GOOD_EFFECT); } break; case ABILITY_VOLT_ABSORB: - if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) { RETURN_SCORE_MINUS(10); } @@ -2978,7 +2978,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_WATER_ABSORB: case ABILITY_DRY_SKIN: case ABILITY_EARTH_EATER: - if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) { RETURN_SCORE_MINUS(10); } @@ -2993,7 +2993,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case ABILITY_WATER_COMPACTION: - if (moveType == TYPE_WATER && GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING) >= 4) + if (moveType == TYPE_WATER && GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) >= 4) { RETURN_SCORE_PLUS(WEAK_EFFECT); // only mon with this ability is weak to water so only make it okay if we do very little damage } @@ -3020,7 +3020,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && !IsBattleMoveStatus(move) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING)) + && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3029,7 +3029,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!IsBattleMoveStatus(move) && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPEED) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING)) + && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3086,7 +3086,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && !IsBattleMoveStatus(move) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING)) + && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { RETURN_SCORE_PLUS(WEAK_EFFECT); } @@ -3225,8 +3225,8 @@ static bool32 IsPinchBerryItemEffect(enum ItemHoldEffect holdEffect) static s32 CompareMoveAccuracies(u32 battlerAtk, u32 battlerDef, u32 moveSlot1, u32 moveSlot2) { - u32 acc1 = AI_DATA->moveAccuracy[battlerAtk][battlerDef][moveSlot1]; - u32 acc2 = AI_DATA->moveAccuracy[battlerAtk][battlerDef][moveSlot2]; + u32 acc1 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot1]; + u32 acc2 = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][moveSlot2]; if (acc1 > acc2) return 1; @@ -3349,7 +3349,7 @@ static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; enum ItemHoldEffect holdEffect = aiData->holdEffects[battlerAtk]; s32 score = 0; @@ -3358,7 +3358,7 @@ static u32 AI_CalcHoldEffectMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) { case HOLD_EFFECT_BLUNDER_POLICY: { - u32 moveAcc = aiData->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + u32 moveAcc = aiData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; if (moveAcc <= LOW_ACCURACY_THRESHOLD) { @@ -3381,8 +3381,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); - struct AiLogicData *aiData = AI_DATA; - u32 movesetIndex = AI_THINKING_STRUCT->movesetIndex; + struct AiLogicData *aiData = gAiLogicData; + u32 movesetIndex = gAiThinkingStruct->movesetIndex; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; @@ -3397,7 +3397,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) moveEffect = EFFECT_PROTECT; // check status move preference - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); // check thawing moves @@ -3405,7 +3405,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(10); // check burn / frostbite - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && AI_DATA->abilities[battlerAtk] == ABILITY_NATURAL_CURE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && gAiLogicData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) { if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL, TRUE)) || (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL, TRUE))) @@ -3431,14 +3431,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_EXPLOSION: case EFFECT_MEMENTO: - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) { if (aiData->hpPercents[battlerAtk] < 50 && AI_RandLessThan(128)) ADJUST_SCORE(DECENT_EFFECT); } break; case EFFECT_FINAL_GAMBIT: - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_MIRROR_MOVE: @@ -3767,7 +3767,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_BATON_PASS: - if ((AI_DATA->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE + if ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) && (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || (gStatuses3[battlerAtk] & (STATUS3_ROOTED | STATUS3_AQUA_RING | STATUS3_MAGNET_RISE | STATUS3_POWER_TRICK)) || AnyStatIsRaised(battlerAtk))) ADJUST_SCORE(BEST_EFFECT); @@ -4451,7 +4451,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: - if (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) + if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) ADJUST_SCORE(GOOD_EFFECT); @@ -4620,9 +4620,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (GetFirstFaintedPartyIndex(battlerAtk) != PARTY_SIZE) { ADJUST_SCORE(DECENT_EFFECT); - if (AI_DATA->shouldSwitch & (1u << battlerAtk)) // Bad matchup + if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) // Bad matchup ADJUST_SCORE(WEAK_EFFECT); - if (AI_DATA->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after + if (gAiLogicData->mostSuitableMonId[battlerAtk] != PARTY_SIZE) // Good mon to send in after ADJUST_SCORE(WEAK_EFFECT); } break; @@ -4909,15 +4909,15 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score if (GetMovePower(move) != 0) { - if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING) == 0) + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 0) ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); // No point in checking the move further so return early else { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) ADJUST_SCORE(BEST_DAMAGE_MOVE); else - ADJUST_SCORE(AI_CompareDamagingMoves(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex)); + ADJUST_SCORE(AI_CompareDamagingMoves(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex)); } } @@ -4935,10 +4935,10 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 || gBattleResults.battleTurnCounter != 0) return score; - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && AI_IsSlower(battlerAtk, battlerDef, move) && CanTargetFaintAi(battlerDef, battlerAtk) - && GetBattleMovePriority(battlerAtk, AI_DATA->abilities[battlerAtk], move) == 0) + && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) == 0) { RETURN_SCORE_MINUS(20); // No point in setting up if you will faint. Should just switch if possible.. } @@ -5062,7 +5062,7 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 static s32 AI_Risky(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { u8 i; - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; @@ -5138,9 +5138,9 @@ static s32 AI_TryTo2HKO(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) return score; - if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING) == 1) + if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 1) ADJUST_SCORE(BEST_EFFECT); - else if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING) == 2) + else if (GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) == 2) ADJUST_SCORE(DECENT_EFFECT); return score; @@ -5162,7 +5162,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor { if (gBattleResults.battleTurnCounter == 0) ADJUST_SCORE(GOOD_EFFECT); - else if (AI_DATA->hpPercents[battlerAtk] < 60) + else if (gAiLogicData->hpPercents[battlerAtk] < 60) ADJUST_SCORE(-10); else ADJUST_SCORE(WEAK_EFFECT); @@ -5210,9 +5210,9 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { if ((effect == EFFECT_HEAL_PULSE || effect == EFFECT_HIT_ENEMY_HEAL_ALLY) - || (moveType == TYPE_ELECTRIC && AI_DATA->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_VOLT_ABSORB) - || (moveType == TYPE_GROUND && AI_DATA->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_EARTH_EATER) - || (moveType == TYPE_WATER && (AI_DATA->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_DRY_SKIN || AI_DATA->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_WATER_ABSORB))) + || (moveType == TYPE_ELECTRIC && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_VOLT_ABSORB) + || (moveType == TYPE_GROUND && gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_EARTH_EATER) + || (moveType == TYPE_WATER && (gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_DRY_SKIN || gAiLogicData->abilities[BATTLE_PARTNER(battlerAtk)] == ABILITY_WATER_ABSORB))) { if (gStatuses3[battlerDef] & STATUS3_HEAL_BLOCK) return 0; @@ -5221,14 +5221,14 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || (CanTargetFaintAi(BATTLE_PARTNER(FOE(battlerAtk)), BATTLE_PARTNER(battlerAtk)))) ADJUST_SCORE(-1); - if (AI_DATA->hpPercents[battlerDef] <= 50) + if (gAiLogicData->hpPercents[battlerDef] <= 50) ADJUST_SCORE(WEAK_EFFECT); } } else { // Consider AI HP - if (AI_DATA->hpPercents[battlerAtk] > 70) + if (gAiLogicData->hpPercents[battlerAtk] > 70) { // high hp switch (effect) @@ -5253,7 +5253,7 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } } - else if (AI_DATA->hpPercents[battlerAtk] > 30) + else if (gAiLogicData->hpPercents[battlerAtk] > 30) { // med hp if (IsStatRaisingEffect(effect) || IsStatLoweringEffect(effect)) @@ -5316,18 +5316,18 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // consider target HP - if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING)) + if (CanIndexMoveFaintTarget(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { ADJUST_SCORE(DECENT_EFFECT); } else { - if (AI_DATA->hpPercents[battlerDef] > 70) + if (gAiLogicData->hpPercents[battlerDef] > 70) { // high HP ; // nothing yet } - else if (AI_DATA->hpPercents[battlerDef] > 30) + else if (gAiLogicData->hpPercents[battlerDef] > 30) { // med HP - check discouraged effects switch (effect) @@ -5395,7 +5395,7 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score { enum BattleMoveEffects moveEffect = GetMoveEffect(move); - if (GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS || GetMoveEffect(AI_DATA->partnerMove) == moveEffect) + if (GetMoveCategory(move) != DAMAGE_CATEGORY_STATUS || GetMoveEffect(gAiLogicData->partnerMove) == moveEffect) return score; switch (moveEffect) @@ -5438,7 +5438,7 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: case EFFECT_TOXIC_SPIKES: - if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, AI_DATA)) + if (AI_ShouldSetUpHazards(battlerAtk, battlerDef, gAiLogicData)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_GRASSY_TERRAIN: @@ -5492,15 +5492,15 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 opposingHazardFlags = gSideStatuses[GetBattlerSide(battlerDef)] & (SIDE_STATUS_SPIKES | SIDE_STATUS_STEALTH_ROCK | SIDE_STATUS_TOXIC_SPIKES); u32 aiHazardFlags = gSideStatuses[GetBattlerSide(battlerAtk)] & (SIDE_STATUS_HAZARDS_ANY); enum BattleMoveEffects moveEffect = GetMoveEffect(move); - struct AiLogicData *aiData = AI_DATA; - uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + struct AiLogicData *aiData = gAiLogicData; + uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; // Switch benefit switch (moveEffect) { case EFFECT_PURSUIT: { - u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, AI_ATTACKING); + u32 hitsToKO = GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING); if (hitsToKO == 2) ADJUST_SCORE(GOOD_EFFECT); else if (hitsToKO == 1) @@ -5512,7 +5512,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FOCUS_PUNCH: ADJUST_SCORE(DECENT_EFFECT); - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) { if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(10); @@ -5573,7 +5573,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_RESTORE_HP: - if (AI_DATA->hpPercents[battlerAtk] < 60) + if (gAiLogicData->hpPercents[battlerAtk] < 60) ADJUST_SCORE(GOOD_EFFECT); break; @@ -5639,12 +5639,12 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) static void AI_Flee(void) { - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); + gAiThinkingStruct->aiAction |= (AI_ACTION_DONE | AI_ACTION_FLEE | AI_ACTION_DO_NOT_ATTACK); } static void AI_Watch(void) { - AI_THINKING_STRUCT->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); + gAiThinkingStruct->aiAction |= (AI_ACTION_DONE | AI_ACTION_WATCH | AI_ACTION_DO_NOT_ATTACK); } // Roaming pokemon logic @@ -5654,9 +5654,9 @@ static s32 AI_Roaming(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (AI_CanBattlerEscape(battlerAtk)) roamerCanFlee = TRUE; - else if (AI_DATA->abilities[battlerAtk] == ABILITY_RUN_AWAY) + else if (gAiLogicData->abilities[battlerAtk] == ABILITY_RUN_AWAY) roamerCanFlee = TRUE; - else if (AI_DATA->holdEffects[battlerAtk] == HOLD_EFFECT_CAN_ALWAYS_RUN) + else if (gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_CAN_ALWAYS_RUN) roamerCanFlee = TRUE; if (!roamerCanFlee && IsBattlerTrapped(battlerDef, battlerAtk)) @@ -5682,7 +5682,7 @@ static s32 AI_Safari(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // First battle logic static s32 AI_FirstBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { - if (AI_DATA->hpPercents[battlerDef] <= 20) + if (gAiLogicData->hpPercents[battlerDef] <= 20) AI_Flee(); return score; diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c1ff6d9c4a..4937719b44 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -34,8 +34,8 @@ static u32 GetHPHealAmount(u8 itemEffectParam, struct Pokemon *mon); static void InitializeSwitchinCandidate(struct Pokemon *mon) { - PokemonToBattleMon(mon, &AI_DATA->switchinCandidate.battleMon); - AI_DATA->switchinCandidate.hypotheticalStatus = FALSE; + PokemonToBattleMon(mon, &gAiLogicData->switchinCandidate.battleMon); + gAiLogicData->switchinCandidate.hypotheticalStatus = FALSE; } u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) @@ -108,18 +108,18 @@ u32 GetSwitchChance(enum ShouldSwitchScenario shouldSwitchScenario) u32 GetThinkingBattler(u32 battler) { - if (AI_DATA->aiSwitchPredictionInProgress) - return AI_DATA->battlerDoingPrediction; + if (gAiLogicData->aiSwitchPredictionInProgress) + return gAiLogicData->battlerDoingPrediction; return battler; } static bool32 IsAceMon(u32 battler, u32 monPartyId) { - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; @@ -168,7 +168,7 @@ static inline bool32 SetSwitchinAndSwitch(u32 battler, u32 switchinId) static bool32 AI_DoesChoiceItemBlockMove(u32 battler, u32 move) { // Choice locked into something else - if (AI_DATA->lastUsedMove[battler] != MOVE_NONE && AI_DATA->lastUsedMove[battler] != move && HOLD_EFFECT_CHOICE(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) + if (gAiLogicData->lastUsedMove[battler] != MOVE_NONE && gAiLogicData->lastUsedMove[battler] != move && HOLD_EFFECT_CHOICE(GetBattlerHoldEffect(battler, FALSE)) && IsBattlerItemEnabled(battler)) return TRUE; return FALSE; } @@ -181,13 +181,13 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) //Variable initialization u8 opposingPosition, atkType1, atkType2, defType1, defType2; s32 i, damageDealt = 0, maxDamageDealt = 0, damageTaken = 0, maxDamageTaken = 0; - u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = AI_DATA->abilities[battler], opposingBattler; + u32 aiMove, playerMove, aiBestMove = MOVE_NONE, aiAbility = gAiLogicData->abilities[battler], opposingBattler; bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u16 typeEffectiveness = UQ_4_12(1.0); //baseline typing damage enum BattleMoveEffects aiMoveEffect; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic @@ -228,7 +228,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) hasSuperEffectiveMove = TRUE; // Get maximum damage mon can deal - damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, AI_DATA); + damageDealt = AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData); if(damageDealt > maxDamageDealt && !AI_DoesChoiceItemBlockMove(battler, aiMove)) { maxDamageDealt = damageDealt; @@ -255,7 +255,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) playerMove = gBattleMons[opposingBattler].moves[i]; if (playerMove != MOVE_NONE && !IsBattleMoveStatus(playerMove) && GetMoveEffect(playerMove) != EFFECT_FOCUS_PUNCH) { - damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, AI_DATA); + damageTaken = AI_GetDamage(opposingBattler, battler, i, AI_DEFENDING, gAiLogicData); if (playerMove == gBattleStruct->choicedMove[opposingBattler]) // If player is choiced, only care about the choice locked move { return maxDamageTaken = damageTaken; @@ -281,7 +281,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } // If we don't have any other viable options, don't switch out - if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) + if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) return FALSE; // Start assessing whether or not mon has bad odds @@ -293,7 +293,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 4))) { // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !gAiLogicData->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -313,7 +313,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) return FALSE; // 50% chance to stay in regardless - if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !AI_DATA->aiSwitchPredictionInProgress) + if (RandomPercentage(RNG_AI_SWITCH_HASBADODDS, (100 - GetSwitchChance(SHOULD_SWITCH_HASBADODDS))) && !gAiLogicData->aiSwitchPredictionInProgress) return FALSE; // Switch mon out @@ -326,11 +326,11 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) static bool32 ShouldSwitchIfTruant(u32 battler) { // Switch if mon with truant is bodied by Protect or invulnerability spam - if (AI_DATA->abilities[battler] == ABILITY_TRUANT + if (gAiLogicData->abilities[battler] == ABILITY_TRUANT && IsTruantMonVulnerable(battler, gBattlerTarget) && gDisableStructs[battler].truantCounter && gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2 - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE) { if (RandomPercentage(RNG_AI_SWITCH_TRUANT, GetSwitchChance(SHOULD_SWITCH_TRUANT))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -402,7 +402,7 @@ static bool32 ShouldSwitchIfAllMovesBad(u32 battler) if (RandomPercentage(RNG_AI_SWITCH_ALL_MOVES_BAD, GetSwitchChance(SHOULD_SWITCH_ALL_MOVES_BAD))) { - if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) // No good candidate mons, find any one that can deal damage + if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) // No good candidate mons, find any one that can deal damage return FindMonWithMoveOfEffectiveness(battler, opposingBattler, UQ_4_12(1.0)); else // Good candidate mon, send that in return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -419,7 +419,7 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) if (IsDoubleBattle()) return FALSE; - if (AI_DATA->abilities[opposingBattler] != ABILITY_WONDER_GUARD) + if (gAiLogicData->abilities[opposingBattler] != ABILITY_WONDER_GUARD) return FALSE; // Check if PokΓ©mon has a super effective move. @@ -435,7 +435,7 @@ static bool32 ShouldSwitchIfWonderGuard(u32 battler) if (RandomPercentage(RNG_AI_SWITCH_WONDER_GUARD, GetSwitchChance(SHOULD_SWITCH_WONDER_GUARD))) { - if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) // No good candidate mons, find any one that can deal damage + if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) // No good candidate mons, find any one that can deal damage return FindMonWithMoveOfEffectiveness(battler, opposingBattler, UQ_4_12(2.0)); else // Good candidate mon, send that in return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -454,18 +454,18 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) struct Pokemon *party; u16 monAbility, aiMove; u32 opposingBattler = GetOppositeBattler(battler); - u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; + u32 incomingMove = gAiLogicData->lastUsedMove[opposingBattler]; u32 incomingType = GetMoveType(incomingMove); u32 predictedMove = incomingMove; // Update for move prediction u32 predictedType = GetMoveType(predictedMove); bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); s32 i, j; - if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE return FALSE; - if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || AI_DATA->aiSwitchPredictionInProgress)) + if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || gAiLogicData->aiSwitchPredictionInProgress)) return FALSE; if (AreStatsRaised(battler)) return FALSE; @@ -479,7 +479,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) // Only check damage if it's a damaging move if (!IsBattleMoveStatus(aiMove)) { - if (AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, AI_DATA) > gBattleMons[opposingBattler].hp) + if (AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) return FALSE; } } @@ -581,13 +581,13 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) { u32 opposingBattler = GetOppositeBattler(battler); - u32 incomingMove = AI_DATA->lastUsedMove[opposingBattler]; + u32 incomingMove = gAiLogicData->lastUsedMove[opposingBattler]; bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); - if (IsDoubleBattle() || !(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; - if (isOpposingBattlerChargingOrInvulnerable && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) + if (isOpposingBattlerChargingOrInvulnerable && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -603,7 +603,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Check if current mon has an ability that traps opponent @@ -624,7 +624,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) if (CanAbilityTrapOpponent(monAbility, opposingBattler) || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && monAbility == ABILITY_TRACE)) { // If mon in slot i is the most suitable switchin candidate, then it's a trapper than wins 1v1 - if (i == AI_DATA->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) + if (i == gAiLogicData->mostSuitableMonId[battler] && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } } @@ -634,8 +634,8 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) static bool32 ShouldSwitchIfBadlyStatused(u32 battler) { bool32 switchMon = FALSE; - u16 monAbility = AI_DATA->abilities[battler]; - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battler]; + u16 monAbility = gAiLogicData->abilities[battler]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; u8 opposingPosition = BATTLE_OPPOSITE(GetBattlerPosition(battler)); u8 opposingBattler = GetBattlerAtPosition(opposingPosition); bool32 hasStatRaised = AnyStatIsRaised(battler); @@ -647,7 +647,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) { //Yawn if (gStatuses3[battler] & STATUS3_YAWN @@ -658,7 +658,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) switchMon = TRUE; // If we don't have a good switchin, not worth switching - if (AI_DATA->mostSuitableMonId[battler] == PARTY_SIZE) + if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) switchMon = FALSE; // Check if Active Pokemon can KO opponent instead of switching @@ -680,10 +680,10 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) // Check if Active Pokemon evasion boosted and might be able to dodge until awake if (gBattleMons[battler].statStages[STAT_EVASION] > (DEFAULT_STAT_STAGE + 3) - && AI_DATA->abilities[opposingBattler] != ABILITY_UNAWARE - && AI_DATA->abilities[opposingBattler] != ABILITY_KEEN_EYE - && AI_DATA->abilities[opposingBattler] != ABILITY_MINDS_EYE - && (B_ILLUMINATE_EFFECT >= GEN_9 && AI_DATA->abilities[opposingBattler] != ABILITY_ILLUMINATE) + && gAiLogicData->abilities[opposingBattler] != ABILITY_UNAWARE + && gAiLogicData->abilities[opposingBattler] != ABILITY_KEEN_EYE + && gAiLogicData->abilities[opposingBattler] != ABILITY_MINDS_EYE + && (B_ILLUMINATE_EFFECT >= GEN_9 && gAiLogicData->abilities[opposingBattler] != ABILITY_ILLUMINATE) && !(gBattleMons[battler].status2 & STATUS2_FORESIGHT) && !(gStatuses3[battler] & STATUS3_MIRACLE_EYED)) switchMon = FALSE; @@ -695,12 +695,12 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) // Secondary Damage if (monAbility != ABILITY_MAGIC_GUARD && !AiExpectsToFaintPlayer(battler) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE) { //Toxic if (((gBattleMons[battler].status1 & STATUS1_TOXIC_COUNTER) >= STATUS1_TOXIC_TURN(2)) && gBattleMons[battler].hp >= (gBattleMons[battler].maxHP / 3) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_BADLY_POISONED, GetSwitchChance(SHOULD_SWITCH_BADLY_POISONED)))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); @@ -723,7 +723,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) // Infatuation if (gBattleMons[battler].status2 & STATUS2_INFATUATION && !AiExpectsToFaintPlayer(battler) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_INFATUATION, GetSwitchChance(SHOULD_SWITCH_INFATUATION))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } @@ -740,18 +740,18 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) || IsNeutralizingGasOnField()) return FALSE; - switch(AI_DATA->abilities[battler]) + switch(gAiLogicData->abilities[battler]) { case ABILITY_NATURAL_CURE: //Attempt to cure bad ailment if (gBattleMons[battler].status1 & (STATUS1_SLEEP | STATUS1_FREEZE | STATUS1_TOXIC_POISON) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_STRONG)))) break; //Attempt to cure lesser ailment if ((gBattleMons[battler].status1 & STATUS1_ANY) && (gBattleMons[battler].hp >= gBattleMons[battler].maxHP / 2) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_NATURAL_CURE, GetSwitchChance(SHOULD_SWITCH_NATURAL_CURE_WEAK)))) break; @@ -762,7 +762,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) if (gBattleMons[battler].status1 & STATUS1_ANY) return FALSE; if ((gBattleMons[battler].hp <= ((gBattleMons[battler].maxHP * 2) / 3)) - && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE + && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (hasStatRaised ? RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR_STATS_RAISED)) : RandomPercentage(RNG_AI_SWITCH_REGENERATOR, GetSwitchChance(SHOULD_SWITCH_REGENERATOR)))) break; @@ -836,7 +836,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc u16 move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (gLastLandedMoves[battler] == MOVE_NONE) @@ -898,7 +898,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc if (move == 0) continue; - if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || AI_DATA->aiSwitchPredictionInProgress)) + if (AI_GetMoveEffectiveness(move, battler, battlerIn1) >= UQ_4_12(2.0) && (RandomPercentage(RNG_AI_SWITCH_SE_DEFENSIVE, percentChance) || gAiLogicData->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, i); } } @@ -911,7 +911,7 @@ static bool32 CanMonSurviveHazardSwitchin(u32 battler) { u32 battlerIn1, battlerIn2; u32 hazardDamage = 0, battlerHp = gBattleMons[battler].hp; - u32 ability = AI_DATA->abilities[battler], aiMove; + u32 ability = gAiLogicData->abilities[battler], aiMove; s32 firstId, lastId, i, j; struct Pokemon *party; @@ -974,7 +974,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // If not Encore'd don't switch @@ -990,7 +990,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) return FALSE; // Switch out 50% of the time otherwise - else if ((RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_DAMAGE)) || AI_DATA->aiSwitchPredictionInProgress) && AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE) + else if ((RandomPercentage(RNG_AI_SWITCH_ENCORE, GetSwitchChance(SHOULD_SWITCH_ENCORE_DAMAGE)) || gAiLogicData->aiSwitchPredictionInProgress) && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE) return SetSwitchinAndSwitch(battler, PARTY_SIZE); return FALSE; @@ -999,13 +999,13 @@ static bool32 ShouldSwitchIfEncored(u32 battler) static bool32 ShouldSwitchIfBadChoiceLock(u32 battler) { enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); - u32 lastUsedMove = AI_DATA->lastUsedMove[battler]; + u32 lastUsedMove = gAiLogicData->lastUsedMove[battler]; u32 opposingBattler = GetOppositeBattler(battler); bool32 moveAffectsTarget = TRUE; if (lastUsedMove != MOVE_NONE && (AI_GetMoveEffectiveness(lastUsedMove, battler, opposingBattler) == UQ_4_12(0.0) - || CanAbilityAbsorbMove(battler, opposingBattler, AI_DATA->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), ABILITY_CHECK_TRIGGER) - || CanAbilityBlockMove(battler, opposingBattler, AI_DATA->abilities[battler], AI_DATA->abilities[opposingBattler], lastUsedMove, ABILITY_CHECK_TRIGGER))) + || CanAbilityAbsorbMove(battler, opposingBattler, gAiLogicData->abilities[opposingBattler], lastUsedMove, GetMoveType(lastUsedMove), ABILITY_CHECK_TRIGGER) + || CanAbilityBlockMove(battler, opposingBattler, gAiLogicData->abilities[battler], gAiLogicData->abilities[opposingBattler], lastUsedMove, ABILITY_CHECK_TRIGGER))) moveAffectsTarget = FALSE; if (HOLD_EFFECT_CHOICE(holdEffect) && IsBattlerItemEnabled(battler)) @@ -1024,7 +1024,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Physical attacker @@ -1036,7 +1036,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (attackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) + if (gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || gAiLogicData->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless @@ -1053,7 +1053,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) // 50% chance if attack at -2 and have a good candidate mon else if (spAttackingStage == DEFAULT_STAT_STAGE - 2) { - if (AI_DATA->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || AI_DATA->aiSwitchPredictionInProgress)) + if (gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && (RandomPercentage(RNG_AI_SWITCH_STATS_LOWERED, GetSwitchChance(SHOULD_SWITCH_ATTACKING_STAT_MINUS_TWO)) || gAiLogicData->aiSwitchPredictionInProgress)) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } // If at -3 or worse, switch out regardless @@ -1100,7 +1100,7 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // Sequence Switching AI never switches mid-battle - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) return FALSE; availableToSwitch = 0; @@ -1152,7 +1152,7 @@ bool32 ShouldSwitch(u32 battler) if (ShouldSwitchIfWonderGuard(battler)) return TRUE; - if ((AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + if ((gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) return FALSE; if (HasGoodSubstituteMove(battler)) return FALSE; @@ -1182,7 +1182,7 @@ bool32 ShouldSwitch(u32 battler) // Removing switch capabilites under specific conditions // These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (HasSuperEffectiveMoveAgainstOpponents(battler, FALSE)) return FALSE; @@ -1206,14 +1206,14 @@ bool32 IsSwitchinValid(u32 battler) u32 partner = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerAtPosition(battler))); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) // Generic switch { - if ((AI_DATA->shouldSwitch & (1u << partner)) && AI_DATA->monToSwitchInId[partner] == AI_DATA->mostSuitableMonId[battler]) + if ((gAiLogicData->shouldSwitch & (1u << partner)) && gAiLogicData->monToSwitchInId[partner] == gAiLogicData->mostSuitableMonId[battler]) { return FALSE; } } else // Override switch { - if ((AI_DATA->shouldSwitch & (1u << partner)) && AI_DATA->monToSwitchInId[partner] == gBattleStruct->AI_monToSwitchIntoId[battler]) + if ((gAiLogicData->shouldSwitch & (1u << partner)) && gAiLogicData->monToSwitchInId[partner] == gBattleStruct->AI_monToSwitchIntoId[battler]) { return FALSE; } @@ -1233,12 +1233,12 @@ void AI_TrySwitchOrUseItem(u32 battler) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - if (AI_DATA->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) + if (gAiLogicData->shouldSwitch & (1u << battler) && IsSwitchinValid(battler)) { BtlController_EmitTwoReturnValues(battler, 1, B_ACTION_SWITCH, 0); if (gBattleStruct->AI_monToSwitchIntoId[battler] == PARTY_SIZE) { - s32 monToSwitchId = AI_DATA->mostSuitableMonId[battler]; + s32 monToSwitchId = gAiLogicData->mostSuitableMonId[battler]; if (monToSwitchId == PARTY_SIZE) { if (!IsDoubleBattle()) @@ -1277,7 +1277,7 @@ void AI_TrySwitchOrUseItem(u32 battler) } gBattleStruct->monToSwitchIntoId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; - AI_DATA->monToSwitchInId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; + gAiLogicData->monToSwitchInId[battler] = gBattleStruct->AI_monToSwitchIntoId[battler]; return; } else if (ShouldUseItem(battler)) @@ -1400,11 +1400,11 @@ static u32 GetBestMonDmg(struct Pokemon *party, int firstId, int lastId, u8 inva InitializeSwitchinCandidate(&party[i]); for (j = 0; j < MAX_MON_MOVES; j++) { - aiMove = AI_DATA->switchinCandidate.battleMon.moves[j]; + aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { aiMove = GetMonData(&party[i], MON_DATA_MOVE1 + j); - dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, AI_ATTACKING); + dmg = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); if (bestDmg < dmg) { bestDmg = dmg; @@ -1494,8 +1494,8 @@ static u32 GetSwitchinHazardsDamage(u32 battler, struct BattlePokemon *battleMon // Gets damage / healing from weather static s32 GetSwitchinWeatherImpact(void) { - s32 weatherImpact = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + s32 weatherImpact = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); if (HasWeatherEffect()) { @@ -1503,7 +1503,7 @@ static s32 GetSwitchinWeatherImpact(void) if (holdEffect != HOLD_EFFECT_SAFETY_GOGGLES && ability != ABILITY_MAGIC_GUARD && ability != ABILITY_OVERCOAT) { if ((gBattleWeather & B_WEATHER_HAIL) - && (AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_ICE || AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_ICE) + && (gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_ICE || gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_ICE) && ability != ABILITY_SNOW_CLOAK && ability != ABILITY_ICE_BODY) { weatherImpact = maxHP / 16; @@ -1511,9 +1511,9 @@ static s32 GetSwitchinWeatherImpact(void) weatherImpact = 1; } else if ((gBattleWeather & B_WEATHER_SANDSTORM) - && (AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_GROUND && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_GROUND - && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_ROCK && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_ROCK - && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_STEEL && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_STEEL + && (gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_GROUND && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_GROUND + && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_ROCK && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_ROCK + && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_STEEL && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_STEEL && ability != ABILITY_SAND_VEIL && ability != ABILITY_SAND_RUSH && ability != ABILITY_SAND_FORCE)) { weatherImpact = maxHP / 16; @@ -1558,13 +1558,13 @@ static s32 GetSwitchinWeatherImpact(void) // Gets one turn of recurring healing static u32 GetSwitchinRecurringHealing(void) { - u32 recurringHealing = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + u32 recurringHealing = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && (AI_DATA->switchinCandidate.battleMon.types[0] == TYPE_POISON || AI_DATA->switchinCandidate.battleMon.types[1] == TYPE_POISON)) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && (gAiLogicData->switchinCandidate.battleMon.types[0] == TYPE_POISON || gAiLogicData->switchinCandidate.battleMon.types[1] == TYPE_POISON)) { recurringHealing = maxHP / 16; if (recurringHealing == 0) @@ -1579,7 +1579,7 @@ static u32 GetSwitchinRecurringHealing(void) } // Intentionally omitting Shell Bell for its inconsistency // Abilities - if (ability == ABILITY_POISON_HEAL && (AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_POISON)) + if (ability == ABILITY_POISON_HEAL && (gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_POISON)) { u32 healing = maxHP / 8; if (healing == 0) @@ -1592,13 +1592,13 @@ static u32 GetSwitchinRecurringHealing(void) // Gets one turn of recurring damage static u32 GetSwitchinRecurringDamage(void) { - u32 passiveDamage = 0, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, ability = AI_DATA->switchinCandidate.battleMon.ability; - enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); + u32 passiveDamage = 0, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, ability = gAiLogicData->switchinCandidate.battleMon.ability; + enum ItemHoldEffect holdEffect = ItemId_GetHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); // Items if (ability != ABILITY_MAGIC_GUARD && ability != ABILITY_KLUTZ) { - if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && AI_DATA->switchinCandidate.battleMon.types[0] != TYPE_POISON && AI_DATA->switchinCandidate.battleMon.types[1] != TYPE_POISON) + if (holdEffect == HOLD_EFFECT_BLACK_SLUDGE && gAiLogicData->switchinCandidate.battleMon.types[0] != TYPE_POISON && gAiLogicData->switchinCandidate.battleMon.types[1] != TYPE_POISON) { passiveDamage = maxHP / 8; if (passiveDamage == 0) @@ -1623,14 +1623,14 @@ static u32 GetSwitchinRecurringDamage(void) // Gets one turn of status damage static u32 GetSwitchinStatusDamage(u32 battler) { - u8 defType1 = AI_DATA->switchinCandidate.battleMon.types[0], defType2 = AI_DATA->switchinCandidate.battleMon.types[1]; + u8 defType1 = gAiLogicData->switchinCandidate.battleMon.types[0], defType2 = gAiLogicData->switchinCandidate.battleMon.types[1]; u8 tSpikesLayers = gSideTimers[GetBattlerSide(battler)].toxicSpikesAmount; - u16 heldItemEffect = ItemId_GetHoldEffect(AI_DATA->switchinCandidate.battleMon.item); - u32 status = AI_DATA->switchinCandidate.battleMon.status1, ability = AI_DATA->switchinCandidate.battleMon.ability, maxHP = AI_DATA->switchinCandidate.battleMon.maxHP; + u16 heldItemEffect = ItemId_GetHoldEffect(gAiLogicData->switchinCandidate.battleMon.item); + u32 status = gAiLogicData->switchinCandidate.battleMon.status1, ability = gAiLogicData->switchinCandidate.battleMon.ability, maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP; u32 statusDamage = 0; // Status condition damage - if ((status != 0) && AI_DATA->switchinCandidate.battleMon.ability != ABILITY_MAGIC_GUARD) + if ((status != 0) && gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_MAGIC_GUARD) { if (status & STATUS1_BURN) { @@ -1661,11 +1661,11 @@ static u32 GetSwitchinStatusDamage(u32 battler) else if ((status & STATUS1_TOXIC_POISON) && ability != ABILITY_POISON_HEAL) { if ((status & STATUS1_TOXIC_COUNTER) != STATUS1_TOXIC_TURN(15)) // not 16 turns - AI_DATA->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); + gAiLogicData->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); statusDamage = maxHP / 16; if (statusDamage == 0) statusDamage = 1; - statusDamage *= AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; + statusDamage *= gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_COUNTER >> 8; } } @@ -1681,14 +1681,14 @@ static u32 GetSwitchinStatusDamage(u32 battler) { if (tSpikesLayers == 1) { - AI_DATA->switchinCandidate.battleMon.status1 = STATUS1_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes - AI_DATA->switchinCandidate.hypotheticalStatus = TRUE; + gAiLogicData->switchinCandidate.battleMon.status1 = STATUS1_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes + gAiLogicData->switchinCandidate.hypotheticalStatus = TRUE; } if (tSpikesLayers == 2) { - AI_DATA->switchinCandidate.battleMon.status1 = STATUS1_TOXIC_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes - AI_DATA->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); - AI_DATA->switchinCandidate.hypotheticalStatus = TRUE; + gAiLogicData->switchinCandidate.battleMon.status1 = STATUS1_TOXIC_POISON; // Assign "hypothetical" status to the switchin candidate so we can get the damage it would take from TSpikes + gAiLogicData->switchinCandidate.battleMon.status1 += STATUS1_TOXIC_TURN(1); + gAiLogicData->switchinCandidate.hypotheticalStatus = TRUE; } } return statusDamage; @@ -1697,16 +1697,16 @@ static u32 GetSwitchinStatusDamage(u32 battler) // Gets number of hits to KO factoring in hazards, healing held items, status, and weather static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) { - u32 startingHP = AI_DATA->switchinCandidate.battleMon.hp - GetSwitchinHazardsDamage(battler, &AI_DATA->switchinCandidate.battleMon); + u32 startingHP = gAiLogicData->switchinCandidate.battleMon.hp - GetSwitchinHazardsDamage(battler, &gAiLogicData->switchinCandidate.battleMon); s32 weatherImpact = GetSwitchinWeatherImpact(); // Signed to handle both damage and healing in the same value u32 recurringDamage = GetSwitchinRecurringDamage(); u32 recurringHealing = GetSwitchinRecurringHealing(); u32 statusDamage = GetSwitchinStatusDamage(battler); u32 hitsToKO = 0, singleUseItemHeal = 0; - u16 maxHP = AI_DATA->switchinCandidate.battleMon.maxHP, item = AI_DATA->switchinCandidate.battleMon.item, heldItemEffect = ItemId_GetHoldEffect(item); + u16 maxHP = gAiLogicData->switchinCandidate.battleMon.maxHP, item = gAiLogicData->switchinCandidate.battleMon.item, heldItemEffect = ItemId_GetHoldEffect(item); u8 weatherDuration = gWishFutureKnock.weatherDuration, holdEffectParam = ItemId_GetHoldEffectParam(item); u32 opposingBattler = GetOppositeBattler(battler); - u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = AI_DATA->switchinCandidate.battleMon.ability; + u32 opposingAbility = gBattleMons[opposingBattler].ability, ability = gAiLogicData->switchinCandidate.battleMon.ability; bool32 usedSingleUseHealingItem = FALSE, opponentCanBreakMold = IsMoldBreakerTypeAbility(opposingBattler, opposingAbility); s32 currentHP = startingHP; @@ -1737,7 +1737,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP - weatherImpact; // Check if we're at a single use healing item threshold - if (AI_DATA->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE + if (gAiLogicData->switchinCandidate.battleMon.ability != ABILITY_KLUTZ && usedSingleUseHealingItem == FALSE && !(opposingAbility == ABILITY_UNNERVE && GetPocketByItemId(item) == POCKET_BERRIES)) { switch (heldItemEffect) @@ -1784,7 +1784,7 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) currentHP = currentHP + recurringHealing - recurringDamage - statusDamage; // Recalculate toxic damage if needed - if (AI_DATA->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_POISON) + if (gAiLogicData->switchinCandidate.battleMon.status1 & STATUS1_TOXIC_POISON) statusDamage = GetSwitchinStatusDamage(battler); // Reduce weather duration @@ -1795,14 +1795,14 @@ static u32 GetSwitchinHitsToKO(s32 damageTaken, u32 battler) } // Disguise will always add an extra hit to KO - if (opponentCanBreakMold && AI_DATA->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) + if (opponentCanBreakMold && gAiLogicData->switchinCandidate.battleMon.species == SPECIES_MIMIKYU_DISGUISED) hitsToKO++; // If mon had a hypothetical status from TSpikes, clear it - if (AI_DATA->switchinCandidate.hypotheticalStatus == TRUE) + if (gAiLogicData->switchinCandidate.hypotheticalStatus == TRUE) { - AI_DATA->switchinCandidate.battleMon.status1 = 0; - AI_DATA->switchinCandidate.hypotheticalStatus = FALSE; + gAiLogicData->switchinCandidate.battleMon.status1 = 0; + gAiLogicData->switchinCandidate.hypotheticalStatus = FALSE; } return hitsToKO; } @@ -1875,7 +1875,7 @@ static bool32 CanAbilityTrapOpponent(u16 ability, u32 opponent) return FALSE; else if (ability == ABILITY_SHADOW_TAG) { - if (B_SHADOW_TAG_ESCAPE >= GEN_4 && AI_DATA->abilities[opponent] == ABILITY_SHADOW_TAG) // Check if ability exists in species + if (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[opponent] == ABILITY_SHADOW_TAG) // Check if ability exists in species return FALSE; else return TRUE; @@ -1897,9 +1897,9 @@ static inline bool32 IsFreeSwitch(enum SwitchType switchType, u32 battlerSwitchi { if (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) && movedSecond) return TRUE; - if (AI_DATA->ejectButtonSwitch) + if (gAiLogicData->ejectButtonSwitch) return TRUE; - if (AI_DATA->ejectPackSwitch) + if (gAiLogicData->ejectPackSwitch) { u32 opposingAbility = AI_GetBattlerAbility(opposingBattler); // If faster, not a free switch; likely lowered own stats @@ -1969,12 +1969,12 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, InitializeSwitchinCandidate(&party[i]); // While not really invalid per se, not really wise to switch into this mon - if (AI_DATA->switchinCandidate.battleMon.ability == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) + if (gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRUANT && IsTruantMonVulnerable(battler, opposingBattler)) continue; // Get max number of hits for player to KO AI mon and type matchup for defensive switching - hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, AI_DATA->switchinCandidate.battleMon), battler); - typeMatchup = GetSwitchinTypeMatchup(opposingBattler, AI_DATA->switchinCandidate.battleMon); + hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon), battler); + typeMatchup = GetSwitchinTypeMatchup(opposingBattler, gAiLogicData->switchinCandidate.battleMon); // Track max hits to KO and set defensive mon if(hitsToKOAI > maxHitsToKO) @@ -1987,13 +1987,13 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { - aiMove = AI_DATA->switchinCandidate.battleMon.moves[j]; + aiMove = gAiLogicData->switchinCandidate.battleMon.moves[j]; if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) - damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, AI_ATTACKING); + damageDealt = AI_CalcPartyMonDamage(aiMove, battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, AI_ATTACKING); // Offensive switchin decisions are based on which whether switchin moves first and whether it can win a 1v1 - isSwitchinFirst = AI_WhoStrikesFirstPartyMon(battler, opposingBattler, AI_DATA->switchinCandidate.battleMon, aiMove); + isSwitchinFirst = AI_WhoStrikesFirstPartyMon(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon, aiMove); canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler), isSwitchinFirst, isFreeSwitch); // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not @@ -2068,8 +2068,8 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If mon can trap - if ((CanAbilityTrapOpponent(AI_DATA->switchinCandidate.battleMon.ability, opposingBattler) - || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && AI_DATA->switchinCandidate.battleMon.ability == ABILITY_TRACE)) + if ((CanAbilityTrapOpponent(gAiLogicData->switchinCandidate.battleMon.ability, opposingBattler) + || (CanAbilityTrapOpponent(AI_GetBattlerAbility(opposingBattler), opposingBattler) && gAiLogicData->switchinCandidate.battleMon.ability == ABILITY_TRACE)) && CountUsablePartyMons(opposingBattler) > 0 && canSwitchinWin1v1) trapperId = i; @@ -2104,7 +2104,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) + && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; @@ -2166,14 +2166,14 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) { bestMonId = GetNextMonInParty(party, firstId, lastId, battlerIn1, battlerIn2); return bestMonId; } // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (AI_THINKING_STRUCT->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; @@ -2221,7 +2221,7 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) // If ace mon is the last available Pokemon and U-Turn/Volt Switch or Eject Pack/Button was used - switch to the mon. if (aceMonId != PARTY_SIZE && CountUsablePartyMons(battler) <= aceMonCount - && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || AI_DATA->ejectButtonSwitch || AI_DATA->ejectPackSwitch)) + && (IsSwitchOutEffect(GetMoveEffect(gCurrentMove)) || gAiLogicData->ejectButtonSwitch || gAiLogicData->ejectPackSwitch)) return aceMonId; return PARTY_SIZE; @@ -2284,7 +2284,7 @@ static bool32 ShouldUseItem(u32 battler) const u8 *itemEffects; u8 battlerSide; - item = gBattleResources->battleHistory->trainerItems[i]; + item = gBattleHistory->trainerItems[i]; if (item == ITEM_NONE) continue; itemEffects = ItemId_GetEffect(item); @@ -2354,7 +2354,7 @@ static bool32 ShouldUseItem(u32 battler) gBattleStruct->itemPartyIndex[battler] = gBattlerPartyIndexes[battler]; BtlController_EmitTwoReturnValues(battler, BUFFER_B, B_ACTION_USE_ITEM, 0); gBattleStruct->chosenItem[battler] = item; - gBattleResources->battleHistory->trainerItems[i] = 0; + gBattleHistory->trainerItems[i] = 0; return shouldUse; } } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 74f0646ed3..e0d040c294 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -55,17 +55,17 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC if (calcContext == AI_ATTACKING && BattlerHasAi(battlerAtk)) { - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it deals max damage + if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it deals max damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it deals min damage + if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it deals min damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].median; // Default assumes it deals median damage } else if (calcContext == AI_DEFENDING && BattlerHasAi(battlerDef)) { - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it takes min damage + if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it takes min damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it takes max damage + if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it takes max damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].median; // Default assumes it takes median damage } @@ -125,8 +125,8 @@ bool32 BattlerHasAi(u32 battlerId) bool32 IsAiBattlerAware(u32 battlerId) { - if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT - || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT) return TRUE; return BattlerHasAi(battlerId); @@ -134,8 +134,8 @@ bool32 IsAiBattlerAware(u32 battlerId) bool32 IsAiBattlerPredictingAbility(u32 battlerId) { - if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION - || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) return TRUE; return BattlerHasAi(battlerId); @@ -144,10 +144,10 @@ bool32 IsAiBattlerPredictingAbility(u32 battlerId) bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch - if (AI_THINKING_STRUCT->aiFlags[AI_DATA->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH - || AI_THINKING_STRUCT->aiFlags[AI_DATA->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + if (gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH + || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) { - if (AI_DATA->predictingSwitch && AI_DATA->shouldSwitch & (1u << battler)) + if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) return TRUE; } return FALSE; @@ -155,18 +155,18 @@ bool32 IsBattlerPredictedToSwitch(u32 battler) void ClearBattlerMoveHistory(u32 battlerId) { - memset(BATTLE_HISTORY->usedMoves[battlerId], 0, sizeof(BATTLE_HISTORY->usedMoves[battlerId])); - memset(BATTLE_HISTORY->moveHistory[battlerId], 0, sizeof(BATTLE_HISTORY->moveHistory[battlerId])); - BATTLE_HISTORY->moveHistoryIndex[battlerId] = 0; + memset(gBattleHistory->usedMoves[battlerId], 0, sizeof(gBattleHistory->usedMoves[battlerId])); + memset(gBattleHistory->moveHistory[battlerId], 0, sizeof(gBattleHistory->moveHistory[battlerId])); + gBattleHistory->moveHistoryIndex[battlerId] = 0; } void RecordLastUsedMoveBy(u32 battlerId, u32 move) { - u8 *index = &BATTLE_HISTORY->moveHistoryIndex[battlerId]; + u8 *index = &gBattleHistory->moveHistoryIndex[battlerId]; if (++(*index) >= AI_MOVE_HISTORY_COUNT) *index = 0; - BATTLE_HISTORY->moveHistory[battlerId][*index] = move; + gBattleHistory->moveHistory[battlerId][*index] = move; } void RecordKnownMove(u32 battlerId, u32 move) @@ -175,12 +175,12 @@ void RecordKnownMove(u32 battlerId, u32 move) for (i = 0; i < MAX_MON_MOVES; i++) { - if (BATTLE_HISTORY->usedMoves[battlerId][i] == move) + if (gBattleHistory->usedMoves[battlerId][i] == move) break; - if (BATTLE_HISTORY->usedMoves[battlerId][i] == MOVE_NONE) + if (gBattleHistory->usedMoves[battlerId][i] == MOVE_NONE) { - BATTLE_HISTORY->usedMoves[battlerId][i] = move; - AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].moves[i] = move; + gBattleHistory->usedMoves[battlerId][i] = move; + gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].moves[i] = move; break; } } @@ -188,47 +188,47 @@ void RecordKnownMove(u32 battlerId, u32 move) void RecordAllMoves(u32 battler) { - memcpy(AI_PARTY->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].moves, gBattleMons[battler].moves, MAX_MON_MOVES * sizeof(u16)); + memcpy(gAiPartyData->mons[GetBattlerSide(battler)][gBattlerPartyIndexes[battler]].moves, gBattleMons[battler].moves, MAX_MON_MOVES * sizeof(u16)); } void RecordAbilityBattle(u32 battlerId, u32 abilityId) { - BATTLE_HISTORY->abilities[battlerId] = abilityId; - AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability = abilityId; + gBattleHistory->abilities[battlerId] = abilityId; + gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability = abilityId; } void ClearBattlerAbilityHistory(u32 battlerId) { - BATTLE_HISTORY->abilities[battlerId] = ABILITY_NONE; + gBattleHistory->abilities[battlerId] = ABILITY_NONE; } void RecordItemEffectBattle(u32 battlerId, u32 itemEffect) { - BATTLE_HISTORY->itemEffects[battlerId] = itemEffect; - AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect = itemEffect; + gBattleHistory->itemEffects[battlerId] = itemEffect; + gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect = itemEffect; } void ClearBattlerItemEffectHistory(u32 battlerId) { - BATTLE_HISTORY->itemEffects[battlerId] = 0; + gBattleHistory->itemEffects[battlerId] = 0; } void SaveBattlerData(u32 battlerId) { - if (!BattlerHasAi(battlerId) && !AI_THINKING_STRUCT->saved[battlerId].saved) + if (!BattlerHasAi(battlerId) && !gAiThinkingStruct->saved[battlerId].saved) { u32 i; - AI_THINKING_STRUCT->saved[battlerId].saved = TRUE; - AI_THINKING_STRUCT->saved[battlerId].ability = gBattleMons[battlerId].ability; - AI_THINKING_STRUCT->saved[battlerId].heldItem = gBattleMons[battlerId].item; - AI_THINKING_STRUCT->saved[battlerId].species = gBattleMons[battlerId].species; + gAiThinkingStruct->saved[battlerId].saved = TRUE; + gAiThinkingStruct->saved[battlerId].ability = gBattleMons[battlerId].ability; + gAiThinkingStruct->saved[battlerId].heldItem = gBattleMons[battlerId].item; + gAiThinkingStruct->saved[battlerId].species = gBattleMons[battlerId].species; for (i = 0; i < 4; i++) - AI_THINKING_STRUCT->saved[battlerId].moves[i] = gBattleMons[battlerId].moves[i]; + gAiThinkingStruct->saved[battlerId].moves[i] = gBattleMons[battlerId].moves[i]; } // Save and restore types even for AI controlled battlers in case it gets changed during move evaluation process. - AI_THINKING_STRUCT->saved[battlerId].types[0] = gBattleMons[battlerId].types[0]; - AI_THINKING_STRUCT->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; + gAiThinkingStruct->saved[battlerId].types[0] = gBattleMons[battlerId].types[0]; + gAiThinkingStruct->saved[battlerId].types[1] = gBattleMons[battlerId].types[1]; } static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) @@ -236,13 +236,13 @@ static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) u32 i, j; const struct LevelUpMove *learnset; - if (BATTLE_HISTORY->abilities[battlerId] == ABILITY_ILLUSION) + if (gBattleHistory->abilities[battlerId] == ABILITY_ILLUSION) return FALSE; // Don't fall for Illusion if the mon used a move it cannot know. for (i = 0; i < MAX_MON_MOVES; i++) { - u32 move = BATTLE_HISTORY->usedMoves[battlerId][i]; + u32 move = gBattleHistory->usedMoves[battlerId][i]; if (move == MOVE_NONE) continue; @@ -269,7 +269,7 @@ static bool32 ShouldFailForIllusion(u32 illusionSpecies, u32 battlerId) void SetBattlerData(u32 battlerId) { - if (!BattlerHasAi(battlerId) && AI_THINKING_STRUCT->saved[battlerId].saved) + if (!BattlerHasAi(battlerId) && gAiThinkingStruct->saved[battlerId].saved) { u32 i, species, illusionSpecies, side; side = GetBattlerSide(battlerId); @@ -290,8 +290,8 @@ void SetBattlerData(u32 battlerId) } // Use the known battler's ability. - if (AI_PARTY->mons[side][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) - gBattleMons[battlerId].ability = AI_PARTY->mons[side][gBattlerPartyIndexes[battlerId]].ability; + if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) + gBattleMons[battlerId].ability = gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].ability; // Check if mon can only have one ability. else if (gSpeciesInfo[species].abilities[1] == ABILITY_NONE || gSpeciesInfo[species].abilities[1] == gSpeciesInfo[species].abilities[0]) @@ -300,12 +300,12 @@ void SetBattlerData(u32 battlerId) else gBattleMons[battlerId].ability = ABILITY_NONE; - if (AI_PARTY->mons[side][gBattlerPartyIndexes[battlerId]].heldEffect == 0) + if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].heldEffect == 0) gBattleMons[battlerId].item = 0; for (i = 0; i < MAX_MON_MOVES; i++) { - if (AI_PARTY->mons[side][gBattlerPartyIndexes[battlerId]].moves[i] == 0) + if (gAiPartyData->mons[side][gBattlerPartyIndexes[battlerId]].moves[i] == 0) gBattleMons[battlerId].moves[i] = 0; } } @@ -313,19 +313,19 @@ void SetBattlerData(u32 battlerId) void RestoreBattlerData(u32 battlerId) { - if (!BattlerHasAi(battlerId) && AI_THINKING_STRUCT->saved[battlerId].saved) + if (!BattlerHasAi(battlerId) && gAiThinkingStruct->saved[battlerId].saved) { u32 i; - AI_THINKING_STRUCT->saved[battlerId].saved = FALSE; - gBattleMons[battlerId].ability = AI_THINKING_STRUCT->saved[battlerId].ability; - gBattleMons[battlerId].item = AI_THINKING_STRUCT->saved[battlerId].heldItem; - gBattleMons[battlerId].species = AI_THINKING_STRUCT->saved[battlerId].species; + gAiThinkingStruct->saved[battlerId].saved = FALSE; + gBattleMons[battlerId].ability = gAiThinkingStruct->saved[battlerId].ability; + gBattleMons[battlerId].item = gAiThinkingStruct->saved[battlerId].heldItem; + gBattleMons[battlerId].species = gAiThinkingStruct->saved[battlerId].species; for (i = 0; i < 4; i++) - gBattleMons[battlerId].moves[i] = AI_THINKING_STRUCT->saved[battlerId].moves[i]; + gBattleMons[battlerId].moves[i] = gAiThinkingStruct->saved[battlerId].moves[i]; } - gBattleMons[battlerId].types[0] = AI_THINKING_STRUCT->saved[battlerId].types[0]; - gBattleMons[battlerId].types[1] = AI_THINKING_STRUCT->saved[battlerId].types[1]; + gBattleMons[battlerId].types[0] = gAiThinkingStruct->saved[battlerId].types[0]; + gBattleMons[battlerId].types[1] = gAiThinkingStruct->saved[battlerId].types[1]; } u32 GetHealthPercentage(u32 battlerId) @@ -335,7 +335,7 @@ u32 GetHealthPercentage(u32 battlerId) bool32 AI_BattlerAtMaxHp(u32 battlerId) { - if (AI_DATA->hpPercents[battlerId] == 100) + if (gAiLogicData->hpPercents[battlerId] == 100) return TRUE; return FALSE; } @@ -343,7 +343,7 @@ bool32 AI_BattlerAtMaxHp(u32 battlerId) bool32 AI_CanBattlerEscape(u32 battler) { - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battler]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battler]; if (B_GHOSTS_ESCAPE >= GEN_6 && IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) return TRUE; @@ -362,7 +362,7 @@ bool32 IsBattlerTrapped(u32 battlerAtk, u32 battlerDef) if (gFieldStatuses & STATUS_FIELD_FAIRY_LOCK) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_SHADOW_TAG) - && (B_SHADOW_TAG_ESCAPE >= GEN_4 && AI_DATA->abilities[battlerDef] != ABILITY_SHADOW_TAG)) + && (B_SHADOW_TAG_ESCAPE >= GEN_4 && gAiLogicData->abilities[battlerDef] != ABILITY_SHADOW_TAG)) return TRUE; if (AI_IsAbilityOnSide(battlerAtk, ABILITY_ARENA_TRAP) && IsBattlerGrounded(battlerAtk)) @@ -390,7 +390,7 @@ bool32 IsTruantMonVulnerable(u32 battlerAI, u32 opposingBattler) for (i = 0; i < MAX_MON_MOVES; i++) { - u32 move = gBattleResources->battleHistory->usedMoves[opposingBattler][i]; + u32 move = gBattleHistory->usedMoves[opposingBattler][i]; enum BattleMoveEffects effect = GetMoveEffect(move); if (effect == EFFECT_PROTECT && move != MOVE_ENDURE) return TRUE; @@ -417,7 +417,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) s32 i, moveType; u32 usable = 0; u16 *moves = GetMovesArray(attacker); - u32 moveLimitations = AI_DATA->moveLimitations[attacker]; + u32 moveLimitations = gAiLogicData->moveLimitations[attacker]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -428,7 +428,7 @@ bool32 MovesWithCategoryUnusable(u32 attacker, u32 target, u32 category) { SetTypeBeforeUsingMove(moves[i], attacker); moveType = GetBattleMoveType(moves[i]); - if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, AI_DATA->abilities[target], FALSE) != 0) + if (CalcTypeEffectivenessMultiplier(moves[i], moveType, attacker, target, gAiLogicData->abilities[target], FALSE) != 0) usable |= 1u << i; } } @@ -474,7 +474,7 @@ static inline s32 DmgRoll(s32 dmg) bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; @@ -513,7 +513,7 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy return TRUE; break; case EFFECT_POLTERGEIST: - if (AI_DATA->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef)) + if (gAiLogicData->items[battlerDef] == ITEM_NONE || !IsBattlerItemEnabled(battlerDef)) return TRUE; break; case EFFECT_FIRST_TURN_ONLY: @@ -677,11 +677,11 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo if (critChanceIndex == CRITICAL_HIT_ALWAYS) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_STAGE_THRESHOLD // Not guaranteed but above Risky threshold - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) != GEN_1) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_THRESHOLD_GEN_1 // Not guaranteed but above Risky threshold - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) return TRUE; return FALSE; @@ -695,8 +695,8 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u uq4_12_t effectivenessMultiplier; bool32 isDamageMoveUnusable = FALSE; bool32 toggledGimmick = FALSE; - struct AiLogicData *aiData = AI_DATA; - AI_DATA->aiCalcInProgress = TRUE; + struct AiLogicData *aiData = gAiLogicData; + gAiLogicData->aiCalcInProgress = TRUE; if (moveEffect == EFFECT_NATURE_POWER) move = GetNaturePowerMove(battlerAtk); @@ -817,13 +817,13 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u gBattleStruct->zmove.baseMoves[battlerAtk] = MOVE_NONE; if (toggledGimmick) SetActiveGimmick(battlerAtk, GIMMICK_NONE); - AI_DATA->aiCalcInProgress = FALSE; + gAiLogicData->aiCalcInProgress = FALSE; return simDamage; } bool32 AI_IsDamagedByRecoil(u32 battler) { - u32 ability = AI_DATA->abilities[battler]; + u32 ability = gAiLogicData->abilities[battler]; if (ability == ABILITY_MAGIC_GUARD || ability == ABILITY_ROCK_HEAD) return FALSE; return TRUE; @@ -833,13 +833,13 @@ bool32 AI_IsDamagedByRecoil(u32 battler) static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { u32 i; - u32 abilityDef = AI_DATA->abilities[battlerDef]; - u32 abilityAtk = AI_DATA->abilities[battlerAtk]; + u32 abilityDef = gAiLogicData->abilities[battlerDef]; + u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; switch (GetMoveEffect(move)) { case EFFECT_HIT_ESCAPE: - if (CountUsablePartyMons(battlerAtk) != 0 && ShouldPivot(battlerAtk, battlerDef, abilityDef, move, AI_THINKING_STRUCT->movesetIndex)) + if (CountUsablePartyMons(battlerAtk) != 0 && ShouldPivot(battlerAtk, battlerDef, abilityDef, move, gAiThinkingStruct->movesetIndex)) return TRUE; break; case EFFECT_FELL_STINGER: @@ -961,8 +961,8 @@ static bool32 AI_IsMoveEffectInPlus(u32 battlerAtk, u32 battlerDef, u32 move, s3 static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s32 noOfHitsToKo) { - u32 abilityAtk = AI_DATA->abilities[battlerAtk]; - u32 abilityDef = AI_DATA->abilities[battlerDef]; + u32 abilityAtk = gAiLogicData->abilities[battlerAtk]; + u32 abilityDef = gAiLogicData->abilities[battlerDef]; u8 i; switch (GetMoveEffect(move)) @@ -1041,12 +1041,12 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s s32 AI_WhichMoveBetter(u32 move1, u32 move2, u32 battlerAtk, u32 battlerDef, s32 noOfHitsToKo) { bool32 effect1, effect2; - u32 defAbility = AI_DATA->abilities[battlerDef]; - u32 atkAbility = AI_DATA->abilities[battlerAtk]; + u32 defAbility = gAiLogicData->abilities[battlerDef]; + u32 atkAbility = gAiLogicData->abilities[battlerAtk]; // Check if physical moves hurt. - if (AI_DATA->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH - && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET + if (gAiLogicData->holdEffects[battlerAtk] != HOLD_EFFECT_PROTECTIVE_PADS && atkAbility != ABILITY_LONG_REACH + && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_ROCKY_HELMET || defAbility == ABILITY_IRON_BARBS || defAbility == ABILITY_ROUGH_SKIN)) { bool32 moveContact1 = MoveMakesContact(move1); @@ -1089,12 +1089,12 @@ u32 GetNoOfHitsToKOBattlerDmg(u32 dmg, u32 battlerDef) u32 GetNoOfHitsToKOBattler(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcContext calcContext) { - return GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, AI_DATA), battlerDef); + return GetNoOfHitsToKOBattlerDmg(AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData), battlerDef); } u32 GetCurrDamageHpPercent(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { - int bestDmg = AI_GetDamage(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, calcContext, AI_DATA); + int bestDmg = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); return (bestDmg * 100) / gBattleMons[battlerDef].maxHP; } @@ -1113,7 +1113,7 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) gBattleStruct->dynamicMoveType = 0; SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); - typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], FALSE); + typeEffectiveness = CalcTypeEffectivenessMultiplier(move, moveType, battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], FALSE); RestoreBattlerData(battlerAtk); RestoreBattlerData(battlerDef); @@ -1130,12 +1130,12 @@ uq4_12_t AI_GetMoveEffectiveness(u32 move, u32 battlerAtk, u32 battlerDef) s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) { u32 speedBattlerAI, speedBattler; - enum ItemHoldEffect holdEffectAI = AI_DATA->holdEffects[battlerAI]; - enum ItemHoldEffect holdEffectPlayer = AI_DATA->holdEffects[battler]; - u32 abilityAI = AI_DATA->abilities[battlerAI]; - u32 abilityPlayer = AI_DATA->abilities[battler]; + enum ItemHoldEffect holdEffectAI = gAiLogicData->holdEffects[battlerAI]; + enum ItemHoldEffect holdEffectPlayer = gAiLogicData->holdEffects[battler]; + u32 abilityAI = gAiLogicData->abilities[battlerAI]; + u32 abilityPlayer = gAiLogicData->abilities[battler]; - u32 predictedMove = AI_DATA->lastUsedMove[battler]; // TODO update for move prediction + u32 predictedMove = gAiLogicData->lastUsedMove[battler]; // TODO update for move prediction s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, moveConsidered); s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, predictedMove); @@ -1187,12 +1187,12 @@ static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) return FALSE; if (GetMoveStrikeCount(move) > 1 && !(effect == EFFECT_DRAGON_DARTS && IsValidDoubleBattle(battlerTarget))) return FALSE; - if (AI_DATA->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) + if (gAiLogicData->holdEffects[battlerTarget] == HOLD_EFFECT_FOCUS_SASH) return TRUE; - if (!DoesBattlerIgnoreAbilityChecks(battler, AI_DATA->abilities[battler], move)) + if (!DoesBattlerIgnoreAbilityChecks(battler, gAiLogicData->abilities[battler], move)) { - if (B_STURDY >= GEN_5 && AI_DATA->abilities[battlerTarget] == ABILITY_STURDY) + if (B_STURDY >= GEN_5 && gAiLogicData->abilities[battlerTarget] == ABILITY_STURDY) return TRUE; if (gBattleMons[battlerTarget].species == SPECIES_MIMIKYU_DISGUISED) return TRUE; @@ -1204,7 +1204,7 @@ static bool32 CanEndureHit(u32 battler, u32 battlerTarget, u32 move) // Check if target has means to faint ai mon. bool32 CanTargetFaintAi(u32 battlerDef, u32 battlerAtk) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; s32 moveIndex; u16 *moves = GetMovesArray(battlerDef); u32 moveLimitations = aiData->moveLimitations[battlerDef]; @@ -1242,7 +1242,7 @@ u32 NoOfHitsForTargetToFaintAI(u32 battlerDef, u32 battlerAtk) u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcContext calcContext) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; u32 moveIndex; u32 move = 0; u32 bestDmg = 0; @@ -1265,7 +1265,7 @@ u32 GetBestDmgMoveFromBattler(u32 battlerAtk, u32 battlerDef, enum DamageCalcCon u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext calcContext) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; u32 moveIndex; u32 bestDmg = 0; u16 *moves = GetMovesArray(battler); @@ -1288,7 +1288,7 @@ u32 GetBestDmgFromBattler(u32 battler, u32 battlerTarget, enum DamageCalcContext // If numHits > 1, check if the target will be KO'ed by that number of hits (ignoring healing effects) bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; s32 moveIndex, dmg; u16 *moves = gBattleMons[battlerAtk].moves; u32 moveLimitations = aiData->moveLimitations[battlerAtk]; @@ -1321,7 +1321,7 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) u32 indexSlot = GetMoveSlot(GetMovesArray(battlerDef), move); if (indexSlot < MAX_MON_MOVES) { - if (GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, AI_DATA), gBattleMons[battlerAtk].hp) <= nHits) + if (GetNoOfHitsToKO(AI_GetDamage(battlerDef, battlerAtk, indexSlot, AI_DEFENDING, gAiLogicData), gBattleMons[battlerAtk].hp) <= nHits) return TRUE; } return FALSE; @@ -1330,7 +1330,7 @@ bool32 CanTargetMoveFaintAi(u32 move, u32 battlerDef, u32 battlerAtk, u32 nHits) // Check if target has means to faint ai mon after modding hp/dmg bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dmgMod) { - struct AiLogicData *aiData = AI_DATA; + struct AiLogicData *aiData = gAiLogicData; u32 moveIndex; s32 dmg; u16 *moves = GetMovesArray(battlerDef); @@ -1359,9 +1359,9 @@ bool32 CanTargetFaintAiWithMod(u32 battlerDef, u32 battlerAtk, s32 hpMod, s32 dm bool32 AI_IsAbilityOnSide(u32 battlerId, u32 ability) { - if (IsBattlerAlive(battlerId) && AI_DATA->abilities[battlerId] == ability) + if (IsBattlerAlive(battlerId) && gAiLogicData->abilities[battlerId] == ability) return TRUE; - else if (IsBattlerAlive(BATTLE_PARTNER(battlerId)) && AI_DATA->abilities[BATTLE_PARTNER(battlerId)] == ability) + else if (IsBattlerAlive(BATTLE_PARTNER(battlerId)) && gAiLogicData->abilities[BATTLE_PARTNER(battlerId)] == ability) return TRUE; else return FALSE; @@ -1392,7 +1392,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) u32 indexAbility; u32 abilityAiRatings[NUM_ABILITY_SLOTS] = {0}; - // We've had ability overwritten by e.g. Worry Seed. It is not part of AI_PARTY in case of switching + // We've had ability overwritten by e.g. Worry Seed. It is not part of gAiPartyData in case of switching if (gDisableStructs[battlerId].overwrittenAbility) return gDisableStructs[battlerId].overwrittenAbility; @@ -1404,8 +1404,8 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId) if (knownAbility == ABILITY_NONE) return knownAbility; - if (AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) - return AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability; + if (gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability != ABILITY_NONE) + return gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].ability; // Abilities that prevent fleeing - treat as always known if (knownAbility == ABILITY_SHADOW_TAG || knownAbility == ABILITY_MAGNET_PULL || knownAbility == ABILITY_ARENA_TRAP) @@ -1435,18 +1435,18 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) enum ItemHoldEffect holdEffect; if (!IsAiBattlerAware(battlerId)) - holdEffect = AI_PARTY->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; + holdEffect = gAiPartyData->mons[GetBattlerSide(battlerId)][gBattlerPartyIndexes[battlerId]].heldEffect; else holdEffect = GetBattlerHoldEffect(battlerId, FALSE); - if (AI_THINKING_STRUCT->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; if (gStatuses3[battlerId] & STATUS3_EMBARGO) return HOLD_EFFECT_NONE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return HOLD_EFFECT_NONE; - if (AI_DATA->abilities[battlerId] == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) + if (gAiLogicData->abilities[battlerId] == ABILITY_KLUTZ && !(gStatuses3[battlerId] & STATUS3_GASTRO_ACID)) return HOLD_EFFECT_NONE; return holdEffect; @@ -1454,7 +1454,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) @@ -1465,11 +1465,11 @@ bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) static inline bool32 AI_WeatherHasEffect(void) { - if (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE - || AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE + || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) return TRUE; // AI doesn't understand weather supression (handicap) - return AI_DATA->weatherHasEffect; // weather damping abilities are announced + return gAiLogicData->weatherHasEffect; // weather damping abilities are announced } u32 AI_GetWeather(void) @@ -1583,7 +1583,7 @@ bool32 IsHazardClearingMove(u32 move) bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; enum BattleMoveEffects effect = GetMoveEffect(move); @@ -1623,7 +1623,7 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) if (gStatuses3[battlerDef] & STATUS3_ALWAYS_HITS || gDisableStructs[battlerDef].battlerWithSureHit == battlerAtk) return TRUE; - if (AI_DATA->abilities[battlerDef] == ABILITY_NO_GUARD || AI_DATA->abilities[battlerAtk] == ABILITY_NO_GUARD) + if (gAiLogicData->abilities[battlerDef] == ABILITY_NO_GUARD || gAiLogicData->abilities[battlerAtk] == ABILITY_NO_GUARD) return TRUE; enum BattleMoveEffects effect = GetMoveEffect(move); @@ -1650,11 +1650,11 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) { - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battlerDef]; - u32 accuracy = AI_DATA->moveAccuracy[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerDef]; + u32 accuracy = gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; gPotentialItemEffectBattler = battlerDef; - if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < AI_DATA->holdEffectParams[battlerDef]) + if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < gAiLogicData->holdEffectParams[battlerDef]) return FALSE; //probabilistically speaking, focus band should activate so dont OHKO else if (holdEffect == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)) return FALSE; @@ -1836,7 +1836,7 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) if (gBattleMons[battlerDef].statStages[stat] == MIN_STAT_STAGE) return FALSE; - if (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) + if (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) return FALSE; switch (abilityDef) @@ -1872,7 +1872,7 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) if (stat == STAT_SPEED) { // If AI is faster and doesn't have any mons left, lowering speed doesn't give any - return !(AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) + return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) && CountUsablePartyMons(battlerAtk) == 0 && !HasMoveEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } @@ -1937,8 +1937,8 @@ u32 CountNegativeStatStages(u32 battlerId) bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -1949,15 +1949,15 @@ bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_WHITE_SMOKE && defAbility != ABILITY_FULL_METAL_BODY && defAbility != ABILITY_HYPER_CUTTER - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -1968,7 +1968,7 @@ bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_WHITE_SMOKE && defAbility != ABILITY_FULL_METAL_BODY && defAbility != ABILITY_BIG_PECKS - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } @@ -1979,16 +1979,16 @@ bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility) || defAbility == ABILITY_CLEAR_BODY || defAbility == ABILITY_FULL_METAL_BODY || defAbility == ABILITY_WHITE_SMOKE - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CLEAR_AMULET) return FALSE; - return (AI_IsSlower(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered)); + return (AI_IsSlower(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered)); } bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -1998,15 +1998,15 @@ bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_CLEAR_BODY && defAbility != ABILITY_FULL_METAL_BODY && defAbility != ABILITY_WHITE_SMOKE - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2016,15 +2016,15 @@ bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_CLEAR_BODY && defAbility != ABILITY_FULL_METAL_BODY && defAbility != ABILITY_WHITE_SMOKE - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2035,15 +2035,15 @@ bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_KEEN_EYE && defAbility != ABILITY_MINDS_EYE && (B_ILLUMINATE_EFFECT >= GEN_9 && defAbility != ABILITY_ILLUMINATE) - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility) { - if (AI_IsFaster(battlerAtk, battlerDef, AI_THINKING_STRUCT->moveConsidered) - && (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) + && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2052,7 +2052,7 @@ bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility) && defAbility != ABILITY_CLEAR_BODY && defAbility != ABILITY_FULL_METAL_BODY && defAbility != ABILITY_WHITE_SMOKE - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CLEAR_AMULET) return TRUE; return FALSE; } @@ -2063,9 +2063,9 @@ bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 moveIndex, en u16 *moves = gBattleMons[battlerAtk].moves; if (IsDoubleBattle() && battlerDef == BATTLE_PARTNER(battlerAtk)) - dmg = AI_DATA->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; // Attacking partner, be careful + dmg = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; // Attacking partner, be careful else - dmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, AI_DATA); + dmg = AI_GetDamage(battlerAtk, battlerDef, moveIndex, calcContext, gAiLogicData); if (gBattleMons[battlerDef].hp <= dmg && !CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) return TRUE; @@ -2077,7 +2077,7 @@ bool32 CanIndexMoveGuaranteeFaintTarget(u32 battlerAtk, u32 battlerDef, u32 move s32 dmg; u16 *moves = gBattleMons[battlerAtk].moves; - dmg = AI_DATA->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; // Explictly care about guaranteed KOs universally + dmg = gAiLogicData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; // Explictly care about guaranteed KOs universally if (gBattleMons[battlerDef].hp <= dmg && !CanEndureHit(battlerAtk, battlerDef, moves[moveIndex])) return TRUE; @@ -2089,7 +2089,7 @@ u16 *GetMovesArray(u32 battler) if (IsAiBattlerAware(battler) || IsAiBattlerAware(BATTLE_PARTNER(battler))) return gBattleMons[battler].moves; else - return gBattleResources->battleHistory->usedMoves[battler]; + return gBattleHistory->usedMoves[battler]; } bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive) @@ -2266,7 +2266,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool { s32 i; u16 *moves = GetMovesArray(battlerAtk); - u32 moveLimitations = AI_DATA->moveLimitations[battlerAtk]; + u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -2279,7 +2279,7 @@ bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool || GetBattlerMoveTargetType(battlerAtk, moves[i]) & (MOVE_TARGET_USER | MOVE_TARGET_OPPONENTS_FIELD)) continue; - if (AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] <= accCheck) + if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= accCheck) return TRUE; } @@ -2290,14 +2290,14 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) { u32 i; u16 *moves = GetMovesArray(battlerAtk); - u32 moveLimitations = AI_DATA->moveLimitations[battlerAtk]; + u32 moveLimitations = gAiLogicData->moveLimitations[battlerAtk]; for (i = 0; i < MAX_MON_MOVES; i++) { if (IsMoveUnusable(i, moves[i], moveLimitations)) continue; - if (GetMoveEffect(moves[i]) == EFFECT_SLEEP && AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] < 85) + if (GetMoveEffect(moves[i]) == EFFECT_SLEEP && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] < 85) return TRUE; } return FALSE; @@ -2652,7 +2652,7 @@ bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) { case EFFECT_SOLAR_BEAM: case EFFECT_TWO_TURNS_ATTACK: - return !(AI_DATA->holdEffects[battlerAtk] == HOLD_EFFECT_POWER_HERB + return !(gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_POWER_HERB || (AI_GetWeather() & GetMoveTwoTurnAttackWeather(move))); default: return FALSE; @@ -2700,7 +2700,7 @@ static u32 GetTrapDamage(u32 battlerId) { // ai has no knowledge about turns remaining u32 damage = 0; - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[gBattleStruct->wrappedBy[battlerId]]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[gBattleStruct->wrappedBy[battlerId]]; if (gBattleMons[battlerId].status2 & STATUS2_WRAPPED) { if (holdEffect == HOLD_EFFECT_BINDING_BAND) @@ -2718,7 +2718,7 @@ static u32 GetPoisonDamage(u32 battlerId) { u32 damage = 0; - if (AI_DATA->abilities[battlerId] == ABILITY_POISON_HEAL) + if (gAiLogicData->abilities[battlerId] == ABILITY_POISON_HEAL) return damage; if (gBattleMons[battlerId].status1 & STATUS1_POISON) @@ -2763,8 +2763,8 @@ static bool32 BattlerAffectedByHail(u32 battlerId, u32 ability) static u32 GetWeatherDamage(u32 battlerId) { - u32 ability = AI_DATA->abilities[battlerId]; - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[battlerId]; + u32 ability = gAiLogicData->abilities[battlerId]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[battlerId]; u32 damage = 0; u32 weather = AI_GetWeather(); if (!weather) @@ -2799,7 +2799,7 @@ u32 GetBattlerSecondaryDamage(u32 battlerId) { u32 secondaryDamage; - if (AI_DATA->abilities[battlerId] == ABILITY_MAGIC_GUARD) + if (gAiLogicData->abilities[battlerId] == ABILITY_MAGIC_GUARD) return FALSE; secondaryDamage = GetLeechSeedDamage(battlerId) @@ -2928,8 +2928,8 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov if (CanTargetFaintAi(battlerDef, battlerAtk)) return SHOULD_PIVOT; // Won't get the two turns, pivot - if (!IsBattleMoveStatus(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) - || (AI_BattlerAtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH + if (!IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) + || (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD)))) @@ -2937,20 +2937,20 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov } else if (!hasStatBoost) { - if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH + if (!IsBattleMoveStatus(move) && (AI_BattlerAtMaxHp(battlerDef) && (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH || (B_STURDY >= GEN_5 && defAbility == ABILITY_STURDY) || defAbility == ABILITY_MULTISCALE || defAbility == ABILITY_SHADOW_SHIELD))) return SHOULD_PIVOT; // pivot to break sash/sturdy/multiscale - if (AI_DATA->shouldSwitch & (1u << battlerAtk)) + if (gAiLogicData->shouldSwitch & (1u << battlerAtk)) return SHOULD_PIVOT; /* TODO - check if switchable mon unafffected by/will remove hazards if (gSideStatuses[battlerAtk] & SIDE_STATUS_SPIKES && switchScore >= SWITCHING_INCREASE_CAN_REMOVE_HAZARDS) return SHOULD_PIVOT;*/ - /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, AI_DATA->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) + /*if (BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) && switchScore >= SWITCHING_INCREASE_WALLS_FOE) return SHOULD_PIVOT;*/ /*if (IsClassDamager(class) && switchScore >= SWITCHING_INCREASE_HAS_SUPER_EFFECTIVE_MOVE) @@ -2993,7 +2993,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov { if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) { - if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, AI_DATA->abilities[battlerAtk])) + if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk])) return CAN_TRY_PIVOT; // Use this move to KO if you must } else // Can't KO the foe @@ -3005,7 +3005,7 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov { if (CanAIFaintTarget(battlerAtk, battlerDef, 0)) { - if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, AI_DATA->abilities[battlerAtk]) // This is the only move that can KO + if (!BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]) // This is the only move that can KO && !hasStatBoost) //You're not wasting a valuable stat boost { return CAN_TRY_PIVOT; @@ -3014,9 +3014,9 @@ enum AIPivot ShouldPivot(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 mov else if (CanAIFaintTarget(battlerAtk, battlerDef, 2)) { // can knock out foe in 2 hits - if (IsBattleMoveStatus(move) && ((AI_DATA->shouldSwitch & (1u << battlerAtk)) //Damaging move + if (IsBattleMoveStatus(move) && ((gAiLogicData->shouldSwitch & (1u << battlerAtk)) //Damaging move //&& (switchScore >= SWITCHING_INCREASE_RESIST_ALL_MOVES + SWITCHING_INCREASE_KO_FOE //remove hazards - || (AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)))) + || (gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_FOCUS_SASH && AI_BattlerAtMaxHp(battlerDef)))) return DONT_PIVOT; // Pivot to break the sash else return CAN_TRY_PIVOT; @@ -3083,7 +3083,7 @@ bool32 CanKnockOffItem(u32 battler, u32 item) )) && GetBattlerSide(battler) == B_SIDE_PLAYER) return FALSE; - if (AI_DATA->abilities[battler] == ABILITY_STICKY_HOLD) + if (gAiLogicData->abilities[battler] == ABILITY_STICKY_HOLD) return FALSE; if (!CanBattlerGetOrLoseItem(battler, item)) @@ -3130,9 +3130,9 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab bool32 ShouldPoison(u32 battlerAtk, u32 battlerDef) { - u32 abilityDef = AI_DATA->abilities[battlerDef]; + u32 abilityDef = gAiLogicData->abilities[battlerDef]; // Battler can be poisoned and has move/ability that synergizes with being poisoned - if (CanBePoisoned(battlerAtk, battlerDef, AI_DATA->abilities[battlerAtk], abilityDef) && ( + if (CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], abilityDef) && ( DoesBattlerBenefitFromAllVolatileStatus(battlerDef, abilityDef) || abilityDef == ABILITY_POISON_HEAL || (abilityDef == ABILITY_TOXIC_BOOST && HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)))) @@ -3219,8 +3219,8 @@ bool32 ShouldParalyze(u32 battlerAtk, u32 battlerDef, u32 abilityDef) bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { - if (!CanBePoisoned(battlerAtk, battlerDef, AI_DATA->abilities[battlerAtk], defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) + if (!CanBePoisoned(battlerAtk, battlerDef, gAiLogicData->abilities[battlerAtk], defAbility) + || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) return FALSE; @@ -3231,7 +3231,7 @@ bool32 AI_CanPoison(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u3 bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, u32 partnerMove) { if (!CanBeParalyzed(battlerAtk, battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) + || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(BATTLE_PARTNER(battlerAtk), battlerDef, partnerMove)) return FALSE; @@ -3241,7 +3241,7 @@ bool32 AI_CanParalyze(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 move, bool32 AI_CanBeConfused(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability) { if ((gBattleMons[battlerDef].status2 & STATUS2_CONFUSION) - || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, AI_DATA->abilities[battlerAtk], move)) + || (ability == ABILITY_OWN_TEMPO && !DoesBattlerIgnoreAbilityChecks(battlerAtk, gAiLogicData->abilities[battlerAtk], move)) || IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN) || gSideStatuses[GetBattlerSide(battlerDef)] & SIDE_STATUS_SAFEGUARD || DoesSubstituteBlockMove(battlerAtk, battlerDef, move)) @@ -3253,7 +3253,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battler { if (GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY && AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) - && !AI_CanBeConfused(battlerAtk, BATTLE_PARTNER(battlerDef), move, AI_DATA->abilities[BATTLE_PARTNER(battlerDef)])) + && !AI_CanBeConfused(battlerAtk, BATTLE_PARTNER(battlerDef), move, gAiLogicData->abilities[BATTLE_PARTNER(battlerDef)])) return FALSE; if (!AI_CanBeConfused(battlerAtk, battlerDef, move, defAbility) @@ -3266,7 +3266,7 @@ bool32 AI_CanConfuse(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battler bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeBurned(battlerAtk, battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) + || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3278,7 +3278,7 @@ bool32 AI_CanBurn(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtk bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 battlerAtkPartner, u32 move, u32 partnerMove) { if (!CanBeFrozen(battlerAtk, battlerDef, defAbility) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) + || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || PartnerMoveEffectIsStatusSameTarget(battlerAtkPartner, battlerDef, partnerMove)) { @@ -3290,7 +3290,7 @@ bool32 AI_CanGiveFrostbite(u32 battlerAtk, u32 battlerDef, u32 defAbility, u32 b bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if ((gBattleMons[battlerDef].status2 & STATUS2_INFATUATION) - || AI_DATA->effectiveness[battlerAtk][battlerDef][AI_THINKING_STRUCT->movesetIndex] == UQ_4_12(0.0) + || gAiLogicData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] == UQ_4_12(0.0) || defAbility == ABILITY_OBLIVIOUS || !AreBattlersOfOppositeGender(battlerAtk, battlerDef) || AI_IsAbilityOnSide(battlerDef, ABILITY_AROMA_VEIL)) @@ -3300,8 +3300,8 @@ bool32 AI_CanBeInfatuated(u32 battlerAtk, u32 battlerDef, u32 defAbility) u32 ShouldTryToFlinch(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbility, u32 move) { - if (((!IsMoldBreakerTypeAbility(battlerAtk, AI_DATA->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK + if (((!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) && (defAbility == ABILITY_SHIELD_DUST || defAbility == ABILITY_INNER_FOCUS)) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) || AI_IsSlower(battlerAtk, battlerDef, move))) // Opponent goes first { @@ -3327,10 +3327,10 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) if (IsBattlerTrapped(battlerAtk, battlerDef)) return FALSE; - if (BattlerWillFaintFromSecondaryDamage(battlerDef, AI_DATA->abilities[battlerDef])) + if (BattlerWillFaintFromSecondaryDamage(battlerDef, gAiLogicData->abilities[battlerDef])) return TRUE; // battler is taking secondary damage with low HP - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) { if (!CanTargetFaintAi(battlerDef, battlerAtk)) return TRUE; // attacker goes first and opponent can't kill us @@ -3342,12 +3342,12 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move) { if ((!gDisableStructs[battlerAtk].isFirstTurn && MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) - || AI_DATA->abilities[battlerAtk] == ABILITY_GORILLA_TACTICS - || AI_DATA->holdEffects[battlerAtk] == HOLD_EFFECT_CHOICE_BAND - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK + || gAiLogicData->abilities[battlerAtk] == ABILITY_GORILLA_TACTICS + || gAiLogicData->holdEffects[battlerAtk] == HOLD_EFFECT_CHOICE_BAND + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_COVERT_CLOAK || DoesSubstituteBlockMove(battlerAtk, battlerDef, move) - || (!IsMoldBreakerTypeAbility(battlerAtk, AI_DATA->abilities[battlerAtk]) - && (AI_DATA->abilities[battlerDef] == ABILITY_SHIELD_DUST || AI_DATA->abilities[battlerDef] == ABILITY_INNER_FOCUS))) + || (!IsMoldBreakerTypeAbility(battlerAtk, gAiLogicData->abilities[battlerAtk]) + && (gAiLogicData->abilities[battlerDef] == ABILITY_SHIELD_DUST || gAiLogicData->abilities[battlerDef] == ABILITY_INNER_FOCUS))) return FALSE; return TRUE; @@ -3355,13 +3355,13 @@ bool32 ShouldFakeOut(u32 battlerAtk, u32 battlerDef, u32 move) static u32 FindMoveUsedXTurnsAgo(u32 battlerId, u32 x) { - s32 i, index = BATTLE_HISTORY->moveHistoryIndex[battlerId]; + s32 i, index = gBattleHistory->moveHistoryIndex[battlerId]; for (i = 0; i < x; i++) { if (--index < 0) index = AI_MOVE_HISTORY_COUNT - 1; } - return BATTLE_HISTORY->moveHistory[battlerId][index]; + return gBattleHistory->moveHistory[battlerId][index]; } bool32 IsWakeupTurn(u32 battler) @@ -3386,7 +3386,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) battlerOnField2 = gBattlerPartyIndexes[GetPartnerBattler(battlerId)]; // Check partner's status if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 - || AI_DATA->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF + || gAiLogicData->abilities[BATTLE_PARTNER(battlerId)] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField2], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; @@ -3400,7 +3400,7 @@ bool32 AnyPartyMemberStatused(u32 battlerId, bool32 checkSoundproof) // Check attacker's status if ((GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) == GEN_5 || GetGenConfig(GEN_CONFIG_HEAL_BELL_SOUNDPROOF) >= GEN_8 - || AI_DATA->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) + || gAiLogicData->abilities[battlerId] != ABILITY_SOUNDPROOF || !checkSoundproof) && GetMonData(&party[battlerOnField1], MON_DATA_STATUS) != STATUS1_NONE) return TRUE; @@ -3428,13 +3428,13 @@ u32 GetBattlerSideSpeedAverage(u32 battler) if (IsBattlerAlive(battler)) { - speed1 = AI_DATA->speedStats[battler]; + speed1 = gAiLogicData->speedStats[battler]; numBattlersAlive++; } if (IsDoubleBattle() && IsBattlerAlive(BATTLE_PARTNER(battler))) { - speed2 = AI_DATA->speedStats[BATTLE_PARTNER(battler)]; + speed2 = gAiLogicData->speedStats[BATTLE_PARTNER(battler)]; numBattlersAlive++; } @@ -3468,7 +3468,7 @@ bool32 ShouldAbsorb(u32 battlerAtk, u32 battlerDef, u32 move, s32 damage) if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healDmg, 0)) return TRUE; // target can faint attacker unless they heal - else if (!CanTargetFaintAi(battlerDef, battlerAtk) && AI_DATA->hpPercents[battlerAtk] < 60 && (Random() % 3)) + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < 60 && (Random() % 3)) return TRUE; // target can't faint attacker at all, attacker health is about half, 2/3rds rate of encouraging healing } else @@ -3486,7 +3486,7 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, if (move == 0xFFFF || AI_IsFaster(battlerAtk, battlerDef, move)) { // using item or user going first - s32 damage = AI_GetDamage(battlerAtk, battlerDef, AI_THINKING_STRUCT->movesetIndex, calcContext, AI_DATA); + s32 damage = AI_GetDamage(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, calcContext, gAiLogicData); s32 healAmount = (healPercent * damage) / 100; if (gStatuses3[battlerAtk] & STATUS3_HEAL_BLOCK) healAmount = 0; @@ -3494,7 +3494,7 @@ bool32 ShouldRecover(u32 battlerAtk, u32 battlerDef, u32 move, u32 healPercent, if (CanTargetFaintAi(battlerDef, battlerAtk) && !CanTargetFaintAiWithMod(battlerDef, battlerAtk, healAmount, 0)) return TRUE; // target can faint attacker unless they heal - else if (!CanTargetFaintAi(battlerDef, battlerAtk) && AI_DATA->hpPercents[battlerAtk] < 60 && (Random() % 3)) + else if (!CanTargetFaintAi(battlerDef, battlerAtk) && gAiLogicData->hpPercents[battlerAtk] < 60 && (Random() % 3)) return TRUE; // target can't faint attacker at all, attacker health is about half, 2/3rds rate of encouraging healing } return FALSE; @@ -3697,7 +3697,7 @@ bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move) party = GetBattlerParty(battlerAtk); if (CountUsablePartyMons(battlerAtk) == 0 - && (CanTargetFaintAi(battlerDef, battlerAtk) || BattlerWillFaintFromSecondaryDamage(battlerAtk, AI_DATA->abilities[battlerAtk]))) + && (CanTargetFaintAi(battlerDef, battlerAtk) || BattlerWillFaintFromSecondaryDamage(battlerAtk, gAiLogicData->abilities[battlerAtk]))) return FALSE; // Don't heal if last mon and will faint for (i = 0; i < PARTY_SIZE; i++) @@ -3774,16 +3774,16 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl if (calcContext == AI_ATTACKING) { gBattleMons[battlerAtk] = switchinCandidate; - AI_THINKING_STRUCT->saved[battlerDef].saved = TRUE; - SetBattlerAiData(battlerAtk, AI_DATA); // set known opposing battler data - AI_THINKING_STRUCT->saved[battlerDef].saved = FALSE; + gAiThinkingStruct->saved[battlerDef].saved = TRUE; + SetBattlerAiData(battlerAtk, gAiLogicData); // set known opposing battler data + gAiThinkingStruct->saved[battlerDef].saved = FALSE; } else if (calcContext == AI_DEFENDING) { gBattleMons[battlerDef] = switchinCandidate; - AI_THINKING_STRUCT->saved[battlerAtk].saved = TRUE; - SetBattlerAiData(battlerDef, AI_DATA); // set known opposing battler data - AI_THINKING_STRUCT->saved[battlerAtk].saved = FALSE; + gAiThinkingStruct->saved[battlerAtk].saved = TRUE; + SetBattlerAiData(battlerDef, gAiLogicData); // set known opposing battler data + gAiThinkingStruct->saved[battlerAtk].saved = FALSE; } dmg = AI_CalcDamage(move, battlerAtk, battlerDef, &effectiveness, FALSE, AI_GetWeather()); @@ -3793,10 +3793,10 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl if (calcContext == AI_ATTACKING) { - SetBattlerAiData(battlerAtk, AI_DATA); - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) + SetBattlerAiData(battlerAtk, gAiLogicData); + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) return dmg.maximum; - else if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + else if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) return dmg.minimum; else return dmg.median; @@ -3804,10 +3804,10 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl else if (calcContext == AI_DEFENDING) { - SetBattlerAiData(battlerDef, AI_DATA); - if (AI_THINKING_STRUCT->aiFlags[battlerDef] & AI_FLAG_RISKY && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) + SetBattlerAiData(battlerDef, gAiLogicData); + if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) return dmg.minimum; - else if (AI_THINKING_STRUCT->aiFlags[battlerDef] & AI_FLAG_CONSERVATIVE && !(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + else if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) return dmg.maximum; else return dmg.median; @@ -3821,10 +3821,10 @@ u32 AI_WhoStrikesFirstPartyMon(u32 battlerAtk, u32 battlerDef, struct BattlePoke struct BattlePokemon *savedBattleMons = AllocSaveBattleMons(); gBattleMons[battlerAtk] = switchinCandidate; - SetBattlerAiData(battlerAtk, AI_DATA); + SetBattlerAiData(battlerAtk, gAiLogicData); u32 aiMonFaster = AI_IsFaster(battlerAtk, battlerDef, moveConsidered); FreeRestoreBattleMons(savedBattleMons); - SetBattlerAiData(battlerAtk, AI_DATA); + SetBattlerAiData(battlerAtk, gAiLogicData); return aiMonFaster; } @@ -4013,11 +4013,11 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, u32 shouldSetUp = ((noOfHitsToFaint >= 2 && aiIsFaster) || (noOfHitsToFaint >= 3 && !aiIsFaster) || noOfHitsToFaint == UNKNOWN_NO_OF_HITS); u32 i; - if (considerContrary && AI_DATA->abilities[battlerAtk] == ABILITY_CONTRARY) + if (considerContrary && gAiLogicData->abilities[battlerAtk] == ABILITY_CONTRARY) return NO_INCREASE; // Don't increase stats if opposing battler has Unaware - if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, AI_DATA)) + if (HasBattlerSideAbility(battlerDef, ABILITY_UNAWARE, gAiLogicData)) return NO_INCREASE; // Don't increase stat if AI is at +4 @@ -4025,7 +4025,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stat if AI has less then 70% HP and number of hits isn't known - if (AI_DATA->hpPercents[battlerAtk] < 70 && noOfHitsToFaint == UNKNOWN_NO_OF_HITS) + if (gAiLogicData->hpPercents[battlerAtk] < 70 && noOfHitsToFaint == UNKNOWN_NO_OF_HITS) return NO_INCREASE; // Don't set up if AI is dead to residual damage from weather @@ -4033,7 +4033,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has Opportunist - if (AI_DATA->abilities[battlerDef] == ABILITY_OPPORTUNIST) + if (gAiLogicData->abilities[battlerDef] == ABILITY_OPPORTUNIST) return NO_INCREASE; // Don't increase stats if opposing battler has Encore @@ -4050,10 +4050,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, // If expected switchin outspeeds and has Encore, don't increase for (i = 0; i < MAX_MON_MOVES; i++) { - if (GetMoveEffect(GetMonData(&playerParty[AI_DATA->mostSuitableMonId[battlerDef]], MON_DATA_MOVE1 + i, NULL)) == EFFECT_ENCORE - && GetMonData(&playerParty[AI_DATA->mostSuitableMonId[battlerDef]], MON_DATA_PP1 + i, NULL) > 0); + if (GetMoveEffect(GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_MOVE1 + i, NULL)) == EFFECT_ENCORE + && GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_PP1 + i, NULL) > 0); { - if (GetMonData(&playerParty[AI_DATA->mostSuitableMonId[battlerDef]], MON_DATA_SPEED, NULL) > gBattleMons[battlerAtk].speed) + if (GetMonData(&playerParty[gAiLogicData->mostSuitableMonId[battlerDef]], MON_DATA_SPEED, NULL) > gBattleMons[battlerAtk].speed) return NO_INCREASE; } } @@ -4070,7 +4070,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_DEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) tempScore += DECENT_EFFECT; else tempScore += WEAK_EFFECT; @@ -4087,7 +4087,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_SPDEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) tempScore += DECENT_EFFECT; else tempScore += WEAK_EFFECT; @@ -4100,7 +4100,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_DEF_2: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) tempScore += GOOD_EFFECT; else tempScore += DECENT_EFFECT; @@ -4117,7 +4117,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_SPDEF_2: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) tempScore += GOOD_EFFECT; else tempScore += DECENT_EFFECT; @@ -4150,21 +4150,21 @@ u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PSN || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PSN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; - if (AI_CanPoison(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_DATA->partnerMove) && AI_DATA->hpPercents[battlerDef] > 20) + if (AI_CanPoison(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiLogicData->partnerMove) && gAiLogicData->hpPercents[battlerDef] > 20) { if (!HasDamagingMove(battlerDef)) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(WEAK_EFFECT); // stall tactic if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) - || AI_DATA->abilities[battlerAtk] == ABILITY_MERCILESS) + || gAiLogicData->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -4173,14 +4173,14 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_BRN || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_BRN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; - if (AI_CanBurn(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, AI_DATA->partnerMove)) + if (AI_CanBurn(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, gAiLogicData->partnerMove)) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - || (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker + || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL) @@ -4197,14 +4197,14 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PAR || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PAR || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; - if (AI_CanParalyze(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_DATA->partnerMove)) + if (AI_CanParalyze(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiLogicData->partnerMove)) { - u32 atkSpeed = AI_DATA->speedStats[battlerAtk]; - u32 defSpeed = AI_DATA->speedStats[battlerDef]; + u32 atkSpeed = gAiLogicData->speedStats[battlerAtk]; + u32 defSpeed = gAiLogicData->speedStats[battlerDef]; if ((defSpeed >= atkSpeed && defSpeed / 2 < atkSpeed) // You'll go first after paralyzing foe || IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PARALYSIS) @@ -4219,11 +4219,11 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING)) != EFFECT_FOCUS_PUNCH) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING)) != EFFECT_FOCUS_PUNCH) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; - if (AI_CanPutToSleep(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_DATA->partnerMove)) + if (AI_CanPutToSleep(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiLogicData->partnerMove)) ADJUST_SCORE_PTR(DECENT_EFFECT); else return; @@ -4239,17 +4239,17 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) - || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_CONFUSION || AI_DATA->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) + if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_CONFUSION || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; - if (AI_CanConfuse(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, AI_DATA->partnerMove) - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CURE_CONFUSION - && AI_DATA->holdEffects[battlerDef] != HOLD_EFFECT_CURE_STATUS) + if (AI_CanConfuse(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, gAiLogicData->partnerMove) + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CURE_CONFUSION + && gAiLogicData->holdEffects[battlerDef] != HOLD_EFFECT_CURE_STATUS) { if (gBattleMons[battlerDef].status1 & STATUS1_PARALYSIS || gBattleMons[battlerDef].status2 & STATUS2_INFATUATION - || (AI_DATA->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY))) + || (gAiLogicData->abilities[battlerAtk] == ABILITY_SERENE_GRACE && HasMoveWithMoveEffectExcept(battlerAtk, MOVE_EFFECT_FLINCH, EFFECT_FIRST_TURN_ONLY))) ADJUST_SCORE_PTR(GOOD_EFFECT); else ADJUST_SCORE_PTR(DECENT_EFFECT); @@ -4258,13 +4258,13 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if ((AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return; - if (AI_CanGiveFrostbite(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, AI_DATA->partnerMove)) + if (AI_CanGiveFrostbite(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, gAiLogicData->partnerMove)) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - || (!(AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker + || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL) @@ -4330,7 +4330,7 @@ bool32 ShouldUseZMove(u32 battlerAtk, u32 battlerDef, u32 chosenMove) bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId) { - return (gBattleMons[battlerId].status1 & STATUS1_SLEEP) || AI_DATA->abilities[battlerId] == ABILITY_COMATOSE; + return (gBattleMons[battlerId].status1 & STATUS1_SLEEP) || gAiLogicData->abilities[battlerId] == ABILITY_COMATOSE; } s32 AI_TryToClearStats(u32 battlerAtk, u32 battlerDef, bool32 isDoubleBattle) @@ -4362,7 +4362,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) return TRUE; case STAT_DEF: case STAT_SPDEF: - return (AI_THINKING_STRUCT->aiFlags[battlerAtk] & AI_FLAG_STALL); + return (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL); } } } @@ -4455,7 +4455,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) } else if (effect == EFFECT_SHED_TAIL) // Shed Tail specific { - if ((ShouldPivot(battlerAtk, battlerDef, AI_DATA->abilities[battlerDef], move, AI_THINKING_STRUCT->movesetIndex)) + if ((ShouldPivot(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], move, gAiThinkingStruct->movesetIndex)) && (HasAnyKnownMove(battlerDef) && (GetBestDmgFromBattler(battlerDef, battlerAtk, AI_DEFENDING) < gBattleMons[battlerAtk].maxHP / 2))) scoreIncrease += BEST_EFFECT; } @@ -4480,7 +4480,7 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) || HasMoveEffect(battlerDef, EFFECT_LEECH_SEED)) scoreIncrease += GOOD_EFFECT; - if (AI_DATA->hpPercents[battlerAtk] > 70) + if (gAiLogicData->hpPercents[battlerAtk] > 70) scoreIncrease += WEAK_EFFECT; return scoreIncrease; } @@ -4490,7 +4490,7 @@ bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) int i; for (i = 0; i < MAX_MON_MOVES; i++) { - if (AI_DATA->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD) + if (gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] <= LOW_ACCURACY_THRESHOLD) return TRUE; } return FALSE; @@ -4498,7 +4498,7 @@ bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) bool32 IsBattlerItemEnabled(u32 battler) { - if (AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) return TRUE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return FALSE; @@ -4513,7 +4513,7 @@ bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiDat { if (aiData->abilities[battler] == ability) return TRUE; - if (IsDoubleBattle() && AI_DATA->abilities[BATTLE_PARTNER(battler)] == ability) + if (IsDoubleBattle() && gAiLogicData->abilities[BATTLE_PARTNER(battler)] == ability) return TRUE; return FALSE; } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 654311c417..ce95927c8e 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -650,14 +650,14 @@ static void OpponentHandleChooseItem(u32 battler) static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) { - return AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_ACE_POKEMON + return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; } static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) { - return AI_THINKING_STRUCT->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON + return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2) && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle diff --git a/src/battle_debug.c b/src/battle_debug.c index efdebf6377..e863e78181 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -972,7 +972,7 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 83 + count * 54, i * 15, 0, NULL); ConvertIntToDecimalStringN(text, - AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, AI_DATA), + AI_GetDamage(data->aiBattlerId, battlerDef, i, AI_ATTACKING, gAiLogicData), STR_CONV_MODE_RIGHT_ALIGN, 3); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, text, 110 + count * 54, i * 15, 0, NULL); @@ -980,9 +980,9 @@ static void PutMovesPointsText(struct BattleDebugMenu *data) } } - if (AI_DATA->shouldSwitch & (1u << data->aiBattlerId)) + if (gAiLogicData->shouldSwitch & (1u << data->aiBattlerId)) { - u32 switchMon = GetMonData(&gEnemyParty[AI_DATA->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); + u32 switchMon = GetMonData(&gEnemyParty[gAiLogicData->mostSuitableMonId[data->aiBattlerId]], MON_DATA_SPECIES); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, sText_IsSwitching, 74, 64, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_NORMAL, gSpeciesInfo[switchMon].speciesName, 74 + 68, 64, 0, NULL); @@ -1129,9 +1129,9 @@ static void PutAiInfoText(struct BattleDebugMenu *data) { if (GetBattlerSide(i) == B_SIDE_PLAYER && IsBattlerAlive(i)) { - u16 ability = AI_DATA->abilities[i]; - enum ItemHoldEffect holdEffect = AI_DATA->holdEffects[i]; - u16 item = AI_DATA->items[i]; + u16 ability = gAiLogicData->abilities[i]; + enum ItemHoldEffect holdEffect = gAiLogicData->holdEffects[i]; + u16 item = gAiLogicData->items[i]; u8 x = (i == B_POSITION_PLAYER_LEFT) ? 83 + (i) * 75 : 83 + (i-1) * 75; AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, gAbilitiesInfo[ability].name, x, 0, 0, NULL); AddTextPrinterParameterized(data->aiMovesWindowId, FONT_SMALL, ItemId_GetName(item), x, 15, 0, NULL); @@ -1147,10 +1147,10 @@ static void PutAiPartyText(struct BattleDebugMenu *data) { u32 i, j, count; u8 *text = Alloc(0x50), *txtPtr; - struct AiPartyMon *aiMons = AI_PARTY->mons[GetBattlerSide(data->aiBattlerId)]; + struct AiPartyMon *aiMons = gAiPartyData->mons[GetBattlerSide(data->aiBattlerId)]; FillWindowPixelBuffer(data->aiMovesWindowId, 0x11); - count = AI_PARTY->count[GetBattlerSide(data->aiBattlerId)]; + count = gAiPartyData->count[GetBattlerSide(data->aiBattlerId)]; for (i = 0; i < count; i++) { if (aiMons[i].wasSentInBattle) @@ -1276,8 +1276,8 @@ static void Task_ShowAiParty(u8 taskId) LoadMonIconPalettes(); LoadPartyMenuAilmentGfx(); data->aiBattlerId = data->battlerId; - aiMons = AI_PARTY->mons[GetBattlerSide(data->aiBattlerId)]; - for (i = 0; i < AI_PARTY->count[GetBattlerSide(data->aiBattlerId)]; i++) + aiMons = gAiPartyData->mons[GetBattlerSide(data->aiBattlerId)]; + for (i = 0; i < gAiPartyData->count[GetBattlerSide(data->aiBattlerId)]; i++) { u16 species = SPECIES_NONE; // Question mark if (aiMons[i].wasSentInBattle && aiMons[i].species) @@ -2199,8 +2199,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; case LIST_ITEM_AI: - data->modifyArrows.modifiedValPtr = &gBattleResources->ai->aiFlags[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gBattleResources->ai->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->aiFlags[data->battlerId]; + data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; CASE_ITEM_STATUS: diff --git a/src/battle_main.c b/src/battle_main.c index d049dbb370..02c111cb4f 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -209,7 +209,14 @@ EWRAM_DATA u8 gSentPokesToOpponent[2] = {0}; EWRAM_DATA struct BattleEnigmaBerry gEnigmaBerries[MAX_BATTLERS_COUNT] = {0}; EWRAM_DATA struct BattleScripting gBattleScripting = {0}; EWRAM_DATA struct BattleStruct *gBattleStruct = NULL; + +EWRAM_DATA struct AiThinkingStruct *gAiThinkingStruct = NULL; +EWRAM_DATA struct AiLogicData *gAiLogicData = NULL; +EWRAM_DATA struct AiPartyData *gAiPartyData = NULL; +EWRAM_DATA struct BattleHistory *gBattleHistory = NULL; + EWRAM_DATA struct AiBattleData *gAiBattleData = NULL; + EWRAM_DATA u8 *gLinkBattleSendBuffer = NULL; EWRAM_DATA u8 *gLinkBattleRecvBuffer = NULL; EWRAM_DATA struct BattleResources *gBattleResources = NULL; @@ -3230,8 +3237,8 @@ void SwitchInClearSetData(u32 battler) gSpecialStatuses[battler].enduredDamage = FALSE; // Reset Eject Button / Eject Pack switch detection - AI_DATA->ejectButtonSwitch = FALSE; - AI_DATA->ejectPackSwitch = FALSE; + gAiLogicData->ejectButtonSwitch = FALSE; + gAiLogicData->ejectPackSwitch = FALSE; // Reset G-Max Chi Strike boosts. gBattleStruct->bonusCritStages[battler] = 0; @@ -3887,7 +3894,7 @@ static void TryDoEventsBeforeFirstTurn(void) memset(gQueuedStatBoosts, 0, sizeof(gQueuedStatBoosts)); SetShellSideArmCategory(); - SetAiLogicDataForTurn(AI_DATA); // get assumed abilities, hold effects, etc of all battlers + SetAiLogicDataForTurn(gAiLogicData); // get assumed abilities, hold effects, etc of all battlers if (gBattleTypeFlags & BATTLE_TYPE_ARENA) { @@ -3987,7 +3994,7 @@ void BattleTurnPassed(void) BattlePutTextOnWindow(gText_EmptyString3, B_WIN_MSG); AssignUsableGimmicks(); SetShellSideArmCategory(); - SetAiLogicDataForTurn(AI_DATA); // get assumed abilities, hold effects, etc of all battlers + SetAiLogicDataForTurn(gAiLogicData); // get assumed abilities, hold effects, etc of all battlers gBattleMainFunc = HandleTurnActionSelectionState; if (gBattleTypeFlags & BATTLE_TYPE_PALACE) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 914ffe7fc1..63720331c9 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -7109,7 +7109,7 @@ static void Cmd_moveend(void) gBattleStruct->battlerState[battler].usedEjectItem = TRUE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EjectButtonActivates; - AI_DATA->ejectButtonSwitch = TRUE; + gAiLogicData->ejectButtonSwitch = TRUE; break; // Only the fastest Eject Button activates } } @@ -7159,7 +7159,7 @@ static void Cmd_moveend(void) gBattleStruct->battlerState[battler].usedEjectItem = TRUE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_EjectPackActivates; - AI_DATA->ejectPackSwitch = TRUE; + gAiLogicData->ejectPackSwitch = TRUE; break; // Only the fastest Eject item activates } } @@ -11643,13 +11643,13 @@ static void Cmd_various(void) case VARIOUS_SAVE_BATTLER_ITEM: { VARIOUS_ARGS(); - gBattleResources->battleHistory->heldItems[battler] = gBattleMons[battler].item; + gBattleHistory->heldItems[battler] = gBattleMons[battler].item; break; } case VARIOUS_RESTORE_BATTLER_ITEM: { VARIOUS_ARGS(); - gBattleMons[battler].item = gBattleResources->battleHistory->heldItems[battler]; + gBattleMons[battler].item = gBattleHistory->heldItems[battler]; break; } case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM: @@ -18704,7 +18704,7 @@ void BS_TryIntimidatEjectpack(void) { gProtectStructs[battler].statFell = FALSE; gProtectStructs[partnerBattler].statFell = FALSE; - AI_DATA->ejectPackSwitch = TRUE; + gAiLogicData->ejectPackSwitch = TRUE; gBattleScripting.battler = affectedBattler; gLastUsedItem = gBattleMons[affectedBattler].item; RecordItemEffectBattle(affectedBattler, HOLD_EFFECT_EJECT_PACK); diff --git a/src/battle_util.c b/src/battle_util.c index 43d507707c..32194c4b3c 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2984,7 +2984,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a && !IsBattlerAlly(battlerAtk, partnerDef)) { if (option == ABILITY_CHECK_TRIGGER_AI) - abilityDef = AI_DATA->abilities[partnerDef]; + abilityDef = gAiLogicData->abilities[partnerDef]; else abilityDef = GetBattlerAbility(partnerDef); @@ -6080,7 +6080,7 @@ static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) { gProtectStructs[battler].statFell = FALSE; gBattleScripting.battler = battler; - AI_DATA->ejectPackSwitch = TRUE; + gAiLogicData->ejectPackSwitch = TRUE; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) { BattleScriptExecute(BattleScript_EjectPackActivate_End2); @@ -7822,7 +7822,7 @@ static bool32 IsBattlerGroundedInverseCheck(u32 battler, bool32 considerInverse) return FALSE; if (holdEffect == HOLD_EFFECT_AIR_BALLOON) return FALSE; - if ((AI_DATA->aiCalcInProgress ? AI_DATA->abilities[battler] : GetBattlerAbility(battler)) == ABILITY_LEVITATE) + if ((gAiLogicData->aiCalcInProgress ? gAiLogicData->abilities[battler] : GetBattlerAbility(battler)) == ABILITY_LEVITATE) return FALSE; if (IS_BATTLER_OF_TYPE(battler, TYPE_FLYING) && (!considerInverse || !FlagGet(B_FLAG_INVERSE_BATTLE))) return FALSE; diff --git a/src/battle_util2.c b/src/battle_util2.c index 3fd6549a19..a77af79d78 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -19,6 +19,10 @@ void AllocateBattleResources(void) gBattleStruct = AllocZeroed(sizeof(*gBattleStruct)); gAiBattleData = AllocZeroed(sizeof(*gAiBattleData)); + gAiThinkingStruct = AllocZeroed(sizeof(*gAiThinkingStruct)); + gAiLogicData = AllocZeroed(sizeof(*gAiLogicData)); + gAiPartyData = AllocZeroed(sizeof(*gAiPartyData)); + gBattleHistory = AllocZeroed(sizeof(*gBattleHistory)); #if B_FLAG_SKY_BATTLE gBattleStruct->isSkyBattle = FlagGet(B_FLAG_SKY_BATTLE); @@ -29,10 +33,6 @@ void AllocateBattleResources(void) 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->aiData = AllocZeroed(sizeof(*gBattleResources->aiData)); - gBattleResources->aiParty = AllocZeroed(sizeof(*gBattleResources->aiParty)); - gBattleResources->battleHistory = AllocZeroed(sizeof(*gBattleResources->battleHistory)); gLinkBattleSendBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); gLinkBattleRecvBuffer = AllocZeroed(BATTLE_BUFFER_LINK_SIZE); @@ -57,15 +57,15 @@ void FreeBattleResources(void) { FREE_AND_SET_NULL(gBattleStruct); FREE_AND_SET_NULL(gAiBattleData); + FREE_AND_SET_NULL(gAiThinkingStruct); + FREE_AND_SET_NULL(gAiLogicData); + FREE_AND_SET_NULL(gAiPartyData); + FREE_AND_SET_NULL(gBattleHistory); FREE_AND_SET_NULL(gBattleResources->secretBase); 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->aiData); - FREE_AND_SET_NULL(gBattleResources->aiParty); - FREE_AND_SET_NULL(gBattleResources->battleHistory); FREE_AND_SET_NULL(gBattleResources); FREE_AND_SET_NULL(gLinkBattleSendBuffer); diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 0b385c017c..0349b08ff0 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -87,7 +87,7 @@ void RecordedBattle_Init(u8 mode) for (j = 0; j < BATTLER_RECORD_SIZE; j++) sBattleRecords[i][j] = 0xFF; sBattleFlags = gBattleTypeFlags; - sAI_Scripts = gBattleResources->ai->aiFlags[B_POSITION_OPPONENT_LEFT]; + sAI_Scripts = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; } } } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index c67095b5e9..e4edecd3df 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -45,7 +45,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has } SCENE { MESSAGE("Shuckle's Defense fell!"); // Contrary activates } THEN { - EXPECT(gBattleResources->aiData->abilities[B_POSITION_PLAYER_LEFT] == ABILITY_CONTRARY); + EXPECT(gAiThinkingStruct->abilities[B_POSITION_PLAYER_LEFT] == ABILITY_CONTRARY); } } @@ -749,7 +749,7 @@ AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") } WHEN { TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } } THEN { - EXPECT(gBattleResources->aiData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); + EXPECT(gAiThinkingStruct->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); } } From 057c0f548088c4cdda615bee66db58c6a93e7781 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Thu, 1 May 2025 17:25:27 +0200 Subject: [PATCH 027/187] fix test compiling --- test/battle/ai/ai.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index e4edecd3df..a499a3b841 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -45,7 +45,7 @@ AI_SINGLE_BATTLE_TEST("AI prefers Water Gun over Bubble if it knows that foe has } SCENE { MESSAGE("Shuckle's Defense fell!"); // Contrary activates } THEN { - EXPECT(gAiThinkingStruct->abilities[B_POSITION_PLAYER_LEFT] == ABILITY_CONTRARY); + EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_LEFT] == ABILITY_CONTRARY); } } @@ -749,7 +749,7 @@ AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") } WHEN { TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } } THEN { - EXPECT(gAiThinkingStruct->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); + EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); } } From 9a14bb2dd3956a5ad36c36ee77632d8a9ede6a0e Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Thu, 1 May 2025 20:22:11 +0200 Subject: [PATCH 028/187] removed aiFlags prefix --- include/battle.h | 2 +- src/battle_ai_main.c | 72 +++++++++++++------------- src/battle_ai_switch_items.c | 30 +++++------ src/battle_ai_util.c | 86 ++++++++++++++++---------------- src/battle_controller_opponent.c | 4 +- src/battle_debug.c | 4 +- src/debug.c | 6 +-- src/recorded_battle.c | 2 +- 8 files changed, 103 insertions(+), 103 deletions(-) diff --git a/include/battle.h b/include/battle.h index eb26509b9d..dff832f725 100644 --- a/include/battle.h +++ b/include/battle.h @@ -354,7 +354,7 @@ struct AiThinkingStruct u16 moveConsidered; s32 score[MAX_MON_MOVES]; u32 funcResult; - u32 aiFlags[MAX_BATTLERS_COUNT]; + u32 flags[MAX_BATTLERS_COUNT]; u8 aiAction; u8 aiLogicId; struct AI_SavedBattleMon saved[MAX_BATTLERS_COUNT]; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 93f5ddc933..c6d1559020 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -196,43 +196,43 @@ static u32 GetAiFlags(u16 trainerId) void BattleAI_SetupFlags(void) { if (IsAiVsAiBattle()) - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); + gAiThinkingStruct->flags[B_POSITION_PLAYER_LEFT] = GetAiFlags(gPartnerTrainerId); else - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI + gAiThinkingStruct->flags[B_POSITION_PLAYER_LEFT] = 0; // player has no AI if (DEBUG_OVERWORLD_MENU && gIsDebugBattle) { - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = gDebugAIFlags; - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gDebugAIFlags; + gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] = gDebugAIFlags; + gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] = gDebugAIFlags; return; } if (IsWildMonSmart() && !(gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER))) { // smart wild AI - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(0xFFFF); + gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(0xFFFF); } else { - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); + gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentA); if (TRAINER_BATTLE_PARAM.opponentB != 0) - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); + gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] = GetAiFlags(TRAINER_BATTLE_PARAM.opponentB); else - gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; + gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] = gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT]; } if (gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); + gAiThinkingStruct->flags[B_POSITION_PLAYER_RIGHT] = GetAiFlags(gPartnerTrainerId - TRAINER_PARTNER(PARTNER_NONE)); } else if (IsDoubleBattle() && IsAiVsAiBattle()) { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_LEFT]; + gAiThinkingStruct->flags[B_POSITION_PLAYER_RIGHT] = gAiThinkingStruct->flags[B_POSITION_PLAYER_LEFT]; } else { - gAiThinkingStruct->aiFlags[B_POSITION_PLAYER_RIGHT] = 0; // player + gAiThinkingStruct->flags[B_POSITION_PLAYER_RIGHT] = 0; // player } } @@ -242,9 +242,9 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves, u32 battler) u32 flags[MAX_BATTLERS_COUNT]; // Clear AI data but preserve the flags. - memcpy(&flags[0], &gAiThinkingStruct->aiFlags[0], sizeof(u32) * MAX_BATTLERS_COUNT); + memcpy(&flags[0], &gAiThinkingStruct->flags[0], sizeof(u32) * MAX_BATTLERS_COUNT); memset(gAiThinkingStruct, 0, sizeof(struct AiThinkingStruct)); - memcpy(&gAiThinkingStruct->aiFlags[0], &flags[0], sizeof(u32) * MAX_BATTLERS_COUNT); + memcpy(&gAiThinkingStruct->flags[0], &flags[0], sizeof(u32) * MAX_BATTLERS_COUNT); moveLimitations = gAiLogicData->moveLimitations[battler]; @@ -287,7 +287,7 @@ void SetupAISwitchingData(u32 battler, enum SwitchType switchType) s32 opposingBattler = GetOppositeBattler(battler); // AI's predicting data - if ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_SWITCH)) + if ((gAiThinkingStruct->flags[battler] & AI_FLAG_PREDICT_SWITCH)) { gAiLogicData->aiSwitchPredictionInProgress = TRUE; gAiLogicData->battlerDoingPrediction = battler; @@ -319,7 +319,7 @@ void ComputeBattlerDecisions(u32 battler) return; // Risky AI switches aggressively even mid battle - enum SwitchType switchType = (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; + enum SwitchType switchType = (gAiThinkingStruct->flags[battler] & AI_FLAG_RISKY) ? SWITCH_AFTER_KO : SWITCH_MID_BATTLE; gAiLogicData->aiCalcInProgress = TRUE; BattleAI_SetupAIData(0xF, battler); @@ -366,7 +366,7 @@ static void CopyBattlerDataToAIParty(u32 bPosition, u32 side) void Ai_InitPartyStruct(void) { u32 i; - bool32 isOmniscient = (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); + bool32 isOmniscient = (gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); struct Pokemon *mon; gAiPartyData->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); @@ -560,14 +560,14 @@ static u32 ChooseMoveOrAction_Singles(u32 battlerAi) u8 consideredMoveArray[MAX_MON_MOVES]; u32 numOfBestMoves; s32 i; - u32 flags = gAiThinkingStruct->aiFlags[battlerAi]; + u32 flags = gAiThinkingStruct->flags[battlerAi]; gAiLogicData->partnerMove = 0; // no ally while (flags != 0) { if (flags & 1) { - if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->flags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battlerAi, gBattlerTarget); else BattleAI_DoAIProcessing(gAiThinkingStruct, battlerAi, gBattlerTarget); @@ -638,13 +638,13 @@ static u32 ChooseMoveOrAction_Doubles(u32 battlerAi) gAiLogicData->partnerMove = GetAllyChosenMove(battlerAi); gAiThinkingStruct->aiLogicId = 0; gAiThinkingStruct->movesetIndex = 0; - flags = gAiThinkingStruct->aiFlags[battlerAi]; + flags = gAiThinkingStruct->flags[battlerAi]; while (flags != 0) { if (flags & 1) { - if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->aiFlags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) + if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->flags[battlerAi] & AI_FLAG_PREDICT_INCOMING_MON)) BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battlerAi, gBattlerTarget); else BattleAI_DoAIProcessing(gAiThinkingStruct, battlerAi, gBattlerTarget); @@ -1151,7 +1151,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-20); break; case EFFECT_EXPLOSION: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) + if (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); if (effectiveness == UQ_4_12(0.0)) @@ -1501,7 +1501,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-1); if ((predictedMove == MOVE_NONE || GetBattleMoveCategory(predictedMove) == DAMAGE_CATEGORY_STATUS || DoesSubstituteBlockMove(battlerAtk, BATTLE_PARTNER(battlerDef), predictedMove)) - && !(predictedMove == MOVE_NONE && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY))) // Let Risky AI predict blindly based on stats + && !(predictedMove == MOVE_NONE && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY))) // Let Risky AI predict blindly based on stats ADJUST_SCORE(-10); break; @@ -2007,7 +2007,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; case EFFECT_RECOIL_IF_MISS: if (aiData->abilities[battlerAtk] != ABILITY_MAGIC_GUARD && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex] < 75 - && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY)) ADJUST_SCORE(-6); break; case EFFECT_TRANSFORM: @@ -2122,7 +2122,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } - /*if (gAiThinkingStruct->aiFlags[battlerAtk] == AI_SCRIPT_CHECK_BAD_MOVE //Only basic AI + /*if (gAiThinkingStruct->flags[battlerAtk] == AI_SCRIPT_CHECK_BAD_MOVE //Only basic AI && IsDoubleBattle()) //Make the regular AI know how to use Protect minimally in Doubles { u8 shouldProtect = ShouldProtect(battlerAtk, battlerDef, move); @@ -2436,7 +2436,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(-10); } - else if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) + else if (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { if (gFieldStatuses & STATUS_FIELD_TRICK_ROOM) // Trick Room Up { @@ -2955,7 +2955,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } break; case ABILITY_VOLT_ABSORB: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + if (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_HP_AWARE)) { RETURN_SCORE_MINUS(10); } @@ -2978,7 +2978,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_WATER_ABSORB: case ABILITY_DRY_SKIN: case ABILITY_EARTH_EATER: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + if (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_HP_AWARE)) { RETURN_SCORE_MINUS(10); } @@ -3397,7 +3397,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) moveEffect = EFFECT_PROTECT; // check status move preference - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_PREFER_STATUS_MOVES && IsBattleMoveStatus(move) && effectiveness != UQ_4_12(0.0)) ADJUST_SCORE(10); // check thawing moves @@ -3405,7 +3405,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(10); // check burn / frostbite - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING && gAiLogicData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_SMART_SWITCHING && gAiLogicData->abilities[battlerAtk] == ABILITY_NATURAL_CURE) { if ((gBattleMons[battlerAtk].status1 & STATUS1_BURN && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_PHYSICAL, TRUE)) || (gBattleMons[battlerAtk].status1 & STATUS1_FROSTBITE && HasOnlyMovesWithCategory(battlerAtk, DAMAGE_CATEGORY_SPECIAL, TRUE))) @@ -3431,14 +3431,14 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_EXPLOSION: case EFFECT_MEMENTO: - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_WILL_SUICIDE && gBattleMons[battlerDef].statStages[STAT_EVASION] < 7) { if (aiData->hpPercents[battlerAtk] < 50 && AI_RandLessThan(128)) ADJUST_SCORE(DECENT_EFFECT); } break; case EFFECT_FINAL_GAMBIT: - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_WILL_SUICIDE) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_MIRROR_MOVE: @@ -4451,7 +4451,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) + if (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_POWERFUL_STATUS)) { if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && GetBattlerSideSpeedAverage(battlerAtk) < GetBattlerSideSpeedAverage(battlerDef)) ADJUST_SCORE(GOOD_EFFECT); @@ -4913,7 +4913,7 @@ static s32 AI_CheckViability(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_AND_RETURN_SCORE(NO_DAMAGE_OR_FAILS); // No point in checking the move further so return early else { - if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) + if (gAiThinkingStruct->flags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_PREFER_HIGHEST_DAMAGE_MOVE) && GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING) == move) ADJUST_SCORE(BEST_DAMAGE_MOVE); else @@ -4935,7 +4935,7 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 || gBattleResults.battleTurnCounter != 0) return score; - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_SMART_SWITCHING + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_SMART_SWITCHING && AI_IsSlower(battlerAtk, battlerDef, move) && CanTargetFaintAi(battlerDef, battlerAtk) && GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], move) == 0) @@ -5512,7 +5512,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_FOCUS_PUNCH: ADJUST_SCORE(DECENT_EFFECT); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CHECK_BAD_MOVE) { if (aiData->abilities[battlerDef] == ABILITY_WONDER_GUARD && effectiveness < UQ_4_12(2.0)) ADJUST_SCORE(10); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4937719b44..d28c95834b 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -115,11 +115,11 @@ u32 GetThinkingBattler(u32 battler) static bool32 IsAceMon(u32 battler, u32 monPartyId) { - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && monPartyId == CalculateEnemyPartyCountInSide(battler)-1) return TRUE; - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_DOUBLE_ACE_POKEMON && !gBattleStruct->battlerState[battler].forcedSwitch && (monPartyId == CalculateEnemyPartyCount()-1 || monPartyId == CalculateEnemyPartyCount()-2)) return TRUE; @@ -187,7 +187,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) enum BattleMoveEffects aiMoveEffect; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic @@ -461,7 +461,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); s32 i, j; - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species) // AI mon has changed, player's behaviour no longer reliable; note to override this if using AI_FLAG_PREDICT_MOVE return FALSE; @@ -584,7 +584,7 @@ static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) u32 incomingMove = gAiLogicData->lastUsedMove[opposingBattler]; bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); - if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (IsDoubleBattle() || !(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; if (isOpposingBattlerChargingOrInvulnerable && gAiLogicData->mostSuitableMonId[battler] != PARTY_SIZE && RandomPercentage(RNG_AI_SWITCH_FREE_TURN, GetSwitchChance(SHOULD_SWITCH_FREE_TURN))) @@ -603,7 +603,7 @@ static bool32 ShouldSwitchIfTrapperInParty(u32 battler) s32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Check if current mon has an ability that traps opponent @@ -647,7 +647,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) && RandomPercentage(RNG_AI_SWITCH_PERISH_SONG, GetSwitchChance(SHOULD_SWITCH_PERISH_SONG))) return SetSwitchinAndSwitch(battler, PARTY_SIZE); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) { //Yawn if (gStatuses3[battler] & STATUS3_YAWN @@ -836,7 +836,7 @@ static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 perc u16 move; // Similar functionality handled more thoroughly by ShouldSwitchIfHasBadOdds - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (gLastLandedMoves[battler] == MOVE_NONE) @@ -974,7 +974,7 @@ static bool32 ShouldSwitchIfEncored(u32 battler) u32 opposingBattler = GetOppositeBattler(battler); // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // If not Encore'd don't switch @@ -1024,7 +1024,7 @@ static bool32 ShouldSwitchIfAttackingStatsLowered(u32 battler) s8 spAttackingStage = gBattleMons[battler].statStages[STAT_SPATK]; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer - if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) + if (!(gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) return FALSE; // Physical attacker @@ -1100,7 +1100,7 @@ bool32 ShouldSwitch(u32 battler) return FALSE; // Sequence Switching AI never switches mid-battle - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) return FALSE; availableToSwitch = 0; @@ -1152,7 +1152,7 @@ bool32 ShouldSwitch(u32 battler) if (ShouldSwitchIfWonderGuard(battler)) return TRUE; - if ((gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) + if ((gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) && (CanMonSurviveHazardSwitchin(battler) == FALSE)) return FALSE; if (HasGoodSubstituteMove(battler)) return FALSE; @@ -1182,7 +1182,7 @@ bool32 ShouldSwitch(u32 battler) // Removing switch capabilites under specific conditions // These Functions prevent the "FindMonWithFlagsAndSuperEffective" from getting out of hand. // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; if (HasSuperEffectiveMoveAgainstOpponents(battler, FALSE)) return FALSE; @@ -2166,14 +2166,14 @@ u32 GetMostSuitableMonToSwitchInto(u32 battler, enum SwitchType switchType) GetAIPartyIndexes(battler, &firstId, &lastId); party = GetBattlerParty(battler); - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SEQUENCE_SWITCHING) { bestMonId = GetNextMonInParty(party, firstId, lastId, battlerIn1, battlerIn2); return bestMonId; } // Only use better mon selection if AI_FLAG_SMART_MON_CHOICES is set for the trainer. - if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic + if (gAiThinkingStruct->flags[GetThinkingBattler(battler)] & AI_FLAG_SMART_MON_CHOICES && !IsDoubleBattle()) // Double Battles aren't included in AI_FLAG_SMART_MON_CHOICE. Defaults to regular switch in logic { bestMonId = GetBestMonIntegrated(party, firstId, lastId, battler, opposingBattler, battlerIn1, battlerIn2, switchType); return bestMonId; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index e0d040c294..08c3623a17 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -55,17 +55,17 @@ u32 AI_GetDamage(u32 battlerAtk, u32 battlerDef, u32 moveIndex, enum DamageCalcC if (calcContext == AI_ATTACKING && BattlerHasAi(battlerAtk)) { - if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it deals max damage + if ((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it deals max damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; - if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it deals min damage + if ((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it deals min damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].median; // Default assumes it deals median damage } else if (calcContext == AI_DEFENDING && BattlerHasAi(battlerDef)) { - if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it takes min damage + if ((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY) && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE)) // Risky assumes it takes min damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].minimum; - if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it takes max damage + if ((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE) && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY)) // Conservative assumes it takes max damage return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].maximum; return aiData->simulatedDmg[battlerAtk][battlerDef][moveIndex].median; // Default assumes it takes median damage } @@ -125,8 +125,8 @@ bool32 BattlerHasAi(u32 battlerId) bool32 IsAiBattlerAware(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT) + if (gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT + || gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT) return TRUE; return BattlerHasAi(battlerId); @@ -134,8 +134,8 @@ bool32 IsAiBattlerAware(u32 battlerId) bool32 IsAiBattlerPredictingAbility(u32 battlerId) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) + if (gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_WEIGH_ABILITY_PREDICTION + || gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_WEIGH_ABILITY_PREDICTION) return TRUE; return BattlerHasAi(battlerId); @@ -144,8 +144,8 @@ bool32 IsAiBattlerPredictingAbility(u32 battlerId) bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch - if (gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH - || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + if (gAiThinkingStruct->flags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH + || gAiThinkingStruct->flags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) { if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) return TRUE; @@ -677,11 +677,11 @@ static inline bool32 ShouldCalcCritDamage(u32 battlerAtk, u32 battlerDef, u32 mo if (critChanceIndex == CRITICAL_HIT_ALWAYS) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_STAGE_THRESHOLD // Not guaranteed but above Risky threshold - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY) && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) != GEN_1) return TRUE; if (critChanceIndex >= RISKY_AI_CRIT_THRESHOLD_GEN_1 // Not guaranteed but above Risky threshold - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY) && GetGenConfig(GEN_CONFIG_CRIT_CHANCE) == GEN_1) return TRUE; return FALSE; @@ -1439,7 +1439,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) else holdEffect = GetBattlerHoldEffect(battlerId, FALSE); - if (gAiThinkingStruct->aiFlags[battlerId] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->flags[battlerId] & AI_FLAG_NEGATE_UNAWARE) return holdEffect; if (gStatuses3[battlerId] & STATUS3_EMBARGO) @@ -1454,7 +1454,7 @@ enum ItemHoldEffect AI_DecideHoldEffectForTurn(u32 battlerId) bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; // AI handicap flag: doesn't understand ability suppression concept if (IsMoldBreakerTypeAbility(battlerAtk, atkAbility) || MoveIgnoresTargetAbility(move)) @@ -1465,8 +1465,8 @@ bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move) static inline bool32 AI_WeatherHasEffect(void) { - if (gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE - || gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_NEGATE_UNAWARE + || gAiThinkingStruct->flags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_NEGATE_UNAWARE) return TRUE; // AI doesn't understand weather supression (handicap) return gAiLogicData->weatherHasEffect; // weather damping abilities are announced @@ -1583,7 +1583,7 @@ bool32 IsHazardClearingMove(u32 move) bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) return FALSE; enum BattleMoveEffects effect = GetMoveEffect(move); @@ -1938,7 +1938,7 @@ u32 CountNegativeStatStages(u32 battlerId) bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -1957,7 +1957,7 @@ bool32 ShouldLowerAttack(u32 battlerAtk, u32 battlerDef, u32 defAbility) bool32 ShouldLowerDefense(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -1988,7 +1988,7 @@ bool32 ShouldLowerSpeed(u32 battlerAtk, u32 battlerDef, u32 defAbility) bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2006,7 +2006,7 @@ bool32 ShouldLowerSpAtk(u32 battlerAtk, u32 battlerDef, u32 defAbility) bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2024,7 +2024,7 @@ bool32 ShouldLowerSpDef(u32 battlerAtk, u32 battlerDef, u32 defAbility) bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -2043,7 +2043,7 @@ bool32 ShouldLowerAccuracy(u32 battlerAtk, u32 battlerDef, u32 defAbility) bool32 ShouldLowerEvasion(u32 battlerAtk, u32 battlerDef, u32 defAbility) { if (AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) - && (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) + && (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return FALSE; // Don't bother lowering stats if can kill enemy. @@ -3330,7 +3330,7 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move) if (BattlerWillFaintFromSecondaryDamage(battlerDef, gAiLogicData->abilities[battlerDef])) return TRUE; // battler is taking secondary damage with low HP - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL) { if (!CanTargetFaintAi(battlerDef, battlerAtk)) return TRUE; // attacker goes first and opponent can't kill us @@ -3794,9 +3794,9 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl if (calcContext == AI_ATTACKING) { SetBattlerAiData(battlerAtk, gAiLogicData); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE)) return dmg.maximum; - else if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + else if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY)) return dmg.minimum; else return dmg.median; @@ -3805,9 +3805,9 @@ s32 AI_CalcPartyMonDamage(u32 move, u32 battlerAtk, u32 battlerDef, struct Battl else if (calcContext == AI_DEFENDING) { SetBattlerAiData(battlerDef, gAiLogicData); - if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_RISKY && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_CONSERVATIVE)) + if (gAiThinkingStruct->flags[battlerDef] & AI_FLAG_RISKY && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_CONSERVATIVE)) return dmg.minimum; - else if (gAiThinkingStruct->aiFlags[battlerDef] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_RISKY)) + else if (gAiThinkingStruct->flags[battlerDef] & AI_FLAG_CONSERVATIVE && !(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_RISKY)) return dmg.maximum; else return dmg.median; @@ -4070,7 +4070,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_DEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL) tempScore += DECENT_EFFECT; else tempScore += WEAK_EFFECT; @@ -4087,7 +4087,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_SPDEF: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL) tempScore += DECENT_EFFECT; else tempScore += WEAK_EFFECT; @@ -4100,7 +4100,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_DEF_2: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL) tempScore += GOOD_EFFECT; else tempScore += DECENT_EFFECT; @@ -4117,7 +4117,7 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, case STAT_CHANGE_SPDEF_2: if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) || !HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL) tempScore += GOOD_EFFECT; else tempScore += DECENT_EFFECT; @@ -4150,7 +4150,7 @@ u32 IncreaseStatUpScoreContrary(u32 battlerAtk, u32 battlerDef, enum StatChange void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if (((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PSN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; @@ -4159,7 +4159,7 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (!HasDamagingMove(battlerDef)) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) + if (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(WEAK_EFFECT); // stall tactic if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) @@ -4173,14 +4173,14 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if (((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_BRN || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; if (AI_CanBurn(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, gAiLogicData->partnerMove)) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_PHYSICAL) - || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker + || (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects physical attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_PHYSICAL) @@ -4197,7 +4197,7 @@ void IncreaseBurnScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if (((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_PAR || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; @@ -4219,7 +4219,7 @@ void IncreaseParalyzeScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING)) != EFFECT_FOCUS_PUNCH) + if (((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0) && GetMoveEffect(GetBestDmgMoveFromBattler(battlerAtk, battlerDef, AI_ATTACKING)) != EFFECT_FOCUS_PUNCH) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_SLP || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; @@ -4239,7 +4239,7 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if (((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if (((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_CONFUSION || gAiLogicData->holdEffects[battlerDef] == HOLD_EFFECT_CURE_STATUS) return; @@ -4258,13 +4258,13 @@ void IncreaseConfusionScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score void IncreaseFrostbiteScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) { - if ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) + if ((gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_TRY_TO_FAINT) && CanAIFaintTarget(battlerAtk, battlerDef, 0)) return; if (AI_CanGiveFrostbite(battlerAtk, battlerDef, gAiLogicData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, gAiLogicData->partnerMove)) { if (HasMoveWithCategory(battlerDef, DAMAGE_CATEGORY_SPECIAL) - || (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker + || (!(gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_OMNISCIENT) // Not Omniscient but expects special attacker && gSpeciesInfo[gBattleMons[battlerDef].species].baseSpAttack >= gSpeciesInfo[gBattleMons[battlerDef].species].baseAttack + 10)) { if (GetMoveCategory(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == DAMAGE_CATEGORY_SPECIAL) @@ -4362,7 +4362,7 @@ bool32 AI_ShouldCopyStatChanges(u32 battlerAtk, u32 battlerDef) return TRUE; case STAT_DEF: case STAT_SPDEF: - return (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL); + return (gAiThinkingStruct->flags[battlerAtk] & AI_FLAG_STALL); } } } @@ -4498,7 +4498,7 @@ bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef) bool32 IsBattlerItemEnabled(u32 battler) { - if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_NEGATE_UNAWARE) + if (gAiThinkingStruct->flags[battler] & AI_FLAG_NEGATE_UNAWARE) return TRUE; if (gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) return FALSE; diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index ce95927c8e..c809fe641f 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -650,14 +650,14 @@ static void OpponentHandleChooseItem(u32 battler) static inline bool32 IsAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) { - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_ACE_POKEMON + return gAiThinkingStruct->flags[battler] & AI_FLAG_ACE_POKEMON && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle; } static inline bool32 IsDoubleAcePokemon(u32 chosenMonId, u32 pokemonInBattle, u32 battler) { - return gAiThinkingStruct->aiFlags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON + return gAiThinkingStruct->flags[battler] & AI_FLAG_DOUBLE_ACE_POKEMON && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 1) && (chosenMonId == CalculateEnemyPartyCountInSide(battler) - 2) && CountAIAliveNonEggMonsExcept(PARTY_SIZE) != pokemonInBattle diff --git a/src/battle_debug.c b/src/battle_debug.c index e863e78181..e8307b3879 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2199,8 +2199,8 @@ static void SetUpModifyArrows(struct BattleDebugMenu *data) data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; case LIST_ITEM_AI: - data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->aiFlags[data->battlerId]; - data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->aiFlags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); + data->modifyArrows.modifiedValPtr = &gAiThinkingStruct->flags[data->battlerId]; + data->modifyArrows.currValue = GetBitfieldValue(gAiThinkingStruct->flags[data->battlerId], data->bitfield[data->currentSecondaryListItemId].currBit, data->bitfield[data->currentSecondaryListItemId].bitsCount); data->modifyArrows.typeOfVal = VAL_BITFIELD_32; goto CASE_ITEM_STATUS; CASE_ITEM_STATUS: diff --git a/src/debug.c b/src/debug.c index ad0cf449d4..cfdf8794b1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -120,7 +120,7 @@ enum TimeMenuTimeOfDay DEBUG_TIME_MENU_ITEM_MORNING, DEBUG_TIME_MENU_ITEM_DAY, DEBUG_TIME_MENU_ITEM_EVENING, - DEBUG_TIME_MENU_ITEM_NIGHT, + DEBUG_TIME_MENU_ITEM_NIGHT, }; enum TimeMenuWeekdays @@ -3776,7 +3776,7 @@ static void DebugAction_Give_DayCareEgg(u8 taskId) static void DebugAction_TimeMenu_ChangeTimeOfDay(u8 taskId) { u32 input = ListMenu_ProcessInput(gTasks[taskId].tMenuTaskId); - + DebugAction_DestroyExtraWindow(taskId); switch (input) { @@ -3808,7 +3808,7 @@ static void DebugAction_TimeMenu_ChangeWeekdays(u8 taskId) { case DEBUG_TIME_MENU_ITEM_SUNDAY: daysToAdd = ((WEEKDAY_SUN - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); + FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); break; case DEBUG_TIME_MENU_ITEM_MONDAY: daysToAdd = ((WEEKDAY_MON - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; diff --git a/src/recorded_battle.c b/src/recorded_battle.c index 0349b08ff0..8b8f97ce43 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -87,7 +87,7 @@ void RecordedBattle_Init(u8 mode) for (j = 0; j < BATTLER_RECORD_SIZE; j++) sBattleRecords[i][j] = 0xFF; sBattleFlags = gBattleTypeFlags; - sAI_Scripts = gAiThinkingStruct->aiFlags[B_POSITION_OPPONENT_LEFT]; + sAI_Scripts = gAiThinkingStruct->flags[B_POSITION_OPPONENT_LEFT]; } } } From d83b0671f7378f3e672fba9a7ae315631b3fcfe1 Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Thu, 1 May 2025 23:49:05 -0400 Subject: [PATCH 029/187] Battle anims, ice: ARRAY_COUNT works if used with a cast --- src/battle_anim_ice.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_anim_ice.c b/src/battle_anim_ice.c index 7579246588..6b48215a7a 100644 --- a/src/battle_anim_ice.c +++ b/src/battle_anim_ice.c @@ -1371,9 +1371,9 @@ static void AnimTask_Hail2(u8 taskId) if (GenerateHailParticle(task->tHailStructId, task->tHailAffineAnimNum, taskId, 1)) task->tSpriteCount++; - if (++task->tHailAffineAnimNum == 3) // i.e. ARRAY_COUNT(sAffineAnims_HailParticle) + if (++task->tHailAffineAnimNum == (int)ARRAY_COUNT(sAffineAnims_HailParticle)) { - if (++task->tHailStructId == 10) // i.e. ARRAY_COUNT(sHailCoordData) + if (++task->tHailStructId == (int)ARRAY_COUNT(sHailCoordData)) task->tState++; else task->tState--; From 0f17e703710299744bc2e1f12df665d2c791166b Mon Sep 17 00:00:00 2001 From: DavidJCobb <831497+DavidJCobb@users.noreply.github.com> Date: Fri, 2 May 2025 00:01:15 -0400 Subject: [PATCH 030/187] Shorter names for engine/controller communication enum members --- include/battle_controllers.h | 15 +- src/battle_ai_switch_items.c | 18 +-- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 26 +-- src/battle_controller_player.c | 48 +++--- src/battle_controller_player_partner.c | 12 +- src/battle_controller_recorded_opponent.c | 12 +- src/battle_controller_recorded_player.c | 14 +- src/battle_controller_safari.c | 12 +- src/battle_controller_wally.c | 16 +- src/battle_controllers.c | 10 +- src/battle_main.c | 54 +++---- src/battle_script_commands.c | 186 +++++++++++----------- src/battle_util.c | 24 +-- src/battle_util2.c | 2 +- src/pokemon.c | 2 +- 17 files changed, 234 insertions(+), 225 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index ca82e487d9..2fe19b4907 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -111,9 +111,18 @@ enum { // Special arguments for Battle Controller functions. enum { - BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, // gBattleBufferA - BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, // gBattleBufferB - BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE + // For commands sent from the core battle engine to a controller. + B_COMM_TO_CONTROLLER, // gBattleBufferA + + // For replies sent from a controller to the core battle engine. + B_COMM_TO_ENGINE, // gBattleBufferB + + // During local play, a controller must directly mark itself as + // inactive when it's done processing, whether or not it sends + // a reply. During multiplayer, it must NOT directly mark itself + // as inactive, but instead send one of these, with the player's + // multiplayer ID as data. + B_COMM_CONTROLLER_IS_DONE }; enum { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 73f0b3e929..2e76b418a9 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -23,7 +23,7 @@ static bool8 ShouldSwitchIfPerishSong(void) && gDisableStructs[gActiveBattler].perishSongTimer == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else @@ -107,7 +107,7 @@ static bool8 ShouldSwitchIfWonderGuard(void) { // We found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -207,7 +207,7 @@ static bool8 FindMonThatAbsorbsOpponentsMove(void) { // we found a mon. *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -229,14 +229,14 @@ static bool8 ShouldSwitchIfNaturalCure(void) && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } else if (gBattleMoves[gLastLandedMoves[gActiveBattler]].power == 0 && Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -248,7 +248,7 @@ static bool8 ShouldSwitchIfNaturalCure(void) if (Random() & 1) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } @@ -416,7 +416,7 @@ static bool8 FindMonWithFlagsAndSuperEffective(u8 flags, u8 moduloPercent) if (moveFlags & MOVE_RESULT_SUPER_EFFECTIVE && Random() % moduloPercent == 0) { *(gBattleStruct->AI_monToSwitchIntoId + gActiveBattler) = i; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); return TRUE; } } @@ -599,7 +599,7 @@ void AI_TrySwitchOrUseItem(void) } } - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, BATTLE_OPPOSITE(gActiveBattler) << 8); } static void ModulateByTypeEffectiveness(u8 atkType, u8 defType1, u8 defType2, u8 *var) @@ -933,7 +933,7 @@ static bool8 ShouldUseItem(void) if (shouldUse) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2) = item; gBattleResources->battleHistory->trainerItems[i] = ITEM_NONE; return shouldUse; diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 1a364d4f98..00fb018b8b 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -518,7 +518,7 @@ static void LinkOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -548,7 +548,7 @@ static void LinkOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); LinkOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 73331c86e2..53babb1f1d 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -400,7 +400,7 @@ static void LinkPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -442,7 +442,7 @@ static void LinkPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); LinkPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 16c748cc64..07dd7596d8 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -531,7 +531,7 @@ static void OpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -561,7 +561,7 @@ static void OpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); OpponentBufferExecCompleted(); } @@ -881,7 +881,7 @@ static void OpponentHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); OpponentBufferExecCompleted(); } @@ -1552,7 +1552,7 @@ static void OpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); OpponentBufferExecCompleted(); } else @@ -1569,13 +1569,13 @@ static void OpponentHandleChooseMove(void) switch (chosenMoveId) { case AI_CHOICE_WATCH: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SAFARI_WATCH_CAREFULLY, 0); break; case AI_CHOICE_FLEE: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_RUN, 0); break; case 6: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 15, gBattlerTarget); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 15, gBattlerTarget); break; default: if (gBattleMoves[moveInfo->moves[chosenMoveId]].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) @@ -1586,7 +1586,7 @@ static void OpponentHandleChooseMove(void) if (gAbsentBattlerFlags & gBitTable[gBattlerTarget]) gBattlerTarget = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, (chosenMoveId) | (gBattlerTarget << 8)); break; } OpponentBufferExecCompleted(); @@ -1601,11 +1601,11 @@ static void OpponentHandleChooseMove(void) } while (move == MOVE_NONE); if (gBattleMoves[move].target & (MOVE_TARGET_USER_OR_SELECTED | MOVE_TARGET_USER)) - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (gActiveBattler << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, (chosenMoveId) | (gActiveBattler << 8)); else if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(Random() & 2) << 8)); else - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, (chosenMoveId) | (GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) << 8)); OpponentBufferExecCompleted(); } @@ -1614,7 +1614,7 @@ static void OpponentHandleChooseMove(void) static void OpponentHandleChooseItem(void) { - BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); + BtlController_EmitOneReturnValue(B_COMM_TO_ENGINE, *(gBattleStruct->chosenItem + (gActiveBattler / 2) * 2)); OpponentBufferExecCompleted(); } @@ -1671,7 +1671,7 @@ static void OpponentHandleChoosePokemon(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, chosenMonId, NULL); OpponentBufferExecCompleted(); } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 65144b16e3..125d83d3fa 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -204,7 +204,7 @@ static void PlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -249,16 +249,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: // Top left - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); break; case 1: // Top right - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); break; case 2: // Bottom left - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SWITCH, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SWITCH, 0); break; case 3: // Bottom right - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_RUN, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_RUN, 0); break; } PlayerBufferExecCompleted(); @@ -319,7 +319,7 @@ static void HandleInputChooseAction(void) return; } PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_CANCEL_PARTNER, 0); PlayerBufferExecCompleted(); } } @@ -365,7 +365,7 @@ static void HandleInputChooseTarget(void) { PlaySE(SE_SELECT); gSprites[gBattlerSpriteIds[gMultiUsePlayerCursor]].callback = SpriteCB_HideAsMoveTarget; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); EndBounceEffect(gMultiUsePlayerCursor, BOUNCE_HEALTHBOX); PlayerBufferExecCompleted(); } @@ -523,7 +523,7 @@ static void HandleInputChooseMove(void) if (!canSelectTarget) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, gMoveSelectionCursor[gActiveBattler] | (gMultiUsePlayerCursor << 8)); PlayerBufferExecCompleted(); } else @@ -543,7 +543,7 @@ static void HandleInputChooseMove(void) else if (JOY_NEW(B_BUTTON) || gPlayerDpadHoldFrames > 59) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, 0xFFFF); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, 0xFFFF); PlayerBufferExecCompleted(); } else if (JOY_NEW(DPAD_LEFT)) @@ -1174,7 +1174,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE @@ -1253,7 +1253,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -1361,9 +1361,9 @@ static void WaitForMonSelection(void) if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { if (gPartyMenuUseExitCallback == TRUE) - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, gSelectedMonPartyId, gBattlePartyCurrentOrder); else - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, PARTY_SIZE, NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, PARTY_SIZE, NULL); if ((gBattleBufferA[gActiveBattler][1] & 0xF) == 1) PrintLinkStandbyMsg(); @@ -1387,7 +1387,7 @@ static void CompleteWhenChoseItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(B_COMM_TO_ENGINE, gSpecialVar_ItemId); PlayerBufferExecCompleted(); } } @@ -1439,9 +1439,9 @@ static void PlayerHandleYesNoInput(void) PlaySE(SE_SELECT); if (gMultiUsePlayerCursor != 0) - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0xE, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 0xE, 0); else - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0xD, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 0xD, 0); PlayerBufferExecCompleted(); } @@ -1600,7 +1600,7 @@ static void PlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); PlayerBufferExecCompleted(); } @@ -1920,7 +1920,7 @@ void PlayerHandleGetRawMonData(void) for (i = 0; i < gBattleBufferA[gActiveBattler][2]; i++) dst[i] = src[i]; - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, gBattleBufferA[gActiveBattler][2], dst); PlayerBufferExecCompleted(); } @@ -2621,7 +2621,7 @@ static void PlayerChooseMoveInBattlePalace(void) if (--*(gBattleStruct->arenaMindPoints + gActiveBattler) == 0) { gBattlePalaceMoveSelectionRngValue = gRngValue; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); PlayerBufferExecCompleted(); } } @@ -2671,7 +2671,7 @@ static void PlayerHandleChoosePokemon(void) if (gBattleTypeFlags & BATTLE_TYPE_ARENA && (gBattleBufferA[gActiveBattler][1] & 0xF) != PARTY_ACTION_CANT_SWITCH) { - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, gBattlerPartyIndexes[gActiveBattler] + 1, gBattlePartyCurrentOrder); PlayerBufferExecCompleted(); } else @@ -2828,25 +2828,25 @@ static void PlayerHandleCmd32(void) static void PlayerHandleTwoReturnValues(void) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 0, 0); PlayerBufferExecCompleted(); } static void PlayerHandleChosenMonReturnValue(void) { - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0, NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, 0, NULL); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue(void) { - BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0); + BtlController_EmitOneReturnValue(B_COMM_TO_ENGINE, 0); PlayerBufferExecCompleted(); } static void PlayerHandleOneReturnValue_Duplicate(void) { - BtlController_EmitOneReturnValue_Duplicate(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 0); + BtlController_EmitOneReturnValue_Duplicate(B_COMM_TO_ENGINE, 0); PlayerBufferExecCompleted(); } diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 1c39d9fc76..04445736c4 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -332,7 +332,7 @@ static void Task_GiveExpToMon(u8 taskId) gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE @@ -411,7 +411,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = Task_LaunchLvlUpAnim; } @@ -584,7 +584,7 @@ static void PlayerPartnerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -626,7 +626,7 @@ static void PlayerPartnerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); PlayerPartnerBufferExecCompleted(); } @@ -1527,7 +1527,7 @@ static void PlayerPartnerHandleChooseMove(void) gBattlerTarget = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); } - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, chosenMoveId | (gBattlerTarget << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, chosenMoveId | (gBattlerTarget << 8)); PlayerPartnerBufferExecCompleted(); } @@ -1557,7 +1557,7 @@ static void PlayerPartnerHandleChoosePokemon(void) } *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = chosenMonId; - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, chosenMonId, NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, chosenMonId, NULL); PlayerPartnerBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 283827d326..1c73b65913 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -504,7 +504,7 @@ static void RecordedOpponentBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -534,7 +534,7 @@ static void RecordedOpponentHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); RecordedOpponentBufferExecCompleted(); } @@ -1402,7 +1402,7 @@ static void RecordedOpponentHandlePrintSelectionString(void) static void RecordedOpponentHandleChooseAction(void) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedOpponentBufferExecCompleted(); } @@ -1415,13 +1415,13 @@ static void RecordedOpponentHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveId | (target << 8)); } RecordedOpponentBufferExecCompleted(); @@ -1435,7 +1435,7 @@ static void RecordedOpponentHandleChooseItem(void) static void RecordedOpponentHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedOpponentBufferExecCompleted(); } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 92442ae445..4026aa728f 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -475,7 +475,7 @@ static void RecordedPlayerBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -517,7 +517,7 @@ static void RecordedPlayerHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); RecordedPlayerBufferExecCompleted(); } @@ -1414,7 +1414,7 @@ static void ChooseActionInBattlePalace(void) { if (gBattleCommunication[4] >= gBattlersCount / 2) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1427,7 +1427,7 @@ static void RecordedPlayerHandleChooseAction(void) } else { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RecordedBattle_GetBattlerAction(gActiveBattler), 0); RecordedPlayerBufferExecCompleted(); } } @@ -1441,13 +1441,13 @@ static void RecordedPlayerHandleChooseMove(void) { if (gBattleTypeFlags & BATTLE_TYPE_PALACE) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, ChooseMoveAndTargetInBattlePalace()); } else { u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveId | (target << 8)); } RecordedPlayerBufferExecCompleted(); @@ -1461,7 +1461,7 @@ static void RecordedPlayerHandleChooseItem(void) static void RecordedPlayerHandleChoosePokemon(void) { *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitChosenMonReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); + BtlController_EmitChosenMonReturnValue(B_COMM_TO_ENGINE, *(gBattleStruct->monToSwitchIntoId + gActiveBattler), NULL); RecordedPlayerBufferExecCompleted(); } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index fe6e1278db..c432fcbb64 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -176,16 +176,16 @@ static void HandleInputChooseAction(void) switch (gActionSelectionCursor[gActiveBattler]) { case 0: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_BALL, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SAFARI_BALL, 0); break; case 1: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_POKEBLOCK, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SAFARI_POKEBLOCK, 0); break; case 2: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_GO_NEAR, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SAFARI_GO_NEAR, 0); break; case 3: - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_SAFARI_RUN, 0); break; } SafariBufferExecCompleted(); @@ -280,7 +280,7 @@ static void CompleteWhenChosePokeblock(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(B_COMM_TO_ENGINE, gSpecialVar_ItemId); SafariBufferExecCompleted(); } } @@ -298,7 +298,7 @@ static void SafariBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index d95eb6d5c4..5715c522f5 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -196,7 +196,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -207,7 +207,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_MOVE, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_MOVE, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -217,7 +217,7 @@ static void WallyHandleActions(void) case 3: if (--gBattleStruct->wallyWaitFrames == 0) { - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_WALLY_THROW, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_WALLY_THROW, 0); WallyBufferExecCompleted(); gBattleStruct->wallyBattleState++; gBattleStruct->wallyMovesState = 0; @@ -238,7 +238,7 @@ static void WallyHandleActions(void) if (--gBattleStruct->wallyWaitFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, B_ACTION_USE_ITEM, 0); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, B_ACTION_USE_ITEM, 0); WallyBufferExecCompleted(); } break; @@ -278,7 +278,7 @@ static void CompleteOnChosenItem(void) { if (gMain.callback2 == BattleMainCB2 && !gPaletteFade.active) { - BtlController_EmitOneReturnValue(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, gSpecialVar_ItemId); + BtlController_EmitOneReturnValue(B_COMM_TO_ENGINE, gSpecialVar_ItemId); WallyBufferExecCompleted(); } } @@ -408,7 +408,7 @@ static void WallyBufferExecCompleted(void) { u8 playerId = GetMultiplayerId(); - PrepareBufferDataTransferLink(BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE, 4, &playerId); + PrepareBufferDataTransferLink(B_COMM_CONTROLLER_IS_DONE, 4, &playerId); gBattleBufferA[gActiveBattler][0] = CONTROLLER_TERMINATOR_NOP; } else @@ -444,7 +444,7 @@ static void WallyHandleGetMonData(void) monToCheck >>= 1; } } - BtlController_EmitDataTransfer(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, size, monData); + BtlController_EmitDataTransfer(B_COMM_TO_ENGINE, size, monData); WallyBufferExecCompleted(); } @@ -1241,7 +1241,7 @@ static void WallyHandleChooseMove(void) if (--gBattleStruct->wallyMoveFrames == 0) { PlaySE(SE_SELECT); - BtlController_EmitTwoReturnValues(BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE, 10, 0x100); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, 0x100); WallyBufferExecCompleted(); } break; diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 339d68ff9e..559fa8604b 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -659,11 +659,11 @@ static void PrepareBufferDataTransfer(u8 bufferId, u8 *data, u16 size) { switch (bufferId) { - case BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER: + case B_COMM_TO_CONTROLLER: for (i = 0; i < size; data++, i++) gBattleBufferA[gActiveBattler][i] = *data; break; - case BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE: + case B_COMM_TO_ENGINE: for (i = 0; i < size; data++, i++) gBattleBufferB[gActiveBattler][i] = *data; break; @@ -922,7 +922,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) switch (BYTE_TO_RECEIVE(0)) { - case BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER: + case B_COMM_TO_CONTROLLER: if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId)) return; @@ -937,10 +937,10 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) gEffectBattler = BYTE_TO_RECEIVE(LINK_BUFF_EFFECT_BATTLER); } break; - case BATTLELINKCOMMTYPE_CONTROLLER_TO_ENGINE: + case B_COMM_TO_ENGINE: memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + LINK_BUFF_DATA], blockSize); break; - case BATTLELINKCOMMTYPE_CONTROLLER_BECOMING_IDLE: + case B_COMM_CONTROLLER_IS_DONE: playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId); break; diff --git a/src/battle_main.c b/src/battle_main.c index 890d3fb4bf..226d1a805b 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -3360,7 +3360,7 @@ static void BattleIntroGetMonsData(void) { case 0: gActiveBattler = gBattleCommunication[1]; - BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTIUSE_STATE]++; break; @@ -3382,7 +3382,7 @@ static void BattleIntroPrepareBackgroundSlide(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerAtPosition(0); - BtlController_EmitIntroSlide(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleEnvironment); + BtlController_EmitIntroSlide(B_COMM_TO_CONTROLLER, gBattleEnvironment); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroDrawTrainersOrMonsSprites; gBattleCommunication[MULTIUSE_STATE] = 0; @@ -3427,7 +3427,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_LEFT) { - BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3435,7 +3435,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { if (GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_LEFT) { - BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } if (GetBattlerSide(gActiveBattler) == B_SIDE_OPPONENT @@ -3460,7 +3460,7 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) { HandleSetPokedexFlag(SpeciesToNationalPokedexNum(gBattleMons[gActiveBattler].species), FLAG_SET_SEEN, gBattleMons[gActiveBattler].personality); } - BtlController_EmitLoadMonSprite(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitLoadMonSprite(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattleResults.lastOpponentSpecies = GetMonData(&gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], MON_DATA_SPECIES, NULL); } @@ -3471,14 +3471,14 @@ static void BattleIntroDrawTrainersOrMonsSprites(void) if (GetBattlerPosition(gActiveBattler) == B_POSITION_PLAYER_RIGHT || GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } if (gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS && GetBattlerPosition(gActiveBattler) == B_POSITION_OPPONENT_RIGHT) { - BtlController_EmitDrawTrainerPic(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitDrawTrainerPic(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } @@ -3513,7 +3513,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); - BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(B_COMM_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); for (i = 0; i < PARTY_SIZE; i++) @@ -3531,7 +3531,7 @@ static void BattleIntroDrawPartySummaryScreens(void) } } gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); + BtlController_EmitDrawPartyStatusSummary(B_COMM_TO_CONTROLLER, hpStatus, PARTY_SUMM_SKIP_DRAW_DELAY); MarkBattlerForControllerExec(gActiveBattler); gBattleMainFunc = BattleIntroPrintTrainerWantsToBattle; @@ -3631,7 +3631,7 @@ static void BattleIntroOpponent2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3669,7 +3669,7 @@ static void BattleIntroOpponent1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_TWO_OPPONENTS)) { @@ -3761,7 +3761,7 @@ static void BattleIntroPlayer2SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } } @@ -3800,7 +3800,7 @@ static void BattleIntroPlayer1SendsOutMonAnimation(void) { if (GetBattlerPosition(gActiveBattler) == position) { - BtlController_EmitIntroTrainerBallThrow(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitIntroTrainerBallThrow(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); if (gBattleTypeFlags & (BATTLE_TYPE_MULTI)) { @@ -3825,7 +3825,7 @@ static void UNUSED BattleIntroSwitchInPlayerMons(void) { if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { - BtlController_EmitSwitchInAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], FALSE); + BtlController_EmitSwitchInAnim(B_COMM_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4165,7 +4165,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseAction(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); + BtlController_EmitChooseAction(B_COMM_TO_CONTROLLER, gChosenActionByBattler[0], gBattleBufferB[0][1] | (gBattleBufferB[0][2] << 8)); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; } @@ -4214,7 +4214,7 @@ static void HandleTurnActionSelectionState(void) i); } - BtlController_EmitChooseMove(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); + BtlController_EmitChooseMove(B_COMM_TO_CONTROLLER, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0, FALSE, &moveInfo); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4233,7 +4233,7 @@ static void HandleTurnActionSelectionState(void) } else { - BtlController_EmitChooseItem(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(B_COMM_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -4243,7 +4243,7 @@ static void HandleTurnActionSelectionState(void) || gBattleTypeFlags & BATTLE_TYPE_ARENA || gStatuses3[gActiveBattler] & STATUS3_ROOTED) { - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, PARTY_ACTION_CANT_SWITCH, PARTY_SIZE, 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)) @@ -4252,16 +4252,16 @@ static void HandleTurnActionSelectionState(void) || ((i = AbilityBattleEffects(ABILITYEFFECT_CHECK_FIELD_EXCEPT_BATTLER, gActiveBattler, ABILITY_MAGNET_PULL, 0, 0)) && IS_BATTLER_OF_TYPE(gActiveBattler, TYPE_STEEL))) { - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, ((i - 1) << 4) | PARTY_ACTION_ABILITY_PREVENTS, PARTY_SIZE, gLastUsedAbility, gBattleStruct->battlerPartyOrders[gActiveBattler]); } else { if (gActiveBattler == 2 && gChosenActionByBattler[0] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 0), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else if (gActiveBattler == 3 && gChosenActionByBattler[1] == B_ACTION_SWITCH) - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, *(gBattleStruct->monToSwitchIntoId + 1), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); else - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, PARTY_ACTION_CHOOSE_MON, PARTY_SIZE, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); } MarkBattlerForControllerExec(gActiveBattler); break; @@ -4276,7 +4276,7 @@ static void HandleTurnActionSelectionState(void) } break; case B_ACTION_SAFARI_POKEBLOCK: - BtlController_EmitChooseItem(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChooseItem(B_COMM_TO_CONTROLLER, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); break; case B_ACTION_CANCEL_PARTNER: @@ -4286,7 +4286,7 @@ static void HandleTurnActionSelectionState(void) if (gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_MULTIPLETURNS || gBattleMons[GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler)))].status2 & STATUS2_RECHARGE) { - BtlController_EmitEndBounceEffect(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitEndBounceEffect(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4314,7 +4314,7 @@ static void HandleTurnActionSelectionState(void) { RecordedBattle_ClearBattlerAction(GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gActiveBattler))), 3); } - BtlController_EmitEndBounceEffect(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitEndBounceEffect(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); return; } @@ -4467,11 +4467,11 @@ static void HandleTurnActionSelectionState(void) || (position & BIT_FLANK) != B_FLANK_LEFT || (*(&gBattleStruct->absentBattlerFlags) & gBitTable[GetBattlerAtPosition(BATTLE_PARTNER(position))])) { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_STOP_BOUNCE, i); } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_STOP_BOUNCE_ONLY, i); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_STOP_BOUNCE_ONLY, i); } MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[gActiveBattler]++; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 4639783468..e75b67d2c2 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1239,7 +1239,7 @@ static void Cmd_ppreduce(void) if (MOVE_IS_PERMANENT(gBattlerAttacker, gCurrMovePos)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + gCurrMovePos, 0, sizeof(gBattleMons[gBattlerAttacker].pp[gCurrMovePos]), &gBattleMons[gBattlerAttacker].pp[gCurrMovePos]); MarkBattlerForControllerExec(gBattlerAttacker); @@ -1784,7 +1784,7 @@ static void Cmd_attackanimation(void) multihit = gMultiHitCounter; } - BtlController_EmitMoveAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); + BtlController_EmitMoveAnimation(B_COMM_TO_CONTROLLER, gCurrentMove, gBattleScripting.animTurn, gBattleMovePower, gBattleMoveDamage, gBattleMons[gBattlerAttacker].friendship, &gDisableStructs[gBattlerAttacker], multihit); gBattleScripting.animTurn++; gBattleScripting.animTargetsHit++; MarkBattlerForControllerExec(gBattlerAttacker); @@ -1829,7 +1829,7 @@ static void Cmd_healthbarupdate(void) else healthValue = maxPossibleDmgValue; - BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, healthValue); + BtlController_EmitHealthBarUpdate(B_COMM_TO_CONTROLLER, healthValue); MarkBattlerForControllerExec(gActiveBattler); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleMoveDamage > 0) @@ -1971,7 +1971,7 @@ static void Cmd_datahpupdate(void) gHitMarker &= ~HITMARKER_PASSIVE_DAMAGE; // Send updated HP - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); } } @@ -2009,11 +2009,11 @@ static void Cmd_effectivenesssound(void) switch (gMoveResultFlags & (u8)(~MOVE_RESULT_MISSED)) { case MOVE_RESULT_SUPER_EFFECTIVE: - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_NOT_VERY_EFFECTIVE: - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); break; case MOVE_RESULT_DOESNT_AFFECT_FOE: @@ -2026,17 +2026,17 @@ static void Cmd_effectivenesssound(void) default: if (gMoveResultFlags & MOVE_RESULT_SUPER_EFFECTIVE) { - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_SUPER_EFFECTIVE); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, SE_SUPER_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (gMoveResultFlags & MOVE_RESULT_NOT_VERY_EFFECTIVE) { - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_NOT_EFFECTIVE); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, SE_NOT_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } else if (!(gMoveResultFlags & (MOVE_RESULT_DOESNT_AFFECT_FOE | MOVE_RESULT_FAILED))) { - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, SE_EFFECTIVE); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, SE_EFFECTIVE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -2149,7 +2149,7 @@ static void Cmd_printselectionstring(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPrintSelectionString(B_COMM_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -2199,7 +2199,7 @@ static void Cmd_printselectionstringfromtable(void) ptr += gBattleCommunication[MULTISTRING_CHOOSER]; gActiveBattler = gBattlerAttacker; - BtlController_EmitPrintSelectionString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *ptr); + BtlController_EmitPrintSelectionString(B_COMM_TO_CONTROLLER, *ptr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -2485,7 +2485,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattlescriptCurrInstr = sMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBattler = gEffectBattler; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gEffectBattler].status1), &gBattleMons[gEffectBattler].status1); MarkBattlerForControllerExec(gActiveBattler); if (gHitMarker & HITMARKER_STATUS_ABILITY_EFFECT) @@ -2787,11 +2787,11 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].item = ITEM_NONE; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gLastUsedItem), &gLastUsedItem); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -2829,7 +2829,7 @@ void SetMoveEffect(bool8 primary, u8 certain) gBattleMons[gBattlerTarget].status1 &= ~STATUS1_PARALYSIS; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPush(gBattlescriptCurrInstr + 1); @@ -3036,7 +3036,7 @@ static void Cmd_tryfaintmon(void) BattleScriptPush(gBattlescriptCurrInstr); gBattlescriptCurrInstr = BattleScript_GrudgeTakesPp; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, moveIndex + REQUEST_PPMOVE1_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].pp[moveIndex]), &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleMons[gBattlerAttacker].moves[moveIndex]) @@ -3054,7 +3054,7 @@ static void Cmd_dofaintanimation(void) if (gBattleControllerExecFlags == 0) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitFaintAnimation(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -3069,7 +3069,7 @@ static void Cmd_cleareffectsonfaint(void) if (!(gBattleTypeFlags & BATTLE_TYPE_ARENA) || gBattleMons[gActiveBattler].hp == 0) { gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } @@ -3438,7 +3438,7 @@ static void Cmd_getexp(void) gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_SPDEF); gActiveBattler = gBattleStruct->expGetterBattlerId; - BtlController_EmitExpUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleStruct->expGetterMonId, gBattleMoveDamage); + BtlController_EmitExpUpdate(B_COMM_TO_CONTROLLER, gBattleStruct->expGetterMonId, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); } gBattleScripting.getexpState++; @@ -3937,7 +3937,7 @@ static void Cmd_healthbar_update(void) else gActiveBattler = gBattlerAttacker; - BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMoveDamage); + BtlController_EmitHealthBarUpdate(B_COMM_TO_CONTROLLER, gBattleMoveDamage); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -4012,7 +4012,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SNATCH_MOVE || gBattlescriptCurrInstr[2] == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4026,7 +4026,7 @@ static void Cmd_playanimation(void) || gBattlescriptCurrInstr[2] == B_ANIM_SANDSTORM_CONTINUES || gBattlescriptCurrInstr[2] == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4036,7 +4036,7 @@ static void Cmd_playanimation(void) } else { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, gBattlescriptCurrInstr[2], *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 7; } @@ -4056,7 +4056,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SNATCH_MOVE || *animationIdPtr == B_ANIM_SUBSTITUTE_FADE) { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4069,7 +4069,7 @@ static void Cmd_playanimation_var(void) || *animationIdPtr == B_ANIM_SANDSTORM_CONTINUES || *animationIdPtr == B_ANIM_HAIL_CONTINUES) { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4079,7 +4079,7 @@ static void Cmd_playanimation_var(void) } else { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, *animationIdPtr, *argumentPtr); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, *animationIdPtr, *argumentPtr); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 10; } @@ -4195,7 +4195,7 @@ static void Cmd_playstatchangeanimation(void) } else if (changeableStatsCount != 0 && !gBattleScripting.statAnimPlayed) { - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, B_ANIM_STATS_CHANGE, statAnimId); MarkBattlerForControllerExec(gActiveBattler); if (gBattlescriptCurrInstr[3] & STAT_CHANGE_MULTIPLE_STATS && changeableStatsCount > 1) gBattleScripting.statAnimPlayed = TRUE; @@ -4264,7 +4264,7 @@ static void Cmd_moveend(void) { gBattleMons[gBattlerTarget].status1 &= ~STATUS1_FREEZE; gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].status1), &gBattleMons[gBattlerTarget].status1); MarkBattlerForControllerExec(gActiveBattler); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; @@ -4343,7 +4343,7 @@ static void Cmd_moveend(void) && gHitMarker & HITMARKER_NO_ANIMATIONS) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE); + BtlController_EmitSpriteInvisibility(B_COMM_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattleScripting.moveendState++; return; @@ -4356,7 +4356,7 @@ static void Cmd_moveend(void) || WasUnableToUseMove(gBattlerAttacker)) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerAttacker] &= ~STATUS3_SEMI_INVULNERABLE; gSpecialStatuses[gBattlerAttacker].restoredBattlerSprite = 1; @@ -4370,7 +4370,7 @@ static void Cmd_moveend(void) && !(gStatuses3[gBattlerTarget] & STATUS3_SEMI_INVULNERABLE)) { gActiveBattler = gBattlerTarget; - BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gStatuses3[gBattlerTarget] &= ~STATUS3_SEMI_INVULNERABLE; gBattleScripting.moveendState++; @@ -4597,7 +4597,7 @@ static void Cmd_returnatktoball(void) gActiveBattler = gBattlerAttacker; if (!(gHitMarker & HITMARKER_FAINTED(gActiveBattler))) { - BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr++; @@ -4612,7 +4612,7 @@ static void Cmd_getswitchedmondata(void) gBattlerPartyIndexes[gActiveBattler] = *(gBattleStruct->monToSwitchIntoId + gActiveBattler); - BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); + BtlController_EmitGetMonData(B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, gBitTable[gBattlerPartyIndexes[gActiveBattler]]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -4688,7 +4688,7 @@ static void Cmd_switchinanim(void) gAbsentBattlerFlags &= ~(gBitTable[gActiveBattler]); - BtlController_EmitSwitchInAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); + BtlController_EmitSwitchInAnim(B_COMM_TO_CONTROLLER, gBattlerPartyIndexes[gActiveBattler], gBattlescriptCurrInstr[2]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -4858,7 +4858,7 @@ static void ChooseMonToSendOut(u8 slotId) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, PARTY_ACTION_SEND_OUT, slotId, ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); } @@ -4885,7 +4885,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4896,7 +4896,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4914,7 +4914,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4924,7 +4924,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 1; } @@ -4936,7 +4936,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4946,7 +4946,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 1)) { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -4957,7 +4957,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4967,7 +4967,7 @@ static void Cmd_openpartyscreen(void) } else { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); flags |= 2; } @@ -4979,7 +4979,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -4989,7 +4989,7 @@ static void Cmd_openpartyscreen(void) } else if (!(flags & 2)) { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5005,7 +5005,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 0; - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } @@ -5021,7 +5021,7 @@ static void Cmd_openpartyscreen(void) else gActiveBattler = 1; - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5042,7 +5042,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5058,7 +5058,7 @@ static void Cmd_openpartyscreen(void) { gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); - BtlController_EmitCantSwitch(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitCantSwitch(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); } else if (!gSpecialStatuses[gActiveBattler].faintedHasReplacement) @@ -5117,7 +5117,7 @@ static void Cmd_openpartyscreen(void) *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); - BtlController_EmitChoosePokemon(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); + BtlController_EmitChoosePokemon(B_COMM_TO_CONTROLLER, hitmarkerFaintBits, *(gBattleStruct->monToSwitchIntoId + BATTLE_PARTNER(gActiveBattler)), ABILITY_NONE, gBattleStruct->battlerPartyOrders[gActiveBattler]); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 6; @@ -5131,7 +5131,7 @@ static void Cmd_openpartyscreen(void) { if (gActiveBattler != battlerId) { - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5142,7 +5142,7 @@ static void Cmd_openpartyscreen(void) if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; - BtlController_EmitLinkStandbyMsg(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); + BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -5301,7 +5301,7 @@ static void Cmd_switchineffects(void) static void Cmd_trainerslidein(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlide(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitTrainerSlide(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5310,7 +5310,7 @@ static void Cmd_trainerslidein(void) static void Cmd_playse(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlaySE(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); + BtlController_EmitPlaySE(B_COMM_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1)); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5319,7 +5319,7 @@ static void Cmd_playse(void) static void Cmd_fanfare(void) { gActiveBattler = gBattlerAttacker; - BtlController_EmitPlayFanfareOrBGM(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); + BtlController_EmitPlayFanfareOrBGM(B_COMM_TO_CONTROLLER, T2_READ_16(gBattlescriptCurrInstr + 1), FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 3; @@ -5328,7 +5328,7 @@ static void Cmd_fanfare(void) static void Cmd_playfaintcry(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitFaintingCry(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitFaintingCry(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5337,7 +5337,7 @@ static void Cmd_playfaintcry(void) static void Cmd_endlinkbattle(void) { gActiveBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); - BtlController_EmitEndLinkBattle(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleOutcome); + BtlController_EmitEndLinkBattle(B_COMM_TO_CONTROLLER, gBattleOutcome); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 1; @@ -5346,7 +5346,7 @@ static void Cmd_endlinkbattle(void) static void Cmd_returntoball(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE); + BtlController_EmitReturnMonToBall(B_COMM_TO_CONTROLLER, TRUE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5565,7 +5565,7 @@ static void Cmd_hitanimation(void) } else if (!(gHitMarker & HITMARKER_IGNORE_SUBSTITUTE) || !(gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) || gDisableStructs[gActiveBattler].substituteHP == 0) { - BtlController_EmitHitAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitHitAnimation(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -5652,7 +5652,7 @@ static void Cmd_updatebattlermoves(void) switch (gBattleCommunication[0]) { case 0: - BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[0]++; break; @@ -5725,7 +5725,7 @@ static void Cmd_drawpartystatussummary(void) } } - BtlController_EmitDrawPartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, hpStatuses, 1); + BtlController_EmitDrawPartyStatusSummary(B_COMM_TO_CONTROLLER, hpStatuses, 1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5734,7 +5734,7 @@ static void Cmd_drawpartystatussummary(void) static void Cmd_hidepartystatussummary(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitHidePartyStatusSummary(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitHidePartyStatusSummary(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -5759,7 +5759,7 @@ static void Cmd_statusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE, gBattleMons[gActiveBattler].status1); + BtlController_EmitStatusAnimation(B_COMM_TO_CONTROLLER, FALSE, gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 2; @@ -5778,7 +5778,7 @@ static void Cmd_status2animation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); + BtlController_EmitStatusAnimation(B_COMM_TO_CONTROLLER, TRUE, gBattleMons[gActiveBattler].status2 & wantedToAnimate); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 6; @@ -5797,7 +5797,7 @@ static void Cmd_chosenstatusanimation(void) && gDisableStructs[gActiveBattler].substituteHP == 0 && !(gHitMarker & HITMARKER_NO_ANIMATIONS)) { - BtlController_EmitStatusAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattlescriptCurrInstr[2], wantedStatus); + BtlController_EmitStatusAnimation(B_COMM_TO_CONTROLLER, gBattlescriptCurrInstr[2], wantedStatus); MarkBattlerForControllerExec(gActiveBattler); } gBattlescriptCurrInstr += 7; @@ -5908,7 +5908,7 @@ static void Cmd_removeitem(void) *usedHeldItem = gBattleMons[gActiveBattler].item; gBattleMons[gActiveBattler].item = ITEM_NONE; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6217,7 +6217,7 @@ static void Cmd_setatktoplayer0(void) static void Cmd_makevisible(void) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitSpriteInvisibility(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitSpriteInvisibility(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; @@ -6431,7 +6431,7 @@ static void Cmd_various(void) gDisableStructs[1].truantSwitchInHack = 1; break; case VARIOUS_EMIT_YESNOBOX: - BtlController_EmitYesNoBox(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitYesNoBox(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); break; case VARIOUS_DRAW_ARENA_REF_TEXT_BOX: @@ -6456,7 +6456,7 @@ static void Cmd_various(void) gActiveBattler = 1; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } break; @@ -6466,7 +6466,7 @@ static void Cmd_various(void) gActiveBattler = 3; if (gBattleMons[gActiveBattler].hp != 0) { - BtlController_EmitReturnMonToBall(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, FALSE); + BtlController_EmitReturnMonToBall(B_COMM_TO_CONTROLLER, FALSE); MarkBattlerForControllerExec(gActiveBattler); } } @@ -6491,7 +6491,7 @@ static void Cmd_various(void) gBattleOutcome = B_OUTCOME_MON_TELEPORTED; break; case VARIOUS_PLAY_TRAINER_DEFEATED_MUSIC: - BtlController_EmitPlayFanfareOrBGM(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); + BtlController_EmitPlayFanfareOrBGM(B_COMM_TO_CONTROLLER, MUS_VICTORY_TRAINER, TRUE); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -6552,7 +6552,7 @@ static void Cmd_tryexplosion(void) // Success, no battlers with Damp. Drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6581,7 +6581,7 @@ static void Cmd_setatkhptozero(void) gActiveBattler = gBattlerAttacker; gBattleMons[gActiveBattler].hp = 0; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HP_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].hp), &gBattleMons[gActiveBattler].hp); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -6777,7 +6777,7 @@ static void Cmd_trysetrest(void) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_REST; gBattleMons[gBattlerTarget].status1 = STATUS1_SLEEP_TURN(3); - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -7727,7 +7727,7 @@ static void Cmd_updatestatusicon(void) if (gBattlescriptCurrInstr[1] != BS_ATTACKER_WITH_PARTNER) { gActiveBattler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(B_COMM_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; } @@ -7736,7 +7736,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = gBattlerAttacker; if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(B_COMM_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } if ((gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) @@ -7744,7 +7744,7 @@ static void Cmd_updatestatusicon(void) gActiveBattler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerAttacker))); if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler])) { - BtlController_EmitStatusIconUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); + BtlController_EmitStatusIconUpdate(B_COMM_TO_CONTROLLER, gBattleMons[gActiveBattler].status1, gBattleMons[gActiveBattler].status2); MarkBattlerForControllerExec(gActiveBattler); } } @@ -7822,7 +7822,7 @@ static void Cmd_transformdataexecution(void) } gActiveBattler = gBattlerAttacker; - BtlController_EmitResetActionMoveSelection(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, RESET_MOVE_SELECTION); + BtlController_EmitResetActionMoveSelection(B_COMM_TO_CONTROLLER, RESET_MOVE_SELECTION); MarkBattlerForControllerExec(gActiveBattler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_TRANSFORMED; } @@ -8202,7 +8202,7 @@ static void Cmd_copymovepermanently(void) } movePpData.ppBonuses = gBattleMons[gBattlerAttacker].ppBonuses; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_MOVES_PP_BATTLE, 0, sizeof(movePpData), &movePpData); MarkBattlerForControllerExec(gActiveBattler); PREPARE_MOVE_BUFFER(gBattleTextBuff1, gLastPrintedMoves[gBattlerTarget]) @@ -8370,7 +8370,7 @@ static void Cmd_tryspiteppreduce(void) if (!(gDisableStructs[gActiveBattler].mimickedMoves & gBitTable[i]) && !(gBattleMons[gActiveBattler].status2 & STATUS2_TRANSFORMED)) { - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + i, 0, sizeof(gBattleMons[gActiveBattler].pp[i]), &gBattleMons[gActiveBattler].pp[i]); MarkBattlerForControllerExec(gActiveBattler); } @@ -8481,7 +8481,7 @@ static void Cmd_healpartystatus(void) if (toHeal) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, toHeal, sizeof(zero), &zero); MarkBattlerForControllerExec(gActiveBattler); } @@ -9106,7 +9106,7 @@ static void Cmd_trymemento(void) // Success, drop user's HP bar to 0 gActiveBattler = gBattlerAttacker; gBattleMoveDamage = gBattleMons[gActiveBattler].hp; - BtlController_EmitHealthBarUpdate(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, INSTANT_HP_BAR_DROP); + BtlController_EmitHealthBarUpdate(B_COMM_TO_CONTROLLER, INSTANT_HP_BAR_DROP); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; } @@ -9146,7 +9146,7 @@ static void Cmd_cureifburnedparalysedorpoisoned(void) gBattleMons[gBattlerAttacker].status1 = 0; gBattlescriptCurrInstr += 5; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } else @@ -9268,11 +9268,11 @@ static void Cmd_tryswapitems(void) gBattleMons[gBattlerTarget].item = oldItemAtk; gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(*newItemAtk), newItemAtk); MarkBattlerForControllerExec(gBattlerAttacker); gActiveBattler = gBattlerTarget; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gBattlerTarget].item), &gBattleMons[gBattlerTarget].item); MarkBattlerForControllerExec(gBattlerTarget); *(u8 *)((u8 *)(&gBattleStruct->choicedMove[gBattlerTarget]) + 0) = 0; @@ -9618,7 +9618,7 @@ static void Cmd_switchoutabilities(void) { case ABILITY_NATURAL_CURE: gBattleMons[gActiveBattler].status1 = 0; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, gBitTable[*(gBattleStruct->battlerPartyIndexes + gActiveBattler)], sizeof(gBattleMons[gActiveBattler].status1), &gBattleMons[gActiveBattler].status1); @@ -9758,7 +9758,7 @@ static void Cmd_docastformchangeanimation(void) if (gBattleMons[gActiveBattler].status2 & STATUS2_SUBSTITUTE) *(&gBattleStruct->formToChangeInto) |= CASTFORM_SUBSTITUTE; - BtlController_EmitBattleAnimation(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); + BtlController_EmitBattleAnimation(B_COMM_TO_CONTROLLER, B_ANIM_CASTFORM_CHANGE, gBattleStruct->formToChangeInto); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr++; @@ -9840,7 +9840,7 @@ static void Cmd_tryrecycleitem(void) *usedHeldItem = ITEM_NONE; gBattleMons[gActiveBattler].item = gLastUsedItem; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_HELDITEM_BATTLE, 0, sizeof(gBattleMons[gActiveBattler].item), &gBattleMons[gActiveBattler].item); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 5; @@ -9937,13 +9937,13 @@ static void Cmd_handleballthrow(void) if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) { - BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_TRAINER_BLOCK); + BtlController_EmitBallThrowAnim(B_COMM_TO_CONTROLLER, BALL_TRAINER_BLOCK); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_TrainerBallBlock; } else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) { - BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_WallyBallThrow; } @@ -10031,7 +10031,7 @@ static void Cmd_handleballthrow(void) if (odds > 254) // mon caught { - BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); + BtlController_EmitBallThrowAnim(B_COMM_TO_CONTROLLER, BALL_3_SHAKES_SUCCESS); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr = BattleScript_SuccessBallThrow; SetMonData(&gEnemyParty[gBattlerPartyIndexes[gBattlerTarget]], MON_DATA_POKEBALL, &gLastUsedItem); @@ -10053,7 +10053,7 @@ static void Cmd_handleballthrow(void) if (gLastUsedItem == ITEM_MASTER_BALL) shakes = BALL_3_SHAKES_SUCCESS; // why calculate the shakes before that check? - BtlController_EmitBallThrowAnim(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, shakes); + BtlController_EmitBallThrowAnim(B_COMM_TO_CONTROLLER, shakes); MarkBattlerForControllerExec(gActiveBattler); if (shakes == BALL_3_SHAKES_SUCCESS) // mon caught, copy of the code above @@ -10342,7 +10342,7 @@ static void Cmd_finishturn(void) static void Cmd_trainerslideout(void) { gActiveBattler = GetBattlerAtPosition(gBattlescriptCurrInstr[1]); - BtlController_EmitTrainerSlideBack(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER); + BtlController_EmitTrainerSlideBack(B_COMM_TO_CONTROLLER); MarkBattlerForControllerExec(gActiveBattler); gBattlescriptCurrInstr += 2; diff --git a/src/battle_util.c b/src/battle_util.c index f2e55cea27..bbc9e1a819 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -759,7 +759,7 @@ void PressurePPLose(u8 target, u8 attacker, u16 move) if (MOVE_IS_PERMANENT(attacker, moveIndex)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + moveIndex, 0, 1, &gBattleMons[gActiveBattler].pp[moveIndex]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -791,7 +791,7 @@ void PressurePPLoseOnUsingImprison(u8 attacker) if (imprisonPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, imprisonPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + imprisonPos, 0, 1, &gBattleMons[gActiveBattler].pp[imprisonPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -822,7 +822,7 @@ void PressurePPLoseOnUsingPerishSong(u8 attacker) if (perishSongPos != MAX_MON_MOVES && MOVE_IS_PERMANENT(attacker, perishSongPos)) { gActiveBattler = attacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_PPMOVE1_BATTLE + perishSongPos, 0, 1, &gBattleMons[gActiveBattler].pp[perishSongPos]); MarkBattlerForControllerExec(gActiveBattler); } } @@ -906,7 +906,7 @@ bool8 WasUnableToUseMove(u8 battler) void PrepareStringBattle(u16 stringId, u8 battler) { gActiveBattler = battler; - BtlController_EmitPrintString(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, stringId); + BtlController_EmitPrintString(B_COMM_TO_CONTROLLER, stringId); MarkBattlerForControllerExec(gActiveBattler); } @@ -1635,7 +1635,7 @@ u8 DoBattlerEndTurnEffects(void) gBattleCommunication[MULTISTRING_CHOOSER] = 1; BattleScriptExecute(BattleScript_MonWokeUpInUproar); gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } @@ -1760,7 +1760,7 @@ u8 DoBattlerEndTurnEffects(void) { CancelMultiTurnMoves(gActiveBattler); gBattleMons[gActiveBattler].status1 |= STATUS1_SLEEP_TURN((Random() & 3) + 2); // 2-5 turns of sleep - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); gEffectBattler = gActiveBattler; BattleScriptExecute(BattleScript_YawnMakesAsleep); @@ -2270,7 +2270,7 @@ u8 AtkCanceller_UnableToUseMove(void) if (effect == 2) { gActiveBattler = gBattlerAttacker; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } return effect; @@ -2634,7 +2634,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; // fix nightmare glitch gBattleScripting.battler = gActiveBattler = battler; BattleScriptPushCursorAndCallback(BattleScript_ShedSkinActivates); - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); effect++; } @@ -2946,7 +2946,7 @@ u8 AbilityBattleEffects(u8 caseID, u8 battler, u8 ability, u8 special, u16 moveA gBattlescriptCurrInstr = BattleScript_AbilityCuredStatus; gBattleScripting.battler = battler; gActiveBattler = battler; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); return effect; } @@ -3374,7 +3374,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) PREPARE_MOVE_BUFFER(gBattleTextBuff1, move); BattleScriptExecute(BattleScript_BerryPPHealEnd2); - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, i + REQUEST_PPMOVE1_BATTLE, 0, 1, &changedPP); MarkBattlerForControllerExec(gActiveBattler); effect = ITEM_PP_CHANGE; } @@ -3609,7 +3609,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (effect) { case ITEM_STATUS_CHANGE: - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: @@ -3760,7 +3760,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleScripting.battler = battlerId; gPotentialItemEffectBattler = battlerId; gActiveBattler = battlerId; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; } diff --git a/src/battle_util2.c b/src/battle_util2.c index 977835d1db..349853b578 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -204,7 +204,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) if (effect == 2) { gActiveBattler = battlerId; - BtlController_EmitSetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } diff --git a/src/pokemon.c b/src/pokemon.c index 018b189f1a..8943a232d5 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5074,7 +5074,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov temp2 = gActiveBattler; gActiveBattler = battlerId; - BtlController_EmitGetMonData(BATTLELINKCOMMTYPE_ENGINE_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); + BtlController_EmitGetMonData(B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = temp2; } From 15e39339b9b3bb3ff89bec3d3536f523a70e39d0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 6 May 2025 15:11:38 -0400 Subject: [PATCH 031/187] InitSpritePosToAnimAttacker documentation --- src/battle_anim_mons.c | 22 +++++++++++----------- src/battle_anim_water.c | 8 ++++---- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index d28ec804fe..8a89cfc92f 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -1514,18 +1514,18 @@ static u8 UNUSED GetSpritePalIdxByPosition(u8 position) void AnimSpriteOnMonPos(struct Sprite *sprite) { - bool8 var; + bool8 respectMonPicOffsets; if (!sprite->data[0]) { if (!gBattleAnimArgs[3]) - var = TRUE; + respectMonPicOffsets = TRUE; else - var = FALSE; + respectMonPicOffsets = FALSE; if (!gBattleAnimArgs[2]) - InitSpritePosToAnimAttacker(sprite, var); + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); else - InitSpritePosToAnimTarget(sprite, var); + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); sprite->data[0]++; } @@ -1590,32 +1590,32 @@ static void AnimThrowProjectile_Step(struct Sprite *sprite) void AnimTravelDiagonally(struct Sprite *sprite) { - bool8 r4; + bool8 respectMonPicOffsets; u8 battlerId, coordType; if (!gBattleAnimArgs[6]) { - r4 = TRUE; + respectMonPicOffsets = TRUE; coordType = BATTLER_COORD_Y_PIC_OFFSET; } else { - r4 = FALSE; + respectMonPicOffsets = FALSE; coordType = BATTLER_COORD_Y; } if (gBattleAnimArgs[5] == ANIM_ATTACKER) { - InitSpritePosToAnimAttacker(sprite, r4); + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); battlerId = gBattleAnimAttacker; } else { - InitSpritePosToAnimTarget(sprite, r4); + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); battlerId = gBattleAnimTarget; } if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; - InitSpritePosToAnimTarget(sprite, r4); + InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); sprite->data[0] = gBattleAnimArgs[4]; sprite->data[2] = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; sprite->data[4] = GetBattlerSpriteCoord(battlerId, coordType) + gBattleAnimArgs[3]; diff --git a/src/battle_anim_water.c b/src/battle_anim_water.c index fda3558e4d..883cf5825e 100644 --- a/src/battle_anim_water.c +++ b/src/battle_anim_water.c @@ -753,7 +753,7 @@ static void AnimHydroCannonCharge_Step(struct Sprite *sprite) // Flashing blue orbs move from the attacker to the target. Second stage of Hydro Cannon static void AnimHydroCannonBeam(struct Sprite *sprite) { - bool8 animType; + bool8 respectMonPicOffsets; u8 coordType; if (GetBattlerSide(gBattleAnimAttacker) == GetBattlerSide(gBattleAnimTarget)) { @@ -762,14 +762,14 @@ static void AnimHydroCannonBeam(struct Sprite *sprite) gBattleAnimArgs[0] *= -1; } if ((gBattleAnimArgs[5] & 0xFF00) == 0) - animType = TRUE; + respectMonPicOffsets = TRUE; else - animType = FALSE; + respectMonPicOffsets = FALSE; if ((u8)gBattleAnimArgs[5] == 0) coordType = BATTLER_COORD_Y_PIC_OFFSET; else coordType = BATTLER_COORD_Y; - InitSpritePosToAnimAttacker(sprite, animType); + InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); if (GetBattlerSide(gBattleAnimAttacker) != B_SIDE_PLAYER) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; sprite->data[0] = gBattleAnimArgs[4]; From 2044bea883d08ec9266d21ac0cd6a56c3e0d5962 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 9 May 2025 13:43:23 +0200 Subject: [PATCH 032/187] Rename battlerId to battler for consistency (#2126) --- include/battle.h | 8 +- include/battle_ai_script_commands.h | 10 +- include/battle_anim.h | 32 +- include/battle_controllers.h | 66 ++-- include/battle_gfx_sfx_util.h | 30 +- include/battle_main.h | 4 +- include/battle_records.h | 2 +- include/battle_script_commands.h | 4 +- include/battle_tv.h | 2 +- include/battle_util.h | 30 +- include/party_menu.h | 4 +- include/pokemon.h | 8 +- include/recorded_battle.h | 6 +- src/battle_ai_script_commands.c | 326 +++++++++--------- src/battle_anim.c | 134 +++---- src/battle_anim_mon_movement.c | 24 +- src/battle_anim_mons.c | 238 ++++++------- src/battle_anim_sound_tasks.c | 36 +- src/battle_anim_status_effects.c | 14 +- src/battle_controller_link_opponent.c | 50 +-- src/battle_controller_link_partner.c | 46 +-- src/battle_controller_opponent.c | 48 +-- src/battle_controller_player.c | 98 +++--- src/battle_controller_player_partner.c | 94 ++--- src/battle_controller_recorded_opponent.c | 48 +-- src/battle_controller_recorded_player.c | 46 +-- src/battle_controller_wally.c | 44 +-- src/battle_controllers.c | 26 +- src/battle_gfx_sfx_util.c | 216 ++++++------ src/battle_interface.c | 206 +++++------ src/battle_main.c | 18 +- src/battle_message.c | 14 +- src/battle_records.c | 32 +- src/battle_script_commands.c | 104 +++--- src/battle_tv.c | 6 +- src/battle_util.c | 292 ++++++++-------- src/battle_util2.c | 46 +-- src/data/map_group_count.h | 1 + src/party_menu.c | 14 +- src/pokeball.c | 86 ++--- src/pokemon.c | 172 ++++----- src/pokemon_animation.c | 6 +- src/recorded_battle.c | 94 ++--- src/reshow_battle_screen.c | 6 +- tools/mgba-rom-test-hydra/mgba-rom-test-hydra | Bin 0 -> 30888 bytes tools/patchelf/patchelf | Bin 0 -> 16272 bytes tools/trainerproc/trainerproc | Bin 0 -> 55696 bytes 47 files changed, 1396 insertions(+), 1395 deletions(-) create mode 100644 src/data/map_group_count.h create mode 100755 tools/mgba-rom-test-hydra/mgba-rom-test-hydra create mode 100755 tools/patchelf/patchelf create mode 100755 tools/trainerproc/trainerproc diff --git a/include/battle.h b/include/battle.h index 7979101ecb..061768b489 100644 --- a/include/battle.h +++ b/include/battle.h @@ -465,11 +465,11 @@ STATIC_ASSERT(sizeof(((struct BattleStruct *)0)->palaceFlags) * 8 >= MAX_BATTLER #define TARGET_TURN_DAMAGED ((gSpecialStatuses[gBattlerTarget].physicalDmg != 0 || gSpecialStatuses[gBattlerTarget].specialDmg != 0)) -#define IS_BATTLER_OF_TYPE(battlerId, type) ((gBattleMons[battlerId].types[0] == type || gBattleMons[battlerId].types[1] == type)) -#define SET_BATTLER_TYPE(battlerId, type) \ +#define IS_BATTLER_OF_TYPE(battler, type) ((gBattleMons[battler].types[0] == type || gBattleMons[battler].types[1] == type)) +#define SET_BATTLER_TYPE(battler, type) \ { \ - gBattleMons[battlerId].types[0] = type; \ - gBattleMons[battlerId].types[1] = type; \ + gBattleMons[battler].types[0] = type; \ + gBattleMons[battler].types[1] = type; \ } #define GET_STAT_BUFF_ID(n) ((n & 0xF)) // first four bits 0x1, 0x2, 0x4, 0x8 diff --git a/include/battle_ai_script_commands.h b/include/battle_ai_script_commands.h index d23ad048a5..6415b34995 100644 --- a/include/battle_ai_script_commands.h +++ b/include/battle_ai_script_commands.h @@ -9,10 +9,10 @@ void BattleAI_HandleItemUseBeforeAISetup(u8 defaultScoreMoves); void BattleAI_SetupAIData(u8 defaultScoreMoves); u8 BattleAI_ChooseMoveOrAction(void); -void ClearBattlerMoveHistory(u8 battlerId); -void RecordAbilityBattle(u8 battlerId, u8 abilityId); -void ClearBattlerAbilityHistory(u8 battlerId); -void RecordItemEffectBattle(u8 battlerId, u8 itemEffect); -void ClearBattlerItemEffectHistory(u8 battlerId); +void ClearBattlerMoveHistory(u8 battler); +void RecordAbilityBattle(u8 battler, u8 abilityId); +void ClearBattlerAbilityHistory(u8 battler); +void RecordItemEffectBattle(u8 battler, u8 itemEffect); +void ClearBattlerItemEffectHistory(u8 battler); #endif // GUARD_BATTLE_AI_SCRIPT_COMMANDS_H diff --git a/include/battle_anim.h b/include/battle_anim.h index ffb63bde61..1c9851e4e4 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -57,8 +57,8 @@ void LaunchBattleAnimation(const u8 *const animsTable[], u16 tableId, bool8 isMo void DestroyAnimSprite(struct Sprite *sprite); void DestroyAnimVisualTask(u8 taskId); void DestroyAnimSoundTask(u8 taskId); -bool8 IsBattlerSpriteVisible(u8 battlerId); -void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible); +bool8 IsBattlerSpriteVisible(u8 battler); +void MoveBattlerSpriteToBG(u8 battler, bool8 toBG_2, bool8 setSpriteInvisible); bool8 IsContest(void); s8 BattleAnimAdjustPanning(s8 pan); s8 BattleAnimAdjustPanning2(s8 pan); @@ -80,7 +80,7 @@ void AnimTranslateLinearAndFlicker_Flipped(struct Sprite *sprite); void AnimWeatherBallUp(struct Sprite *sprite); void AnimWeatherBallDown(struct Sprite *sprite); void AnimSpinningSparkle(struct Sprite *sprite); -void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y); +void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y); void DestroySpriteAndMatrix(struct Sprite *sprite); void TranslateSpriteLinearFixedPoint(struct Sprite *sprite); void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffsets); @@ -89,7 +89,7 @@ void StartAnimLinearTranslation(struct Sprite *sprite); void InitAnimArcTranslation(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite); void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite); -u8 GetBattlerSpriteCoord2(u8 battlerId, u8 attributeId); +u8 GetBattlerSpriteCoord2(u8 battler, u8 attributeId); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite); u16 ArcTan2Neg(s16 x, s16 y); void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation); @@ -98,19 +98,19 @@ void TranslateSpriteLinearAndFlicker(struct Sprite *sprite); void SetSpriteCoordsToAnimAttackerCoords(struct Sprite *sprite); void RunStoredCallbackWhenAnimEnds(struct Sprite *sprite); void SetAnimSpriteInitialXOffset(struct Sprite *sprite, s16 xOffset); -s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr); -u8 GetBattlerYCoordWithElevation(u8 battlerId); +s16 GetBattlerSpriteCoordAttr(u8 battler, u8 attr); +u8 GetBattlerYCoordWithElevation(u8 battler); void WaitAnimForDuration(struct Sprite *sprite); void AnimTravelDiagonally(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite); -u8 GetBattlerSpriteBGPriority(u8 battlerId); +u8 GetBattlerSpriteBGPriority(u8 battler); void *LoadPointerFromVars(s16 bottom, s16 top); void StorePointerInVars(s16 *bottom, s16 *top, const void *ptr); void InitPrioritiesForVisibleBattlers(void); void GetBattleAnimBg1Data(struct BattleAnimBgData *); void GetBattleAnimBgData(struct BattleAnimBgData *, u32 bgId); -u8 GetBattlerSpriteSubpriority(u8 battlerId); +u8 GetBattlerSpriteSubpriority(u8 battler); bool8 TranslateAnimHorizontalArc(struct Sprite *sprite); void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite); void ResetSpriteRotScale(u8 spriteId); @@ -145,8 +145,8 @@ void SetGrayscaleOrOriginalPalette(u16 palNum, bool8 restoreOriginal); void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds); bool8 RunAffineAnimFromTaskData(struct Task *task); void AnimThrowProjectile(struct Sprite *sprite); -void GetBgDataForTransform(struct BattleAnimBgData *dest, u8 battlerId); -u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxysForm); +void GetBgDataForTransform(struct BattleAnimBgData *dest, u8 battler); +u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battler, bool32 ignoreDeoxysForm); void ResetSpriteRotScale_PreserveAffine(struct Sprite *sprite); void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); void DestroyAnimVisualTaskAndDisableBlend(u8 taskId); @@ -178,18 +178,18 @@ enum BATTLER_COORD_ATTR_RAW_BOTTOM, }; -u8 GetBattlerSpriteCoord(u8 battlerId, u8 attributeId); +u8 GetBattlerSpriteCoord(u8 battler, u8 attributeId); -bool8 IsBattlerSpritePresent(u8 battlerId); +bool8 IsBattlerSpritePresent(u8 battler); void ClearBattleAnimBg(u32 bgId); u8 GetAnimBattlerSpriteId(u8 wantedBattler); bool8 IsDoubleBattle(void); u8 GetBattleBgPaletteNum(void); -u8 GetBattlerSpriteBGPriorityRank(u8 battlerId); +u8 GetBattlerSpriteBGPriorityRank(u8 battler); void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*spriteCallback)(struct Sprite *)); void SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite); -u8 GetBattlerSpriteDefault_Y(u8 battlerId); -u8 GetSubstituteSpriteDefault_Y(u8 battlerId); +u8 GetBattlerSpriteDefault_Y(u8 battler); +u8 GetSubstituteSpriteDefault_Y(u8 battler); // battle_anim_status_effects.c #define STAT_ANIM_PLUS1 14 @@ -212,7 +212,7 @@ enum { STAT_ANIM_PAL_MULTIPLE = 0xFF }; -void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId); +void LaunchStatusAnimation(u8 battler, u8 statusAnimId); // battle_anim_ground.c void AnimTask_HorizontalShake(u8 taskId); diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 2fe19b4907..20f3e698cf 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -66,46 +66,46 @@ enum { // Accessors for gBattleControllerExecFlags. // -// These are provided for documentation purposes, to make the battle -// controller internals and the link communication internals more -// legible. Several of these have functions that you should call -// (e.g. MarkBattlerForControllerExec) instead of using these macros +// These are provided for documentation purposes, to make the battle +// controller internals and the link communication internals more +// legible. Several of these have functions that you should call +// (e.g. MarkBattlerForControllerExec) instead of using these macros // directly. -#define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ - gBattleControllerExecFlags |= gBitTable[battlerId] +#define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \ + gBattleControllerExecFlags |= gBitTable[battler] -#define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battlerId) \ - gBattleControllerExecFlags &= ~gBitTable(battlerId) +#define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battler) \ + gBattleControllerExecFlags &= ~gBitTable(battler) -#define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId) \ - (gBattleControllerExecFlags & gBitTable[battlerId]) +#define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \ + (gBattleControllerExecFlags & gBitTable[battler]) -#define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battlerId) \ - gBattleControllerExecFlags |= gBitTable[battlerId] << (32 - MAX_BATTLERS_COUNT) +#define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battler) \ + gBattleControllerExecFlags |= gBitTable[battler] << (32 - MAX_BATTLERS_COUNT) -#define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId) \ - gBattleControllerExecFlags &= ~((1 << 28) << (battlerId)) +#define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battler) \ + gBattleControllerExecFlags &= ~((1 << 28) << (battler)) -#define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ - gBattleControllerExecFlags |= gBitTable[battlerId] << ((playerId) << 2) +#define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ + gBattleControllerExecFlags |= gBitTable[battler] << ((playerId) << 2) -#define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId) \ - gBattleControllerExecFlags &= ~(gBitTable[battlerId] << ((playerId) * 4)) +#define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId) \ + gBattleControllerExecFlags &= ~(gBitTable[battler] << ((playerId) * 4)) -#define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, playerId) \ - (gBattleControllerExecFlags & (gBitTable[battlerId] << ((playerId) * 4))) +#define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ + (gBattleControllerExecFlags & (gBitTable[battler] << ((playerId) * 4))) -// This actually checks if a specific controller is active on any player or if -// *any* controller is pending sync over link communications, but the macro name +// This actually checks if a specific controller is active on any player or if +// *any* controller is pending sync over link communications, but the macro name // can only be so specific before it just gets ridiculous. -#define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battlerId) \ +#define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battler) \ (gBattleControllerExecFlags & ( \ - (gBitTable[battlerId]) \ + (gBitTable[battler]) \ | (0xF << 28) \ - | (gBitTable[battlerId] << 4) \ - | (gBitTable[battlerId] << 8) \ - | (gBitTable[battlerId] << 12) \ + | (gBitTable[battler] << 4) \ + | (gBitTable[battler] << 8) \ + | (gBitTable[battler] << 12) \ )) // Special arguments for Battle Controller functions. @@ -113,14 +113,14 @@ enum { enum { // For commands sent from the core battle engine to a controller. B_COMM_TO_CONTROLLER, // gBattleBufferA - + // For replies sent from a controller to the core battle engine. B_COMM_TO_ENGINE, // gBattleBufferB - - // During local play, a controller must directly mark itself as - // inactive when it's done processing, whether or not it sends - // a reply. During multiplayer, it must NOT directly mark itself - // as inactive, but instead send one of these, with the player's + + // During local play, a controller must directly mark itself as + // inactive when it's done processing, whether or not it sends + // a reply. During multiplayer, it must NOT directly mark itself + // as inactive, but instead send one of these, with the player's // multiplayer ID as data. B_COMM_CONTROLLER_IS_DONE }; diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index 2a848e3d93..f9ce1bb2ca 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -10,36 +10,36 @@ void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status); bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument); void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, 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); +bool8 IsBattleSEPlaying(u8 battler); +void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battler); +void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battler); void BattleGfxSfxDummy2(u16 species); -void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId); -void DecompressTrainerBackPic(u16 backPicId, u8 battlerId); +void DecompressTrainerFrontPic(u16 frontPicId, u8 battler); +void DecompressTrainerBackPic(u16 backPicId, u8 battler); void BattleGfxSfxDummy3(u8 gender); void FreeTrainerFrontPicPalette(u16 frontPicId); bool8 BattleLoadAllHealthBoxesGfx(u8 state); void LoadBattleBarGfx(u8 unused); -bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId); +bool8 BattleInitAllSprites(u8 *state1, u8 *battler); void ClearSpritesHealthboxAnimData(void); void CopyAllBattleSpritesInvisibilities(void); -void CopyBattleSpriteInvisibility(u8 battlerId); +void CopyBattleSpriteInvisibility(u8 battler); void HandleSpeciesGfxDataChange(u8 attacker, u8 target, bool8 notTransform); -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 BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite); +void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId); +void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move); +void ClearBehindSubstituteBit(u8 battler); +void HandleLowHpMusicChange(struct Pokemon *mon, u8 battler); void BattleStopLowHpSound(void); u8 GetMonHPBarLevel(struct Pokemon *mon); 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 SetBattlerShadowSpriteCallback(u8 battler, u16 species); +void HideBattlerShadowSprite(u8 battler); void FillAroundBattleWindows(void); -void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute); +void ClearTemporarySpeciesSpriteData(u8 battler, bool8 dontClearSubstitute); void AllocateMonSpritesGfx(void); void FreeMonSpritesGfx(void); bool32 ShouldPlayNormalMonCry(struct Pokemon *mon); diff --git a/include/battle_main.h b/include/battle_main.h index ae970286ca..082611e705 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -69,12 +69,12 @@ void SwitchInClearSetData(void); void FaintClearSetData(void); void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); -void SwitchPartyOrder(u8 battlerId); +void SwitchPartyOrder(u8 battler); void SwapTurnOrder(u8 id1, u8 id2); u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); -bool8 TryRunFromBattle(u8 battlerId); +bool8 TryRunFromBattle(u8 battler); void SpecialStatusesClear(void); extern struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE]; diff --git a/include/battle_records.h b/include/battle_records.h index 88ff6adc96..fe71570389 100644 --- a/include/battle_records.h +++ b/include/battle_records.h @@ -4,7 +4,7 @@ extern u8 gRecordsWindowId; void ClearPlayerLinkBattleRecords(void); -void UpdatePlayerLinkBattleRecords(s32 battlerId); +void UpdatePlayerLinkBattleRecords(s32 battler); void ShowLinkBattleRecords(void); void RemoveRecordsWindow(void); void ShowTrainerHillRecords(void); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 5cb18ab460..4fed623b00 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -13,13 +13,13 @@ void AI_CalcDmg(u8 battlerIdAtk, u8 battlerIdDef); u8 TypeCalc(u16 move, u8 battlerIdAtk, u8 battlerIdDef); u8 AI_TypeCalc(u16 move, u16 targetSpecies, u8 targetAbility); -u8 GetBattlerTurnOrderNum(u8 battlerId); +u8 GetBattlerTurnOrderNum(u8 battler); void SetMoveEffect(bool8 primary, u8 certain); void BattleDestroyYesNoCursorAt(u8 cursorPosition); void BattleCreateYesNoCursorAt(u8 cursorPosition); void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); -bool8 UproarWakeUpCheck(u8 battlerId); +bool8 UproarWakeUpCheck(u8 battler); extern void (* const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; diff --git a/include/battle_tv.h b/include/battle_tv.h index 72466d73b8..b2a89451a1 100644 --- a/include/battle_tv.h +++ b/include/battle_tv.h @@ -6,6 +6,6 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc void BattleTv_SetDataBasedOnAnimation(u8 animationId); void TryPutLinkBattleTvShowOnAir(void); void BattleTv_ClearExplosionFaintCause(void); -u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId); +u8 GetBattlerMoveSlotId(u8 battler, u16 moveId); #endif // GUARD_BATTLE_TV_H diff --git a/include/battle_util.h b/include/battle_util.h index 870990e9f5..7d26e12cb2 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -33,7 +33,7 @@ #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_OPPOSING_FIELD(battler, abilityId) (AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, battler, 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)) @@ -64,34 +64,34 @@ u8 GetBattlerForBattleScript(u8 caseId); void PressurePPLose(u8 target, u8 attacker, u16 move); void PressurePPLoseOnUsingPerishSong(u8 attacker); void PressurePPLoseOnUsingImprison(u8 attacker); -void MarkBattlerForControllerExec(u8 battlerId); -void MarkBattlerReceivedLinkData(u8 battlerId); -void CancelMultiTurnMoves(u8 battlerId); -bool8 WasUnableToUseMove(u8 battlerId); -void PrepareStringBattle(u16 stringId, u8 battlerId); +void MarkBattlerForControllerExec(u8 battler); +void MarkBattlerReceivedLinkData(u8 battler); +void CancelMultiTurnMoves(u8 battler); +bool8 WasUnableToUseMove(u8 battler); +void PrepareStringBattle(u16 stringId, u8 battler); void ResetSentPokesToOpponentValue(void); -void OpponentSwitchInResetSentPokesToOpponentValue(u8 battlerId); -void UpdateSentPokesToOpponentValue(u8 battlerId); +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); +u8 CheckMoveLimitations(u8 battler, u8 unusableMoves, u8 check); bool8 AreAllMovesUnusable(void); -u8 GetImprisonedMovesCount(u8 battlerId, u16 move); +u8 GetImprisonedMovesCount(u8 battler, u16 move); u8 DoFieldEndTurnEffects(void); u8 DoBattlerEndTurnEffects(void); bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageStatuses(void); u8 AtkCanceller_UnableToUseMove(void); -bool8 HasNoMonsToSwitch(u8 battlerId, u8 r1, u8 r2); -u8 CastformDataTypeChange(u8 battlerId); -u8 AbilityBattleEffects(u8 caseID, u8 battlerId, u8 ability, u8 special, u16 moveArg); +bool8 HasNoMonsToSwitch(u8 battler, u8 r1, u8 r2); +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); +u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn); +void ClearFuryCutterDestinyBondGrudge(u8 battler); void HandleAction_RunBattleScript(void); u8 GetMoveTarget(u16 move, u8 setTarget); u8 IsMonDisobedient(void); diff --git a/include/party_menu.h b/include/party_menu.h index 40029f77b0..2d33b3b9fc 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -71,8 +71,8 @@ void ChooseMonForWirelessMinigame(void); void OpenPartyMenuInBattle(u8 partyAction); void ChooseMonForInBattleItem(void); void BufferBattlePartyCurrentOrder(void); -void BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId); -void SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 arrayIndex); +void BufferBattlePartyCurrentOrderBySide(u8 battler, u8 flankId); +void SwitchPartyOrderLinkMulti(u8 battler, u8 slot, u8 arrayIndex); void SwitchPartyMonSlots(u8 slot, u8 slot2); u8 GetPartyIdFromBattlePartyId(u8 slot); void ShowPartyMenuToShowcaseMultiBattleParty(void); diff --git a/include/pokemon.h b/include/pokemon.h index 771d947f0a..306cca115e 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -408,7 +408,7 @@ void CreateBattleTowerMon_HandleLevel(struct Pokemon *mon, struct BattleTowerPok void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 monId); void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, u8 nature, u8 fixedIV, u8 evSpread, u32 otId); void ConvertPokemonToBattleTowerPokemon(struct Pokemon *mon, struct BattleTowerPokemon *dest); -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId); +bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler); void SetDeoxysStats(void); u16 GetUnionRoomTrainerPic(void); u16 GetUnionRoomTrainerClass(void); @@ -428,7 +428,7 @@ void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef); u8 CountAliveMonsInBattle(u8 caseId); -u8 GetDefaultMoveTarget(u8 battlerId); +u8 GetDefaultMoveTarget(u8 battler); u8 GetMonGender(struct Pokemon *mon); u8 GetBoxMonGender(struct BoxPokemon *boxMon); u8 GetGenderFromSpeciesAndPersonality(u16 species, u32 personality); @@ -467,10 +467,10 @@ void GetSpeciesName(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); -void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex); +void CopyPlayerPartyMonToBattleData(u8 battler, u8 partyIndex); bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e); -bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId); +bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battler); u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); u8 *UseStatIncreaseItem(u16 itemId); u8 GetNature(struct Pokemon *mon); diff --git a/include/recorded_battle.h b/include/recorded_battle.h index 9b89394038..2e61be577c 100644 --- a/include/recorded_battle.h +++ b/include/recorded_battle.h @@ -10,9 +10,9 @@ extern u8 gRecordedBattleMultiplayerId; void RecordedBattle_Init(u8 mode); void RecordedBattle_SetTrainerInfo(void); -void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action); -void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear); -u8 RecordedBattle_GetBattlerAction(u8 battlerId); +void RecordedBattle_SetBattlerAction(u8 battler, u8 action); +void RecordedBattle_ClearBattlerAction(u8 battler, u8 bytesToClear); +u8 RecordedBattle_GetBattlerAction(u8 battler); u8 RecordedBattle_BufferNewBattlerData(u8 *dst); void RecordedBattle_RecordAllBattlerData(u8 *data); bool32 CanCopyRecordedBattleSaveData(void); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index 716c456794..a1c7b57ea0 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -344,7 +344,7 @@ void BattleAI_SetupAIData(u8 defaultScoreMoves) gBattleResources->AI_ScriptsStack->size = 0; sBattler_AI = gActiveBattler; - // Decide a random target battlerId in doubles. + // Decide a random target battler in doubles. if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { gBattlerTarget = (Random() & BIT_FLANK) + BATTLE_OPPOSITE(GetBattlerSide(gActiveBattler)); @@ -632,32 +632,32 @@ static void RecordLastUsedMoveByTarget(void) } } -void ClearBattlerMoveHistory(u8 battlerId) +void ClearBattlerMoveHistory(u8 battler) { s32 i; for (i = 0; i < MAX_MON_MOVES; i++) - BATTLE_HISTORY->usedMoves[battlerId].moves[i] = MOVE_NONE; + BATTLE_HISTORY->usedMoves[battler].moves[i] = MOVE_NONE; } -void RecordAbilityBattle(u8 battlerId, u8 abilityId) +void RecordAbilityBattle(u8 battler, u8 abilityId) { - BATTLE_HISTORY->abilities[battlerId] = abilityId; + BATTLE_HISTORY->abilities[battler] = abilityId; } -void ClearBattlerAbilityHistory(u8 battlerId) +void ClearBattlerAbilityHistory(u8 battler) { - BATTLE_HISTORY->abilities[battlerId] = ABILITY_NONE; + BATTLE_HISTORY->abilities[battler] = ABILITY_NONE; } -void RecordItemEffectBattle(u8 battlerId, u8 itemEffect) +void RecordItemEffectBattle(u8 battler, u8 itemEffect) { - BATTLE_HISTORY->itemEffects[battlerId] = itemEffect; + BATTLE_HISTORY->itemEffects[battler] = itemEffect; } -void ClearBattlerItemEffectHistory(u8 battlerId) +void ClearBattlerItemEffectHistory(u8 battler) { - BATTLE_HISTORY->itemEffects[battlerId] = 0; + BATTLE_HISTORY->itemEffects[battler] = 0; } static void Cmd_if_random_less_than(void) @@ -712,14 +712,14 @@ static void Cmd_score(void) static void Cmd_if_hp_less_than(void) { - u16 battlerId; + u16 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) < gAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battler].hp / gBattleMons[battler].maxHP) < gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; @@ -727,14 +727,14 @@ static void Cmd_if_hp_less_than(void) static void Cmd_if_hp_more_than(void) { - u16 battlerId; + u16 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) > gAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battler].hp / gBattleMons[battler].maxHP) > gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; @@ -742,14 +742,14 @@ static void Cmd_if_hp_more_than(void) static void Cmd_if_hp_equal(void) { - u16 battlerId; + u16 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) == gAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battler].hp / gBattleMons[battler].maxHP) == gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; @@ -757,14 +757,14 @@ static void Cmd_if_hp_equal(void) static void Cmd_if_hp_not_equal(void) { - u16 battlerId; + u16 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if ((u32)(100 * gBattleMons[battlerId].hp / gBattleMons[battlerId].maxHP) != gAIScriptPtr[2]) + if ((u32)(100 * gBattleMons[battler].hp / gBattleMons[battler].maxHP) != gAIScriptPtr[2]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; @@ -772,17 +772,17 @@ static void Cmd_if_hp_not_equal(void) static void Cmd_if_status(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if (gBattleMons[battlerId].status1 & status) + if (gBattleMons[battler].status1 & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -790,17 +790,17 @@ static void Cmd_if_status(void) static void Cmd_if_not_status(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if (!(gBattleMons[battlerId].status1 & status)) + if (!(gBattleMons[battler].status1 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -808,17 +808,17 @@ static void Cmd_if_not_status(void) static void Cmd_if_status2(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if ((gBattleMons[battlerId].status2 & status)) + if ((gBattleMons[battler].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -826,17 +826,17 @@ static void Cmd_if_status2(void) static void Cmd_if_not_status2(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if (!(gBattleMons[battlerId].status2 & status)) + if (!(gBattleMons[battler].status2 & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -844,17 +844,17 @@ static void Cmd_if_not_status2(void) static void Cmd_if_status3(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if (gStatuses3[battlerId] & status) + if (gStatuses3[battler] & status) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -862,17 +862,17 @@ static void Cmd_if_status3(void) static void Cmd_if_not_status3(void) { - u16 battlerId; + u16 battler; u32 status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; status = T1_READ_32(gAIScriptPtr + 2); - if (!(gStatuses3[battlerId] & status)) + if (!(gStatuses3[battler] & status)) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 6); else gAIScriptPtr += 10; @@ -880,15 +880,15 @@ static void Cmd_if_not_status3(void) static void Cmd_if_side_affecting(void) { - u16 battlerId; + u16 battler; u32 side, status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - side = GET_BATTLER_SIDE(battlerId); + side = GET_BATTLER_SIDE(battler); status = T1_READ_32(gAIScriptPtr + 2); if (gSideStatuses[side] & status) @@ -899,15 +899,15 @@ static void Cmd_if_side_affecting(void) static void Cmd_if_not_side_affecting(void) { - u16 battlerId; + u16 battler; u32 side, status; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - side = GET_BATTLER_SIDE(battlerId); + side = GET_BATTLER_SIDE(battler); status = T1_READ_32(gAIScriptPtr + 2); if (!(gSideStatuses[side] & status)) @@ -1155,9 +1155,9 @@ static u8 BattleAI_GetWantedBattler(u8 wantedBattler) static void Cmd_is_of_type(void) { - u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if (IS_BATTLER_OF_TYPE(battlerId, gAIScriptPtr[2])) + if (IS_BATTLER_OF_TYPE(battler, gAIScriptPtr[2])) AI_THINKING_STRUCT->funcResult = TRUE; else AI_THINKING_STRUCT->funcResult = FALSE; @@ -1291,7 +1291,7 @@ static void Cmd_nop_2B(void) static void Cmd_count_usable_party_mons(void) { - u8 battlerId; + u8 battler; u8 battlerOnField1, battlerOnField2; struct Pokemon *party; s32 i; @@ -1299,11 +1299,11 @@ static void Cmd_count_usable_party_mons(void) AI_THINKING_STRUCT->funcResult = 0; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; @@ -1311,14 +1311,14 @@ static void Cmd_count_usable_party_mons(void) if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { u32 position; - battlerOnField1 = gBattlerPartyIndexes[battlerId]; - position = BATTLE_PARTNER(GetBattlerPosition(battlerId)); + battlerOnField1 = gBattlerPartyIndexes[battler]; + position = BATTLE_PARTNER(GetBattlerPosition(battler)); battlerOnField2 = gBattlerPartyIndexes[GetBattlerAtPosition(position)]; } - else // In singles there's only one battlerId by side. + else // In singles there's only one battler by side. { - battlerOnField1 = gBattlerPartyIndexes[battlerId]; - battlerOnField2 = gBattlerPartyIndexes[battlerId]; + battlerOnField1 = gBattlerPartyIndexes[battler]; + battlerOnField2 = gBattlerPartyIndexes[battler]; } for (i = 0; i < PARTY_SIZE; i++) @@ -1349,56 +1349,56 @@ static void Cmd_get_considered_move_effect(void) static void Cmd_get_ability(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gActiveBattler != battlerId) + if (gActiveBattler != battler) { - if (BATTLE_HISTORY->abilities[battlerId] != 0) + if (BATTLE_HISTORY->abilities[battler] != 0) { - AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battlerId]; + AI_THINKING_STRUCT->funcResult = BATTLE_HISTORY->abilities[battler]; gAIScriptPtr += 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) + if (gBattleMons[battler].ability == ABILITY_SHADOW_TAG + || gBattleMons[battler].ability == ABILITY_MAGNET_PULL + || gBattleMons[battler].ability == ABILITY_ARENA_TRAP) { - AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; + AI_THINKING_STRUCT->funcResult = gBattleMons[battler].ability; gAIScriptPtr += 2; return; } - if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) + if (gSpeciesInfo[gBattleMons[battler].species].abilities[0] != ABILITY_NONE) { - if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) + if (gSpeciesInfo[gBattleMons[battler].species].abilities[1] != ABILITY_NONE) { // AI has no knowledge of opponent, so it guesses which ability. if (Random() & 1) - AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; + AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battler].species].abilities[0]; else - AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; + AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battler].species].abilities[1]; } else { - AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; // It's definitely ability 1. + AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battler].species].abilities[0]; // It's definitely ability 1. } } else { - AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no PokΓ©mon has ability 2 and no ability 1. + AI_THINKING_STRUCT->funcResult = gSpeciesInfo[gBattleMons[battler].species].abilities[1]; // AI can't actually reach this part since no PokΓ©mon has ability 2 and no ability 1. } } else { // The AI knows its own ability. - AI_THINKING_STRUCT->funcResult = gBattleMons[battlerId].ability; + AI_THINKING_STRUCT->funcResult = gBattleMons[battler].ability; } gAIScriptPtr += 2; @@ -1406,32 +1406,32 @@ static void Cmd_get_ability(void) static void Cmd_check_ability(void) { - u32 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u32 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u32 ability = gAIScriptPtr[2]; if (gAIScriptPtr[1] == AI_TARGET || gAIScriptPtr[1] == AI_TARGET_PARTNER) { - if (BATTLE_HISTORY->abilities[battlerId] != ABILITY_NONE) + if (BATTLE_HISTORY->abilities[battler] != ABILITY_NONE) { - ability = BATTLE_HISTORY->abilities[battlerId]; + ability = BATTLE_HISTORY->abilities[battler]; AI_THINKING_STRUCT->funcResult = ability; } // Abilities that prevent fleeing. - else if (gBattleMons[battlerId].ability == ABILITY_SHADOW_TAG - || gBattleMons[battlerId].ability == ABILITY_MAGNET_PULL - || gBattleMons[battlerId].ability == ABILITY_ARENA_TRAP) + else if (gBattleMons[battler].ability == ABILITY_SHADOW_TAG + || gBattleMons[battler].ability == ABILITY_MAGNET_PULL + || gBattleMons[battler].ability == ABILITY_ARENA_TRAP) { - ability = gBattleMons[battlerId].ability; + ability = gBattleMons[battler].ability; } - else if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[0] != ABILITY_NONE) + else if (gSpeciesInfo[gBattleMons[battler].species].abilities[0] != ABILITY_NONE) { - if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[1] != ABILITY_NONE) + if (gSpeciesInfo[gBattleMons[battler].species].abilities[1] != ABILITY_NONE) { u8 abilityDummyVariable = ability; // Needed to match. - if (gSpeciesInfo[gBattleMons[battlerId].species].abilities[0] != abilityDummyVariable - && gSpeciesInfo[gBattleMons[battlerId].species].abilities[1] != abilityDummyVariable) + if (gSpeciesInfo[gBattleMons[battler].species].abilities[0] != abilityDummyVariable + && gSpeciesInfo[gBattleMons[battler].species].abilities[1] != abilityDummyVariable) { - ability = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; + ability = gSpeciesInfo[gBattleMons[battler].species].abilities[0]; } else { @@ -1440,18 +1440,18 @@ static void Cmd_check_ability(void) } else { - ability = gSpeciesInfo[gBattleMons[battlerId].species].abilities[0]; + ability = gSpeciesInfo[gBattleMons[battler].species].abilities[0]; } } else { - ability = gSpeciesInfo[gBattleMons[battlerId].species].abilities[1]; // AI can't actually reach this part since no PokΓ©mon has ability 2 and no ability 1. + ability = gSpeciesInfo[gBattleMons[battler].species].abilities[1]; // AI can't actually reach this part since no PokΓ©mon has ability 2 and no ability 1. } } else { // The AI knows its own or partner's ability. - ability = gBattleMons[battlerId].ability; + ability = gBattleMons[battler].ability; } if (ability == 0) @@ -1570,19 +1570,19 @@ static void Cmd_if_status_in_party(void) struct Pokemon *party; s32 i; u32 statusToCompareTo; - u8 battlerId; + u8 battler; switch (gAIScriptPtr[1]) { case AI_USER: - battlerId = sBattler_AI; + battler = sBattler_AI; break; default: - battlerId = gBattlerTarget; + battler = gBattlerTarget; break; } - party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; + party = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); @@ -1607,19 +1607,19 @@ static void Cmd_if_status_not_in_party(void) struct Pokemon *party; s32 i; u32 statusToCompareTo; - u8 battlerId; + u8 battler; switch(gAIScriptPtr[1]) { case 1: - battlerId = sBattler_AI; + battler = sBattler_AI; break; default: - battlerId = gBattlerTarget; + battler = gBattlerTarget; break; } - party = (GetBattlerSide(battlerId) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; + party = (GetBattlerSide(battler) == B_SIDE_PLAYER) ? gPlayerParty : gEnemyParty; statusToCompareTo = T1_READ_32(gAIScriptPtr + 2); @@ -1673,14 +1673,14 @@ static void Cmd_if_not_effect(void) static void Cmd_if_stat_level_less_than(void) { - u32 battlerId; + u32 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) + if (gBattleMons[battler].statStages[gAIScriptPtr[2]] < gAIScriptPtr[3]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -1688,14 +1688,14 @@ static void Cmd_if_stat_level_less_than(void) static void Cmd_if_stat_level_more_than(void) { - u32 battlerId; + u32 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) + if (gBattleMons[battler].statStages[gAIScriptPtr[2]] > gAIScriptPtr[3]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -1703,14 +1703,14 @@ static void Cmd_if_stat_level_more_than(void) static void Cmd_if_stat_level_equal(void) { - u32 battlerId; + u32 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) + if (gBattleMons[battler].statStages[gAIScriptPtr[2]] == gAIScriptPtr[3]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -1718,14 +1718,14 @@ static void Cmd_if_stat_level_equal(void) static void Cmd_if_stat_level_not_equal(void) { - u32 battlerId; + u32 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gBattleMons[battlerId].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) + if (gBattleMons[battler].statStages[gAIScriptPtr[2]] != gAIScriptPtr[3]) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 4); else gAIScriptPtr += 8; @@ -1951,16 +1951,16 @@ static void Cmd_if_doesnt_have_move_with_effect(void) static void Cmd_if_any_move_disabled_or_encored(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; if (gAIScriptPtr[2] == 0) { - if (gDisableStructs[battlerId].disabledMove == MOVE_NONE) + if (gDisableStructs[battler].disabledMove == MOVE_NONE) gAIScriptPtr += 7; else gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); @@ -1971,7 +1971,7 @@ static void Cmd_if_any_move_disabled_or_encored(void) } else { - if (gDisableStructs[battlerId].encoredMove != MOVE_NONE) + if (gDisableStructs[battler].encoredMove != MOVE_NONE) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 3); else gAIScriptPtr += 7; @@ -2022,31 +2022,31 @@ static void Cmd_watch(void) static void Cmd_get_hold_effect(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - if (gActiveBattler != battlerId) - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battlerId]); + if (gActiveBattler != battler) + AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battler]); else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battlerId].item); + AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battler].item); gAIScriptPtr += 2; } static void Cmd_if_holds_item(void) { - u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); u16 item; u8 itemLo, itemHi; - if ((battlerId & BIT_SIDE) == (sBattler_AI & BIT_SIDE)) - item = gBattleMons[battlerId].item; + if ((battler & BIT_SIDE) == (sBattler_AI & BIT_SIDE)) + item = gBattleMons[battler].item; else - item = BATTLE_HISTORY->itemEffects[battlerId]; + item = BATTLE_HISTORY->itemEffects[battler]; itemHi = gAIScriptPtr[2]; itemLo = gAIScriptPtr[3]; @@ -2066,42 +2066,42 @@ static void Cmd_if_holds_item(void) static void Cmd_get_gender(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battlerId].species, gBattleMons[battlerId].personality); + AI_THINKING_STRUCT->funcResult = GetGenderFromSpeciesAndPersonality(gBattleMons[battler].species, gBattleMons[battler].personality); gAIScriptPtr += 2; } static void Cmd_is_first_turn_for(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].isFirstTurn; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battler].isFirstTurn; gAIScriptPtr += 2; } static void Cmd_get_stockpile_count(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].stockpileCounter; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battler].stockpileCounter; gAIScriptPtr += 2; } @@ -2115,14 +2115,14 @@ static void Cmd_is_double_battle(void) static void Cmd_get_used_held_item(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = *(u8 *)&gBattleStruct->usedHeldItems[battlerId]; + AI_THINKING_STRUCT->funcResult = *(u8 *)&gBattleStruct->usedHeldItems[battler]; gAIScriptPtr += 2; } @@ -2150,14 +2150,14 @@ static void Cmd_get_move_effect_from_result(void) static void Cmd_get_protect_count(void) { - u8 battlerId; + u8 battler; if (gAIScriptPtr[1] == AI_USER) - battlerId = sBattler_AI; + battler = sBattler_AI; else - battlerId = gBattlerTarget; + battler = gBattlerTarget; - AI_THINKING_STRUCT->funcResult = gDisableStructs[battlerId].protectUses; + AI_THINKING_STRUCT->funcResult = gDisableStructs[battler].protectUses; gAIScriptPtr += 2; } @@ -2254,9 +2254,9 @@ static void Cmd_if_target_is_ally(void) static void Cmd_if_flash_fired(void) { - u8 battlerId = BattleAI_GetWantedBattler(gAIScriptPtr[1]); + u8 battler = BattleAI_GetWantedBattler(gAIScriptPtr[1]); - if (gBattleResources->flags->flags[battlerId] & RESOURCE_FLAG_FLASH_FIRE) + if (gBattleResources->flags->flags[battler] & RESOURCE_FLAG_FLASH_FIRE) gAIScriptPtr = T1_READ_PTR(gAIScriptPtr + 2); else gAIScriptPtr += 6; diff --git a/src/battle_anim.c b/src/battle_anim.c index e6e049c370..ea6a1b8925 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -592,30 +592,30 @@ static void Cmd_monbg(void) { bool8 toBG_2; u8 taskId; - u8 battlerId; + u8 battler; u8 animBattler; sBattleAnimScriptPtr++; animBattler = sBattleAnimScriptPtr[0]; if (animBattler & ANIM_TARGET) - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; else - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; // Move designated battler to background - if (IsBattlerSpriteVisible(battlerId)) + if (IsBattlerSpriteVisible(battler)) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) toBG_2 = FALSE; else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); taskId = CreateTask(Task_InitUpdateMonBg, 10); gAnimVisualTaskCount++; - gTasks[taskId].tBattlerId = battlerId; + gTasks[taskId].tBattlerId = battler; gTasks[taskId].tInBg2 = toBG_2; gTasks[taskId].tActive = TRUE; gTasks[taskId].tIsPartner = FALSE; @@ -623,19 +623,19 @@ static void Cmd_monbg(void) } // Move battler's partner to background - battlerId ^= BIT_FLANK; - if (IsBattlerSpriteVisible(battlerId)) + battler ^= BIT_FLANK; + if (IsBattlerSpriteVisible(battler)) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) toBG_2 = FALSE; else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); taskId = CreateTask(Task_InitUpdateMonBg, 10); gAnimVisualTaskCount++; - gTasks[taskId].tBattlerId = battlerId; + gTasks[taskId].tBattlerId = battler; gTasks[taskId].tInBg2 = toBG_2; gTasks[taskId].tActive = TRUE; gTasks[taskId].tIsPartner = TRUE; @@ -646,26 +646,26 @@ static void Cmd_monbg(void) gAnimScriptCallback = WaitAnimFrameCount; } -bool8 IsBattlerSpriteVisible(u8 battlerId) +bool8 IsBattlerSpriteVisible(u8 battler) { if (IsContest()) { - if (battlerId == gBattleAnimAttacker) + if (battler == gBattleAnimAttacker) return TRUE; else return FALSE; } - if (!IsBattlerSpritePresent(battlerId)) + if (!IsBattlerSpritePresent(battler)) return FALSE; if (IsContest()) return TRUE; // This line won't ever be reached. - if (!gBattleSpritesDataPtr->battlerData[battlerId].invisible || !gSprites[gBattlerSpriteIds[battlerId]].invisible) + if (!gBattleSpritesDataPtr->battlerData[battler].invisible || !gSprites[gBattlerSpriteIds[battler]].invisible) return TRUE; return FALSE; } -void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) +void MoveBattlerSpriteToBG(u8 battler, bool8 toBG_2, bool8 setSpriteInvisible) { struct BattleAnimBgData animBg; u8 battlerSpriteId; @@ -693,7 +693,7 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) SetAnimBgAttribute(1, BG_ANIM_SCREEN_SIZE, 1); SetAnimBgAttribute(1, BG_ANIM_AREA_OVERFLOW_MODE, 0); - battlerSpriteId = gBattlerSpriteIds[battlerId]; + battlerSpriteId = gBattlerSpriteIds[battler]; gBattle_BG1_X = -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20; if (IsContest() && IsSpeciesNotUnown(gContestResources->moveAnim->species)) @@ -701,18 +701,18 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) gBattle_BG1_Y = -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20; if (setSpriteInvisible) - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].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 + PLTT_OFFSET_4BPP(animBg.paletteId)), PLTT_SIZE_4BPP); + LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battler)], BG_PLTT_ID(animBg.paletteId), PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battler)], (void *)(BG_PLTT + PLTT_OFFSET_4BPP(animBg.paletteId)), PLTT_SIZE_4BPP); if (IsContest()) battlerPosition = 0; else - battlerPosition = GetBattlerPosition(battlerId); + battlerPosition = GetBattlerPosition(battler); DrawBattlerOnBg(1, 0, 0, battlerPosition, animBg.paletteId, animBg.bgTiles, animBg.bgTilemap, animBg.tilesOffset); @@ -730,21 +730,21 @@ void MoveBattlerSpriteToBG(u8 battlerId, bool8 toBG_2, bool8 setSpriteInvisible) SetAnimBgAttribute(2, BG_ANIM_SCREEN_SIZE, 1); SetAnimBgAttribute(2, BG_ANIM_AREA_OVERFLOW_MODE, 0); - battlerSpriteId = gBattlerSpriteIds[battlerId]; + battlerSpriteId = gBattlerSpriteIds[battler]; gBattle_BG2_X = -(gSprites[battlerSpriteId].x + gSprites[battlerSpriteId].x2) + 0x20; gBattle_BG2_Y = -(gSprites[battlerSpriteId].y + gSprites[battlerSpriteId].y2) + 0x20; if (setSpriteInvisible) - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].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 + PLTT_OFFSET_4BPP(9)), PLTT_SIZE_4BPP); + LoadPalette(&gPlttBufferUnfaded[OBJ_PLTT_ID(battler)], BG_PLTT_ID(9), PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferUnfaded[OBJ_PLTT_ID(battler)], (void *)(BG_PLTT + PLTT_OFFSET_4BPP(9)), PLTT_SIZE_4BPP); - DrawBattlerOnBg(2, 0, 0, GetBattlerPosition(battlerId), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset); + DrawBattlerOnBg(2, 0, 0, GetBattlerPosition(battler), animBg.paletteId, animBg.bgTiles + 0x1000, animBg.bgTilemap + 0x400, animBg.tilesOffset); } } @@ -812,12 +812,12 @@ void ResetBattleAnimBg(bool8 toBG2) static void Task_UpdateMonBg(u8 taskId) { - u8 spriteId, battlerId; + u8 spriteId, battler; s16 x, y; struct BattleAnimBgData animBg; spriteId = gTasks[taskId].t2_SpriteId; - battlerId = gTasks[taskId].t2_BattlerId; + battler = gTasks[taskId].t2_BattlerId; GetBattleAnimBg1Data(&animBg); x = gTasks[taskId].t2_SpriteX - (gSprites[spriteId].x + gSprites[spriteId].x2); y = gTasks[taskId].t2_SpriteY - (gSprites[spriteId].y + gSprites[spriteId].y2); @@ -826,13 +826,13 @@ static void Task_UpdateMonBg(u8 taskId) { gBattle_BG1_X = x + gTasks[taskId].t2_BgX; gBattle_BG1_Y = y + gTasks[taskId].t2_BgY; - CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battlerId)], &gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId)], PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battler)], &gPlttBufferFaded[BG_PLTT_ID(animBg.paletteId)], PLTT_SIZE_4BPP); } else { gBattle_BG2_X = x + gTasks[taskId].t2_BgX; gBattle_BG2_Y = y + gTasks[taskId].t2_BgY; - CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battlerId)], &gPlttBufferFaded[BG_PLTT_ID(9)], PLTT_SIZE_4BPP); + CpuCopy32(&gPlttBufferFaded[OBJ_PLTT_ID(battler)], &gPlttBufferFaded[BG_PLTT_ID(9)], PLTT_SIZE_4BPP); } } @@ -852,7 +852,7 @@ static void Task_UpdateMonBg(u8 taskId) static void Cmd_clearmonbg(void) { u8 animBattlerId; - u8 battlerId; + u8 battler; u8 taskId; sBattleAnimScriptPtr++; @@ -864,20 +864,20 @@ static void Cmd_clearmonbg(void) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; if (sMonAnimTaskIdArray[0] != TASK_NONE) - gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; if (animBattlerId > 1 && sMonAnimTaskIdArray[1] != TASK_NONE) - gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battlerId)]].invisible = FALSE; + gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler)]].invisible = FALSE; else animBattlerId = 0; taskId = CreateTask(Task_ClearMonBg, 5); gTasks[taskId].data[0] = animBattlerId; - gTasks[taskId].data[2] = battlerId; + gTasks[taskId].data[2] = battler; sBattleAnimScriptPtr++; } @@ -914,7 +914,7 @@ static void Task_ClearMonBg(u8 taskId) static void Cmd_monbg_static(void) { bool8 toBG_2; - u8 battlerId; + u8 battler; u8 animBattlerId; sBattleAnimScriptPtr++; @@ -927,31 +927,31 @@ static void Cmd_monbg_static(void) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; - if (IsBattlerSpriteVisible(battlerId)) + if (IsBattlerSpriteVisible(battler)) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) toBG_2 = FALSE; else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); } - battlerId ^= BIT_FLANK; - if (animBattlerId > 1 && IsBattlerSpriteVisible(battlerId)) + battler ^= BIT_FLANK; + if (animBattlerId > 1 && IsBattlerSpriteVisible(battler)) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) toBG_2 = FALSE; else toBG_2 = TRUE; - MoveBattlerSpriteToBG(battlerId, toBG_2, FALSE); + MoveBattlerSpriteToBG(battler, toBG_2, FALSE); } sBattleAnimScriptPtr++; @@ -960,7 +960,7 @@ static void Cmd_monbg_static(void) static void Cmd_clearmonbg_static(void) { u8 animBattlerId; - u8 battlerId; + u8 battler; u8 taskId; sBattleAnimScriptPtr++; @@ -972,20 +972,20 @@ static void Cmd_clearmonbg_static(void) animBattlerId = ANIM_DEF_PARTNER; if (animBattlerId == ANIM_ATTACKER || animBattlerId == ANIM_ATK_PARTNER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; - if (IsBattlerSpriteVisible(battlerId)) - gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; - if (animBattlerId > 1 && IsBattlerSpriteVisible(BATTLE_PARTNER(battlerId))) - gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battlerId)]].invisible = FALSE; + if (IsBattlerSpriteVisible(battler)) + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; + if (animBattlerId > 1 && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) + gSprites[gBattlerSpriteIds[BATTLE_PARTNER(battler)]].invisible = FALSE; else animBattlerId = 0; taskId = CreateTask(Task_ClearMonBgStatic, 5); gTasks[taskId].data[0] = animBattlerId; - gTasks[taskId].data[2] = battlerId; + gTasks[taskId].data[2] = battler; sBattleAnimScriptPtr++; } @@ -996,16 +996,16 @@ static void Task_ClearMonBgStatic(u8 taskId) if (gTasks[taskId].data[1] != 1) { bool8 toBG_2; - u8 battlerId = gTasks[taskId].data[2]; - u8 position = GetBattlerPosition(battlerId); + u8 battler = gTasks[taskId].data[2]; + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_OPPONENT_LEFT || position == B_POSITION_PLAYER_RIGHT || IsContest()) toBG_2 = FALSE; else toBG_2 = TRUE; - if (IsBattlerSpriteVisible(battlerId)) + if (IsBattlerSpriteVisible(battler)) ResetBattleAnimBg(toBG_2); - if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(BATTLE_PARTNER(battlerId))) + if (gTasks[taskId].data[0] > 1 && IsBattlerSpriteVisible(BATTLE_PARTNER(battler))) ResetBattleAnimBg(toBG_2 ^ 1); DestroyTask(taskId); @@ -1687,19 +1687,19 @@ static void Cmd_jumpifcontest(void) static void Cmd_splitbgprio(void) { u8 wantedBattler; - u8 battlerId; + u8 battler; u8 battlerPosition; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; if (wantedBattler != ANIM_ATTACKER) - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; else - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; // Apply only if the given battler is the lead (on left from team's perspective) - battlerPosition = GetBattlerPosition(battlerId); + battlerPosition = GetBattlerPosition(battler); if (!IsContest() && (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)) { SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); @@ -1721,7 +1721,7 @@ static void Cmd_splitbgprio_foes(void) { u8 wantedBattler; u8 battlerPosition; - u8 battlerId; + u8 battler; wantedBattler = sBattleAnimScriptPtr[1]; sBattleAnimScriptPtr += 2; @@ -1730,12 +1730,12 @@ static void Cmd_splitbgprio_foes(void) if (GetBattlerSide(gBattleAnimAttacker) != GetBattlerSide(gBattleAnimTarget)) { if (wantedBattler != ANIM_ATTACKER) - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; else - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; // Apply only if the given battler is the lead (on left from team's perspective) - battlerPosition = GetBattlerPosition(battlerId); + battlerPosition = GetBattlerPosition(battler); if (!IsContest() && (battlerPosition == B_POSITION_PLAYER_LEFT || battlerPosition == B_POSITION_OPPONENT_RIGHT)) { SetAnimBgAttribute(1, BG_ANIM_PRIORITY, 1); diff --git a/src/battle_anim_mon_movement.c b/src/battle_anim_mon_movement.c index 4c8e79cb9f..a8a129c201 100644 --- a/src/battle_anim_mon_movement.c +++ b/src/battle_anim_mon_movement.c @@ -156,7 +156,7 @@ void AnimTask_ShakeMon2(u8 taskId) { u8 spriteId; bool8 abort = FALSE; - u8 battlerId; + u8 battler; if (gBattleAnimArgs[0] < MAX_BATTLERS_COUNT) { @@ -169,24 +169,24 @@ void AnimTask_ShakeMon2(u8 taskId) switch (gBattleAnimArgs[0]) { case ANIM_PLAYER_LEFT: - battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); + battler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); break; case ANIM_PLAYER_RIGHT: - battlerId = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); + battler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); break; case ANIM_OPPONENT_LEFT: - battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); break; case ANIM_OPPONENT_RIGHT: default: - battlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + battler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); break; } - if (IsBattlerSpriteVisible(battlerId) == FALSE) + if (IsBattlerSpriteVisible(battler) == FALSE) abort = TRUE; - spriteId = gBattlerSpriteIds[battlerId]; + spriteId = gBattlerSpriteIds[battler]; } else { @@ -578,16 +578,16 @@ static void SlideMonToOffset(struct Sprite *sprite) static void SlideMonToOffsetAndBack(struct Sprite *sprite) { u8 spriteId; - u8 battlerId; + u8 battler; sprite->invisible = TRUE; if (gBattleAnimArgs[0] == ANIM_ATTACKER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; - spriteId = gBattlerSpriteIds[battlerId]; - if (GetBattlerSide(battlerId)) + spriteId = gBattlerSpriteIds[battler]; + if (GetBattlerSide(battler)) { gBattleAnimArgs[1] = -gBattleAnimArgs[1]; if (gBattleAnimArgs[3] == 1) diff --git a/src/battle_anim_mons.c b/src/battle_anim_mons.c index 8a89cfc92f..dff3a71fa1 100644 --- a/src/battle_anim_mons.c +++ b/src/battle_anim_mons.c @@ -109,7 +109,7 @@ static const struct SpriteSheet sSpriteSheets_MoveEffectMons[] = { gMiscBlank_Gfx, MON_PIC_SIZE, TAG_MOVE_EFFECT_MON_2, }, }; -u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) +u8 GetBattlerSpriteCoord(u8 battler, u8 coordType) { u8 retVal; u16 species; @@ -117,7 +117,7 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) if (IsContest()) { - if (coordType == BATTLER_COORD_Y_PIC_OFFSET && battlerId == 3) + if (coordType == BATTLER_COORD_Y_PIC_OFFSET && battler == 3) coordType = BATTLER_COORD_Y; } @@ -125,10 +125,10 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) { case BATTLER_COORD_X: case BATTLER_COORD_X_2: - retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].x; + retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battler)].x; break; case BATTLER_COORD_Y: - retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; + retVal = sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battler)].y; break; case BATTLER_COORD_Y_PIC_OFFSET: case BATTLER_COORD_Y_PIC_OFFSET_DEFAULT: @@ -142,34 +142,34 @@ u8 GetBattlerSpriteCoord(u8 battlerId, u8 coordType) } else { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (!spriteInfo[battler].transformSpecies) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (!spriteInfo[battler].transformSpecies) + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; } } if (coordType == BATTLER_COORD_Y_PIC_OFFSET) - retVal = GetBattlerSpriteFinal_Y(battlerId, species, TRUE); + retVal = GetBattlerSpriteFinal_Y(battler, species, TRUE); else - retVal = GetBattlerSpriteFinal_Y(battlerId, species, FALSE); + retVal = GetBattlerSpriteFinal_Y(battler, species, FALSE); break; } return retVal; } -u8 GetBattlerYDelta(u8 battlerId, u16 species) +u8 GetBattlerYDelta(u8 battler, u16 species) { u16 letter; u32 personality; @@ -177,7 +177,7 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) u8 ret; u16 coordSpecies; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + if (GetBattlerSide(battler) == B_SIDE_PLAYER || IsContest()) { if (species == SPECIES_UNOWN) { @@ -191,10 +191,10 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + if (!spriteInfo[battler].transformSpecies) + personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); else - personality = gTransformedPersonalities[battlerId]; + personality = gTransformedPersonalities[battler]; } letter = GET_UNOWN_LETTER(personality); if (!letter) @@ -205,7 +205,7 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) } else if (species == SPECIES_CASTFORM) { - ret = sCastformBackSpriteYCoords[gBattleMonForms[battlerId]]; + ret = sCastformBackSpriteYCoords[gBattleMonForms[battler]]; } else if (species > NUM_SPECIES) { @@ -221,10 +221,10 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) if (species == SPECIES_UNOWN) { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + if (!spriteInfo[battler].transformSpecies) + personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); else - personality = gTransformedPersonalities[battlerId]; + personality = gTransformedPersonalities[battler]; letter = GET_UNOWN_LETTER(personality); if (!letter) coordSpecies = species; @@ -234,7 +234,7 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) } else if (species == SPECIES_CASTFORM) { - ret = gCastformFrontSpriteCoords[gBattleMonForms[battlerId]].y_offset; + ret = gCastformFrontSpriteCoords[gBattleMonForms[battler]].y_offset; } else if (species > NUM_SPECIES) { @@ -248,15 +248,15 @@ u8 GetBattlerYDelta(u8 battlerId, u16 species) return ret; } -u8 GetBattlerElevation(u8 battlerId, u16 species) +u8 GetBattlerElevation(u8 battler, u16 species) { u8 ret = 0; - if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) { if (!IsContest()) { if (species == SPECIES_CASTFORM) - ret = sCastformElevations[gBattleMonForms[battlerId]]; + ret = sCastformElevations[gBattleMonForms[battler]]; else if (species > NUM_SPECIES) ret = gEnemyMonElevation[0]; else @@ -266,24 +266,24 @@ u8 GetBattlerElevation(u8 battlerId, u16 species) return ret; } -u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3) +u8 GetBattlerSpriteFinal_Y(u8 battler, u16 species, bool8 a3) { u16 offset; u8 y; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER || IsContest()) + if (GetBattlerSide(battler) == B_SIDE_PLAYER || IsContest()) { - offset = GetBattlerYDelta(battlerId, species); + offset = GetBattlerYDelta(battler, species); } else { - offset = GetBattlerYDelta(battlerId, species); - offset -= GetBattlerElevation(battlerId, species); + offset = GetBattlerYDelta(battler, species); + offset -= GetBattlerElevation(battler, species); } - y = offset + sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battlerId)].y; + y = offset + sBattlerCoords[IS_DOUBLE_BATTLE()][GetBattlerPosition(battler)].y; if (a3) { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) y += 8; if (y > DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8) y = DISPLAY_HEIGHT - MON_PIC_HEIGHT + 8; @@ -291,7 +291,7 @@ u8 GetBattlerSpriteFinal_Y(u8 battlerId, u16 species, bool8 a3) return y; } -u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType) +u8 GetBattlerSpriteCoord2(u8 battler, u8 coordType) { u16 species; struct BattleSpriteInfo *spriteInfo; @@ -308,64 +308,64 @@ u8 GetBattlerSpriteCoord2(u8 battlerId, u8 coordType) else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = gAnimBattlerSpecies[battlerId]; + if (!spriteInfo[battler].transformSpecies) + species = gAnimBattlerSpecies[battler]; else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; } if (coordType == BATTLER_COORD_Y_PIC_OFFSET) - return GetBattlerSpriteFinal_Y(battlerId, species, TRUE); + return GetBattlerSpriteFinal_Y(battler, species, TRUE); else - return GetBattlerSpriteFinal_Y(battlerId, species, FALSE); + return GetBattlerSpriteFinal_Y(battler, species, FALSE); } else { - return GetBattlerSpriteCoord(battlerId, coordType); + return GetBattlerSpriteCoord(battler, coordType); } } -u8 GetBattlerSpriteDefault_Y(u8 battlerId) +u8 GetBattlerSpriteDefault_Y(u8 battler) { - return GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT); + return GetBattlerSpriteCoord(battler, BATTLER_COORD_Y_PIC_OFFSET_DEFAULT); } -u8 GetSubstituteSpriteDefault_Y(u8 battlerId) +u8 GetSubstituteSpriteDefault_Y(u8 battler) { u16 y; - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 16; + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 16; else - y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y) + 17; + y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 17; return y; } -u8 GetBattlerYCoordWithElevation(u8 battlerId) +u8 GetBattlerYCoordWithElevation(u8 battler) { u16 species; u8 y; struct BattleSpriteInfo *spriteInfo; - y = GetBattlerSpriteCoord(battlerId, BATTLER_COORD_Y); + y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y); if (!IsContest()) { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (!spriteInfo[battler].transformSpecies) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (!spriteInfo[battler].transformSpecies) + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; } - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - y -= GetBattlerElevation(battlerId, species); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + y -= GetBattlerElevation(battler, species); } return y; } @@ -846,14 +846,14 @@ void InitSpritePosToAnimAttacker(struct Sprite *sprite, bool8 respectMonPicOffse sprite->y += gBattleAnimArgs[1]; } -u8 GetBattlerSide(u8 battlerId) +u8 GetBattlerSide(u8 battler) { - return GET_BATTLER_SIDE2(battlerId); + return GET_BATTLER_SIDE2(battler); } -u8 GetBattlerPosition(u8 battlerId) +u8 GetBattlerPosition(u8 battler) { - return gBattlerPositions[battlerId]; + return gBattlerPositions[battler]; } u8 GetBattlerAtPosition(u8 position) @@ -868,31 +868,31 @@ u8 GetBattlerAtPosition(u8 position) return i; } -bool8 IsBattlerSpritePresent(u8 battlerId) +bool8 IsBattlerSpritePresent(u8 battler) { if (IsContest()) { - if (gBattleAnimAttacker == battlerId) + if (gBattleAnimAttacker == battler) return TRUE; - else if (gBattleAnimTarget == battlerId) + else if (gBattleAnimTarget == battler) return TRUE; else return FALSE; } else { - if (gBattlerPositions[battlerId] == 0xff) + if (gBattlerPositions[battler] == 0xff) { return FALSE; } - else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + else if (GetBattlerSide(battler) != B_SIDE_PLAYER) { - if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) + if (GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) != 0) return TRUE; } else { - if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_HP) != 0) + if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_HP) != 0) return TRUE; } } @@ -956,7 +956,7 @@ void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId) } } -void GetBgDataForTransform(struct BattleAnimBgData *out, u8 battlerId) +void GetBgDataForTransform(struct BattleAnimBgData *out, u8 battler) { out->bgTiles = gBattleAnimBgTileBuffer; out->bgTilemap = (u16 *)gBattleAnimBgTilemapBuffer; @@ -1294,14 +1294,14 @@ static bool8 ShouldRotScaleSpeciesBeFlipped(void) void PrepareBattlerSpriteForRotScale(u8 spriteId, u8 objMode) { - u8 battlerId = gSprites[spriteId].data[0]; + u8 battler = gSprites[spriteId].data[0]; - if (IsContest() || IsBattlerSpriteVisible(battlerId)) + if (IsContest() || IsBattlerSpriteVisible(battler)) gSprites[spriteId].invisible = FALSE; gSprites[spriteId].oam.objMode = objMode; gSprites[spriteId].affineAnimPaused = TRUE; if (!IsContest() && !gSprites[spriteId].oam.affineMode) - gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battlerId].matrixNum; + gSprites[spriteId].oam.matrixNum = gBattleSpritesDataPtr->healthBoxesData[battler].matrixNum; gSprites[spriteId].oam.affineMode = ST_OAM_AFFINE_DOUBLE; CalcCenterToCornerVec(&gSprites[spriteId], gSprites[spriteId].oam.shape, gSprites[spriteId].oam.size, gSprites[spriteId].oam.affineMode); } @@ -1591,7 +1591,7 @@ static void AnimThrowProjectile_Step(struct Sprite *sprite) void AnimTravelDiagonally(struct Sprite *sprite) { bool8 respectMonPicOffsets; - u8 battlerId, coordType; + u8 battler, coordType; if (!gBattleAnimArgs[6]) { @@ -1606,19 +1606,19 @@ void AnimTravelDiagonally(struct Sprite *sprite) if (gBattleAnimArgs[5] == ANIM_ATTACKER) { InitSpritePosToAnimAttacker(sprite, respectMonPicOffsets); - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; } else { InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; } if (GetBattlerSide(gBattleAnimAttacker)) gBattleAnimArgs[2] = -gBattleAnimArgs[2]; InitSpritePosToAnimTarget(sprite, respectMonPicOffsets); 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->data[2] = GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2) + gBattleAnimArgs[2]; + sprite->data[4] = GetBattlerSpriteCoord(battler, coordType) + gBattleAnimArgs[3]; sprite->callback = StartAnimLinearTranslation; StoreSpriteCallbackInData6(sprite, DestroyAnimSprite); } @@ -1897,7 +1897,7 @@ void SetBattlerSpriteYOffsetFromOtherYScale(u8 spriteId, u8 otherSpriteId) static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) { struct BattleSpriteInfo *spriteInfo; - u8 battlerId = gSprites[spriteId].data[0]; + u8 battler = gSprites[spriteId].data[0]; u16 species; u16 i; @@ -1915,26 +1915,26 @@ static u16 GetBattlerYDeltaFromSpriteId(u8 spriteId) if (GetBattlerSide(i) == B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) + if (!spriteInfo[battler].transformSpecies) species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; if (species == SPECIES_CASTFORM) - return sCastformBackSpriteYCoords[gBattleMonForms[battlerId]]; + return sCastformBackSpriteYCoords[gBattleMonForms[battler]]; else return gMonBackPicCoords[species].y_offset; } else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) + if (!spriteInfo[battler].transformSpecies) species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[i]], MON_DATA_SPECIES); else - species = spriteInfo[battlerId].transformSpecies; + species = spriteInfo[battler].transformSpecies; if (species == SPECIES_CASTFORM) - return sCastformElevations[gBattleMonForms[battlerId]]; + return sCastformElevations[gBattleMonForms[battler]]; else return gMonFrontPicCoords[species].y_offset; } @@ -2032,21 +2032,21 @@ void InitPrioritiesForVisibleBattlers(void) } } -u8 GetBattlerSpriteSubpriority(u8 battlerId) +u8 GetBattlerSpriteSubpriority(u8 battler) { u8 position; u8 subpriority; if (IsContest()) { - if (battlerId == 2) + if (battler == 2) return 30; else return 40; } else { - position = GetBattlerPosition(battlerId); + position = GetBattlerPosition(battler); if (position == B_POSITION_PLAYER_LEFT) subpriority = 30; else if (position == B_POSITION_PLAYER_RIGHT) @@ -2060,9 +2060,9 @@ u8 GetBattlerSpriteSubpriority(u8 battlerId) return subpriority; } -u8 GetBattlerSpriteBGPriority(u8 battlerId) +u8 GetBattlerSpriteBGPriority(u8 battler) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (IsContest()) return 2; @@ -2072,11 +2072,11 @@ u8 GetBattlerSpriteBGPriority(u8 battlerId) return GetAnimBgAttribute(1, BG_ANIM_PRIORITY); } -u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) +u8 GetBattlerSpriteBGPriorityRank(u8 battler) { if (!IsContest()) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); if (position == B_POSITION_PLAYER_LEFT || position == B_POSITION_OPPONENT_RIGHT) return 2; else @@ -2086,7 +2086,7 @@ u8 GetBattlerSpriteBGPriorityRank(u8 battlerId) } // Create PokΓ©mon sprite to be used for a move animation effect (e.g. Role Play / Snatch) -u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battlerId, bool32 ignoreDeoxysForm) +u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battler, bool32 ignoreDeoxysForm) { u8 spriteId; u16 sheet = LoadSpriteSheet(&sSpriteSheets_MoveEffectMons[id]); @@ -2097,7 +2097,7 @@ u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 if (!isBackpic) { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP); - if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battler) == TRUE || gBattleSpritesDataPtr->battlerData[battler].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->buffer, species, @@ -2113,7 +2113,7 @@ u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 else { LoadCompressedPalette(GetMonSpritePalFromSpeciesAndPersonality(species, trainerId, personality), OBJ_PLTT_ID(palette), PLTT_SIZE_4BPP); - if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != 0) + if (ignoreDeoxysForm == TRUE || ShouldIgnoreDeoxysForm(5, battler) == TRUE || gBattleSpritesDataPtr->battlerData[battler].transformSpecies != 0) LoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->buffer, species, @@ -2148,7 +2148,7 @@ void DestroySpriteAndFreeResources_(struct Sprite *sprite) DestroySpriteAndFreeResources(sprite); } -s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) +s16 GetBattlerSpriteCoordAttr(u8 battler, u8 attr) { u16 species; u32 personality; @@ -2181,7 +2181,7 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]]; + coords = &gCastformFrontSpriteCoords[gBattleMonForms[battler]]; } else if (species <= SPECIES_EGG) { @@ -2194,18 +2194,18 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) } else { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) + if (!spriteInfo[battler].transformSpecies) { - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + personality = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); } else { - species = spriteInfo[battlerId].transformSpecies; - personality = gTransformedPersonalities[battlerId]; + species = spriteInfo[battler].transformSpecies; + personality = gTransformedPersonalities[battler]; } if (species == SPECIES_UNOWN) @@ -2229,15 +2229,15 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) else { spriteInfo = gBattleSpritesDataPtr->battlerData; - if (!spriteInfo[battlerId].transformSpecies) + if (!spriteInfo[battler].transformSpecies) { - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); - personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PERSONALITY); + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + personality = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_PERSONALITY); } else { - species = spriteInfo[battlerId].transformSpecies; - personality = gTransformedPersonalities[battlerId]; + species = spriteInfo[battler].transformSpecies; + personality = gTransformedPersonalities[battler]; } if (species == SPECIES_UNOWN) @@ -2251,7 +2251,7 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) } else if (species == SPECIES_CASTFORM) { - coords = &gCastformFrontSpriteCoords[gBattleMonForms[battlerId]]; + coords = &gCastformFrontSpriteCoords[gBattleMonForms[battler]]; } else if (species > NUM_SPECIES) { @@ -2271,22 +2271,22 @@ s16 GetBattlerSpriteCoordAttr(u8 battlerId, u8 attr) 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); + return GetBattlerSpriteCoord(battler, 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); + return GetBattlerSpriteCoord(battler, 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); + return GetBattlerSpriteCoord(battler, 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); + return GetBattlerSpriteCoord(battler, 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; + ret = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 31; return ret - coords->y_offset; default: return 0; } } -void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x, s16 *y) +void SetAverageBattlerPositions(u8 battler, bool8 respectMonPicOffsets, s16 *x, s16 *y) { u8 xCoordType, yCoordType; s16 battlerX, battlerY; @@ -2303,12 +2303,12 @@ void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x yCoordType = BATTLER_COORD_Y_PIC_OFFSET; } - battlerX = GetBattlerSpriteCoord(battlerId, xCoordType); - battlerY = GetBattlerSpriteCoord(battlerId, yCoordType); + battlerX = GetBattlerSpriteCoord(battler, xCoordType); + battlerY = GetBattlerSpriteCoord(battler, yCoordType); if (IsDoubleBattle() && !IsContest()) { - partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), xCoordType); - partnerY = GetBattlerSpriteCoord(BATTLE_PARTNER(battlerId), yCoordType); + partnerX = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), xCoordType); + partnerY = GetBattlerSpriteCoord(BATTLE_PARTNER(battler), yCoordType); } else { @@ -2320,7 +2320,7 @@ void SetAverageBattlerPositions(u8 battlerId, bool8 respectMonPicOffsets, s16 *x *y = (battlerY + partnerY) / 2; } -u8 CreateInvisibleSpriteCopy(int battlerId, u8 spriteId, int species) +u8 CreateInvisibleSpriteCopy(int battler, u8 spriteId, int species) { u8 newSpriteId = CreateInvisibleSpriteWithCallback(SpriteCallbackDummy); gSprites[newSpriteId] = gSprites[spriteId]; diff --git a/src/battle_anim_sound_tasks.c b/src/battle_anim_sound_tasks.c index 1fde3a9823..a833df2dd1 100644 --- a/src/battle_anim_sound_tasks.c +++ b/src/battle_anim_sound_tasks.c @@ -144,29 +144,29 @@ void SoundTask_PlayCryHighPitch(u8 taskId) } else { - u8 battlerId; + u8 battler; // Get wanted battler. if (gBattleAnimArgs[0] == ANIM_ATTACKER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else if (gBattleAnimArgs[0] == ANIM_TARGET) - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) - battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + battler = BATTLE_PARTNER(gBattleAnimAttacker); else - battlerId = BATTLE_PARTNER(gBattleAnimTarget); + battler = BATTLE_PARTNER(gBattleAnimTarget); // Check if battler is visible. - if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battler)) { DestroyAnimVisualTask(taskId); return; } - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); } if (species != SPECIES_NONE) @@ -192,29 +192,29 @@ void SoundTask_PlayDoubleCry(u8 taskId) } else { - u8 battlerId; + u8 battler; // Get wanted battler. if (gBattleAnimArgs[0] == ANIM_ATTACKER) - battlerId = gBattleAnimAttacker; + battler = gBattleAnimAttacker; else if (gBattleAnimArgs[0] == ANIM_TARGET) - battlerId = gBattleAnimTarget; + battler = gBattleAnimTarget; else if (gBattleAnimArgs[0] == ANIM_ATK_PARTNER) - battlerId = BATTLE_PARTNER(gBattleAnimAttacker); + battler = BATTLE_PARTNER(gBattleAnimAttacker); else - battlerId = BATTLE_PARTNER(gBattleAnimTarget); + battler = BATTLE_PARTNER(gBattleAnimTarget); // Check if battler is visible. - if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battlerId)) + if ((gBattleAnimArgs[0] == ANIM_TARGET || gBattleAnimArgs[0] == ANIM_DEF_PARTNER) && !IsBattlerSpriteVisible(battler)) { DestroyAnimVisualTask(taskId); return; } - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); else - species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES); + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); } gTasks[taskId].data[0] = gBattleAnimArgs[1]; diff --git a/src/battle_anim_status_effects.c b/src/battle_anim_status_effects.c index cc04843b7f..ca69f109ca 100644 --- a/src/battle_anim_status_effects.c +++ b/src/battle_anim_status_effects.c @@ -270,16 +270,16 @@ static const struct SpriteTemplate sFlashingCircleImpactSpriteTemplate = .callback = AnimFlashingCircleImpact, }; -static u8 UNUSED Task_FlashingCircleImpacts(u8 battlerId, bool8 red) +static u8 UNUSED Task_FlashingCircleImpacts(u8 battler, bool8 red) { - u8 battlerSpriteId = gBattlerSpriteIds[battlerId]; + u8 battlerSpriteId = gBattlerSpriteIds[battler]; u8 taskId = CreateTask(Task_UpdateFlashingCircleImpacts, 10); u8 spriteId; u8 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; + gTasks[taskId].data[0] = battler; if (red) { gTasks[taskId].data[1] = RGB_RED; @@ -540,15 +540,15 @@ void AnimTask_StatsChange(u8 taskId) #undef CASE -void LaunchStatusAnimation(u8 battlerId, u8 statusAnimId) +void LaunchStatusAnimation(u8 battler, u8 statusAnimId) { u8 taskId; - gBattleAnimAttacker = battlerId; - gBattleAnimTarget = battlerId; + gBattleAnimAttacker = battler; + gBattleAnimTarget = battler; LaunchBattleAnimation(gBattleAnims_StatusConditions, statusAnimId, FALSE); taskId = CreateTask(Task_DoStatusAnimation, 10); - gTasks[taskId].data[0] = battlerId; + gTasks[taskId].data[0] = battler; } static void Task_DoStatusAnimation(u8 taskId) diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 00fb018b8b..7ef9d3e9cf 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -92,7 +92,7 @@ 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 StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkOpponentDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); @@ -1141,36 +1141,36 @@ static void LinkOpponentHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite( + gBattlerSpriteIds[battler] = CreateSprite( &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void LinkOpponentHandleReturnMonToBall(void) @@ -1321,7 +1321,7 @@ static void LinkOpponentHandleTrainerSlide(void) gSprites[gBattlerSpriteIds[gActiveBattler]].oam.affineParam = trainerPicId; gSprites[gBattlerSpriteIds[gActiveBattler]].callback = SpriteCB_TrainerSlideIn; - gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle battlerId function + gBattlerControllerFuncs[gActiveBattler] = CompleteOnBankSpriteCallbackDummy2; // this line is redundant, because LinkOpponentBufferExecCompleted changes the battle battler function LinkOpponentBufferExecCompleted(); } @@ -1534,11 +1534,11 @@ static void LinkOpponentHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 53babb1f1d..1a486b93f2 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -92,7 +92,7 @@ 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 StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void LinkPartnerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); @@ -1036,35 +1036,35 @@ static void LinkPartnerHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite( + gBattlerSpriteIds[battler] = CreateSprite( &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void LinkPartnerHandleReturnMonToBall(void) @@ -1373,11 +1373,11 @@ static void LinkPartnerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 07dd7596d8..21431053ea 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -97,7 +97,7 @@ static void OpponentBufferExecCompleted(void); static void SwitchIn_HandleSoundAndEnd(void); static u32 GetOpponentMonData(u8 monId, u8 *dst); static void SetOpponentMonData(u8 monId); -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void OpponentDoMoveAnimation(void); static void SpriteCB_FreeOpponentSprite(struct Sprite *sprite); @@ -1165,36 +1165,36 @@ static void OpponentHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void OpponentHandleReturnMonToBall(void) @@ -1713,11 +1713,11 @@ static void OpponentHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 125d83d3fa..4b564ad141 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1154,10 +1154,10 @@ static void CompleteOnInactiveTextPrinter(void) static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)(gTasks[taskId].tExpTask_monId); - u8 battlerId = gTasks[taskId].tExpTask_battler; + u8 battler = gTasks[taskId].tExpTask_battler; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // Give exp without moving the expbar. + if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battler]) // Give exp without moving the expbar. { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -1173,12 +1173,12 @@ static void Task_GiveExpToMon(u8 taskId) CalculateMonStats(mon); gainedExp -= nextLvlExp - currExp; savedActiveBattler = gActiveBattler; - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; if (IsDoubleBattle() == TRUE - && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)])) + && ((u16)(monId) == gBattlerPartyIndexes[battler] || (u16)(monId) == gBattlerPartyIndexes[BATTLE_PARTNER(battler)])) gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; @@ -1187,7 +1187,7 @@ static void Task_GiveExpToMon(u8 taskId) { currExp += gainedExp; SetMonData(mon, MON_DATA_EXP, &currExp); - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } @@ -1201,7 +1201,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_battler; + u8 battler = gTasks[taskId].tExpTask_battler; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -1211,7 +1211,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) exp -= currLvlExp; expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp; - SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); + SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); gTasks[taskId].func = Task_GiveExpWithExpBar; } @@ -1226,11 +1226,11 @@ static void Task_GiveExpWithExpBar(u8 taskId) { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_battler; + u8 battler = gTasks[taskId].tExpTask_battler; s16 newExpPoints; - newExpPoints = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); + newExpPoints = MoveBattleBar(battler, gHealthboxSpriteIds[battler], EXP_BAR, 0); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); if (newExpPoints == -1) // The bar has been filled with given exp points. { u8 level; @@ -1252,7 +1252,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) CalculateMonStats(&gPlayerParty[monId]); gainedExp -= expOnNextLvl - currExp; savedActiveBattler = gActiveBattler; - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBattler; gTasks[taskId].func = Task_LaunchLvlUpAnim; @@ -1261,7 +1261,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) { currExp += gainedExp; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } @@ -1270,30 +1270,30 @@ static void Task_GiveExpWithExpBar(u8 taskId) static void Task_LaunchLvlUpAnim(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_battler; + u8 battler = gTasks[taskId].tExpTask_battler; u8 monIndex = gTasks[taskId].tExpTask_monId; - if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]) - battlerId ^= BIT_FLANK; + if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]) + battler ^= BIT_FLANK; - InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_LVL_UP); gTasks[taskId].func = Task_UpdateLvlInHealthbox; } static void Task_UpdateLvlInHealthbox(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_battler; + u8 battler = gTasks[taskId].tExpTask_battler; - if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. - if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]) - UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battlerId)], &gPlayerParty[monIndex], HEALTHBOX_ALL); + if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]) + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battler)], &gPlayerParty[monIndex], HEALTHBOX_ALL); else - UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[monIndex], HEALTHBOX_ALL); gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } @@ -1302,12 +1302,12 @@ static void Task_UpdateLvlInHealthbox(u8 taskId) static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) { u8 monIndex; - u8 battlerId; + u8 battler; monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value. - battlerId = gTasks[taskId].tExpTask_battler; - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + battler = gTasks[taskId].tExpTask_battler; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } @@ -2193,35 +2193,35 @@ static void PlayerHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnimShowHealthbox; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite( + gBattlerSpriteIds[battler] = CreateSprite( &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerHandleReturnMonToBall(void) @@ -2756,11 +2756,11 @@ static void PlayerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } @@ -2975,7 +2975,7 @@ static void PlayerHandleIntroTrainerBallThrow(void) void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) { - u8 battlerId = sprite->sBattlerId; + u8 battler = sprite->sBattlerId; // Free player trainer sprite FreeSpriteOamMatrix(sprite); @@ -2983,8 +2983,8 @@ void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite) DestroySprite(sprite); // Load mon sprite - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], 0); + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); } #undef sBattlerId diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index 04445736c4..a5d00c4740 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -95,7 +95,7 @@ static void Task_UpdateLvlInHealthbox(u8 taskId); static void SwitchIn_WaitAndEnd(void); static u32 CopyPlayerPartnerMonData(u8 monId, u8 *dst); static void SetPlayerPartnerMonData(u8 monId); -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void PlayerPartnerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); @@ -312,10 +312,10 @@ static void CompleteOnInactiveTextPrinter(void) static void Task_GiveExpToMon(u8 taskId) { u32 monId = (u8)(gTasks[taskId].tExpTask_monId); - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battler = gTasks[taskId].tExpTask_bank; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battlerId]) // give exp without the expbar + if (IsDoubleBattle() == TRUE || monId != gBattlerPartyIndexes[battler]) // give exp without the expbar { struct Pokemon *mon = &gPlayerParty[monId]; u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -331,12 +331,12 @@ static void Task_GiveExpToMon(u8 taskId) CalculateMonStats(mon); gainedExp -= nextLvlExp - currExp; savedActiveBank = gActiveBattler; - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; if (IsDoubleBattle() == TRUE - && ((u16)(monId) == gBattlerPartyIndexes[battlerId] || (u16)(monId) == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)])) + && ((u16)(monId) == gBattlerPartyIndexes[battler] || (u16)(monId) == gBattlerPartyIndexes[BATTLE_PARTNER(battler)])) gTasks[taskId].func = Task_LaunchLvlUpAnim; else gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; @@ -345,7 +345,7 @@ static void Task_GiveExpToMon(u8 taskId) { currExp += gainedExp; SetMonData(mon, MON_DATA_EXP, &currExp); - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } @@ -359,7 +359,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) { u8 monIndex = gTasks[taskId].tExpTask_monId; s32 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battler = gTasks[taskId].tExpTask_bank; struct Pokemon *mon = &gPlayerParty[monIndex]; u8 level = GetMonData(mon, MON_DATA_LEVEL); u16 species = GetMonData(mon, MON_DATA_SPECIES); @@ -369,7 +369,7 @@ static void Task_PrepareToGiveExpWithExpBar(u8 taskId) exp -= currLvlExp; expToNextLvl = gExperienceTables[gSpeciesInfo[species].growthRate][level + 1] - currLvlExp; - SetBattleBarStruct(battlerId, gHealthboxSpriteIds[battlerId], expToNextLvl, exp, -gainedExp); + SetBattleBarStruct(battler, gHealthboxSpriteIds[battler], expToNextLvl, exp, -gainedExp); PlaySE(SE_EXP); gTasks[taskId].func = Task_GiveExpWithExpBar; } @@ -384,11 +384,11 @@ static void Task_GiveExpWithExpBar(u8 taskId) { u8 monId = gTasks[taskId].tExpTask_monId; s16 gainedExp = gTasks[taskId].tExpTask_gainedExp; - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battler = gTasks[taskId].tExpTask_bank; s16 r4; - r4 = MoveBattleBar(battlerId, gHealthboxSpriteIds[battlerId], EXP_BAR, 0); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battlerId]); + r4 = MoveBattleBar(battler, gHealthboxSpriteIds[battler], EXP_BAR, 0); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); if (r4 == -1) { u8 level; @@ -410,7 +410,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) CalculateMonStats(&gPlayerParty[monId]); gainedExp -= expOnNextLvl - currExp; savedActiveBank = gActiveBattler; - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, RET_VALUE_LEVELED_UP, gainedExp); gActiveBattler = savedActiveBank; gTasks[taskId].func = Task_LaunchLvlUpAnim; @@ -419,7 +419,7 @@ static void Task_GiveExpWithExpBar(u8 taskId) { currExp += gainedExp; SetMonData(&gPlayerParty[monId], MON_DATA_EXP, &currExp); - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } } @@ -428,30 +428,30 @@ static void Task_GiveExpWithExpBar(u8 taskId) static void Task_LaunchLvlUpAnim(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battler = gTasks[taskId].tExpTask_bank; u8 monIndex = gTasks[taskId].tExpTask_monId; - if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]) - battlerId ^= BIT_FLANK; + if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]) + battler ^= BIT_FLANK; - InitAndLaunchSpecialAnimation(battlerId, battlerId, battlerId, B_ANIM_LVL_UP); + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_LVL_UP); gTasks[taskId].func = Task_UpdateLvlInHealthbox; } static void Task_UpdateLvlInHealthbox(u8 taskId) { - u8 battlerId = gTasks[taskId].tExpTask_bank; + u8 battler = gTasks[taskId].tExpTask_bank; - if (!gBattleSpritesDataPtr->healthBoxesData[battlerId].specialAnimActive) + if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive) { u8 monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value - if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battlerId)]) - UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battlerId)], &gPlayerParty[monIndex], HEALTHBOX_ALL); + if (IsDoubleBattle() == TRUE && monIndex == gBattlerPartyIndexes[BATTLE_PARTNER(battler)]) + UpdateHealthboxAttribute(gHealthboxSpriteIds[BATTLE_PARTNER(battler)], &gPlayerParty[monIndex], HEALTHBOX_ALL); else - UpdateHealthboxAttribute(gHealthboxSpriteIds[battlerId], &gPlayerParty[monIndex], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], &gPlayerParty[monIndex], HEALTHBOX_ALL); gTasks[taskId].func = DestroyExpTaskAndCompleteOnInactiveTextPrinter; } @@ -460,12 +460,12 @@ static void Task_UpdateLvlInHealthbox(u8 taskId) static void DestroyExpTaskAndCompleteOnInactiveTextPrinter(u8 taskId) { u8 monIndex; - u8 battlerId; + u8 battler; monIndex = gTasks[taskId].tExpTask_monId; GetMonData(&gPlayerParty[monIndex], MON_DATA_LEVEL); // Unused return value - battlerId = gTasks[taskId].tExpTask_bank; - gBattlerControllerFuncs[battlerId] = CompleteOnInactiveTextPrinter; + battler = gTasks[taskId].tExpTask_bank; + gBattlerControllerFuncs[battler] = CompleteOnInactiveTextPrinter; DestroyTask(taskId); } @@ -1220,35 +1220,35 @@ static void PlayerPartnerHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite( + gBattlerSpriteIds[battler] = CreateSprite( &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void PlayerPartnerHandleReturnMonToBall(void) @@ -1623,11 +1623,11 @@ static void PlayerPartnerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1c73b65913..8178e51d01 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -92,7 +92,7 @@ static void RecordedOpponentBufferExecCompleted(void); static void SwitchIn_HandleSoundAndEnd(void); static u32 CopyRecordedOpponentMonData(u8 monId, u8 *dst); static void SetRecordedOpponentMonData(u8 monId); -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void RecordedOpponentDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); @@ -1127,35 +1127,35 @@ static void RecordedOpponentHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite(&gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_OPPONENT_SENDOUT); } static void RecordedOpponentHandleReturnMonToBall(void) @@ -1477,11 +1477,11 @@ static void RecordedOpponentHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gEnemyParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 4026aa728f..f11a759148 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -88,7 +88,7 @@ static void RecordedPlayerBufferExecCompleted(void); static void SwitchIn_WaitAndEnd(void); static u32 CopyRecordedPlayerMonData(u8 monId, u8 *dst); static void SetRecordedPlayerMonData(u8 monId); -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit); +static void StartSendOutAnim(u8 battler, bool8 dontClearSubstituteBit); static void DoSwitchOutAnimation(void); static void RecordedPlayerDoMoveAnimation(void); static void Task_StartSendOutAnim(u8 taskId); @@ -1111,35 +1111,35 @@ static void RecordedPlayerHandleSwitchInAnim(void) gBattlerControllerFuncs[gActiveBattler] = SwitchIn_TryShinyAnim; } -static void StartSendOutAnim(u8 battlerId, bool8 dontClearSubstituteBit) +static void StartSendOutAnim(u8 battler, 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)); + ClearTemporarySpeciesSpriteData(battler, dontClearSubstituteBit); + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); - gBattlerSpriteIds[battlerId] = CreateSprite( + gBattlerSpriteIds[battler] = CreateSprite( &gMultiuseSpriteTemplate, - GetBattlerSpriteCoord(battlerId, BATTLER_COORD_X_2), - GetBattlerSpriteDefault_Y(battlerId), - GetBattlerSpriteSubpriority(battlerId)); + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); - gSprites[gBattleControllerData[battlerId]].data[1] = gBattlerSpriteIds[battlerId]; - gSprites[gBattleControllerData[battlerId]].data[2] = battlerId; + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; - gSprites[gBattlerSpriteIds[battlerId]].data[0] = battlerId; - gSprites[gBattlerSpriteIds[battlerId]].data[2] = species; - gSprites[gBattlerSpriteIds[battlerId]].oam.paletteNum = battlerId; + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battlerId]], gBattleMonForms[battlerId]); + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); - gSprites[gBattlerSpriteIds[battlerId]].invisible = TRUE; - gSprites[gBattlerSpriteIds[battlerId]].callback = SpriteCallbackDummy; + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; - gSprites[gBattleControllerData[battlerId]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void RecordedPlayerHandleReturnMonToBall(void) @@ -1504,11 +1504,11 @@ static void RecordedPlayerHandleStatusIconUpdate(void) { if (!IsBattleSEPlaying(gActiveBattler)) { - u8 battlerId; + u8 battler; UpdateHealthboxAttribute(gHealthboxSpriteIds[gActiveBattler], &gPlayerParty[gBattlerPartyIndexes[gActiveBattler]], HEALTHBOX_STATUS_ICON); - battlerId = gActiveBattler; - gBattleSpritesDataPtr->healthBoxesData[battlerId].statusAnimActive = 0; + battler = gActiveBattler; + gBattleSpritesDataPtr->healthBoxesData[battler].statusAnimActive = 0; gBattlerControllerFuncs[gActiveBattler] = CompleteOnFinishedStatusAnimation; } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 5715c522f5..11d7a851f4 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -1458,31 +1458,31 @@ static void WallyHandleIntroTrainerBallThrow(void) gBattlerControllerFuncs[gActiveBattler] = BattleControllerDummy; } -static void StartSendOutAnim(u8 battlerId) +static void StartSendOutAnim(u8 battler) { u16 species; - gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = 0; - 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[gBattleControllerData[battlerId]].data[2] = 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); + gBattleSpritesDataPtr->battlerData[battler].transformSpecies = 0; + gBattlerPartyIndexes[battler] = gBattleBufferA[battler][1]; + species = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES); + gBattleControllerData[battler] = CreateInvisibleSpriteWithCallback(SpriteCB_WaitForBattlerBallReleaseAnim); + SetMultiuseSpriteTemplateToPokemon(species, GetBattlerPosition(battler)); + gBattlerSpriteIds[battler] = CreateSprite(&gMultiuseSpriteTemplate, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X_2), + GetBattlerSpriteDefault_Y(battler), + GetBattlerSpriteSubpriority(battler)); + + gSprites[gBattleControllerData[battler]].data[1] = gBattlerSpriteIds[battler]; + gSprites[gBattleControllerData[battler]].data[2] = battler; + + gSprites[gBattlerSpriteIds[battler]].data[0] = battler; + gSprites[gBattlerSpriteIds[battler]].data[2] = species; + gSprites[gBattlerSpriteIds[battler]].oam.paletteNum = battler; + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], gBattleMonForms[battler]); + gSprites[gBattlerSpriteIds[battler]].invisible = TRUE; + gSprites[gBattlerSpriteIds[battler]].callback = SpriteCallbackDummy; + gSprites[gBattleControllerData[battler]].data[0] = DoPokeballSendOutAnimation(0, POKEBALL_PLAYER_SENDOUT); } static void Task_StartSendOutAnim(u8 taskId) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 559fa8604b..76f763909a 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -736,10 +736,10 @@ void PrepareBufferDataTransferLink(u8 bufferId, u16 size, u8 *data) gTasks[sLinkSendTaskId].tCurrentBlock_WrapFrom = gTasks[sLinkSendTaskId].tCurrentBlock_End; gTasks[sLinkSendTaskId].tCurrentBlock_End = 0; } - + #define BYTE_TO_SEND(offset) \ gLinkBattleSendBuffer[gTasks[sLinkSendTaskId].tCurrentBlock_End + offset] - + BYTE_TO_SEND(LINK_BUFF_BUFFER_ID) = bufferId; BYTE_TO_SEND(LINK_BUFF_ACTIVE_BATTLER) = gActiveBattler; BYTE_TO_SEND(LINK_BUFF_ATTACKER) = gBattlerAttacker; @@ -770,7 +770,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) { u16 numPlayers; u16 blockSize; - + #define BYTE_TO_SEND(offset) \ gLinkBattleSendBuffer[gTasks[taskId].tCurrentBlock_Start + offset] @@ -850,7 +850,7 @@ static void Task_HandleSendLinkBuffersData(u8 taskId) } break; } - + #undef BYTE_TO_SEND } @@ -903,9 +903,9 @@ void TryReceiveLinkBattleData(void) static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) { u16 blockSize; - u8 battlerId; + u8 battler; u8 playerId; - + #define BYTE_TO_RECEIVE(offset) \ gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + offset] @@ -917,17 +917,17 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) gTasks[taskId].tCurrentBlock_WrapFrom = 0; gTasks[taskId].tCurrentBlock_Start = 0; } - battlerId = BYTE_TO_RECEIVE(LINK_BUFF_ACTIVE_BATTLER); + battler = BYTE_TO_RECEIVE(LINK_BUFF_ACTIVE_BATTLER); blockSize = BYTE_TO_RECEIVE(LINK_BUFF_SIZE_LO) | (BYTE_TO_RECEIVE(LINK_BUFF_SIZE_HI) << 8); switch (BYTE_TO_RECEIVE(0)) { case B_COMM_TO_CONTROLLER: - if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId)) + if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler)) return; - memcpy(gBattleBufferA[battlerId], &BYTE_TO_RECEIVE(LINK_BUFF_DATA), blockSize); - MarkBattlerReceivedLinkData(battlerId); + memcpy(gBattleBufferA[battler], &BYTE_TO_RECEIVE(LINK_BUFF_DATA), blockSize); + MarkBattlerReceivedLinkData(battler); if (!(gBattleTypeFlags & BATTLE_TYPE_IS_MASTER)) { @@ -938,17 +938,17 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) } break; case B_COMM_TO_ENGINE: - memcpy(gBattleBufferB[battlerId], &gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + LINK_BUFF_DATA], blockSize); + memcpy(gBattleBufferB[battler], &gLinkBattleRecvBuffer[gTasks[taskId].tCurrentBlock_Start + LINK_BUFF_DATA], blockSize); break; case B_COMM_CONTROLLER_IS_DONE: playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); - MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battlerId, playerId); + MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId); break; } gTasks[taskId].tCurrentBlock_Start = gTasks[taskId].tCurrentBlock_Start + blockSize + LINK_BUFF_DATA; } - + #undef BYTE_TO_RECEIVE } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 63a466af25..9181b82667 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -551,13 +551,13 @@ bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) } // Check if SE has finished or 30 calls, whichever comes first -bool8 IsBattleSEPlaying(u8 battlerId) +bool8 IsBattleSEPlaying(u8 battler) { u8 zero = 0; if (IsSEPlaying()) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer++; + gBattleSpritesDataPtr->healthBoxesData[battler].soundTimer++; if (gBattleSpritesDataPtr->healthBoxesData[gActiveBattler].soundTimer < 30) return TRUE; @@ -566,7 +566,7 @@ bool8 IsBattleSEPlaying(u8 battlerId) } if (zero == 0) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].soundTimer = 0; + gBattleSpritesDataPtr->healthBoxesData[battler].soundTimer = 0; return FALSE; } @@ -574,7 +574,7 @@ bool8 IsBattleSEPlaying(u8 battlerId) return TRUE; } -void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) +void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battler) { u32 monsPersonality, currentPersonality, otId; u16 species; @@ -584,50 +584,50 @@ void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battlerId) monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); currentPersonality = monsPersonality; } else { - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; - currentPersonality = gTransformedPersonalities[battlerId]; + species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; + currentPersonality = gTransformedPersonalities[battler]; } otId = GetMonData(mon, MON_DATA_OT_ID); - position = GetBattlerPosition(battlerId); + position = GetBattlerPosition(battler); HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonFrontPicTable[species], gMonSpritesGfxPtr->sprites.ptr[position], species, currentPersonality); - paletteOffset = OBJ_PLTT_ID(battlerId); + paletteOffset = OBJ_PLTT_ID(battler); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) lzPaletteData = GetMonFrontSpritePal(mon); else lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); + LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); if (species == SPECIES_CASTFORM) { - paletteOffset = OBJ_PLTT_ID(battlerId); + paletteOffset = OBJ_PLTT_ID(battler); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette); - LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP); + LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battler]], paletteOffset, PLTT_SIZE_4BPP); } // transform's white color - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); } } -void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) +void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battler) { u32 monsPersonality, currentPersonality, otId; u16 species; @@ -637,21 +637,21 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) monsPersonality = GetMonData(mon, MON_DATA_PERSONALITY); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) { species = GetMonData(mon, MON_DATA_SPECIES); currentPersonality = monsPersonality; } else { - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; - currentPersonality = gTransformedPersonalities[battlerId]; + species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; + currentPersonality = gTransformedPersonalities[battler]; } otId = GetMonData(mon, MON_DATA_OT_ID); - position = GetBattlerPosition(battlerId); + position = GetBattlerPosition(battler); - if (ShouldIgnoreDeoxysForm(1, battlerId) == TRUE || gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (ShouldIgnoreDeoxysForm(1, battler) == TRUE || gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) { HandleLoadSpecialPokePic_DontHandleDeoxys(&gMonBackPicTable[species], gMonSpritesGfxPtr->sprites.ptr[position], @@ -664,26 +664,26 @@ void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battlerId) species, currentPersonality); } - paletteOffset = OBJ_PLTT_ID(battlerId); + paletteOffset = OBJ_PLTT_ID(battler); - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies == SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies == SPECIES_NONE) lzPaletteData = GetMonFrontSpritePal(mon); else lzPaletteData = GetMonSpritePalFromSpeciesAndPersonality(species, otId, monsPersonality); LZDecompressWram(lzPaletteData, gDecompressionBuffer); LoadPalette(gDecompressionBuffer, paletteOffset, PLTT_SIZE_4BPP); - LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battlerId), PLTT_SIZE_4BPP); + LoadPalette(gDecompressionBuffer, BG_PLTT_ID(8) + BG_PLTT_ID(battler), PLTT_SIZE_4BPP); if (species == SPECIES_CASTFORM) { - paletteOffset = OBJ_PLTT_ID(battlerId); + paletteOffset = OBJ_PLTT_ID(battler); LZDecompressWram(lzPaletteData, gBattleStruct->castformPalette); - LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battlerId]], paletteOffset, PLTT_SIZE_4BPP); + LoadPalette(gBattleStruct->castformPalette[gBattleMonForms[battler]], paletteOffset, PLTT_SIZE_4BPP); } // transform's pink color - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) { BlendPalette(paletteOffset, 16, 6, RGB_WHITE); CpuCopy32(&gPlttBufferFaded[paletteOffset], &gPlttBufferUnfaded[paletteOffset], PLTT_SIZEOF(16)); @@ -698,23 +698,23 @@ void BattleGfxSfxDummy2(u16 species) { } -void DecompressTrainerFrontPic(u16 frontPicId, u8 battlerId) +void DecompressTrainerFrontPic(u16 frontPicId, u8 battler) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); DecompressPicFromTable_2(&gTrainerFrontPicTable[frontPicId], gMonSpritesGfxPtr->sprites.ptr[position], SPECIES_NONE); LoadCompressedSpritePalette(&gTrainerFrontPicPaletteTable[frontPicId]); } -void DecompressTrainerBackPic(u16 backPicId, u8 battlerId) +void DecompressTrainerBackPic(u16 backPicId, u8 battler) { - u8 position = GetBattlerPosition(battlerId); + u8 position = GetBattlerPosition(battler); DecompressPicFromTable_2(&gTrainerBackPicTable[backPicId], gMonSpritesGfxPtr->sprites.ptr[position], SPECIES_NONE); LoadCompressedPalette(gTrainerBackPicPaletteTable[backPicId].data, - OBJ_PLTT_ID(battlerId), PLTT_SIZE_4BPP); + OBJ_PLTT_ID(battler), PLTT_SIZE_4BPP); } void BattleGfxSfxDummy3(u8 gender) @@ -820,7 +820,7 @@ void LoadBattleBarGfx(u8 unused) LZDecompressWram(gBattleInterfaceGfx_BattleBar, gMonSpritesGfxPtr->barFontGfx); } -bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId) +bool8 BattleInitAllSprites(u8 *state1, u8 *battler) { bool8 retVal = FALSE; @@ -831,13 +831,13 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId) (*state1)++; break; case 1: - if (!BattleLoadAllHealthBoxesGfx(*battlerId)) + if (!BattleLoadAllHealthBoxesGfx(*battler)) { - (*battlerId)++; + (*battler)++; } else { - *battlerId = 0; + *battler = 0; (*state1)++; } break; @@ -845,47 +845,47 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battlerId) (*state1)++; break; case 3: - if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *battlerId == 0) - gHealthboxSpriteIds[*battlerId] = CreateSafariPlayerHealthboxSprites(); + if ((gBattleTypeFlags & BATTLE_TYPE_SAFARI) && *battler == 0) + gHealthboxSpriteIds[*battler] = CreateSafariPlayerHealthboxSprites(); else - gHealthboxSpriteIds[*battlerId] = CreateBattlerHealthboxSprites(*battlerId); + gHealthboxSpriteIds[*battler] = CreateBattlerHealthboxSprites(*battler); - (*battlerId)++; - if (*battlerId == gBattlersCount) + (*battler)++; + if (*battler == gBattlersCount) { - *battlerId = 0; + *battler = 0; (*state1)++; } break; case 4: - InitBattlerHealthboxCoords(*battlerId); - if (gBattlerPositions[*battlerId] <= B_POSITION_OPPONENT_LEFT) - DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], FALSE); + InitBattlerHealthboxCoords(*battler); + if (gBattlerPositions[*battler] <= B_POSITION_OPPONENT_LEFT) + DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battler], FALSE); else - DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battlerId], TRUE); + DummyBattleInterfaceFunc(gHealthboxSpriteIds[*battler], TRUE); - (*battlerId)++; - if (*battlerId == gBattlersCount) + (*battler)++; + if (*battler == gBattlersCount) { - *battlerId = 0; + *battler = 0; (*state1)++; } break; case 5: - if (GetBattlerSide(*battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(*battler) == B_SIDE_PLAYER) { if (!(gBattleTypeFlags & BATTLE_TYPE_SAFARI)) - UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gPlayerParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], &gPlayerParty[gBattlerPartyIndexes[*battler]], HEALTHBOX_ALL); } else { - UpdateHealthboxAttribute(gHealthboxSpriteIds[*battlerId], &gEnemyParty[gBattlerPartyIndexes[*battlerId]], HEALTHBOX_ALL); + UpdateHealthboxAttribute(gHealthboxSpriteIds[*battler], &gEnemyParty[gBattlerPartyIndexes[*battler]], HEALTHBOX_ALL); } - SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battlerId]); - (*battlerId)++; - if (*battlerId == gBattlersCount) + SetHealthboxSpriteInvisible(gHealthboxSpriteIds[*battler]); + (*battler)++; + if (*battler == gBattlersCount) { - *battlerId = 0; + *battler = 0; (*state1)++; } break; @@ -919,9 +919,9 @@ void CopyAllBattleSpritesInvisibilities(void) gBattleSpritesDataPtr->battlerData[i].invisible = gSprites[gBattlerSpriteIds[i]].invisible; } -void CopyBattleSpriteInvisibility(u8 battlerId) +void CopyBattleSpriteInvisibility(u8 battler) { - gBattleSpritesDataPtr->battlerData[battlerId].invisible = gSprites[gBattlerSpriteIds[battlerId]].invisible; + gBattleSpritesDataPtr->battlerData[battler].invisible = gSprites[gBattlerSpriteIds[battler]].invisible; } void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform) @@ -1023,7 +1023,7 @@ void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform) } } -void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) +void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite) { s32 i, position, palOffset; @@ -1032,11 +1032,11 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) if (IsContest()) position = B_POSITION_PLAYER_LEFT; else - position = GetBattlerPosition(battlerId); + position = GetBattlerPosition(battler); if (IsContest()) LZDecompressVram(gSubstituteDollBackGfx, gMonSpritesGfxPtr->sprites.ptr[position]); - else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + else if (GetBattlerSide(battler) != B_SIDE_PLAYER) LZDecompressVram(gSubstituteDollFrontGfx, gMonSpritesGfxPtr->sprites.ptr[position]); else LZDecompressVram(gSubstituteDollBackGfx, gMonSpritesGfxPtr->sprites.ptr[position]); @@ -1046,66 +1046,66 @@ void BattleLoadSubstituteOrMonSpriteGfx(u8 battlerId, bool8 loadMonSprite) Dma3CopyLarge32_(gMonSpritesGfxPtr->sprites.ptr[position], &gMonSpritesGfxPtr->sprites.byte[position][MON_PIC_SIZE * i], MON_PIC_SIZE); } - palOffset = OBJ_PLTT_ID(battlerId); + palOffset = OBJ_PLTT_ID(battler); LoadCompressedPalette(gSubstituteDollPal, palOffset, PLTT_SIZE_4BPP); } else { if (!IsContest()) { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battlerId]], battlerId); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + BattleLoadOpponentMonSpriteGfx(&gEnemyParty[gBattlerPartyIndexes[battler]], battler); else - BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battlerId]], battlerId); + BattleLoadPlayerMonSpriteGfx(&gPlayerParty[gBattlerPartyIndexes[battler]], battler); } } } -void LoadBattleMonGfxAndAnimate(u8 battlerId, bool8 loadMonSprite, u8 spriteId) +void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId) { - BattleLoadSubstituteOrMonSpriteGfx(battlerId, loadMonSprite); - StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[battlerId]); + BattleLoadSubstituteOrMonSpriteGfx(battler, loadMonSprite); + StartSpriteAnim(&gSprites[spriteId], gBattleMonForms[battler]); if (!loadMonSprite) - gSprites[spriteId].y = GetSubstituteSpriteDefault_Y(battlerId); + gSprites[spriteId].y = GetSubstituteSpriteDefault_Y(battler); else - gSprites[spriteId].y = GetBattlerSpriteDefault_Y(battlerId); + gSprites[spriteId].y = GetBattlerSpriteDefault_Y(battler); } -void TrySetBehindSubstituteSpriteBit(u8 battlerId, u16 move) +void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move) { if (move == MOVE_SUBSTITUTE) - gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 1; + gBattleSpritesDataPtr->battlerData[battler].behindSubstitute = 1; } -void ClearBehindSubstituteBit(u8 battlerId) +void ClearBehindSubstituteBit(u8 battler) { - gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute = 0; + gBattleSpritesDataPtr->battlerData[battler].behindSubstitute = 0; } -void HandleLowHpMusicChange(struct Pokemon *mon, u8 battlerId) +void HandleLowHpMusicChange(struct Pokemon *mon, u8 battler) { 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[battler].lowHpSong) { - if (!gBattleSpritesDataPtr->battlerData[BATTLE_PARTNER(battlerId)].lowHpSong) + if (!gBattleSpritesDataPtr->battlerData[BATTLE_PARTNER(battler)].lowHpSong) PlaySE(SE_LOW_HEALTH); - gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 1; + gBattleSpritesDataPtr->battlerData[battler].lowHpSong = 1; } } else { - gBattleSpritesDataPtr->battlerData[battlerId].lowHpSong = 0; + gBattleSpritesDataPtr->battlerData[battler].lowHpSong = 0; if (!IsDoubleBattle()) { m4aSongNumStop(SE_LOW_HEALTH); return; } - if (IsDoubleBattle() && !gBattleSpritesDataPtr->battlerData[BATTLE_PARTNER(battlerId)].lowHpSong) + if (IsDoubleBattle() && !gBattleSpritesDataPtr->battlerData[BATTLE_PARTNER(battler)].lowHpSong) { m4aSongNumStop(SE_LOW_HEALTH); return; @@ -1174,46 +1174,46 @@ void SetBattlerSpriteAffineMode(u8 affineMode) void LoadAndCreateEnemyShadowSprites(void) { - u8 battlerId; + u8 battler; LoadCompressedSpriteSheet(&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, + battler = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); + gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X), + GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 29, 0xC8); - gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId].data[0] = battler; 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, + battler = GetBattlerAtPosition(B_POSITION_OPPONENT_RIGHT); + gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId = CreateSprite(&gSpriteTemplate_EnemyShadow, + GetBattlerSpriteCoord(battler, BATTLER_COORD_X), + GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 29, 0xC8); - gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].data[0] = battlerId; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId].data[0] = battler; } } void SpriteCB_EnemyShadow(struct Sprite *shadowSprite) { bool8 invisible = FALSE; - u8 battlerId = shadowSprite->tBattlerId; - struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battlerId]]; + u8 battler = shadowSprite->tBattlerId; + struct Sprite *battlerSprite = &gSprites[gBattlerSpriteIds[battler]]; - if (!battlerSprite->inUse || !IsBattlerSpritePresent(battlerId)) + if (!battlerSprite->inUse || !IsBattlerSpritePresent(battler)) { 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) + else if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE + && gEnemyMonElevation[gBattleSpritesDataPtr->battlerData[battler].transformSpecies] == 0) invisible = TRUE; - if (gBattleSpritesDataPtr->battlerData[battlerId].behindSubstitute) + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) invisible = TRUE; shadowSprite->x = battlerSprite->x; @@ -1228,24 +1228,24 @@ void SpriteCB_SetInvisible(struct Sprite *sprite) sprite->invisible = TRUE; } -void SetBattlerShadowSpriteCallback(u8 battlerId, u16 species) +void SetBattlerShadowSpriteCallback(u8 battler, u16 species) { // The player's shadow is never seen. - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) return; - if (gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies != SPECIES_NONE) - species = gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies; + if (gBattleSpritesDataPtr->battlerData[battler].transformSpecies != SPECIES_NONE) + species = gBattleSpritesDataPtr->battlerData[battler].transformSpecies; if (gEnemyMonElevation[species] != 0) - gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_EnemyShadow; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId].callback = SpriteCB_EnemyShadow; else - gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId].callback = SpriteCB_SetInvisible; } -void HideBattlerShadowSprite(u8 battlerId) +void HideBattlerShadowSprite(u8 battler) { - gSprites[gBattleSpritesDataPtr->healthBoxesData[battlerId].shadowSpriteId].callback = SpriteCB_SetInvisible; + gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteId].callback = SpriteCB_SetInvisible; } // Color the background tiles surrounding the action selection and move windows @@ -1272,12 +1272,12 @@ void FillAroundBattleWindows(void) } } -void ClearTemporarySpeciesSpriteData(u8 battlerId, bool8 dontClearSubstitute) +void ClearTemporarySpeciesSpriteData(u8 battler, bool8 dontClearSubstitute) { - gBattleSpritesDataPtr->battlerData[battlerId].transformSpecies = SPECIES_NONE; - gBattleMonForms[battlerId] = 0; + gBattleSpritesDataPtr->battlerData[battler].transformSpecies = SPECIES_NONE; + gBattleMonForms[battler] = 0; if (!dontClearSubstitute) - ClearBehindSubstituteBit(battlerId); + ClearBehindSubstituteBit(battler); } void AllocateMonSpritesGfx(void) diff --git a/src/battle_interface.c b/src/battle_interface.c index a417be4a72..4262ceeb93 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -866,7 +866,7 @@ static void UNUSED Debug_DrawNumberPair(s16 number1, s16 number2, u16 *dest) #define hBar_HealthBoxSpriteId data[5] #define hBar_Data6 data[6] -u8 CreateBattlerHealthboxSprites(u8 battlerId) +u8 CreateBattlerHealthboxSprites(u8 battler) { s16 data6 = 0; u8 healthboxLeftSpriteId, healthboxRightSpriteId; @@ -875,7 +875,7 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) if (!IsDoubleBattle()) { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[0], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); @@ -901,10 +901,10 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) } else { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { - healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxPlayerSpriteTemplates[GetBattlerPosition(battler) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; @@ -916,8 +916,8 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) } else { - healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); - healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battlerId) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxLeftSpriteId = CreateSprite(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); + healthboxRightSpriteId = CreateSpriteAtEnd(&sHealthboxOpponentSpriteTemplates[GetBattlerPosition(battler) / 2], DISPLAY_WIDTH, DISPLAY_HEIGHT, 1); gSprites[healthboxLeftSpriteId].oam.affineParam = healthboxRightSpriteId; @@ -929,16 +929,16 @@ u8 CreateBattlerHealthboxSprites(u8 battlerId) } } - healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battlerId]], 140, 60, 0); + healthbarSpriteId = CreateSpriteAtEnd(&sHealthbarSpriteTemplates[gBattlerPositions[battler]], 140, 60, 0); healthBarSpritePtr = &gSprites[healthbarSpriteId]; - SetSubspriteTables(healthBarSpritePtr, &sHealthBar_SubspriteTables[GetBattlerSide(battlerId)]); + SetSubspriteTables(healthBarSpritePtr, &sHealthBar_SubspriteTables[GetBattlerSide(battler)]); healthBarSpritePtr->subspriteMode = SUBSPRITES_IGNORE_PRIORITY; healthBarSpritePtr->oam.priority = 1; CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + healthBarSpritePtr->oam.tileNum * TILE_SIZE_4BPP), 64); gSprites[healthboxLeftSpriteId].hMain_HealthBarSpriteId = healthbarSpriteId; - gSprites[healthboxLeftSpriteId].hMain_Battler = battlerId; + gSprites[healthboxLeftSpriteId].hMain_Battler = battler; gSprites[healthboxLeftSpriteId].invisible = TRUE; gSprites[healthboxRightSpriteId].invisible = TRUE; @@ -1012,13 +1012,13 @@ static void SpriteCB_HealthBoxOther(struct Sprite *sprite) sprite->y2 = gSprites[healthboxMainSpriteId].y2; } -void SetBattleBarStruct(u8 battlerId, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue) +void SetBattleBarStruct(u8 battler, 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; + gBattleSpritesDataPtr->battleBars[battler].healthboxSpriteId = healthboxSpriteId; + gBattleSpritesDataPtr->battleBars[battler].maxValue = maxVal; + gBattleSpritesDataPtr->battleBars[battler].oldValue = oldVal; + gBattleSpritesDataPtr->battleBars[battler].receivedValue = receivedValue; + gBattleSpritesDataPtr->battleBars[battler].currValue = -32768; } void SetHealthboxSpriteInvisible(u8 healthboxSpriteId) @@ -1251,12 +1251,12 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 } else { - u8 battlerId; + u8 battler; memcpy(text, sEmptyWhiteText_TransparentHighlight, sizeof(sEmptyWhiteText_TransparentHighlight)); - battlerId = gSprites[healthboxSpriteId].hMain_Battler; + battler = gSprites[healthboxSpriteId].hMain_Battler; - if (gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) // don't print text if only bars are visible + if (gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars) // don't print text if only bars are visible { u8 var = 4; u8 r7; @@ -1297,7 +1297,7 @@ static void UpdateHpTextInHealthboxInDoubles(u8 healthboxSpriteId, s16 value, u8 } else { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) // Impossible to reach part, because the battlerId is from the opponent's side. + if (GetBattlerSide(battler) == B_SIDE_PLAYER) // Impossible to reach part, because the battler is from the opponent's side. { CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_FRAME_END), (void *)(OBJ_VRAM0) + ((gSprites[healthboxSpriteId].oam.tileNum + 52) * TILE_SIZE_4BPP), @@ -1447,7 +1447,7 @@ void SwapHpBarsWithHpText(void) #define tIsBattleStart data[10] #define tBlend data[15] -u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, bool8 skipPlayer, bool8 isBattleStart) +u8 CreatePartyStatusSummarySprites(u8 battler, struct HpAndStatus *partyInfo, bool8 skipPlayer, bool8 isBattleStart) { bool8 isOpponent; s16 bar_X, bar_Y, bar_pos2_X, bar_data0; @@ -1456,9 +1456,9 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, u8 ballIconSpritesIds[PARTY_SIZE]; u8 taskId; - if (!skipPlayer || GetBattlerPosition(battlerId) != B_POSITION_OPPONENT_RIGHT) + if (!skipPlayer || GetBattlerPosition(battler) != B_POSITION_OPPONENT_RIGHT) { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { isOpponent = FALSE; bar_X = 136, bar_Y = 96; @@ -1537,7 +1537,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, gSprites[ballIconSpritesIds[i]].data[2] = isOpponent; } - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -1650,7 +1650,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, } taskId = CreateTask(TaskDummy, 5); - gTasks[taskId].tBattler = battlerId; + gTasks[taskId].tBattler = battler; gTasks[taskId].tSummaryBarSpriteId = summaryBarSpriteId; for (i = 0; i < PARTY_SIZE; i++) @@ -1673,12 +1673,12 @@ void Task_HidePartyStatusSummary(u8 taskId) u8 ballIconSpriteIds[PARTY_SIZE]; bool8 isBattleStart; u8 summaryBarSpriteId; - u8 battlerId; + u8 battler; s32 i; isBattleStart = gTasks[taskId].tIsBattleStart; summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; - battlerId = gTasks[taskId].tBattler; + battler = gTasks[taskId].tBattler; for (i = 0; i < PARTY_SIZE; i++) ballIconSpriteIds[i] = gTasks[taskId].tBallIconSpriteId(i); @@ -1697,7 +1697,7 @@ void Task_HidePartyStatusSummary(u8 taskId) { for (i = 0; i < PARTY_SIZE; i++) { - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].data[1] = 7 * i; gSprites[ballIconSpriteIds[PARTY_SIZE - 1 - i]].data[3] = 0; @@ -1742,7 +1742,7 @@ static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId) u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; - u8 battlerId = gTasks[taskId].tBattler; + u8 battler = gTasks[taskId].tBattler; if (--gTasks[taskId].tBlend == -1) { u8 summaryBarSpriteId = gTasks[taskId].tSummaryBarSpriteId; @@ -1769,7 +1769,7 @@ static void Task_HidePartyStatusSummary_BattleStart_2(u8 taskId) } else if (gTasks[taskId].tBlend == -3) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0; + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); @@ -1780,7 +1780,7 @@ static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId) { u8 ballIconSpriteIds[PARTY_SIZE]; s32 i; - u8 battlerId = gTasks[taskId].tBattler; + u8 battler = gTasks[taskId].tBattler; if (--gTasks[taskId].tBlend >= 0) { @@ -1801,7 +1801,7 @@ static void Task_HidePartyStatusSummary_DuringBattle(u8 taskId) } else if (gTasks[taskId].tBlend == -3) { - gBattleSpritesDataPtr->healthBoxesData[battlerId].partyStatusSummaryShown = 0; + gBattleSpritesDataPtr->healthBoxesData[battler].partyStatusSummaryShown = 0; SetGpuReg(REG_OFFSET_BLDCNT, 0); SetGpuReg(REG_OFFSET_BLDALPHA, 0); DestroyTask(taskId); @@ -1969,17 +1969,17 @@ static void UpdateNickInHealthbox(u8 healthboxSpriteId, struct Pokemon *mon) static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) { - u8 battlerId, healthBarSpriteId; + u8 battler, healthBarSpriteId; if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) return; if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) return; - battlerId = gSprites[healthboxSpriteId].hMain_Battler; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + battler = gSprites[healthboxSpriteId].hMain_Battler; + if (GetBattlerSide(battler) == B_SIDE_PLAYER) return; - if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) + if (!GetSetPokedexFlag(SpeciesToNationalPokedexNum(GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES)), FLAG_GET_CAUGHT)) return; healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; @@ -1993,17 +1993,17 @@ static void TryAddPokeballIconToHealthbox(u8 healthboxSpriteId, bool8 noStatus) static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) { s32 i; - u8 battlerId, healthBarSpriteId; + u8 battler, healthBarSpriteId; u32 status, pltAdder; const u8 *statusGfxPtr; s16 tileNumAdder; u8 statusPalId; - battlerId = gSprites[healthboxSpriteId].hMain_Battler; + battler = gSprites[healthboxSpriteId].hMain_Battler; healthBarSpriteId = gSprites[healthboxSpriteId].hMain_HealthBarSpriteId; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { - status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); + status = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_STATUS); if (!IsDoubleBattle()) tileNumAdder = 0x1A; else @@ -2011,33 +2011,33 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) } else { - status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_STATUS); + status = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_STATUS); tileNumAdder = 0x11; } if (status & STATUS1_SLEEP) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_SLP_BATTLER0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_SLP_BATTLER0, battler)); statusPalId = PAL_STATUS_SLP; } else if (status & STATUS1_PSN_ANY) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PSN_BATTLER0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PSN_BATTLER0, battler)); statusPalId = PAL_STATUS_PSN; } else if (status & STATUS1_BURN) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_BRN_BATTLER0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_BRN_BATTLER0, battler)); statusPalId = PAL_STATUS_BRN; } else if (status & STATUS1_FREEZE) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_FRZ_BATTLER0, battler)); statusPalId = PAL_STATUS_FRZ; } else if (status & STATUS1_PARALYSIS) { - statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, battlerId)); + statusGfxPtr = GetHealthboxElementGfxPtr(GetStatusIconForBattlerId(HEALTHBOX_GFX_STATUS_PRZ_BATTLER0, battler)); statusPalId = PAL_STATUS_PAR; } else @@ -2047,7 +2047,7 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) for (i = 0; i < 3; i++) CpuCopy32(statusGfxPtr, (void *)(OBJ_VRAM0 + (gSprites[healthboxSpriteId].oam.tileNum + tileNumAdder + i) * TILE_SIZE_4BPP), 32); - if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) + if (!gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars) CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_1), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 64); TryAddPokeballIconToHealthbox(healthboxSpriteId, TRUE); @@ -2055,14 +2055,14 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) } pltAdder = PLTT_ID(gSprites[healthboxSpriteId].oam.paletteNum); - pltAdder += battlerId + 12; + pltAdder += battler + 12; FillPalette(sStatusIconColors[statusPalId], OBJ_PLTT_OFFSET + pltAdder, 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), 96); - if (IsDoubleBattle() == TRUE || GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + if (IsDoubleBattle() == TRUE || GetBattlerSide(battler) == B_SIDE_OPPONENT) { - if (!gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars) + if (!gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars) { CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_0), (void *)(OBJ_VRAM0 + gSprites[healthBarSpriteId].oam.tileNum * TILE_SIZE_4BPP), 32); CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_65), (void *)(OBJ_VRAM0 + (gSprites[healthBarSpriteId].oam.tileNum + 1) * TILE_SIZE_4BPP), 32); @@ -2071,58 +2071,58 @@ static void UpdateStatusIconInHealthbox(u8 healthboxSpriteId) TryAddPokeballIconToHealthbox(healthboxSpriteId, FALSE); } -static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battlerId) +static u8 GetStatusIconForBattlerId(u8 statusElementId, u8 battler) { u8 ret = statusElementId; switch (statusElementId) { case HEALTHBOX_GFX_STATUS_PSN_BATTLER0: - if (battlerId == 0) + if (battler == 0) ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER0; - else if (battlerId == 1) + else if (battler == 1) ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER1; - else if (battlerId == 2) + else if (battler == 2) ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER2; else ret = HEALTHBOX_GFX_STATUS_PSN_BATTLER3; break; case HEALTHBOX_GFX_STATUS_PRZ_BATTLER0: - if (battlerId == 0) + if (battler == 0) ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER0; - else if (battlerId == 1) + else if (battler == 1) ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER1; - else if (battlerId == 2) + else if (battler == 2) ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER2; else ret = HEALTHBOX_GFX_STATUS_PRZ_BATTLER3; break; case HEALTHBOX_GFX_STATUS_SLP_BATTLER0: - if (battlerId == 0) + if (battler == 0) ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER0; - else if (battlerId == 1) + else if (battler == 1) ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER1; - else if (battlerId == 2) + else if (battler == 2) ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER2; else ret = HEALTHBOX_GFX_STATUS_SLP_BATTLER3; break; case HEALTHBOX_GFX_STATUS_FRZ_BATTLER0: - if (battlerId == 0) + if (battler == 0) ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER0; - else if (battlerId == 1) + else if (battler == 1) ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER1; - else if (battlerId == 2) + else if (battler == 2) ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER2; else ret = HEALTHBOX_GFX_STATUS_FRZ_BATTLER3; break; case HEALTHBOX_GFX_STATUS_BRN_BATTLER0: - if (battlerId == 0) + if (battler == 0) ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER0; - else if (battlerId == 1) + else if (battler == 1) ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER1; - else if (battlerId == 2) + else if (battler == 2) ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER2; else ret = HEALTHBOX_GFX_STATUS_BRN_BATTLER3; @@ -2163,10 +2163,10 @@ static void UpdateLeftNoOfBallsTextOnHealthbox(u8 healthboxSpriteId) void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elementId) { s32 maxHp, currHp; - u8 battlerId = gSprites[healthboxSpriteId].hMain_Battler; + u8 battler = gSprites[healthboxSpriteId].hMain_Battler; if (elementId == HEALTHBOX_ALL && !IsDoubleBattle()) - GetBattlerSide(battlerId); // Pointless function call. + GetBattlerSide(battler); // Pointless function call. if (GetBattlerSide(gSprites[healthboxSpriteId].hMain_Battler) == B_SIDE_PLAYER) { @@ -2183,8 +2183,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem 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); + SetBattleBarStruct(battler, healthboxSpriteId, maxHp, currHp, 0); + MoveBattleBar(battler, healthboxSpriteId, HEALTH_BAR, 0); } isDoubles = IsDoubleBattle(); if (!isDoubles && (elementId == HEALTHBOX_EXP_BAR || elementId == HEALTHBOX_ALL)) @@ -2201,8 +2201,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem 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); + SetBattleBarStruct(battler, healthboxSpriteId, maxExpBarValue, currExpBarValue, isDoubles); + MoveBattleBar(battler, healthboxSpriteId, EXP_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -2222,8 +2222,8 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem 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); + SetBattleBarStruct(battler, healthboxSpriteId, maxHp, currHp, 0); + MoveBattleBar(battler, healthboxSpriteId, HEALTH_BAR, 0); } if (elementId == HEALTHBOX_NICK || elementId == HEALTHBOX_ALL) UpdateNickInHealthbox(healthboxSpriteId, mon); @@ -2235,44 +2235,44 @@ void UpdateHealthboxAttribute(u8 healthboxSpriteId, struct Pokemon *mon, u8 elem #define B_EXPBAR_PIXELS 64 #define B_HEALTHBAR_PIXELS 48 -s32 MoveBattleBar(u8 battlerId, u8 healthboxSpriteId, u8 whichBar, u8 unused) +s32 MoveBattleBar(u8 battler, u8 healthboxSpriteId, u8 whichBar, u8 unused) { s32 currentBarValue; if (whichBar == HEALTH_BAR) // health bar { - currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].oldValue, - gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battler].maxValue, + gBattleSpritesDataPtr->battleBars[battler].oldValue, + gBattleSpritesDataPtr->battleBars[battler].receivedValue, + &gBattleSpritesDataPtr->battleBars[battler].currValue, B_HEALTHBAR_PIXELS / 8, 1); } else // exp bar { - u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battlerId].oldValue, - gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - gBattleSpritesDataPtr->battleBars[battlerId].maxValue, 8); + u16 expFraction = GetScaledExpFraction(gBattleSpritesDataPtr->battleBars[battler].oldValue, + gBattleSpritesDataPtr->battleBars[battler].receivedValue, + gBattleSpritesDataPtr->battleBars[battler].maxValue, 8); if (expFraction == 0) expFraction = 1; - expFraction = abs(gBattleSpritesDataPtr->battleBars[battlerId].receivedValue / expFraction); + expFraction = abs(gBattleSpritesDataPtr->battleBars[battler].receivedValue / expFraction); - currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].oldValue, - gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + currentBarValue = CalcNewBarValue(gBattleSpritesDataPtr->battleBars[battler].maxValue, + gBattleSpritesDataPtr->battleBars[battler].oldValue, + gBattleSpritesDataPtr->battleBars[battler].receivedValue, + &gBattleSpritesDataPtr->battleBars[battler].currValue, B_EXPBAR_PIXELS / 8, expFraction); } - if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battlerId].hpNumbersNoBars)) - MoveBattleBarGraphically(battlerId, whichBar); + if (whichBar == EXP_BAR || (whichBar == HEALTH_BAR && !gBattleSpritesDataPtr->battlerData[battler].hpNumbersNoBars)) + MoveBattleBarGraphically(battler, whichBar); if (currentBarValue == -1) - gBattleSpritesDataPtr->battleBars[battlerId].currValue = 0; + gBattleSpritesDataPtr->battleBars[battler].currValue = 0; return currentBarValue; } -static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) +static void MoveBattleBarGraphically(u8 battler, u8 whichBar) { u8 array[8]; u8 filledPixelsCount, level; @@ -2282,10 +2282,10 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) switch (whichBar) { case HEALTH_BAR: - filledPixelsCount = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].oldValue, - gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + filledPixelsCount = CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battler].maxValue, + gBattleSpritesDataPtr->battleBars[battler].oldValue, + gBattleSpritesDataPtr->battleBars[battler].receivedValue, + &gBattleSpritesDataPtr->battleBars[battler].currValue, array, B_HEALTHBAR_PIXELS / 8); if (filledPixelsCount > (B_HEALTHBAR_PIXELS * 50 / 100)) // more than 50 % hp @@ -2297,7 +2297,7 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) for (i = 0; i < 6; i++) { - u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].hMain_HealthBarSpriteId; + u8 healthbarSpriteId = gSprites[gBattleSpritesDataPtr->battleBars[battler].healthboxSpriteId].hMain_HealthBarSpriteId; if (i < 2) CpuCopy32(GetHealthboxElementGfxPtr(barElementId) + array[i] * 32, (void *)(OBJ_VRAM0 + (gSprites[healthbarSpriteId].oam.tileNum + 2 + i) * TILE_SIZE_4BPP), 32); @@ -2307,12 +2307,12 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) } break; case EXP_BAR: - CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battlerId].maxValue, - gBattleSpritesDataPtr->battleBars[battlerId].oldValue, - gBattleSpritesDataPtr->battleBars[battlerId].receivedValue, - &gBattleSpritesDataPtr->battleBars[battlerId].currValue, + CalcBarFilledPixels(gBattleSpritesDataPtr->battleBars[battler].maxValue, + gBattleSpritesDataPtr->battleBars[battler].oldValue, + gBattleSpritesDataPtr->battleBars[battler].receivedValue, + &gBattleSpritesDataPtr->battleBars[battler].currValue, array, B_EXPBAR_PIXELS / 8); - level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_LEVEL); + level = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_LEVEL); if (level == MAX_LEVEL) { for (i = 0; i < 8; i++) @@ -2322,10 +2322,10 @@ static void MoveBattleBarGraphically(u8 battlerId, u8 whichBar) { if (i < 4) CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, - (void *)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum + 0x24 + i) * TILE_SIZE_4BPP), 32); + (void *)(OBJ_VRAM0 + (gSprites[gBattleSpritesDataPtr->battleBars[battler].healthboxSpriteId].oam.tileNum + 0x24 + i) * TILE_SIZE_4BPP), 32); else CpuCopy32(GetHealthboxElementGfxPtr(HEALTHBOX_GFX_12) + array[i] * 32, - (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battlerId].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32); + (void *)(OBJ_VRAM0 + 0xB80 + (i + gSprites[gBattleSpritesDataPtr->battleBars[battler].healthboxSpriteId].oam.tileNum) * TILE_SIZE_4BPP), 32); } break; } diff --git a/src/battle_main.c b/src/battle_main.c index 226d1a805b..c6fbe1c9a4 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -839,7 +839,7 @@ static void SetAllPlayersBerryData(void) { s32 numPlayers; struct BattleEnigmaBerry *src; - u8 battlerId; + u8 battler; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { @@ -851,17 +851,17 @@ static void SetAllPlayersBerryData(void) for (i = 0; i < numPlayers; i++) { src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2); - battlerId = gLinkPlayers[i].id; + battler = gLinkPlayers[i].id; for (j = 0; j < BERRY_NAME_LENGTH; j++) - gEnigmaBerries[battlerId].name[j] = src->name[j]; - gEnigmaBerries[battlerId].name[j] = EOS; + gEnigmaBerries[battler].name[j] = src->name[j]; + gEnigmaBerries[battler].name[j] = EOS; for (j = 0; j < BERRY_ITEM_EFFECT_COUNT; j++) - gEnigmaBerries[battlerId].itemEffect[j] = src->itemEffect[j]; + gEnigmaBerries[battler].itemEffect[j] = src->itemEffect[j]; - gEnigmaBerries[battlerId].holdEffect = src->holdEffect; - gEnigmaBerries[battlerId].holdEffectParam = src->holdEffectParam; + gEnigmaBerries[battler].holdEffect = src->holdEffect; + gEnigmaBerries[battler].holdEffectParam = src->holdEffectParam; } } else @@ -4653,7 +4653,7 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) if (holdEffect == HOLD_EFFECT_QUICK_CLAW && gRandomTurnNumber < (0xFFFF * holdEffectParam) / 100) speedBattler1 = UINT_MAX; - // check second battlerId's speed + // check second battler's speed speedBattler2 = (gBattleMons[battler2].speed * speedMultiplierBattler2) * (gStatStageRatios[gBattleMons[battler2].statStages[STAT_SPEED]][0]) @@ -4949,7 +4949,7 @@ static void RunTurnActionsFunctions(void) } else { - if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battlerId + if (gBattleStruct->savedTurnActionNumber != gCurrentTurnActionNumber) // action turn has been done, clear hitmarker bits for another battler { gHitMarker &= ~HITMARKER_NO_ATTACKSTRING; gHitMarker &= ~HITMARKER_UNABLE_TO_USE_MOVE; diff --git a/src/battle_message.c b/src/battle_message.c index d539bc540d..9cc26698e5 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -2283,8 +2283,8 @@ static const u8 *TryGetStatusString(u8 *src) return NULL; } -#define HANDLE_NICKNAME_STRING_CASE(battlerId, monIndex) \ - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) \ +#define HANDLE_NICKNAME_STRING_CASE(battler, monIndex) \ + if (GetBattlerSide(battler) != B_SIDE_PLAYER) \ { \ if (gBattleTypeFlags & BATTLE_TYPE_TRAINER) \ toCpy = sText_FoePkmnPrefix; \ @@ -2422,7 +2422,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) StringGet_Nickname(text); toCpy = text; break; - case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battlerId 0/1 + case B_TXT_ATK_NAME_WITH_PREFIX_MON1: // attacker name with prefix, only battler 0/1 HANDLE_NICKNAME_STRING_CASE(gBattlerAttacker, gBattlerPartyIndexes[GetBattlerAtPosition(GET_BATTLER_SIDE(gBattlerAttacker))]) break; @@ -2441,13 +2441,13 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) 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 + case B_TXT_EFF_NAME_WITH_PREFIX: // effect battler name with prefix HANDLE_NICKNAME_STRING_CASE(gEffectBattler, gBattlerPartyIndexes[gEffectBattler]) break; - case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battlerId name with prefix + case B_TXT_ACTIVE_NAME_WITH_PREFIX: // active battler 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 + case B_TXT_SCR_ACTIVE_NAME_WITH_PREFIX: // scripting active battler name with prefix HANDLE_NICKNAME_STRING_CASE(gBattleScripting.battler, gBattlerPartyIndexes[gBattleScripting.battler]) break; case B_TXT_CURRENT_MOVE: // current move name @@ -2519,7 +2519,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst) case B_TXT_SCR_ACTIVE_ABILITY: // scripting active ability toCpy = gAbilityNames[sBattlerAbilities[gBattleScripting.battler]]; break; - case B_TXT_EFF_ABILITY: // effect battlerId ability + case B_TXT_EFF_ABILITY: // effect battler ability toCpy = gAbilityNames[sBattlerAbilities[gEffectBattler]]; break; case B_TXT_TRAINER1_CLASS: // trainer class name diff --git a/src/battle_records.c b/src/battle_records.c index edc48d8202..0ea61b79b8 100644 --- a/src/battle_records.c +++ b/src/battle_records.c @@ -201,7 +201,7 @@ static void UpdateLinkBattleGameStats(s32 battleOutcome) IncrementGameStat(stat); } -static void UpdateLinkBattleRecords(struct LinkBattleRecords *records, const u8 *name, u16 trainerId, s32 battleOutcome, u8 battlerId) +static void UpdateLinkBattleRecords(struct LinkBattleRecords *records, const u8 *name, u16 trainerId, s32 battleOutcome, u8 battler) { s32 index; @@ -214,7 +214,7 @@ static void UpdateLinkBattleRecords(struct LinkBattleRecords *records, const u8 ClearLinkBattleRecord(&records->entries[index]); StringCopyN(records->entries[index].name, name, PLAYER_NAME_LENGTH); records->entries[index].trainerId = trainerId; - records->languages[index] = gLinkPlayers[battlerId].language; + records->languages[index] = gLinkPlayers[battler].language; } UpdateLinkBattleRecord(&records->entries[index], battleOutcome); SortLinkBattleRecords(records); @@ -225,48 +225,48 @@ void ClearPlayerLinkBattleRecords(void) ClearLinkBattleRecords(gSaveBlock1Ptr->linkBattleRecords.entries); } -static void IncTrainerCardWins(s32 battlerId) +static void IncTrainerCardWins(s32 battler) { - u16 *wins = &gTrainerCards[battlerId].linkBattleWins; + u16 *wins = &gTrainerCards[battler].linkBattleWins; (*wins)++; if (*wins > 9999) *wins = 9999; } -static void IncTrainerCardLosses(s32 battlerId) +static void IncTrainerCardLosses(s32 battler) { - u16 *losses = &gTrainerCards[battlerId].linkBattleLosses; + u16 *losses = &gTrainerCards[battler].linkBattleLosses; (*losses)++; if (*losses > 9999) *losses = 9999; } -static void UpdateTrainerCardWinsLosses(s32 battlerId) +static void UpdateTrainerCardWinsLosses(s32 battler) { switch (gBattleOutcome) { case B_OUTCOME_WON: - IncTrainerCardWins(BATTLE_OPPOSITE(battlerId)); - IncTrainerCardLosses(battlerId); + IncTrainerCardWins(BATTLE_OPPOSITE(battler)); + IncTrainerCardLosses(battler); break; case B_OUTCOME_LOST: - IncTrainerCardLosses(BATTLE_OPPOSITE(battlerId)); - IncTrainerCardWins(battlerId); + IncTrainerCardLosses(BATTLE_OPPOSITE(battler)); + IncTrainerCardWins(battler); break; } } -void UpdatePlayerLinkBattleRecords(s32 battlerId) +void UpdatePlayerLinkBattleRecords(s32 battler) { if (InUnionRoom() != TRUE) { - UpdateTrainerCardWinsLosses(battlerId); + UpdateTrainerCardWinsLosses(battler); UpdateLinkBattleRecords( &gSaveBlock1Ptr->linkBattleRecords, - gTrainerCards[battlerId].playerName, - gTrainerCards[battlerId].trainerId, + gTrainerCards[battler].playerName, + gTrainerCards[battler].trainerId, gBattleOutcome, - battlerId); + battler); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e75b67d2c2..0f99173b11 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -63,7 +63,7 @@ extern const u8 *const gBattleScriptsForMoveEffects[]; 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 u8 AttacksThisTurn(u8 battler, 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 bool32 IsMonGettingExpSentOut(void); @@ -2207,12 +2207,12 @@ static void Cmd_printselectionstringfromtable(void) } } -u8 GetBattlerTurnOrderNum(u8 battlerId) +u8 GetBattlerTurnOrderNum(u8 battler) { s32 i; for (i = 0; i < gBattlersCount; i++) { - if (gBattlerByTurnOrder[i] == battlerId) + if (gBattlerByTurnOrder[i] == battler) break; } return i; @@ -2239,7 +2239,7 @@ void SetMoveEffect(bool8 primary, u8 certain) if (gBattleCommunication[MOVE_EFFECT_BYTE] & MOVE_EFFECT_AFFECTS_USER) { - gEffectBattler = gBattlerAttacker; // battlerId that effects get applied on + gEffectBattler = gBattlerAttacker; // battler that effects get applied on gBattleCommunication[MOVE_EFFECT_BYTE] &= ~MOVE_EFFECT_AFFECTS_USER; affectsUser = MOVE_EFFECT_AFFECTS_USER; gBattleScripting.battler = gBattlerTarget; // theoretically the attacker @@ -2984,18 +2984,18 @@ static void Cmd_tryfaintmon(void) } else { - u8 battlerId; + u8 battler; if (gBattlescriptCurrInstr[1] == BS_ATTACKER) { gActiveBattler = gBattlerAttacker; - battlerId = gBattlerTarget; + battler = gBattlerTarget; BS_ptr = BattleScript_FaintAttacker; } else { gActiveBattler = gBattlerTarget; - battlerId = gBattlerAttacker; + battler = gBattlerAttacker; BS_ptr = BattleScript_FaintTarget; } if (!(gAbsentBattlerFlags & gBitTable[gActiveBattler]) @@ -3021,7 +3021,7 @@ static void Cmd_tryfaintmon(void) { gHitMarker &= ~HITMARKER_DESTINYBOND; BattleScriptPush(gBattlescriptCurrInstr); - gBattleMoveDamage = gBattleMons[battlerId].hp; + gBattleMoveDamage = gBattleMons[battler].hp; gBattlescriptCurrInstr = BattleScript_DestinyBondTakesLife; } if ((gStatuses3[gBattlerTarget] & STATUS3_GRUDGE) @@ -3080,11 +3080,11 @@ static void Cmd_cleareffectsonfaint(void) static void Cmd_jumpifstatus(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + u8 battler = 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) + if (gBattleMons[battler].status1 & flags && gBattleMons[battler].hp != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 10; @@ -3092,11 +3092,11 @@ static void Cmd_jumpifstatus(void) static void Cmd_jumpifstatus2(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + u8 battler = 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) + if (gBattleMons[battler].status2 & flags && gBattleMons[battler].hp != 0) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 10; @@ -3104,19 +3104,19 @@ static void Cmd_jumpifstatus2(void) static void Cmd_jumpifability(void) { - u8 battlerId; + u8 battler; 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) + battler = AbilityBattleEffects(ABILITYEFFECT_CHECK_BATTLER_SIDE, gBattlerAttacker, ability, 0, 0); + if (battler) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; + RecordAbilityBattle(battler - 1, gLastUsedAbility); + gBattleScripting.battlerWithAbility = battler - 1; } else { @@ -3125,13 +3125,13 @@ static void Cmd_jumpifability(void) } else if (gBattlescriptCurrInstr[1] == BS_NOT_ATTACKER_SIDE) { - battlerId = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0); - if (battlerId) + battler = AbilityBattleEffects(ABILITYEFFECT_CHECK_OTHER_SIDE, gBattlerAttacker, ability, 0, 0); + if (battler) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId - 1, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId - 1; + RecordAbilityBattle(battler - 1, gLastUsedAbility); + gBattleScripting.battlerWithAbility = battler - 1; } else { @@ -3140,13 +3140,13 @@ static void Cmd_jumpifability(void) } else { - battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattleMons[battlerId].ability == ability) + battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + if (gBattleMons[battler].ability == ability) { gLastUsedAbility = ability; gBattlescriptCurrInstr = jumpPtr; - RecordAbilityBattle(battlerId, gLastUsedAbility); - gBattleScripting.battlerWithAbility = battlerId; + RecordAbilityBattle(battler, gLastUsedAbility); + gBattleScripting.battlerWithAbility = battler; } else { @@ -3178,8 +3178,8 @@ static void Cmd_jumpifsideaffecting(void) static void Cmd_jumpifstat(void) { u8 ret = 0; - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - u8 value = gBattleMons[battlerId].statStages[gBattlescriptCurrInstr[3]]; + u8 battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + u8 value = gBattleMons[battler].statStages[gBattlescriptCurrInstr[3]]; switch (gBattlescriptCurrInstr[2]) { @@ -3242,11 +3242,11 @@ static void Cmd_jumpifstatus3condition(void) static void Cmd_jumpiftype(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + u8 battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); u8 type = gBattlescriptCurrInstr[2]; const u8 *jumpPtr = T2_READ_PTR(gBattlescriptCurrInstr + 3); - if (IS_BATTLER_OF_TYPE(battlerId, type)) + if (IS_BATTLER_OF_TYPE(battler, type)) gBattlescriptCurrInstr = jumpPtr; else gBattlescriptCurrInstr += 7; @@ -3396,7 +3396,7 @@ static void Cmd_getexp(void) i = STRINGID_EMPTYSTRING4; } - // get exp getter battlerId + // get exp getter battler if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) { if (gBattlerPartyIndexes[2] == gBattleStruct->expGetterMonId && !(gAbsentBattlerFlags & gBitTable[2])) @@ -3980,9 +3980,9 @@ static void Cmd_call(void) static void Cmd_jumpiftype2(void) { - u8 battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); + u8 battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1]); - if (gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[0] || gBattlescriptCurrInstr[2] == gBattleMons[battlerId].types[1]) + if (gBattlescriptCurrInstr[2] == gBattleMons[battler].types[0] || gBattlescriptCurrInstr[2] == gBattleMons[battler].types[1]) gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3); else gBattlescriptCurrInstr += 7; @@ -4464,10 +4464,10 @@ static void Cmd_moveend(void) && !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) + u8 battler = GetBattlerAtPosition(BATTLE_PARTNER(GetBattlerPosition(gBattlerTarget))); + if (gBattleMons[battler].hp != 0) { - gBattlerTarget = battlerId; + gBattlerTarget = battler; gHitMarker |= HITMARKER_NO_ATTACKSTRING; gBattleScripting.moveendState = 0; MoveValuesCleanUp(); @@ -4866,10 +4866,10 @@ static void Cmd_openpartyscreen(void) { u32 flags; u8 hitmarkerFaintBits; - u8 battlerId; + u8 battler; const u8 *jumpPtr; - battlerId = 0; + battler = 0; flags = 0; jumpPtr = T1_READ_PTR(gBattlescriptCurrInstr + 2); @@ -5098,21 +5098,21 @@ static void Cmd_openpartyscreen(void) else hitmarkerFaintBits = PARTY_ACTION_SEND_OUT; - battlerId = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~PARTY_SCREEN_OPTIONAL); - if (gSpecialStatuses[battlerId].faintedHasReplacement) + battler = GetBattlerForBattleScript(gBattlescriptCurrInstr[1] & ~PARTY_SCREEN_OPTIONAL); + if (gSpecialStatuses[battler].faintedHasReplacement) { gBattlescriptCurrInstr += 6; } - else if (HasNoMonsToSwitch(battlerId, PARTY_SIZE, PARTY_SIZE)) + else if (HasNoMonsToSwitch(battler, PARTY_SIZE, PARTY_SIZE)) { - gActiveBattler = battlerId; + gActiveBattler = battler; gAbsentBattlerFlags |= gBitTable[gActiveBattler]; gHitMarker &= ~HITMARKER_FAINTED(gActiveBattler); gBattlescriptCurrInstr = jumpPtr; } else { - gActiveBattler = battlerId; + gActiveBattler = battler; *(gBattleStruct->battlerPartyIndexes + gActiveBattler) = gBattlerPartyIndexes[gActiveBattler]; *(gBattleStruct->monToSwitchIntoId + gActiveBattler) = PARTY_SIZE; gBattleStruct->field_93 &= ~(gBitTable[gActiveBattler]); @@ -5129,7 +5129,7 @@ static void Cmd_openpartyscreen(void) { for (gActiveBattler = 0; gActiveBattler < gBattlersCount; gActiveBattler++) { - if (gActiveBattler != battlerId) + if (gActiveBattler != battler) { BtlController_EmitLinkStandbyMsg(B_COMM_TO_CONTROLLER, LINK_STANDBY_MSG_ONLY, FALSE); MarkBattlerForControllerExec(gActiveBattler); @@ -5138,7 +5138,7 @@ static void Cmd_openpartyscreen(void) } else { - gActiveBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battlerId))); + gActiveBattler = GetBattlerAtPosition(BATTLE_OPPOSITE(GetBattlerPosition(battler))); if (gAbsentBattlerFlags & gBitTable[gActiveBattler]) gActiveBattler ^= BIT_FLANK; @@ -6798,13 +6798,13 @@ static void Cmd_nop(void) gBattlescriptCurrInstr++; } -bool8 UproarWakeUpCheck(u8 battlerId) +bool8 UproarWakeUpCheck(u8 battler) { s32 i; for (i = 0; i < gBattlersCount; i++) { - if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[battlerId].ability == ABILITY_SOUNDPROOF) + if (!(gBattleMons[i].status2 & STATUS2_UPROAR) || gBattleMons[battler].ability == ABILITY_SOUNDPROOF) continue; gBattleScripting.battler = i; @@ -8241,7 +8241,7 @@ static bool8 IsInvalidForSleepTalkOrAssist(u16 move) return FALSE; } -static u8 AttacksThisTurn(u8 battlerId, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 +static u8 AttacksThisTurn(u8 battler, u16 move) // Note: returns 1 if it's a charging turn, otherwise 2 { // first argument is unused if (gBattleMoves[move].effect == EFFECT_SOLAR_BEAM @@ -9440,13 +9440,13 @@ static void Cmd_tryimprison(void) } else { - u8 battlerId, sideAttacker; + u8 battler, sideAttacker; sideAttacker = GetBattlerSide(gBattlerAttacker); PressurePPLoseOnUsingImprison(gBattlerAttacker); - for (battlerId = 0; battlerId < gBattlersCount; battlerId++) + for (battler = 0; battler < gBattlersCount; battler++) { - if (sideAttacker != GetBattlerSide(battlerId)) + if (sideAttacker != GetBattlerSide(battler)) { s32 attackerMoveId; for (attackerMoveId = 0; attackerMoveId < MAX_MON_MOVES; attackerMoveId++) @@ -9454,7 +9454,7 @@ static void Cmd_tryimprison(void) s32 i; for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battlerId].moves[i] + if (gBattleMons[gBattlerAttacker].moves[attackerMoveId] == gBattleMons[battler].moves[i] && gBattleMons[gBattlerAttacker].moves[attackerMoveId] != MOVE_NONE) break; } @@ -9469,7 +9469,7 @@ static void Cmd_tryimprison(void) } } } - if (battlerId == gBattlersCount) // In Generation 3 games, Imprison fails if the user doesn't share any moves with any of the foes + if (battler == 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); } } diff --git a/src/battle_tv.c b/src/battle_tv.c index e9f518f605..33c720cc13 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -1568,12 +1568,12 @@ void BattleTv_ClearExplosionFaintCause(void) } } -u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId) +u8 GetBattlerMoveSlotId(u8 battler, u16 moveId) { s32 i; struct Pokemon *party; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) party = gPlayerParty; else party = gEnemyParty; @@ -1583,7 +1583,7 @@ u8 GetBattlerMoveSlotId(u8 battlerId, u16 moveId) { if (i >= MAX_MON_MOVES) break; - if (GetMonData(&party[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + i, NULL) == moveId) + if (GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_MOVE1 + i, NULL) == moveId) break; i++; } diff --git a/src/battle_util.c b/src/battle_util.c index bbc9e1a819..b32ae9d6a7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -851,27 +851,27 @@ static void UNUSED MarkAllBattlersForControllerExec(void) // set a bit indicating that we're sending a message over the link. That // message will be received by all other players... *and* by us, the player // sending it, at which point we'll invoke MarkBattlerReceivedLinkData, -// below, to clear the "we're sending a message" bit and set the "controller +// below, to clear the "we're sending a message" bit and set the "controller // is now active" bit. -void MarkBattlerForControllerExec(u8 battlerId) +void MarkBattlerForControllerExec(u8 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battlerId); + MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battler); else - MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battlerId); + MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler); } -// Called when a message dispatched from the battle engine to a battle +// Called when a message dispatched from the battle engine to a battle // controller is received over link communications. All players assume // that if they've received the message, everyone else has as well. -void MarkBattlerReceivedLinkData(u8 battlerId) +void MarkBattlerReceivedLinkData(u8 battler) { s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battlerId, i); + MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, i); - MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battlerId); + MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battler); } void CancelMultiTurnMoves(u8 battler) @@ -1079,44 +1079,44 @@ u8 TrySetCantSelectMoveBattleScript(void) return limitations; } -u8 CheckMoveLimitations(u8 battlerId, u8 unusableMoves, u8 check) +u8 CheckMoveLimitations(u8 battler, u8 unusableMoves, u8 check) { u8 holdEffect; - u16 *choicedMove = &gBattleStruct->choicedMove[battlerId]; + u16 *choicedMove = &gBattleStruct->choicedMove[battler]; s32 i; - if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) - holdEffect = gEnigmaBerries[battlerId].holdEffect; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY) + holdEffect = gEnigmaBerries[battler].holdEffect; else - holdEffect = ItemId_GetHoldEffect(gBattleMons[battlerId].item); + holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item); - gPotentialItemEffectBattler = battlerId; + gPotentialItemEffectBattler = battler; for (i = 0; i < MAX_MON_MOVES; i++) { // No move - if (gBattleMons[battlerId].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE) + if (gBattleMons[battler].moves[i] == MOVE_NONE && check & MOVE_LIMITATION_ZEROMOVE) unusableMoves |= gBitTable[i]; // No PP - if (gBattleMons[battlerId].pp[i] == 0 && check & MOVE_LIMITATION_PP) + if (gBattleMons[battler].pp[i] == 0 && check & MOVE_LIMITATION_PP) unusableMoves |= gBitTable[i]; // Disable - if (gBattleMons[battlerId].moves[i] == gDisableStructs[battlerId].disabledMove && check & MOVE_LIMITATION_DISABLED) + if (gBattleMons[battler].moves[i] == gDisableStructs[battler].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) + if (gBattleMons[battler].moves[i] == gLastMoves[battler] && check & MOVE_LIMITATION_TORMENTED && gBattleMons[battler].status2 & STATUS2_TORMENT) unusableMoves |= gBitTable[i]; // Taunt - if (gDisableStructs[battlerId].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battlerId].moves[i]].power == 0) + if (gDisableStructs[battler].tauntTimer && check & MOVE_LIMITATION_TAUNT && gBattleMoves[gBattleMons[battler].moves[i]].power == 0) unusableMoves |= gBitTable[i]; // Imprison - if (GetImprisonedMovesCount(battlerId, gBattleMons[battlerId].moves[i]) && check & MOVE_LIMITATION_IMPRISON) + if (GetImprisonedMovesCount(battler, gBattleMons[battler].moves[i]) && check & MOVE_LIMITATION_IMPRISON) unusableMoves |= gBitTable[i]; // Encore - if (gDisableStructs[battlerId].encoreTimer && gDisableStructs[battlerId].encoredMove != gBattleMons[battlerId].moves[i]) + if (gDisableStructs[battler].encoreTimer && gDisableStructs[battler].encoredMove != gBattleMons[battler].moves[i]) unusableMoves |= gBitTable[i]; // Choice Band - if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != gBattleMons[battlerId].moves[i]) + if (holdEffect == HOLD_EFFECT_CHOICE_BAND && *choicedMove != MOVE_NONE && *choicedMove != MOVE_UNAVAILABLE && *choicedMove != gBattleMons[battler].moves[i]) unusableMoves |= gBitTable[i]; } return unusableMoves; @@ -1139,11 +1139,11 @@ bool8 AreAllMovesUnusable(void) return (unusable == ALL_MOVES_MASK); } -u8 GetImprisonedMovesCount(u8 battlerId, u16 move) +u8 GetImprisonedMovesCount(u8 battler, u16 move) { s32 i; u8 imprisonedMoves = 0; - u8 battlerSide = GetBattlerSide(battlerId); + u8 battlerSide = GetBattlerSide(battler); for (i = 0; i < gBattlersCount; i++) { @@ -3225,16 +3225,16 @@ enum }; #define TRY_EAT_CONFUSE_BERRY(flavor) \ - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) \ + if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2 && !moveTurn) \ { \ PREPARE_FLAVOR_BUFFER(gBattleTextBuff1, flavor); \ - gBattleMoveDamage = gBattleMons[battlerId].maxHP / battlerHoldEffectParam; \ + gBattleMoveDamage = gBattleMons[battler].maxHP / battlerHoldEffectParam; \ if (gBattleMoveDamage == 0) \ gBattleMoveDamage = 1; \ - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) \ - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; \ + if (gBattleMons[battler].hp + gBattleMoveDamage > gBattleMons[battler].maxHP) \ + gBattleMoveDamage = gBattleMons[battler].maxHP - gBattleMons[battler].hp; \ gBattleMoveDamage *= -1; \ - if (GetFlavorRelationByPersonality(gBattleMons[battlerId].personality, flavor) < 0) \ + if (GetFlavorRelationByPersonality(gBattleMons[battler].personality, flavor) < 0) \ BattleScriptExecute(BattleScript_BerryConfuseHealEnd2); \ else \ BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); \ @@ -3242,11 +3242,11 @@ enum } #define TRY_EAT_STAT_UP_BERRY(stat) \ - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / battlerHoldEffectParam \ - && !moveTurn && gBattleMons[battlerId].statStages[stat] < MAX_STAT_STAGE) \ + if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / battlerHoldEffectParam \ + && !moveTurn && gBattleMons[battler].statStages[stat] < MAX_STAT_STAGE) \ { \ PREPARE_STAT_BUFFER(gBattleTextBuff1, stat); \ - gEffectBattler = battlerId; \ + gEffectBattler = battler; \ SET_STATCHANGER(stat, 1, FALSE); \ gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + (stat); \ gBattleScripting.animArg2 = 0; \ @@ -3254,7 +3254,7 @@ enum effect = ITEM_STATS_CHANGE; \ } -u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) +u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) { int i = 0; u8 effect = ITEM_NO_EFFECT; @@ -3263,11 +3263,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) u8 battlerHoldEffectParam, atkHoldEffectParam, UNUSED defHoldEffectParam; u16 atkItem, defItem; - gLastUsedItem = gBattleMons[battlerId].item; + gLastUsedItem = gBattleMons[battler].item; if (gLastUsedItem == ITEM_ENIGMA_BERRY) { - battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; - battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; + battlerHoldEffect = gEnigmaBerries[battler].holdEffect; + battlerHoldEffectParam = gEnigmaBerries[battler].holdEffectParam; } else { @@ -3306,39 +3306,39 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_DOUBLE_PRIZE: - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) 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) + if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; + gBattleScripting.battler = battler; + gPotentialItemEffectBattler = battler; + gActiveBattler = gBattlerAttacker = battler; BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; } break; case ITEMEFFECT_NORMAL: - if (gBattleMons[battlerId].hp) + if (gBattleMons[battler].hp) { switch (battlerHoldEffect) { case HOLD_EFFECT_RESTORE_HP: - if (gBattleMons[battlerId].hp <= gBattleMons[battlerId].maxHP / 2 && !moveTurn) + if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / 2 && !moveTurn) { gBattleMoveDamage = battlerHoldEffectParam; - if (gBattleMons[battlerId].hp + battlerHoldEffectParam > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; + if (gBattleMons[battler].hp + battlerHoldEffectParam > gBattleMons[battler].maxHP) + gBattleMoveDamage = gBattleMons[battler].maxHP - gBattleMons[battler].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_RemoveItem); effect = ITEM_HP_CHANGE; @@ -3351,10 +3351,10 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) u8 ppBonuses; u16 move; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; else - mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + mon = &gEnemyParty[gBattlerPartyIndexes[battler]]; for (i = 0; i < MAX_MON_MOVES; i++) { move = GetMonData(mon, MON_DATA_MOVE1 + i); @@ -3383,32 +3383,32 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; + gBattleScripting.battler = battler; + gPotentialItemEffectBattler = battler; + gActiveBattler = gBattlerAttacker = battler; BattleScriptExecute(BattleScript_WhiteHerbEnd2); } break; case HOLD_EFFECT_LEFTOVERS: - if (gBattleMons[battlerId].hp < gBattleMons[battlerId].maxHP && !moveTurn) + if (gBattleMons[battler].hp < gBattleMons[battler].maxHP && !moveTurn) { - gBattleMoveDamage = gBattleMons[battlerId].maxHP / 16; + gBattleMoveDamage = gBattleMons[battler].maxHP / 16; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; - if (gBattleMons[battlerId].hp + gBattleMoveDamage > gBattleMons[battlerId].maxHP) - gBattleMoveDamage = gBattleMons[battlerId].maxHP - gBattleMons[battlerId].hp; + if (gBattleMons[battler].hp + gBattleMoveDamage > gBattleMons[battler].maxHP) + gBattleMoveDamage = gBattleMons[battler].maxHP - gBattleMons[battler].hp; gBattleMoveDamage *= -1; BattleScriptExecute(BattleScript_ItemHealHP_End2); effect = ITEM_HP_CHANGE; - RecordItemEffectBattle(battlerId, battlerHoldEffect); + RecordItemEffectBattle(battler, battlerHoldEffect); } break; case HOLD_EFFECT_CONFUSE_SPICY: @@ -3427,12 +3427,12 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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) + if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / battlerHoldEffectParam + && !moveTurn && gBattleMons[battler].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; + gEffectBattler = battler; SET_STATCHANGER(STAT_ATK, 1, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + STAT_ATK; gBattleScripting.animArg2 = 0; @@ -3453,20 +3453,20 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) 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)) + if (gBattleMons[battler].hp <= gBattleMons[battler].maxHP / battlerHoldEffectParam && !moveTurn + && !(gBattleMons[battler].status2 & STATUS2_FOCUS_ENERGY)) { - gBattleMons[battlerId].status2 |= STATUS2_FOCUS_ENERGY; + gBattleMons[battler].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) + if (!moveTurn && gBattleMons[battler].hp <= gBattleMons[battler].maxHP / battlerHoldEffectParam) { for (i = 0; i < NUM_STATS - 1; i++) { - if (gBattleMons[battlerId].statStages[STAT_ATK + i] < MAX_STAT_STAGE) + if (gBattleMons[battler].statStages[STAT_ATK + i] < MAX_STAT_STAGE) break; } if (i != NUM_STATS - 1) @@ -3474,7 +3474,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) do { i = Random() % (NUM_STATS - 1); - } while (gBattleMons[battlerId].statStages[STAT_ATK + i] == MAX_STAT_STAGE); + } while (gBattleMons[battler].statStages[STAT_ATK + i] == MAX_STAT_STAGE); PREPARE_STAT_BUFFER(gBattleTextBuff1, i + 1); @@ -3487,7 +3487,7 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleTextBuff2[6] = STRINGID_STATROSE >> 8; gBattleTextBuff2[7] = EOS; - gEffectBattler = battlerId; + gEffectBattler = battler; SET_STATCHANGER(i + 1, 2, FALSE); gBattleScripting.animArg1 = STAT_ANIM_PLUS2 + (i + 1); gBattleScripting.animArg2 = 0; @@ -3497,85 +3497,85 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { - gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; + gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; BattleScriptExecute(BattleScript_BerryCurePrlzEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) { - gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); + gBattleMons[battler].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) + if (gBattleMons[battler].status1 & STATUS1_BURN) { - gBattleMons[battlerId].status1 &= ~STATUS1_BURN; + gBattleMons[battler].status1 &= ~STATUS1_BURN; BattleScriptExecute(BattleScript_BerryCureBrnEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battler].status1 & STATUS1_FREEZE) { - gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; + gBattleMons[battler].status1 &= ~STATUS1_FREEZE; BattleScriptExecute(BattleScript_BerryCureFrzEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; - gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].status1 &= ~STATUS1_SLEEP; + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; BattleScriptExecute(BattleScript_BerryCureSlpEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) { - gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].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) + if (gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) { i = 0; - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) { StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); i++; } - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); i++; } - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); i++; } - if (gBattleMons[battlerId].status1 & STATUS1_BURN) + if (gBattleMons[battler].status1 & STATUS1_BURN) { StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); i++; } - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battler].status1 & STATUS1_FREEZE) { StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); i++; } - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) { StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); i++; @@ -3584,16 +3584,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; else gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_NORMALIZED_STATUS; - gBattleMons[battlerId].status1 = 0; - gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].status1 = 0; + gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) + if (gBattleMons[battler].status2 & STATUS2_INFATUATION) { - gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; + gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptExecute(BattleScript_BerryCureChosenStatusEnd2); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; @@ -3603,18 +3603,18 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } if (effect != 0) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = gBattlerAttacker = battlerId; + gBattleScripting.battler = battler; + gPotentialItemEffectBattler = battler; + gActiveBattler = gBattlerAttacker = battler; switch (effect) { case ITEM_STATUS_CHANGE: - BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battlerId].status1); + BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[battler].status1); MarkBattlerForControllerExec(gActiveBattler); break; case ITEM_PP_CHANGE: - if (MOVE_IS_PERMANENT(battlerId, i)) - gBattleMons[battlerId].pp[i] = changedPP; + if (MOVE_IS_PERMANENT(battler, i)) + gBattleMons[battler].pp[i] = changedPP; break; } } @@ -3623,13 +3623,13 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case ITEMEFFECT_DUMMY: break; case ITEMEFFECT_MOVE_END: - for (battlerId = 0; battlerId < gBattlersCount; battlerId++) + for (battler = 0; battler < gBattlersCount; battler++) { - gLastUsedItem = gBattleMons[battlerId].item; - if (gBattleMons[battlerId].item == ITEM_ENIGMA_BERRY) + gLastUsedItem = gBattleMons[battler].item; + if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY) { - battlerHoldEffect = gEnigmaBerries[battlerId].holdEffect; - battlerHoldEffectParam = gEnigmaBerries[battlerId].holdEffectParam; + battlerHoldEffect = gEnigmaBerries[battler].holdEffect; + battlerHoldEffectParam = gEnigmaBerries[battler].holdEffectParam; } else { @@ -3639,64 +3639,64 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) switch (battlerHoldEffect) { case HOLD_EFFECT_CURE_PAR: - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) { - gBattleMons[battlerId].status1 &= ~STATUS1_PARALYSIS; + gBattleMons[battler].status1 &= ~STATUS1_PARALYSIS; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureParRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_PSN: - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) { - gBattleMons[battlerId].status1 &= ~(STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER); + gBattleMons[battler].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) + if (gBattleMons[battler].status1 & STATUS1_BURN) { - gBattleMons[battlerId].status1 &= ~STATUS1_BURN; + gBattleMons[battler].status1 &= ~STATUS1_BURN; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureBrnRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_FRZ: - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battler].status1 & STATUS1_FREEZE) { - gBattleMons[battlerId].status1 &= ~STATUS1_FREEZE; + gBattleMons[battler].status1 &= ~STATUS1_FREEZE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureFrzRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_SLP: - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status1 &= ~STATUS1_SLEEP; - gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].status1 &= ~STATUS1_SLEEP; + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureSlpRet; effect = ITEM_STATUS_CHANGE; } break; case HOLD_EFFECT_CURE_CONFUSION: - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) { - gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_BerryCureConfusionRet; effect = ITEM_EFFECT_OTHER; } break; case HOLD_EFFECT_CURE_ATTRACT: - if (gBattleMons[battlerId].status2 & STATUS2_INFATUATION) + if (gBattleMons[battler].status2 & STATUS2_INFATUATION) { - gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; + gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn); BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; @@ -3705,31 +3705,31 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } break; case HOLD_EFFECT_CURE_STATUS: - if (gBattleMons[battlerId].status1 & STATUS1_ANY || gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].status1 & STATUS1_ANY || gBattleMons[battler].status2 & STATUS2_CONFUSION) { - if (gBattleMons[battlerId].status1 & STATUS1_PSN_ANY) + if (gBattleMons[battler].status1 & STATUS1_PSN_ANY) StringCopy(gBattleTextBuff1, gStatusConditionString_PoisonJpn); - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; StringCopy(gBattleTextBuff1, gStatusConditionString_SleepJpn); } - if (gBattleMons[battlerId].status1 & STATUS1_PARALYSIS) + if (gBattleMons[battler].status1 & STATUS1_PARALYSIS) StringCopy(gBattleTextBuff1, gStatusConditionString_ParalysisJpn); - if (gBattleMons[battlerId].status1 & STATUS1_BURN) + if (gBattleMons[battler].status1 & STATUS1_BURN) StringCopy(gBattleTextBuff1, gStatusConditionString_BurnJpn); - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battler].status1 & STATUS1_FREEZE) StringCopy(gBattleTextBuff1, gStatusConditionString_IceJpn); - if (gBattleMons[battlerId].status2 & STATUS2_CONFUSION) + if (gBattleMons[battler].status2 & STATUS2_CONFUSION) StringCopy(gBattleTextBuff1, gStatusConditionString_ConfusionJpn); - gBattleMons[battlerId].status1 = 0; - gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].status1 = 0; + gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_CURED_PROBLEM; gBattlescriptCurrInstr = BattleScript_BerryCureChosenStatusRet; @@ -3739,16 +3739,16 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) case HOLD_EFFECT_RESTORE_STATS: for (i = 0; i < NUM_BATTLE_STATS; i++) { - if (gBattleMons[battlerId].statStages[i] < DEFAULT_STAT_STAGE) + if (gBattleMons[battler].statStages[i] < DEFAULT_STAT_STAGE) { - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; effect = ITEM_STATS_CHANGE; } } if (effect != 0) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; + gBattleScripting.battler = battler; + gPotentialItemEffectBattler = battler; BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_WhiteHerbRet; return effect; @@ -3757,9 +3757,9 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) } if (effect != 0) { - gBattleScripting.battler = battlerId; - gPotentialItemEffectBattler = battlerId; - gActiveBattler = battlerId; + gBattleScripting.battler = battler; + gPotentialItemEffectBattler = battler; + gActiveBattler = battler; BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); break; @@ -3812,11 +3812,11 @@ u8 ItemBattleEffects(u8 caseID, u8 battlerId, bool8 moveTurn) return effect; } -void ClearFuryCutterDestinyBondGrudge(u8 battlerId) +void ClearFuryCutterDestinyBondGrudge(u8 battler) { - gDisableStructs[battlerId].furyCutterCounter = 0; - gBattleMons[battlerId].status2 &= ~STATUS2_DESTINY_BOND; - gStatuses3[battlerId] &= ~STATUS3_GRUDGE; + gDisableStructs[battler].furyCutterCounter = 0; + gBattleMons[battler].status2 &= ~STATUS2_DESTINY_BOND; + gStatuses3[battler] &= ~STATUS3_GRUDGE; } void HandleAction_RunBattleScript(void) // identical to RunBattleScriptCommands @@ -3910,14 +3910,14 @@ u8 GetMoveTarget(u16 move, u8 setTarget) return targetBattler; } -static bool32 IsBattlerModernFatefulEncounter(u8 battlerId) +static bool32 IsBattlerModernFatefulEncounter(u8 battler) { - if (GetBattlerSide(battlerId) == B_SIDE_OPPONENT) + if (GetBattlerSide(battler) == 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) + if (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES, NULL) != SPECIES_DEOXYS + && GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_SPECIES, NULL) != SPECIES_MEW) return TRUE; - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL); + return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_MODERN_FATEFUL_ENCOUNTER, NULL); } u8 IsMonDisobedient(void) diff --git a/src/battle_util2.c b/src/battle_util2.c index 349853b578..3b5a376c6b 100644 --- a/src/battle_util2.c +++ b/src/battle_util2.c @@ -71,7 +71,7 @@ void FreeBattleResources(void) } } -void AdjustFriendshipOnBattleFaint(u8 battlerId) +void AdjustFriendshipOnBattleFaint(u8 battler) { u8 opposingBattlerId; @@ -90,28 +90,28 @@ void AdjustFriendshipOnBattleFaint(u8 battlerId) opposingBattlerId = GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT); } - if (gBattleMons[opposingBattlerId].level > gBattleMons[battlerId].level) + if (gBattleMons[opposingBattlerId].level > gBattleMons[battler].level) { - if (gBattleMons[opposingBattlerId].level - gBattleMons[battlerId].level > 29) - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_LARGE); + if (gBattleMons[opposingBattlerId].level - gBattleMons[battler].level > 29) + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battler]], FRIENDSHIP_EVENT_FAINT_LARGE); else - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battler]], FRIENDSHIP_EVENT_FAINT_SMALL); } else { - AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battlerId]], FRIENDSHIP_EVENT_FAINT_SMALL); + AdjustFriendship(&gPlayerParty[gBattlerPartyIndexes[battler]], FRIENDSHIP_EVENT_FAINT_SMALL); } } -void SwitchPartyOrderInGameMulti(u8 battlerId, u8 arg1) +void SwitchPartyOrderInGameMulti(u8 battler, u8 arg1) { - if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) + if (GetBattlerSide(battler) != B_SIDE_OPPONENT) { s32 i; for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) gBattlePartyCurrentOrder[i] = *(i + (u8 *)(gBattleStruct->battlerPartyOrders)); - SwitchPartyMonSlots(GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battlerId]), GetPartyIdFromBattlePartyId(arg1)); + SwitchPartyMonSlots(GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler]), GetPartyIdFromBattlePartyId(arg1)); for (i = 0; i < (int)ARRAY_COUNT(gBattlePartyCurrentOrder); i++) *(i + (u8 *)(gBattleStruct->battlerPartyOrders)) = gBattlePartyCurrentOrder[i]; @@ -120,7 +120,7 @@ void SwitchPartyOrderInGameMulti(u8 battlerId, u8 arg1) // Called when a PokΓ©mon is unable to attack during a Battle Palace battle. // Check if it was because they are frozen/asleep, and if so try to cure the status. -u32 BattlePalace_TryEscapeStatus(u8 battlerId) +u32 BattlePalace_TryEscapeStatus(u8 battler) { u32 effect = 0; @@ -129,13 +129,13 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) switch (gBattleCommunication[MULTIUSE_STATE]) { case 0: - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { - if (UproarWakeUpCheck(battlerId)) + if (UproarWakeUpCheck(battler)) { // Wake up from Uproar - gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); + gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP_UPROAR; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; @@ -145,18 +145,18 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) { u32 toSub; - if (gBattleMons[battlerId].ability == ABILITY_EARLY_BIRD) + if (gBattleMons[battler].ability == ABILITY_EARLY_BIRD) toSub = 2; else toSub = 1; // Reduce number of sleep turns - if ((gBattleMons[battlerId].status1 & STATUS1_SLEEP) < toSub) - gBattleMons[battlerId].status1 &= ~(STATUS1_SLEEP); + if ((gBattleMons[battler].status1 & STATUS1_SLEEP) < toSub) + gBattleMons[battler].status1 &= ~(STATUS1_SLEEP); else - gBattleMons[battlerId].status1 -= toSub; + gBattleMons[battler].status1 -= toSub; - if (gBattleMons[battlerId].status1 & STATUS1_SLEEP) + if (gBattleMons[battler].status1 & STATUS1_SLEEP) { // Still asleep gBattlescriptCurrInstr = BattleScript_MoveUsedIsAsleep; @@ -165,7 +165,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) else { // Wake up - gBattleMons[battlerId].status2 &= ~(STATUS2_NIGHTMARE); + gBattleMons[battler].status2 &= ~(STATUS2_NIGHTMARE); BattleScriptPushCursor(); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_WOKE_UP; gBattlescriptCurrInstr = BattleScript_MoveUsedWokeUp; @@ -176,7 +176,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) gBattleCommunication[MULTIUSE_STATE]++; break; case 1: - if (gBattleMons[battlerId].status1 & STATUS1_FREEZE) + if (gBattleMons[battler].status1 & STATUS1_FREEZE) { if (Random() % 5 != 0) { @@ -186,7 +186,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) else { // Unfreeze - gBattleMons[battlerId].status1 &= ~(STATUS1_FREEZE); + gBattleMons[battler].status1 &= ~(STATUS1_FREEZE); BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_MoveUsedUnfroze; gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_DEFROSTED; @@ -203,7 +203,7 @@ u32 BattlePalace_TryEscapeStatus(u8 battlerId) if (effect == 2) { - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitSetMonData(B_COMM_TO_CONTROLLER, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gActiveBattler].status1); MarkBattlerForControllerExec(gActiveBattler); } diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h new file mode 100644 index 0000000000..4fe8a21b3b --- /dev/null +++ b/src/data/map_group_count.h @@ -0,0 +1 @@ +static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/src/party_menu.c b/src/party_menu.c index cbd469713a..de8ffa631b 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -5915,20 +5915,20 @@ static void BufferBattlePartyOrder(u8 *partyBattleOrder, u8 flankId) partyBattleOrder[i] = (partyIds[0 + (i * 2)] << 4) | partyIds[1 + (i * 2)]; } -void BufferBattlePartyCurrentOrderBySide(u8 battlerId, u8 flankId) +void BufferBattlePartyCurrentOrderBySide(u8 battler, u8 flankId) { - BufferBattlePartyOrderBySide(gBattleStruct->battlerPartyOrders[battlerId], flankId, battlerId); + BufferBattlePartyOrderBySide(gBattleStruct->battlerPartyOrders[battler], flankId, battler); } -// when GetBattlerSide(battlerId) == B_SIDE_PLAYER, this function is identical the one above -static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battlerId) +// when GetBattlerSide(battler) == B_SIDE_PLAYER, this function is identical the one above +static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 battler) { u8 partyIndexes[PARTY_SIZE]; int i, j; u8 leftBattler; u8 rightBattler; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) { leftBattler = GetBattlerAtPosition(B_POSITION_PLAYER_LEFT); rightBattler = GetBattlerAtPosition(B_POSITION_PLAYER_RIGHT); @@ -5987,7 +5987,7 @@ static void BufferBattlePartyOrderBySide(u8 *partyBattleOrder, u8 flankId, u8 ba partyBattleOrder[i] = (partyIndexes[0 + (i * 2)] << 4) | partyIndexes[1 + (i * 2)]; } -void SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2) +void SwitchPartyOrderLinkMulti(u8 battler, u8 slot, u8 slot2) { u8 partyIds[PARTY_SIZE]; u8 tempSlot = 0; @@ -5997,7 +5997,7 @@ void SwitchPartyOrderLinkMulti(u8 battlerId, u8 slot, u8 slot2) if (IsMultiBattle()) { - partyBattleOrder = gBattleStruct->battlerPartyOrders[battlerId]; + partyBattleOrder = gBattleStruct->battlerPartyOrders[battler]; for (i = j = 0; i < PARTY_SIZE / 2; j++, i++) { partyIds[j] = partyBattleOrder[i] >> 4; diff --git a/src/pokeball.c b/src/pokeball.c index 445f048924..5bbeb5c96a 100644 --- a/src/pokeball.c +++ b/src/pokeball.c @@ -40,7 +40,7 @@ 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); +static u16 GetBattlerPokeballItemId(u8 battler); // rom const data @@ -352,7 +352,7 @@ u8 DoPokeballSendOutAnimation(s16 pan, u8 kindOfThrow) static void Task_DoPokeballSendOutAnim(u8 taskId) { u16 throwCaseId; - u8 battlerId; + u8 battler; u16 itemId, ballId; u8 ballSpriteId; bool8 notSendOut = FALSE; @@ -364,12 +364,12 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) } throwCaseId = gTasks[taskId].tThrowId; - battlerId = gTasks[taskId].tBattler; + battler = gTasks[taskId].tBattler; - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) - itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + if (GetBattlerSide(battler) != B_SIDE_PLAYER) + itemId = GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); else - itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + itemId = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); ballId = ItemIdToBallId(itemId); LoadBallGfx(ballId); @@ -381,15 +381,15 @@ static void Task_DoPokeballSendOutAnim(u8 taskId) switch (throwCaseId) { case POKEBALL_PLAYER_SENDOUT: - gBattlerTarget = battlerId; + gBattlerTarget = battler; gSprites[ballSpriteId].x = 24; gSprites[ballSpriteId].y = 68; 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].x = GetBattlerSpriteCoord(battler, BATTLER_COORD_X); + gSprites[ballSpriteId].y = GetBattlerSpriteCoord(battler, BATTLER_COORD_Y) + 24; + gBattlerTarget = battler; gSprites[ballSpriteId].data[0] = 0; gSprites[ballSpriteId].callback = SpriteCB_OpponentMonSendOut; break; @@ -667,7 +667,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) u8 wantedCry = gTasks[taskId].tCryTaskWantedCry; s8 pan = gTasks[taskId].tCryTaskPan; u16 species = gTasks[taskId].tCryTaskSpecies; - u8 battlerId = gTasks[taskId].tCryTaskBattler; + u8 battler = gTasks[taskId].tCryTaskBattler; u8 monSpriteId = gTasks[taskId].tCryTaskMonSpriteId; struct Pokemon *mon = (void *)(u32)((gTasks[taskId].tCryTaskMonPtr1 << 16) | (u16)(gTasks[taskId].tCryTaskMonPtr2)); @@ -684,7 +684,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) PlayCry_ByMode(species, pan, CRY_MODE_NORMAL); else PlayCry_ByMode(species, pan, CRY_MODE_WEAK); - gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].waitForCry = FALSE; DestroyTask(taskId); break; case 2: @@ -701,7 +701,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) else PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK_DOUBLES); - gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].waitForCry = FALSE; DestroyTask(taskId); } else @@ -741,7 +741,7 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) else PlayCry_ReleaseDouble(species, pan, CRY_MODE_WEAK); - gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].waitForCry = FALSE; DestroyTask(taskId); break; } @@ -749,11 +749,11 @@ static void Task_PlayCryWhenReleasedFromBall(u8 taskId) static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) { - u8 battlerId = sprite->sBattler; + u8 battler = sprite->sBattler; u32 ballId; StartSpriteAnim(sprite, 1); - ballId = ItemIdToBallId(GetBattlerPokeballItemId(battlerId)); + ballId = ItemIdToBallId(GetBattlerPokeballItemId(battler)); AnimateBallOpenParticles(sprite->x, sprite->y - 5, 1, 28, ballId); sprite->data[0] = LaunchBallFadeMonTask(TRUE, sprite->sBattler, 14, ballId); sprite->callback = HandleBallAnimEnd; @@ -766,19 +766,19 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) u16 wantedCryCase; u8 taskId; - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { - mon = &gEnemyParty[gBattlerPartyIndexes[battlerId]]; + mon = &gEnemyParty[gBattlerPartyIndexes[battler]]; pan = 25; } else { - mon = &gPlayerParty[gBattlerPartyIndexes[battlerId]]; + mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; pan = -25; } species = GetMonData(mon, MON_DATA_SPECIES); - if ((battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + if ((battler == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battler == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) && IsDoubleBattle() && gBattleSpritesDataPtr->animationData->introAnimActive) { if (gBattleTypeFlags & BATTLE_TYPE_MULTI && gBattleTypeFlags & BATTLE_TYPE_LINK) @@ -794,18 +794,18 @@ static void SpriteCB_ReleaseMonFromBall(struct Sprite *sprite) if (!IsDoubleBattle() || !gBattleSpritesDataPtr->animationData->introAnimActive) wantedCryCase = 0; - else if (battlerId == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battlerId == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) + else if (battler == GetBattlerAtPosition(B_POSITION_PLAYER_LEFT) || battler == GetBattlerAtPosition(B_POSITION_OPPONENT_LEFT)) wantedCryCase = 1; else wantedCryCase = 2; - gBattleSpritesDataPtr->healthBoxesData[battlerId].waitForCry = TRUE; + gBattleSpritesDataPtr->healthBoxesData[battler].waitForCry = TRUE; taskId = CreateTask(Task_PlayCryWhenReleasedFromBall, 3); gTasks[taskId].tCryTaskSpecies = species; gTasks[taskId].tCryTaskPan = pan; gTasks[taskId].tCryTaskWantedCry = wantedCryCase; - gTasks[taskId].tCryTaskBattler = battlerId; + gTasks[taskId].tCryTaskBattler = battler; gTasks[taskId].tCryTaskMonSpriteId = gBattlerSpriteIds[sprite->sBattler]; gTasks[taskId].tCryTaskMonPtr1 = (u32)(mon) >> 16; gTasks[taskId].tCryTaskMonPtr2 = (u32)(mon); @@ -845,28 +845,28 @@ static void SpriteCB_BallThrow_StartCaptureMon(struct Sprite *sprite) static void HandleBallAnimEnd(struct Sprite *sprite) { bool8 affineAnimEnded = FALSE; - u8 battlerId = sprite->sBattler; + u8 battler = sprite->sBattler; - gSprites[gBattlerSpriteIds[battlerId]].invisible = FALSE; + gSprites[gBattlerSpriteIds[battler]].invisible = FALSE; if (sprite->animEnded) sprite->invisible = TRUE; - if (gSprites[gBattlerSpriteIds[battlerId]].affineAnimEnded) + if (gSprites[gBattlerSpriteIds[battler]].affineAnimEnded) { - StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battlerId]], BATTLER_AFFINE_NORMAL); + StartSpriteAffineAnim(&gSprites[gBattlerSpriteIds[battler]], BATTLER_AFFINE_NORMAL); affineAnimEnded = TRUE; } else { - gSprites[gBattlerSpriteIds[battlerId]].data[1] -= 288; - gSprites[gBattlerSpriteIds[battlerId]].y2 = gSprites[gBattlerSpriteIds[battlerId]].data[1] >> 8; + gSprites[gBattlerSpriteIds[battler]].data[1] -= 288; + gSprites[gBattlerSpriteIds[battler]].y2 = gSprites[gBattlerSpriteIds[battler]].data[1] >> 8; } if (sprite->animEnded && affineAnimEnded) { s32 i, doneBattlers; - gSprites[gBattlerSpriteIds[battlerId]].y2 = 0; + gSprites[gBattlerSpriteIds[battler]].y2 = 0; gDoingBattleAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive = FALSE; FreeSpriteOamMatrix(sprite); DestroySprite(sprite); @@ -885,7 +885,7 @@ static void HandleBallAnimEnd(struct Sprite *sprite) static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite) { - u8 battlerId = sprite->sBattler; + u8 battler = sprite->sBattler; sprite->data[4]++; if (sprite->data[4] == 40) @@ -904,7 +904,7 @@ static void SpriteCB_BallThrow_CaptureMon(struct Sprite *sprite) DestroySprite(&gSprites[gBattlerSpriteIds[sprite->sBattler]]); DestroySpriteAndFreeResources(sprite); if (gMain.inBattle) - gBattleSpritesDataPtr->healthBoxesData[battlerId].ballAnimActive = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive = FALSE; } } @@ -1238,16 +1238,16 @@ static void UNUSED DestroySpriteAndFreeResources_Ball(struct Sprite *sprite) #define sDelayTimer data[1] -void StartHealthboxSlideIn(u8 battlerId) +void StartHealthboxSlideIn(u8 battler) { - struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battlerId]]; + struct Sprite *healthboxSprite = &gSprites[gHealthboxSpriteIds[battler]]; healthboxSprite->sSpeedX = 5; healthboxSprite->sSpeedY = 0; healthboxSprite->x2 = 0x73; healthboxSprite->y2 = 0; healthboxSprite->callback = SpriteCB_HealthboxSlideIn; - if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + if (GetBattlerSide(battler) != B_SIDE_PLAYER) { healthboxSprite->sSpeedX = -healthboxSprite->sSpeedX; healthboxSprite->sSpeedY = -healthboxSprite->sSpeedY; @@ -1255,7 +1255,7 @@ void StartHealthboxSlideIn(u8 battlerId) healthboxSprite->y2 = -healthboxSprite->y2; } gSprites[healthboxSprite->data[5]].callback(&gSprites[healthboxSprite->data[5]]); - if (GetBattlerPosition(battlerId) == B_POSITION_PLAYER_RIGHT) + if (GetBattlerPosition(battler) == B_POSITION_PLAYER_RIGHT) healthboxSprite->callback = SpriteCB_HealthboxSlideInDelayed; } @@ -1281,13 +1281,13 @@ static void SpriteCB_HealthboxSlideIn(struct Sprite *sprite) #undef sSpeedY #undef sDelayTimer -void DoHitAnimHealthboxEffect(u8 battlerId) +void DoHitAnimHealthboxEffect(u8 battler) { u8 spriteId; spriteId = CreateInvisibleSpriteWithCallback(SpriteCB_HitAnimHealthoxEffect); gSprites[spriteId].data[0] = 1; - gSprites[spriteId].data[1] = gHealthboxSpriteIds[battlerId]; + gSprites[spriteId].data[1] = gHealthboxSpriteIds[battler]; gSprites[spriteId].callback = SpriteCB_HitAnimHealthoxEffect; } @@ -1335,10 +1335,10 @@ void FreeBallGfx(u8 ballId) FreeSpritePaletteByTag(gBallSpritePalettes[ballId].tag); } -static u16 GetBattlerPokeballItemId(u8 battlerId) +static u16 GetBattlerPokeballItemId(u8 battler) { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) - return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + return GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); else - return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battlerId]], MON_DATA_POKEBALL); + return GetMonData(&gEnemyParty[gBattlerPartyIndexes[battler]], MON_DATA_POKEBALL); } diff --git a/src/pokemon.c b/src/pokemon.c index 8943a232d5..310d686e69 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -67,7 +67,7 @@ static union PokemonSubstruct *GetSubstruct(struct BoxPokemon *boxMon, u32 perso static void EncryptBoxMon(struct BoxPokemon *boxMon); static void DecryptBoxMon(struct BoxPokemon *boxMon); static void Task_PlayMapChosenOrBattleBGM(u8 taskId); -static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battlerId); +static bool8 ShouldGetStatBadgeBoost(u16 flagId, u8 battler); static u16 GiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); static bool8 ShouldSkipFriendshipChange(void); static u8 CopyMonToPC(struct Pokemon *mon); @@ -2639,7 +2639,7 @@ static void CreateEventMon(struct Pokemon *mon, u16 species, u8 level, u8 fixedI } // If FALSE, should load this game's Deoxys form. If TRUE, should load normal Deoxys form -bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) +bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battler) { switch (caseId) { @@ -2651,7 +2651,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) return FALSE; if (!gMain.inBattle) return FALSE; - if (gLinkPlayers[GetMultiplayerId()].id == battlerId) + if (gLinkPlayers[GetMultiplayerId()].id == battler) return FALSE; break; case 2: @@ -2661,7 +2661,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) return FALSE; if (!gMain.inBattle) return FALSE; - if (battlerId == 1 || battlerId == 4 || battlerId == 5) + if (battler == 1 || battler == 4 || battler == 5) return TRUE; return FALSE; case 4: @@ -2673,12 +2673,12 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) return FALSE; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) { - if (gLinkPlayers[GetMultiplayerId()].id == battlerId) + if (gLinkPlayers[GetMultiplayerId()].id == battler) return FALSE; } else { - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) return FALSE; } } @@ -2686,7 +2686,7 @@ bool8 ShouldIgnoreDeoxysForm(u8 caseId, u8 battlerId) { if (!gMain.inBattle) return FALSE; - if (GetBattlerSide(battlerId) == B_SIDE_PLAYER) + if (GetBattlerSide(battler) == B_SIDE_PLAYER) return FALSE; } break; @@ -3404,11 +3404,11 @@ u8 CountAliveMonsInBattle(u8 caseId) return retVal; } -static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) +static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battler) { if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_RECORDED_LINK | BATTLE_TYPE_FRONTIER)) return FALSE; - else if (GetBattlerSide(battlerId) != B_SIDE_PLAYER) + else if (GetBattlerSide(battler) != B_SIDE_PLAYER) return FALSE; else if (gBattleTypeFlags & BATTLE_TYPE_TRAINER && gTrainerBattleOpponent_A == TRAINER_SECRET_BASE) return FALSE; @@ -3418,9 +3418,9 @@ static bool8 ShouldGetStatBadgeBoost(u16 badgeFlag, u8 battlerId) return FALSE; } -u8 GetDefaultMoveTarget(u8 battlerId) +u8 GetDefaultMoveTarget(u8 battler) { - u8 opposing = BATTLE_OPPOSITE(GET_BATTLER_SIDE(battlerId)); + u8 opposing = BATTLE_OPPOSITE(GET_BATTLER_SIDE(battler)); if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) return GetBattlerAtPosition(opposing); @@ -4638,59 +4638,59 @@ void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex) mon->ppBonuses &= gPPUpClearMask[moveIndex]; } -void CopyPlayerPartyMonToBattleData(u8 battlerId, u8 partyIndex) +void CopyPlayerPartyMonToBattleData(u8 battler, u8 partyIndex) { u16 *hpSwitchout; s32 i; u8 nickname[POKEMON_NAME_BUFFER_SIZE]; - gBattleMons[battlerId].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); - gBattleMons[battlerId].item = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HELD_ITEM, NULL); + gBattleMons[battler].species = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPECIES, NULL); + gBattleMons[battler].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].types[0] = gSpeciesInfo[gBattleMons[battlerId].species].types[0]; - gBattleMons[battlerId].types[1] = gSpeciesInfo[gBattleMons[battlerId].species].types[1]; - gBattleMons[battlerId].ability = GetAbilityBySpecies(gBattleMons[battlerId].species, gBattleMons[battlerId].abilityNum); + gBattleMons[battler].moves[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MOVE1 + i, NULL); + gBattleMons[battler].pp[i] = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP1 + i, NULL); + } + + gBattleMons[battler].ppBonuses = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PP_BONUSES, NULL); + gBattleMons[battler].friendship = GetMonData(&gPlayerParty[partyIndex], MON_DATA_FRIENDSHIP, NULL); + gBattleMons[battler].experience = GetMonData(&gPlayerParty[partyIndex], MON_DATA_EXP, NULL); + gBattleMons[battler].hpIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP_IV, NULL); + gBattleMons[battler].attackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK_IV, NULL); + gBattleMons[battler].defenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF_IV, NULL); + gBattleMons[battler].speedIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED_IV, NULL); + gBattleMons[battler].spAttackIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK_IV, NULL); + gBattleMons[battler].spDefenseIV = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF_IV, NULL); + gBattleMons[battler].personality = GetMonData(&gPlayerParty[partyIndex], MON_DATA_PERSONALITY, NULL); + gBattleMons[battler].status1 = GetMonData(&gPlayerParty[partyIndex], MON_DATA_STATUS, NULL); + gBattleMons[battler].level = GetMonData(&gPlayerParty[partyIndex], MON_DATA_LEVEL, NULL); + gBattleMons[battler].hp = GetMonData(&gPlayerParty[partyIndex], MON_DATA_HP, NULL); + gBattleMons[battler].maxHP = GetMonData(&gPlayerParty[partyIndex], MON_DATA_MAX_HP, NULL); + gBattleMons[battler].attack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ATK, NULL); + gBattleMons[battler].defense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_DEF, NULL); + gBattleMons[battler].speed = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPEED, NULL); + gBattleMons[battler].spAttack = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPATK, NULL); + gBattleMons[battler].spDefense = GetMonData(&gPlayerParty[partyIndex], MON_DATA_SPDEF, NULL); + gBattleMons[battler].isEgg = GetMonData(&gPlayerParty[partyIndex], MON_DATA_IS_EGG, NULL); + gBattleMons[battler].abilityNum = GetMonData(&gPlayerParty[partyIndex], MON_DATA_ABILITY_NUM, NULL); + gBattleMons[battler].otId = GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_ID, NULL); + gBattleMons[battler].types[0] = gSpeciesInfo[gBattleMons[battler].species].types[0]; + gBattleMons[battler].types[1] = gSpeciesInfo[gBattleMons[battler].species].types[1]; + gBattleMons[battler].ability = GetAbilityBySpecies(gBattleMons[battler].species, gBattleMons[battler].abilityNum); GetMonData(&gPlayerParty[partyIndex], MON_DATA_NICKNAME, nickname); - StringCopy_Nickname(gBattleMons[battlerId].nickname, nickname); - GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battlerId].otName); + StringCopy_Nickname(gBattleMons[battler].nickname, nickname); + GetMonData(&gPlayerParty[partyIndex], MON_DATA_OT_NAME, gBattleMons[battler].otName); - hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battlerId)]; - *hpSwitchout = gBattleMons[battlerId].hp; + hpSwitchout = &gBattleStruct->hpOnSwitchout[GetBattlerSide(battler)]; + *hpSwitchout = gBattleMons[battler].hp; for (i = 0; i < NUM_BATTLE_STATS; i++) - gBattleMons[battlerId].statStages[i] = DEFAULT_STAT_STAGE; + gBattleMons[battler].statStages[i] = DEFAULT_STAT_STAGE; - gBattleMons[battlerId].status2 = 0; - UpdateSentPokesToOpponentValue(battlerId); - ClearTemporarySpeciesSpriteData(battlerId, FALSE); + gBattleMons[battler].status2 = 0; + UpdateSentPokesToOpponentValue(battler); + ClearTemporarySpeciesSpriteData(battler, FALSE); } bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex) @@ -4737,7 +4737,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u32 temp1, temp2; s8 friendshipChange = 0; u8 holdEffect; - u8 battlerId = MAX_BATTLERS_COUNT; + u8 battler = MAX_BATTLERS_COUNT; u32 friendshipOnly = FALSE; u16 heldItem; u8 effectFlags; @@ -4768,7 +4768,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov { if (gBattlerPartyIndexes[i] == partyIndex) { - battlerId = i; + battler = i; break; } i += 2; @@ -4777,7 +4777,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov else { gActiveBattler = 0; - battlerId = MAX_BATTLERS_COUNT; + battler = MAX_BATTLERS_COUNT; } // Skip using the item if it won't do anything @@ -4809,9 +4809,9 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov case 0: // Cure infatuation if ((itemEffect[i] & ITEM0_INFATUATION) - && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_INFATUATION)) + && gMain.inBattle && battler != MAX_BATTLERS_COUNT && (gBattleMons[battler].status2 & STATUS2_INFATUATION)) { - gBattleMons[battlerId].status2 &= ~STATUS2_INFATUATION; + gBattleMons[battler].status2 &= ~STATUS2_INFATUATION; retVal = FALSE; } @@ -4901,24 +4901,24 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Cure status if ((itemEffect[i] & ITEM3_SLEEP) - && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battlerId) == 0) + && HealStatusConditions(mon, partyIndex, STATUS1_SLEEP, battler) == 0) { - if (battlerId != MAX_BATTLERS_COUNT) - gBattleMons[battlerId].status2 &= ~STATUS2_NIGHTMARE; + if (battler != MAX_BATTLERS_COUNT) + gBattleMons[battler].status2 &= ~STATUS2_NIGHTMARE; retVal = FALSE; } - if ((itemEffect[i] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battlerId) == 0) + if ((itemEffect[i] & ITEM3_POISON) && HealStatusConditions(mon, partyIndex, STATUS1_PSN_ANY | STATUS1_TOXIC_COUNTER, battler) == 0) retVal = FALSE; - if ((itemEffect[i] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battlerId) == 0) + if ((itemEffect[i] & ITEM3_BURN) && HealStatusConditions(mon, partyIndex, STATUS1_BURN, battler) == 0) retVal = FALSE; - if ((itemEffect[i] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battlerId) == 0) + if ((itemEffect[i] & ITEM3_FREEZE) && HealStatusConditions(mon, partyIndex, STATUS1_FREEZE, battler) == 0) retVal = FALSE; - if ((itemEffect[i] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battlerId) == 0) + if ((itemEffect[i] & ITEM3_PARALYSIS) && HealStatusConditions(mon, partyIndex, STATUS1_PARALYSIS, battler) == 0) retVal = FALSE; if ((itemEffect[i] & ITEM3_CONFUSION) // heal confusion - && gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && (gBattleMons[battlerId].status2 & STATUS2_CONFUSION)) + && gMain.inBattle && battler != MAX_BATTLERS_COUNT && (gBattleMons[battler].status2 & STATUS2_CONFUSION)) { - gBattleMons[battlerId].status2 &= ~STATUS2_CONFUSION; + gBattleMons[battler].status2 &= ~STATUS2_CONFUSION; retVal = FALSE; } break; @@ -5011,10 +5011,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov } if (gMain.inBattle) { - if (battlerId != MAX_BATTLERS_COUNT) + if (battler != MAX_BATTLERS_COUNT) { - gAbsentBattlerFlags &= ~gBitTable[battlerId]; - CopyPlayerPartyMonToBattleData(battlerId, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battlerId])); + gAbsentBattlerFlags &= ~gBitTable[battler]; + CopyPlayerPartyMonToBattleData(battler, GetPartyIdFromBattlePartyId(gBattlerPartyIndexes[battler])); if (GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER && gBattleResults.numRevivesUsed < 255) gBattleResults.numRevivesUsed++; } @@ -5064,16 +5064,16 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov SetMonData(mon, MON_DATA_HP, &dataUnsigned); // Update battler (if applicable) - if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT) + if (gMain.inBattle && battler != MAX_BATTLERS_COUNT) { - gBattleMons[battlerId].hp = dataUnsigned; + gBattleMons[battler].hp = dataUnsigned; if (!(effectFlags & (ITEM4_REVIVE >> 2)) && GetBattlerSide(gActiveBattler) == B_SIDE_PLAYER) { if (gBattleResults.numHealingItemsUsed < 255) gBattleResults.numHealingItemsUsed++; temp2 = gActiveBattler; - gActiveBattler = battlerId; + gActiveBattler = battler; BtlController_EmitGetMonData(B_COMM_TO_CONTROLLER, REQUEST_ALL_BATTLE, 0); MarkBattlerForControllerExec(gActiveBattler); gActiveBattler = temp2; @@ -5110,8 +5110,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); // Heal battler PP too (if applicable) - if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battlerId, temp2)) - gBattleMons[battlerId].pp[temp2] = dataUnsigned; + if (gMain.inBattle && battler != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battler, temp2)) + gBattleMons[battler].pp[temp2] = dataUnsigned; retVal = FALSE; } @@ -5136,8 +5136,8 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); // Heal battler PP too (if applicable) - if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battlerId, moveIndex)) - gBattleMons[battlerId].pp[moveIndex] = dataUnsigned; + if (gMain.inBattle && battler != MAX_BATTLERS_COUNT && MOVE_IS_PERMANENT(battler, moveIndex)) + gBattleMons[battler].pp[moveIndex] = dataUnsigned; retVal = FALSE; } @@ -5276,7 +5276,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov return retVal; } -bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battlerId) +bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battler) { u32 status = GetMonData(mon, MON_DATA_STATUS, 0); @@ -5284,8 +5284,8 @@ bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, { status &= ~healMask; SetMonData(mon, MON_DATA_STATUS, &status); - if (gMain.inBattle && battlerId != MAX_BATTLERS_COUNT) - gBattleMons[battlerId].status1 &= ~healMask; + if (gMain.inBattle && battler != MAX_BATTLERS_COUNT) + gBattleMons[battler].status1 &= ~healMask; return FALSE; } else @@ -6874,22 +6874,22 @@ void BattleAnimateBackSprite(struct Sprite *sprite, u16 species) static u8 UNUSED GetOwnOpposingLinkMultiBattlerId(bool8 rightSide) { s32 i; - s32 battlerId = 0; + s32 battler = 0; u8 multiplayerId = GetMultiplayerId(); switch (gLinkPlayers[multiplayerId].id) { case 0: case 2: - battlerId = rightSide ? 1 : 3; + battler = rightSide ? 1 : 3; break; case 1: case 3: - battlerId = rightSide ? 2 : 0; + battler = rightSide ? 2 : 0; break; } for (i = 0; i < MAX_LINK_PLAYERS; i++) { - if (gLinkPlayers[i].id == (s16)battlerId) + if (gLinkPlayers[i].id == (s16)battler) break; } return i; @@ -6898,21 +6898,21 @@ static u8 UNUSED GetOwnOpposingLinkMultiBattlerId(bool8 rightSide) u8 GetOpposingLinkMultiBattlerId(bool8 rightSide, u8 multiplayerId) { s32 i; - s32 battlerId = 0; + s32 battler = 0; switch (gLinkPlayers[multiplayerId].id) { case 0: case 2: - battlerId = rightSide ? 1 : 3; + battler = rightSide ? 1 : 3; break; case 1: case 3: - battlerId = rightSide ? 2 : 0; + battler = rightSide ? 2 : 0; break; } for (i = 0; i < MAX_LINK_PLAYERS; i++) { - if (gLinkPlayers[i].id == (s16)battlerId) + if (gLinkPlayers[i].id == (s16)battler) break; } return i; diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index c5ef33878f..837e6675c9 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -955,14 +955,14 @@ void StartMonSummaryAnimation(struct Sprite *sprite, u8 frontAnimId) void LaunchAnimationTaskForBackSprite(struct Sprite *sprite, u8 backAnimSet) { - u8 nature, taskId, animId, battlerId; + u8 nature, taskId, animId, battler; taskId = CreateTask(Task_HandleMonAnimation, 128); gTasks[taskId].tPtrHi = (u32)(sprite) >> 16; gTasks[taskId].tPtrLo = (u32)(sprite); - battlerId = sprite->data[0]; - nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[battlerId]]); + battler = sprite->data[0]; + nature = GetNature(&gPlayerParty[gBattlerPartyIndexes[battler]]); // * 3 below because each back anim has 3 variants depending on nature animId = 3 * backAnimSet + sBackAnimNatureModTable[nature]; diff --git a/src/recorded_battle.c b/src/recorded_battle.c index ebd2a5800f..559fc445f1 100644 --- a/src/recorded_battle.c +++ b/src/recorded_battle.c @@ -27,7 +27,7 @@ struct PlayerInfo u32 trainerId; u8 name[PLAYER_NAME_LENGTH + 1]; u8 gender; - u16 battlerId; + u16 battler; u16 language; }; @@ -152,7 +152,7 @@ void RecordedBattle_SetTrainerInfo(void) { sPlayers[i].trainerId = gLinkPlayers[i].trainerId; sPlayers[i].gender = gLinkPlayers[i].gender; - sPlayers[i].battlerId = gLinkPlayers[i].id; + sPlayers[i].battler = gLinkPlayers[i].id; sPlayers[i].language = gLinkPlayers[i].language; // Record names @@ -178,7 +178,7 @@ void RecordedBattle_SetTrainerInfo(void) | (gSaveBlock2Ptr->playerTrainerId[3] << 24); sPlayers[0].gender = gSaveBlock2Ptr->playerGender; - sPlayers[0].battlerId = 0; + sPlayers[0].battler = 0; sPlayers[0].language = gGameLanguage; for (i = 0; i < PLAYER_NAME_LENGTH + 1; i++) @@ -186,29 +186,29 @@ void RecordedBattle_SetTrainerInfo(void) } } -void RecordedBattle_SetBattlerAction(u8 battlerId, u8 action) +void RecordedBattle_SetBattlerAction(u8 battler, u8 action) { - if (sBattlerRecordSizes[battlerId] < BATTLER_RECORD_SIZE && sRecordMode != B_RECORD_MODE_PLAYBACK) - sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]++] = action; + if (sBattlerRecordSizes[battler] < BATTLER_RECORD_SIZE && sRecordMode != B_RECORD_MODE_PLAYBACK) + sBattleRecords[battler][sBattlerRecordSizes[battler]++] = action; } -void RecordedBattle_ClearBattlerAction(u8 battlerId, u8 bytesToClear) +void RecordedBattle_ClearBattlerAction(u8 battler, u8 bytesToClear) { s32 i; for (i = 0; i < bytesToClear; i++) { - sBattlerRecordSizes[battlerId]--; - sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] = 0xFF; - if (sBattlerRecordSizes[battlerId] == 0) + sBattlerRecordSizes[battler]--; + sBattleRecords[battler][sBattlerRecordSizes[battler]] = 0xFF; + if (sBattlerRecordSizes[battler] == 0) break; } } -u8 RecordedBattle_GetBattlerAction(u8 battlerId) +u8 RecordedBattle_GetBattlerAction(u8 battler) { // Trying to read past array or invalid action byte, battle is over. - if (sBattlerRecordSizes[battlerId] >= BATTLER_RECORD_SIZE || sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] == 0xFF) + if (sBattlerRecordSizes[battler] >= BATTLER_RECORD_SIZE || sBattleRecords[battler][sBattlerRecordSizes[battler]] == 0xFF) { gSpecialVar_Result = gBattleOutcome = B_OUTCOME_PLAYER_TELEPORTED; // hah ResetPaletteFadeControl(); @@ -218,7 +218,7 @@ u8 RecordedBattle_GetBattlerAction(u8 battlerId) } else { - return sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]++]; + return sBattleRecords[battler][sBattlerRecordSizes[battler]++]; } } @@ -268,11 +268,11 @@ void RecordedBattle_RecordAllBattlerData(u8 *src) { for (size = *src; size != 0;) { - u8 battlerId = GetNextRecordedDataByte(src, &idx, &size); + u8 battler = GetNextRecordedDataByte(src, &idx, &size); u8 numActions = GetNextRecordedDataByte(src, &idx, &size); for (i = 0; i < numActions; i++) - sBattleRecords[battlerId][sBattlerSavedRecordSizes[battlerId]++] = GetNextRecordedDataByte(src, &idx, &size); + sBattleRecords[battler][sBattlerSavedRecordSizes[battler]++] = GetNextRecordedDataByte(src, &idx, &size); } } } @@ -339,7 +339,7 @@ bool32 MoveRecordedBattleToSaveData(void) battleSave->playersName[i][j] = sPlayers[i].name[j]; battleSave->playersGender[i] = sPlayers[i].gender; battleSave->playersLanguage[i] = sPlayers[i].language; - battleSave->playersBattlers[i] = sPlayers[i].battlerId; + battleSave->playersBattlers[i] = sPlayers[i].battler; battleSave->playersTrainerId[i] = sPlayers[i].trainerId; } @@ -358,16 +358,16 @@ bool32 MoveRecordedBattleToSaveData(void) } else if (sBattleFlags & BATTLE_TYPE_MULTI) { - switch (sPlayers[0].battlerId) + switch (sPlayers[0].battler) { case 0: case 2: - if (!(sPlayers[gRecordedBattleMultiplayerId].battlerId & 1)) + if (!(sPlayers[gRecordedBattleMultiplayerId].battler & 1)) battleSave->battleFlags |= BATTLE_TYPE_RECORDED_IS_MASTER; break; case 1: case 3: - if ((sPlayers[gRecordedBattleMultiplayerId].battlerId & 1)) + if ((sPlayers[gRecordedBattleMultiplayerId].battler & 1)) battleSave->battleFlags |= BATTLE_TYPE_RECORDED_IS_MASTER; break; } @@ -707,35 +707,35 @@ void RecordedBattle_CopyBattlerMoves(void) void RecordedBattle_CheckMovesetChanges(u8 mode) { - s32 battlerId, j, k; + s32 battler, j, k; if (gBattleTypeFlags & (BATTLE_TYPE_LINK | BATTLE_TYPE_RECORDED_LINK)) return; - for (battlerId = 0; battlerId < gBattlersCount; battlerId++) + for (battler = 0; battler < gBattlersCount; battler++) { // Player's side only - if (GetBattlerSide(battlerId) != B_SIDE_OPPONENT) + if (GetBattlerSide(battler) != B_SIDE_OPPONENT) { if (mode == B_RECORD_MODE_RECORDING) { // Check if any of the battler's moves have changed. for (j = 0; j < MAX_MON_MOVES; j++) { - if (gBattleMons[battlerId].moves[j] != sPlayerMonMoves[battlerId / 2][j]) + if (gBattleMons[battler].moves[j] != sPlayerMonMoves[battler / 2][j]) break; } if (j != MAX_MON_MOVES) { // At least one of the moves has been changed - RecordedBattle_SetBattlerAction(battlerId, ACTION_MOVE_CHANGE); + RecordedBattle_SetBattlerAction(battler, ACTION_MOVE_CHANGE); for (j = 0; j < MAX_MON_MOVES; j++) { for (k = 0; k < MAX_MON_MOVES; k++) { - if (gBattleMons[battlerId].moves[j] == sPlayerMonMoves[battlerId / 2][k]) + if (gBattleMons[battler].moves[j] == sPlayerMonMoves[battler / 2][k]) { - RecordedBattle_SetBattlerAction(battlerId, k); + RecordedBattle_SetBattlerAction(battler, k); break; } } @@ -744,7 +744,7 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) } else // B_RECORD_MODE_PLAYBACK { - if (sBattleRecords[battlerId][sBattlerRecordSizes[battlerId]] == ACTION_MOVE_CHANGE) + if (sBattleRecords[battler][sBattlerRecordSizes[battler]] == ACTION_MOVE_CHANGE) { u8 ppBonuses[MAX_MON_MOVES]; u8 moveSlots[MAX_MON_MOVES]; @@ -754,55 +754,55 @@ void RecordedBattle_CheckMovesetChanges(u8 mode) // We know the current action is ACTION_MOVE_CHANGE, retrieve // it without saving it to move on to the next action. - RecordedBattle_GetBattlerAction(battlerId); + RecordedBattle_GetBattlerAction(battler); for (j = 0; j < MAX_MON_MOVES; j++) - ppBonuses[j] = ((gBattleMons[battlerId].ppBonuses & (3 << (j << 1))) >> (j << 1)); + ppBonuses[j] = ((gBattleMons[battler].ppBonuses & (3 << (j << 1))) >> (j << 1)); for (j = 0; j < MAX_MON_MOVES; j++) { - moveSlots[j] = RecordedBattle_GetBattlerAction(battlerId); - movePp.moves[j] = gBattleMons[battlerId].moves[moveSlots[j]]; - movePp.currentPp[j] = gBattleMons[battlerId].pp[moveSlots[j]]; + moveSlots[j] = RecordedBattle_GetBattlerAction(battler); + movePp.moves[j] = gBattleMons[battler].moves[moveSlots[j]]; + movePp.currentPp[j] = gBattleMons[battler].pp[moveSlots[j]]; movePp.maxPp[j] = ppBonuses[moveSlots[j]]; - mimickedMoveSlots[j] = (gDisableStructs[battlerId].mimickedMoves & gBitTable[j]) >> j; + mimickedMoveSlots[j] = (gDisableStructs[battler].mimickedMoves & gBitTable[j]) >> j; } for (j = 0; j < MAX_MON_MOVES; j++) { - gBattleMons[battlerId].moves[j] = movePp.moves[j]; - gBattleMons[battlerId].pp[j] = movePp.currentPp[j]; + gBattleMons[battler].moves[j] = movePp.moves[j]; + gBattleMons[battler].pp[j] = movePp.currentPp[j]; } - gBattleMons[battlerId].ppBonuses = 0; - gDisableStructs[battlerId].mimickedMoves = 0; + gBattleMons[battler].ppBonuses = 0; + gDisableStructs[battler].mimickedMoves = 0; for (j = 0; j < MAX_MON_MOVES; j++) { - gBattleMons[battlerId].ppBonuses |= movePp.maxPp[j] << (j << 1); - gDisableStructs[battlerId].mimickedMoves |= mimickedMoveSlots[j] << j; + gBattleMons[battler].ppBonuses |= movePp.maxPp[j] << (j << 1); + gDisableStructs[battler].mimickedMoves |= mimickedMoveSlots[j] << j; } - if (!(gBattleMons[battlerId].status2 & STATUS2_TRANSFORMED)) + if (!(gBattleMons[battler].status2 & STATUS2_TRANSFORMED)) { for (j = 0; j < MAX_MON_MOVES; j++) - ppBonuses[j] = (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); + ppBonuses[j] = (GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PP_BONUSES, NULL) & ((3 << (j << 1)))) >> (j << 1); for (j = 0; j < MAX_MON_MOVES; j++) { - movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + moveSlots[j], NULL); - movePp.currentPp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + moveSlots[j], NULL); + movePp.moves[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_MOVE1 + moveSlots[j], NULL); + movePp.currentPp[j] = GetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PP1 + moveSlots[j], NULL); movePp.maxPp[j] = ppBonuses[moveSlots[j]]; } for (j = 0; j < MAX_MON_MOVES; j++) { - SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_MOVE1 + j, &movePp.moves[j]); - SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP1 + j, &movePp.currentPp[j]); + SetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_MOVE1 + j, &movePp.moves[j]); + SetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PP1 + j, &movePp.currentPp[j]); } ppBonusSet = 0; for (j = 0; j < MAX_MON_MOVES; j++) ppBonusSet |= movePp.maxPp[j] << (j << 1); - SetMonData(&gPlayerParty[gBattlerPartyIndexes[battlerId]], MON_DATA_PP_BONUSES, &ppBonusSet); + SetMonData(&gPlayerParty[gBattlerPartyIndexes[battler]], MON_DATA_PP_BONUSES, &ppBonusSet); } - gChosenMoveByBattler[battlerId] = gBattleMons[battlerId].moves[*(gBattleStruct->chosenMovePositions + battlerId)]; + gChosenMoveByBattler[battler] = gBattleMons[battler].moves[*(gBattleStruct->chosenMovePositions + battler)]; } } } diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c index fd2ed03cca..17a5d3b268 100644 --- a/src/reshow_battle_screen.c +++ b/src/reshow_battle_screen.c @@ -18,9 +18,9 @@ // this file's functions static void CB2_ReshowBattleScreenAfterMenu(void); -static bool8 LoadBattlerSpriteGfx(u8 battlerId); -static void CreateBattlerSprite(u8 battlerId); -static void CreateHealthboxSprite(u8 battlerId); +static bool8 LoadBattlerSpriteGfx(u8 battler); +static void CreateBattlerSprite(u8 battler); +static void CreateHealthboxSprite(u8 battler); static void ClearBattleBgCntBaseBlocks(void); void ReshowBattleScreenDummy(void) diff --git a/tools/mgba-rom-test-hydra/mgba-rom-test-hydra b/tools/mgba-rom-test-hydra/mgba-rom-test-hydra new file mode 100755 index 0000000000000000000000000000000000000000..f92182a1818ff806241fded0d3420b45c99a7204 GIT binary patch literal 30888 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 literal 0 HcmV?d00001 diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc new file mode 100755 index 0000000000000000000000000000000000000000..89dba8c1dd10cab1b28159895472e947ba446cba GIT binary patch literal 55696 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%0De8-r2ozsZ;{mhiUII{GXVTyz%5cKN$I8m@b>^d zV$f-c`C5|Dv!M|fr-~RTP#3%YIRKv{fM-GetnHEmPiHWE`0Xor{#;S~{Q!K1AJ@PB z#{f?JV==)%B;y$VaHaSh4q(rTa64fDK8^w4R}KKb4sgTmJj-8Y;|t@p5E39qGN*8vYZn2AHF5}bU5Ch0!k+gM-I zZ?zK&6~RirfHUxMBhIkzIi!KPUzl_jh*Lx8fzb;u68L@2CUIgT_-8m>AZzYDWh4Yh z0Dgwr*5^!<;f&MI(8@N`$tYfB?@1{`{%5!p30n3p4oslI*XLN4?DKxDX=0yKU;I?3 zho4f+FDx`7{ERRY1g_zT89ySH3LKcrMS_Vu*T$(uZeX$^F)WOI-y)mOM-9Cem>59S z0YfQ2g{ttxS0m5TDRd?^Da&8V9&o5!pztHPcv;!w!E(ssR6S)g>=jOr>X@N;%H7jT z>~7EWvNF5?j8{NQ+)j^D+wAidm%CjhrJe~`Iu(Jk-ap@qQ4Uw&p$ZeF7fe(z_8Yv5 zni3#J;Hs+d;5;l|4{U)WsH!Nf$N9~wYP<&xe0uRG1sxSu*Q7w$TaGCZkFTaWP_5K@ z>l<5ArK2|q8&b(Vwf+V_NmlRcm6f*yjquXRzJ;FJYJYvAiit|IZ%H3E9=!D6Lz`1j ziO(Xu+~+ei0w-#{34XjX5}B)wgfVIfg5y=q6cX;&YExkWyt0x4@pu;C1E&UqlwPh(Wr)MGN^J{#ehL`f(ihb;zokXAiA+JM zrGudGOXo#XyUpW)S$J?--s6FUu$O+V#pCg|R#SK4McNw-4A92`GAA7P zOsP!CZ&|u1P(2?hG{e$5d50GheEAC+g86vkvk6_hRLM_(<_G=tHRJp>N(YJ+W#AZzd?e!lC3LnE>NV!0xpw8d?5h&NR#Q;2s)Ws zC80=V94Ntd+?enu>)#~kWh(a{B|hOMUoK>hU=L2xcL;i!P7=rn7ujW$pSEdePg2s$ zeM_0@q5xqQlT*^mb@N=nsY*#N_d#VU_dS8aE~ETjKxvOr(#w6tL@MZ{{1Q*5v<*Rf zmNGB*EoE9P=#BCVFx!8kK9Te>(LkBXeN$P#vHcooiM~WKlp8l9?Gz0rdeWJZ{x^UT z3dzSVOKK|jrv;SNCGRP{9e>I677IZYMW*cRFbA>UEO9T>dyr42m-~V;t(l)hj9W`; zR(SyVWO})-l&Rc*mt;o!e^}5<{mb=|OjW5*!9dC_`Tf~IFZTmvN@vuQFJt}B80cF! zaBP{5q`{qZ$^Mg|=W&xf{#QNDOJr)1h$1!C|2p8bha-lqBA-jh)L5U)%k%(fvC2%) z%jXs{m3Tm5m(0tw3s6##tY7Yn$#kPZU<>2Y`_qkEvRz3p_i1F>DfBPxTh=T4(S-8k z`ZsRlyk(l(TNS&L^fEopKrf%0$aM4nLT@(Eua9v8nMye&8(FW+pA33}$@a%$yhN^d zDLj5|54;&t!`SK4&6(5&oq7(tlI2l$}%XU;PE1 c?vfoR3T3?#m-buxqkpV}W1M3kFl3eg2h{~ Date: Fri, 9 May 2025 17:33:23 +0200 Subject: [PATCH 033/187] Replace: moveId -> move, moveIdx -> moveIndex (#2134) --- include/battle_gfx_sfx_util.h | 2 +- include/battle_tv.h | 2 +- include/global.h | 2 +- include/party_menu.h | 2 +- include/pokemon_storage_system.h | 2 +- include/tv.h | 2 +- src/apprentice.c | 40 +++++++++++------------ src/battle_controller_recorded_opponent.c | 4 +-- src/battle_controller_recorded_player.c | 4 +-- src/battle_dome.c | 38 ++++++++++----------- src/battle_gfx_sfx_util.c | 2 +- src/battle_script_commands.c | 12 +++---- src/battle_tower.c | 2 +- src/battle_transition.c | 24 +++++++------- src/battle_tv.c | 38 ++++++++++----------- src/contest_ai.c | 6 ++-- src/item_menu.c | 16 ++++----- src/move_relearner.c | 12 +++---- src/pokemon.c | 28 ++++++++-------- src/pokemon_storage_system.c | 4 +-- src/scrcmd.c | 8 ++--- src/secret_base.c | 10 +++--- src/tv.c | 6 ++-- 23 files changed, 133 insertions(+), 133 deletions(-) diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index f9ce1bb2ca..e65df4bf2a 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -9,7 +9,7 @@ void SpriteCB_TrainerSlideIn(struct Sprite *sprite); void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status); bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument); void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId); -bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn); +bool8 IsMoveWithoutAnimation(u16 move, u8 animationTurn); bool8 IsBattleSEPlaying(u8 battler); void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battler); void BattleLoadPlayerMonSpriteGfx(struct Pokemon *mon, u8 battler); diff --git a/include/battle_tv.h b/include/battle_tv.h index b2a89451a1..5766907637 100644 --- a/include/battle_tv.h +++ b/include/battle_tv.h @@ -6,6 +6,6 @@ void BattleTv_SetDataBasedOnMove(u16 move, u16 weatherFlags, struct DisableStruc void BattleTv_SetDataBasedOnAnimation(u8 animationId); void TryPutLinkBattleTvShowOnAir(void); void BattleTv_ClearExplosionFaintCause(void); -u8 GetBattlerMoveSlotId(u8 battler, u16 moveId); +u8 GetBattlerMoveSlotId(u8 battler, u16 move); #endif // GUARD_BATTLE_TV_H diff --git a/include/global.h b/include/global.h index 62da1165c7..36ddbffbf2 100644 --- a/include/global.h +++ b/include/global.h @@ -459,7 +459,7 @@ struct ApprenticeQuestion u8 moveSlot:2; u8 suggestedChange:2; // TRUE if told to use held item or second move, FALSE if told to use no item or first move //u8 padding; - u16 data; // used both as an itemId and a moveId + u16 data; // used both as an itemId and a move }; struct PlayersApprentice diff --git a/include/party_menu.h b/include/party_menu.h index 2d33b3b9fc..15ab57b0a9 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -16,7 +16,7 @@ struct PartyMenu s8 slotId2; u8 action; u16 bagItem; - s16 data1; // used variously as a moveId, counter, moveSlotId, or cursorPos + s16 data1; // used variously as a move, counter, moveSlotId, or cursorPos s16 learnMoveState; // data2, used only as a learn move state }; diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h index eb25c0ff27..b4f0d6565e 100644 --- a/include/pokemon_storage_system.h +++ b/include/pokemon_storage_system.h @@ -57,7 +57,7 @@ bool8 CheckFreePokemonStorageSpace(void); bool32 CheckBoxMonSanityAt(u32 boxId, u32 boxPosition); u32 CountStorageNonEggMons(void); u32 CountAllStorageMons(void); -bool32 AnyStorageMonWithMove(u16 moveId); +bool32 AnyStorageMonWithMove(u16 move); void ResetWaldaWallpaper(void); void SetWaldaWallpaperLockedOrUnlocked(bool32 unlocked); diff --git a/include/tv.h b/include/tv.h index 31c8fcc50f..f47aa532d7 100644 --- a/include/tv.h +++ b/include/tv.h @@ -5,7 +5,7 @@ extern u8 *const gTVStringVarPtrs[3]; void ClearTVShowData(void); void TryPutBreakingNewsOnAir(void); -void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove); +void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIndex, const u16 *movePtr, u16 betterMove); void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facility); void DoTVShow(void); void DoTVShowInSearchOfTrainers(void); diff --git a/src/apprentice.c b/src/apprentice.c index 72ab8f24c8..7e41ad8f40 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -70,8 +70,8 @@ struct ApprenticeQuestionData { u16 speciesId; u16 altSpeciesId; - u16 moveId1; - u16 moveId2; + u16 move1; + u16 move2; }; // IWRAM common @@ -81,7 +81,7 @@ COMMON_DATA void (*gApprenticeFunc)(void) = NULL; // This file's functions. static u16 GetRandomAlternateMove(u8 monId); -static bool8 TrySetMove(u8 monId, u16 moveId); +static bool8 TrySetMove(u8 monId, u16 move); static void CreateChooseAnswerTask(bool8 noBButton, u8 itemsCount, u8 windowId); static u8 CreateAndShowWindow(u8 left, u8 top, u8 width, u8 height); static void RemoveAndHideWindow(u8 windowId); @@ -337,7 +337,7 @@ static u16 GetRandomAlternateMove(u8 monId) u16 species; const u16 *learnset; bool32 needTMs = FALSE; - u16 moveId = MOVE_NONE; + u16 move = MOVE_NONE; bool32 shouldUseMove; u8 level; @@ -379,7 +379,7 @@ static u16 GetRandomAlternateMove(u8 monId) } while (!shouldUseMove); - moveId = ItemIdToBattleMoveId(ITEM_TM01 + id); + move = ItemIdToBattleMoveId(ITEM_TM01 + id); shouldUseMove = TRUE; if (numLearnsetMoves <= MAX_MON_MOVES) @@ -390,7 +390,7 @@ static u16 GetRandomAlternateMove(u8 monId) for (; j < numLearnsetMoves; j++) { // Keep looking for TMs until one not in the level up learnset is found - if ((learnset[j] & LEVEL_UP_MOVE_ID) == moveId) + if ((learnset[j] & LEVEL_UP_MOVE_ID) == move) { shouldUseMove = FALSE; break; @@ -414,13 +414,13 @@ static u16 GetRandomAlternateMove(u8 monId) { // Get a random move excluding the 4 it would know at max level u8 learnsetId = Random() % (numLearnsetMoves - MAX_MON_MOVES); - moveId = learnset[learnsetId] & LEVEL_UP_MOVE_ID; + move = learnset[learnsetId] & LEVEL_UP_MOVE_ID; shouldUseMove = TRUE; for (j = numLearnsetMoves - MAX_MON_MOVES; j < numLearnsetMoves; j++) { // Keep looking for moves until one not in the last 4 is found - if ((learnset[j] & LEVEL_UP_MOVE_ID) == moveId) + if ((learnset[j] & LEVEL_UP_MOVE_ID) == move) { shouldUseMove = FALSE; break; @@ -430,29 +430,29 @@ static u16 GetRandomAlternateMove(u8 monId) } } - if (TrySetMove(monId, moveId)) + if (TrySetMove(monId, move)) { - if (sValidApprenticeMoves[moveId]) + if (sValidApprenticeMoves[move]) break; i++; } } gApprenticePartyMovesData->moveCounter++; - return moveId; + return move; } -static bool8 TrySetMove(u8 monId, u16 moveId) +static bool8 TrySetMove(u8 monId, u16 move) { u8 i; for (i = 0; i < NUM_WHICH_MOVE_QUESTIONS; i++) { - if (gApprenticePartyMovesData->moves[monId][i] == moveId) + if (gApprenticePartyMovesData->moves[monId][i] == move) return FALSE; } - gApprenticePartyMovesData->moves[monId][gApprenticePartyMovesData->moveCounter] = moveId; + gApprenticePartyMovesData->moves[monId][gApprenticePartyMovesData->moveCounter] = move; return TRUE; } @@ -605,8 +605,8 @@ static void CreateApprenticeMenu(u8 menu) case APPRENTICE_ASK_MOVES: left = 17; top = 8; - strings[0] = gMoveNames[gApprenticeQuestionData->moveId1]; - strings[1] = gMoveNames[gApprenticeQuestionData->moveId2]; + strings[0] = gMoveNames[gApprenticeQuestionData->move1]; + strings[1] = gMoveNames[gApprenticeQuestionData->move2]; break; case APPRENTICE_ASK_GIVE: left = 18; @@ -1006,8 +1006,8 @@ static void InitQuestionData(void) count = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].monId; APPRENTICE_SPECIES_ID_NO_COND(id1, count); gApprenticeQuestionData->speciesId = gApprentices[PLAYER_APPRENTICE.id].species[id1]; - gApprenticeQuestionData->moveId1 = GetDefaultMove(count, id1, PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].moveSlot); - gApprenticeQuestionData->moveId2 = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data; + gApprenticeQuestionData->move1 = GetDefaultMove(count, id1, PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].moveSlot); + gApprenticeQuestionData->move2 = PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data; } } else if (gSpecialVar_0x8005 == APPRENTICE_QUESTION_WHAT_ITEM) @@ -1062,10 +1062,10 @@ static void ApprenticeBufferString(void) StringCopy(stringDst, gSpeciesNames[gApprenticeQuestionData->speciesId]); break; case APPRENTICE_BUFF_MOVE1: - StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->moveId1]); + StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->move1]); break; case APPRENTICE_BUFF_MOVE2: - StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->moveId2]); + StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->move2]); break; case APPRENTICE_BUFF_ITEM: StringCopy(stringDst, ItemId_GetName(PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data)); diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 8178e51d01..518086cbb7 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -1419,9 +1419,9 @@ static void RecordedOpponentHandleChooseMove(void) } else { - u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); + u8 moveIndex = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveIndex | (target << 8)); } RecordedOpponentBufferExecCompleted(); diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index f11a759148..6b061487b4 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -1445,9 +1445,9 @@ static void RecordedPlayerHandleChooseMove(void) } else { - u8 moveId = RecordedBattle_GetBattlerAction(gActiveBattler); + u8 moveIndex = RecordedBattle_GetBattlerAction(gActiveBattler); u8 target = RecordedBattle_GetBattlerAction(gActiveBattler); - BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveId | (target << 8)); + BtlController_EmitTwoReturnValues(B_COMM_TO_ENGINE, 10, moveIndex | (target << 8)); } RecordedPlayerBufferExecCompleted(); diff --git a/src/battle_dome.c b/src/battle_dome.c index 68cae14a6e..9573f67cc7 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -2678,24 +2678,24 @@ int GetDomeTrainerSelectedMons(u16 tournamentTrainerId) static int SelectOpponentMons_Good(u16 tournamentTrainerId, bool8 allowRandom) { - int i, moveId, playerMonId; + int i, moveIndex, playerMonId; int partyMovePoints[FRONTIER_PARTY_SIZE]; for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { partyMovePoints[i] = 0; - for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { for (playerMonId = 0; playerMonId < FRONTIER_PARTY_SIZE; playerMonId++) { if (DOME_TRAINERS[tournamentTrainerId].trainerId == TRAINER_FRONTIER_BRAIN) { - partyMovePoints[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveId), + partyMovePoints[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveIndex), GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), EFFECTIVENESS_MODE_GOOD); } else { - partyMovePoints[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][i]].moves[moveId], + partyMovePoints[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][i]].moves[moveIndex], GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), EFFECTIVENESS_MODE_GOOD); } } @@ -2707,24 +2707,24 @@ static int SelectOpponentMons_Good(u16 tournamentTrainerId, bool8 allowRandom) // Identical to function above, but uses EFFECTIVENESS_MODE_BAD static int SelectOpponentMons_Bad(u16 tournamentTrainerId, bool8 allowRandom) { - int i, moveId, playerMonId; + int i, moveIndex, playerMonId; int partyMovePoints[FRONTIER_PARTY_SIZE]; for (i = 0; i < FRONTIER_PARTY_SIZE; i++) { partyMovePoints[i] = 0; - for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { for (playerMonId = 0; playerMonId < FRONTIER_PARTY_SIZE; playerMonId++) { if (DOME_TRAINERS[tournamentTrainerId].trainerId == TRAINER_FRONTIER_BRAIN) { - partyMovePoints[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveId), + partyMovePoints[i] += GetTypeEffectivenessPoints(GetFrontierBrainMonMove(i, moveIndex), GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), EFFECTIVENESS_MODE_BAD); } else { - partyMovePoints[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][i]].moves[moveId], + partyMovePoints[i] += GetTypeEffectivenessPoints(gFacilityTrainerMons[DOME_MONS[tournamentTrainerId][i]].moves[moveIndex], GetMonData(&gPlayerParty[playerMonId], MON_DATA_SPECIES, NULL), EFFECTIVENESS_MODE_BAD); } } @@ -5222,7 +5222,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun { int i, j, k; int moveScores[MAX_MON_MOVES * FRONTIER_PARTY_SIZE]; - u16 moveIds[MAX_MON_MOVES * FRONTIER_PARTY_SIZE]; + u16 moves[MAX_MON_MOVES * FRONTIER_PARTY_SIZE]; u16 bestScore = 0; u16 bestId = 0; int movePower = 0; @@ -5236,17 +5236,17 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun // TODO: Clean this up, looks like a different data structure (2D array) moveScores[i * MAX_MON_MOVES + j] = 0; if (DOME_TRAINERS[winnerTournamentId].trainerId == TRAINER_FRONTIER_BRAIN) - moveIds[i * MAX_MON_MOVES + j] = GetFrontierBrainMonMove(i, j); + moves[i * MAX_MON_MOVES + j] = GetFrontierBrainMonMove(i, j); else - moveIds[i * MAX_MON_MOVES + j] = gFacilityTrainerMons[DOME_MONS[winnerTournamentId][i]].moves[j]; + moves[i * MAX_MON_MOVES + j] = gFacilityTrainerMons[DOME_MONS[winnerTournamentId][i]].moves[j]; - movePower = gBattleMoves[moveIds[i * MAX_MON_MOVES + j]].power; + movePower = gBattleMoves[moves[i * MAX_MON_MOVES + j]].power; if (movePower == 0) movePower = 40; else if (movePower == 1) movePower = 60; - else if (moveIds[i * MAX_MON_MOVES + j] == MOVE_SELF_DESTRUCT - || moveIds[i * MAX_MON_MOVES + j] == MOVE_EXPLOSION) + else if (moves[i * MAX_MON_MOVES + j] == MOVE_SELF_DESTRUCT + || moves[i * MAX_MON_MOVES + j] == MOVE_EXPLOSION) movePower /= 2; for (k = 0; k < FRONTIER_PARTY_SIZE; k++) @@ -5265,7 +5265,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun else targetAbility = gSpeciesInfo[targetSpecies].abilities[0]; - var = AI_TypeCalc(moveIds[i * MAX_MON_MOVES + j], targetSpecies, targetAbility); + var = AI_TypeCalc(moves[i * MAX_MON_MOVES + j], targetSpecies, targetAbility); if (var & MOVE_RESULT_NOT_VERY_EFFECTIVE && var & MOVE_RESULT_SUPER_EFFECTIVE) moveScores[i * MAX_MON_MOVES + j] += movePower; else if (var & MOVE_RESULT_NO_EFFECT) @@ -5285,7 +5285,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun } else if (bestScore == moveScores[i * MAX_MON_MOVES + j]) { - if (moveIds[bestId] < moveIds[i * MAX_MON_MOVES + j]) // Why not use (Random() & 1) instead of promoting moves with a higher id? + if (moves[bestId] < moves[i * MAX_MON_MOVES + j]) // Why not use (Random() & 1) instead of promoting moves with a higher id? bestId = i * MAX_MON_MOVES + j; } } @@ -5296,7 +5296,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun { for (i = 0; i < roundId - 1; i++) { - if (gSaveBlock2Ptr->frontier.domeWinningMoves[GetOpposingNPCTournamentIdByRound(winnerTournamentId, i)] == moveIds[j]) + if (gSaveBlock2Ptr->frontier.domeWinningMoves[GetOpposingNPCTournamentIdByRound(winnerTournamentId, i)] == moves[j]) break; } if (i != roundId - 1) @@ -5316,7 +5316,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun j = k; bestScore = moveScores[k]; } - else if (bestScore == moveScores[k] && moveIds[j] < moveIds[k]) // Yes, these conditions are redundant + else if (bestScore == moveScores[k] && moves[j] < moves[k]) // Yes, these conditions are redundant { j = k; bestScore = moveScores[k]; @@ -5328,7 +5328,7 @@ static u16 GetWinningMove(int winnerTournamentId, int loserTournamentId, u8 roun if (moveScores[j] == 0) j = bestId; - return moveIds[j]; + return moves[j]; } static void Task_ShowTourneyTree(u8 taskId) diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 9181b82667..56906804c8 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -545,7 +545,7 @@ static void Task_ClearBitWhenSpecialAnimDone(u8 taskId) #undef tBattlerId // Great function to include newly added moves that don't have animation yet. -bool8 IsMoveWithoutAnimation(u16 moveId, u8 animationTurn) +bool8 IsMoveWithoutAnimation(u16 move, u8 animationTurn) { return FALSE; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 0f99173b11..a79851acc0 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5464,8 +5464,8 @@ static void Cmd_yesnoboxlearnmove(void) } else { - u16 moveId = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); - if (IsHMMove2(moveId)) + u16 move = GetMonData(&gPlayerParty[gBattleStruct->expGetterMonId], MON_DATA_MOVE1 + movePosition); + if (IsHMMove2(move)) { PrepareStringBattle(STRINGID_HMMOVESCANTBEFORGOTTEN, gActiveBattler); gBattleScripting.learnMoveState = 6; @@ -5474,7 +5474,7 @@ static void Cmd_yesnoboxlearnmove(void) { gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); - PREPARE_MOVE_BUFFER(gBattleTextBuff2, moveId) + PREPARE_MOVE_BUFFER(gBattleTextBuff2, move) RemoveMonPPBonus(&gPlayerParty[gBattleStruct->expGetterMonId], movePosition); SetMonMoveSlot(&gPlayerParty[gBattleStruct->expGetterMonId], gMoveToLearn, movePosition); @@ -9508,7 +9508,7 @@ static void Cmd_assistattackselect(void) { s32 chooseableMovesNo = 0; struct Pokemon *party; - s32 monId, moveId; + s32 monId, moveIndex; u16 *validMoves = gBattleStruct->assistPossibleMoves; if (GET_BATTLER_SIDE(gBattlerAttacker) != B_SIDE_PLAYER) @@ -9525,10 +9525,10 @@ static void Cmd_assistattackselect(void) if (GetMonData(&party[monId], MON_DATA_SPECIES_OR_EGG) == SPECIES_EGG) continue; - for (moveId = 0; moveId < MAX_MON_MOVES; moveId++) + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { s32 i = 0; - u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveId); + u16 move = GetMonData(&party[monId], MON_DATA_MOVE1 + moveIndex); if (IsInvalidForSleepTalkOrAssist(move)) continue; diff --git a/src/battle_tower.c b/src/battle_tower.c index 0420a15f63..0190d3c922 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -2417,7 +2417,7 @@ static void LoadMultiPartnerCandidatesData(void) static void GetPotentialPartnerMoveAndSpecies(u16 trainerId, u16 monId) { - u16 move = 0; + u16 move = MOVE_NONE; u16 species = 0; SetFacilityPtrsGetLevel(); diff --git a/src/battle_transition.c b/src/battle_transition.c index c23578e608..174602471b 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -79,7 +79,7 @@ struct RectangularSpiralLine { u8 state; s16 position; - u8 moveIdx; + u8 moveIndex; s16 reboundPosition; bool8 outward; }; @@ -3204,28 +3204,28 @@ static bool8 RectangularSpiral_Init(struct Task *task) // Line starting in top left sRectangularSpiralLines[0].state = SPIRAL_INWARD_START; sRectangularSpiralLines[0].position = -1; - sRectangularSpiralLines[0].moveIdx = 1; + sRectangularSpiralLines[0].moveIndex = 1; sRectangularSpiralLines[0].reboundPosition = 308; sRectangularSpiralLines[0].outward = FALSE; // Line starting in bottom right sRectangularSpiralLines[1].state = SPIRAL_INWARD_START; sRectangularSpiralLines[1].position = -1; - sRectangularSpiralLines[1].moveIdx = 1; + sRectangularSpiralLines[1].moveIndex = 1; sRectangularSpiralLines[1].reboundPosition = 308; sRectangularSpiralLines[1].outward = FALSE; // Line starting in top right sRectangularSpiralLines[2].state = SPIRAL_INWARD_START; sRectangularSpiralLines[2].position = -3; - sRectangularSpiralLines[2].moveIdx = 1; + sRectangularSpiralLines[2].moveIndex = 1; sRectangularSpiralLines[2].reboundPosition = 307; sRectangularSpiralLines[2].outward = FALSE; // Line starting in bottom left sRectangularSpiralLines[3].state = SPIRAL_INWARD_START; sRectangularSpiralLines[3].position = -3; - sRectangularSpiralLines[3].moveIdx = 1; + sRectangularSpiralLines[3].moveIndex = 1; sRectangularSpiralLines[3].reboundPosition = 307; sRectangularSpiralLines[3].outward = FALSE; @@ -3288,7 +3288,7 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru // Has spiral finished? // Note that most move data arrays endsin SPIRAL_END but it is // only ever reached on the final array of spiraling outward. - if (moveData[line->moveIdx] == SPIRAL_END) + if (moveData[line->moveIndex] == SPIRAL_END) return FALSE; // Presumably saving data for debug. @@ -3319,21 +3319,21 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru // Below check is never true. // SPIRAL_END was already checked, and position is never >= 640 - if (line->position >= 640 || moveData[line->moveIdx] == SPIRAL_END) + if (line->position >= 640 || moveData[line->moveIndex] == SPIRAL_END) return FALSE; - if (!line->outward && moveData[line->moveIdx] == SPIRAL_REBOUND) + if (!line->outward && moveData[line->moveIndex] == SPIRAL_REBOUND) { // Line has reached the final point of spiraling inward. // Time to flip and start spiraling outward. line->outward = TRUE; - line->moveIdx = 1; + line->moveIndex = 1; line->position = line->reboundPosition; line->state = SPIRAL_OUTWARD_START; } // Reached move target, advance to next movement. - if (line->position == moveData[line->moveIdx]) + if (line->position == moveData[line->moveIndex]) { line->state++; if (line->outward == TRUE) @@ -3343,7 +3343,7 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru // Still spiraling outward, loop back to the first state // but use the second set of move targets. // For example, the 28 in sRectangularSpiral_Major_OutwardUp - line->moveIdx++; + line->moveIndex++; line->state = SPIRAL_OUTWARD_START; } } @@ -3354,7 +3354,7 @@ static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, stru // Still spiraling inward, loop back to the first state // but use the second set of move targets. // For example, the 275 in sRectangularSpiral_Major_InwardRight - line->moveIdx++; + line->moveIndex++; line->state = SPIRAL_INWARD_START; } } diff --git a/src/battle_tv.c b/src/battle_tv.c index 33c720cc13..bf31f18f47 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -15,8 +15,8 @@ static bool8 IsNotSpecialBattleString(u16 stringId); static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3); static void TrySetBattleSeminarShow(void); static void AddPointsOnFainting(bool8 targetFainted); -static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot); -static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride); +static void AddPointsBasedOnWeather(u16 weatherFlags, u16 move, u8 moveSlot); +static bool8 ShouldCalculateDamage(u16 move, s32 *dmg, u16 *powerOverride); #define TABLE_END ((u16)-1) @@ -1056,7 +1056,7 @@ void TryPutLinkBattleTvShowOnAir(void) u8 countPlayer = 0, countOpponent = 0; s16 sum = 0; u16 species = 0; - u16 moveId = 0; + u16 move = MOVE_NONE; s32 i, j; int zero = 0, one = 1; //needed for matching @@ -1124,8 +1124,8 @@ void TryPutLinkBattleTvShowOnAir(void) } } - moveId = GetMonData(&gPlayerParty[playerBestMonId], MON_DATA_MOVE1 + i, NULL); - if (playerBestSum == 0 || moveId == 0) + move = GetMonData(&gPlayerParty[playerBestMonId], MON_DATA_MOVE1 + i, NULL); + if (playerBestSum == 0 || move == MOVE_NONE) return; if (gBattleTypeFlags & BATTLE_TYPE_MULTI) @@ -1134,12 +1134,12 @@ void TryPutLinkBattleTvShowOnAir(void) || (playerBestMonId >= MULTI_PARTY_SIZE && GetLinkTrainerFlankId(gBattleScripting.multiplayerId))) { j = (opponentBestMonId < MULTI_PARTY_SIZE) ? FALSE : TRUE; - PutBattleUpdateOnTheAir(GetOpposingLinkMultiBattlerId(j, gBattleScripting.multiplayerId), moveId, playerBestSpecies, opponentBestSpecies); + PutBattleUpdateOnTheAir(GetOpposingLinkMultiBattlerId(j, gBattleScripting.multiplayerId), move, playerBestSpecies, opponentBestSpecies); } } else { - PutBattleUpdateOnTheAir(gBattleScripting.multiplayerId ^ 1, moveId, playerBestSpecies, opponentBestSpecies); + PutBattleUpdateOnTheAir(gBattleScripting.multiplayerId ^ 1, move, playerBestSpecies, opponentBestSpecies); } } @@ -1505,9 +1505,9 @@ static void TrySetBattleSeminarShow(void) gCurrentMove = currMoveSaved; } -static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride) +static bool8 ShouldCalculateDamage(u16 move, s32 *dmg, u16 *powerOverride) { - if (gBattleMoves[moveId].power == 0) + if (gBattleMoves[move].power == 0) { *dmg = 0; return FALSE; @@ -1517,7 +1517,7 @@ static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride) s32 i = 0; do { - if (moveId == sVariableDmgMoves[i]) + if (move == sVariableDmgMoves[i]) break; i++; } while (sVariableDmgMoves[i] != TABLE_END); @@ -1527,13 +1527,13 @@ static bool8 ShouldCalculateDamage(u16 moveId, s32 *dmg, u16 *powerOverride) *dmg = 0; return FALSE; } - else if (moveId == MOVE_PSYWAVE) + else if (move == MOVE_PSYWAVE) { *dmg = gBattleMons[gBattlerAttacker].level; *dmg /= 2; return FALSE; } - else if (moveId == MOVE_MAGNITUDE) + else if (move == MOVE_MAGNITUDE) { *powerOverride = 10; return TRUE; @@ -1568,7 +1568,7 @@ void BattleTv_ClearExplosionFaintCause(void) } } -u8 GetBattlerMoveSlotId(u8 battler, u16 moveId) +u8 GetBattlerMoveSlotId(u8 battler, u16 move) { s32 i; struct Pokemon *party; @@ -1583,7 +1583,7 @@ u8 GetBattlerMoveSlotId(u8 battler, u16 moveId) { if (i >= MAX_MON_MOVES) break; - if (GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_MOVE1 + i, NULL) == moveId) + if (GetMonData(&party[gBattlerPartyIndexes[battler]], MON_DATA_MOVE1 + i, NULL) == move) break; i++; } @@ -1591,14 +1591,14 @@ u8 GetBattlerMoveSlotId(u8 battler, u16 moveId) return i; } -static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot) +static void AddPointsBasedOnWeather(u16 weatherFlags, u16 move, u8 moveSlot) { if (weatherFlags & B_WEATHER_RAIN) - AddMovePoints(PTS_RAIN, moveId, moveSlot, 0); + AddMovePoints(PTS_RAIN, move, moveSlot, 0); else if (weatherFlags & B_WEATHER_SUN) - AddMovePoints(PTS_SUN, moveId, moveSlot, 0); + AddMovePoints(PTS_SUN, move, moveSlot, 0); else if (weatherFlags & B_WEATHER_SANDSTORM) - AddMovePoints(PTS_SANDSTORM, moveId, moveSlot, 0); + AddMovePoints(PTS_SANDSTORM, move, moveSlot, 0); else if (weatherFlags & B_WEATHER_HAIL) - AddMovePoints(PTS_HAIL, moveId, moveSlot, 0); + AddMovePoints(PTS_HAIL, move, moveSlot, 0); } diff --git a/src/contest_ai.c b/src/contest_ai.c index a4bb5b4549..443e57f8be 100644 --- a/src/contest_ai.c +++ b/src/contest_ai.c @@ -326,8 +326,8 @@ u8 ContestAI_GetActionToUse(void) { // Randomly choose a move index. If it's the move // with the highest (or tied highest) score, return - u8 moveIdx = MOD(Random(), MAX_MON_MOVES); - u8 score = eContestAI.moveScores[moveIdx]; + u8 moveIndex = MOD(Random(), MAX_MON_MOVES); + u8 score = eContestAI.moveScores[moveIndex]; int i; for (i = 0; i < MAX_MON_MOVES; i++) { @@ -335,7 +335,7 @@ u8 ContestAI_GetActionToUse(void) break; } if (i == MAX_MON_MOVES) - return moveIdx; + return moveIndex; } } diff --git a/src/item_menu.c b/src/item_menu.c index f0abfcf62a..6d52e4be1c 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -2549,7 +2549,7 @@ static void PrepareTMHMMoveWindow(void) static void PrintTMHMMoveData(u16 itemId) { u8 i; - u16 moveId; + u16 move; const u8 *text; FillWindowPixelBuffer(WIN_TMHM_INFO, PIXEL_FILL(0)); @@ -2561,35 +2561,35 @@ static void PrintTMHMMoveData(u16 itemId) } else { - moveId = ItemIdToBattleMoveId(itemId); - BlitMenuInfoIcon(WIN_TMHM_INFO, gBattleMoves[moveId].type + 1, 0, 0); + move = ItemIdToBattleMoveId(itemId); + BlitMenuInfoIcon(WIN_TMHM_INFO, gBattleMoves[move].type + 1, 0, 0); // Print TMHM power - if (gBattleMoves[moveId].power <= 1) + if (gBattleMoves[move].power <= 1) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].power, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].power, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, text, 7, 12, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); // Print TMHM accuracy - if (gBattleMoves[moveId].accuracy == 0) + if (gBattleMoves[move].accuracy == 0) { text = gText_ThreeDashes; } else { - ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].accuracy, STR_CONV_MODE_RIGHT_ALIGN, 3); text = gStringVar1; } BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, text, 7, 24, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); // Print TMHM pp - ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[moveId].pp, STR_CONV_MODE_RIGHT_ALIGN, 3); + ConvertIntToDecimalStringN(gStringVar1, gBattleMoves[move].pp, STR_CONV_MODE_RIGHT_ALIGN, 3); BagMenu_Print(WIN_TMHM_INFO, FONT_NORMAL, gStringVar1, 7, 36, 0, 0, TEXT_SKIP_DRAW, COLORID_TMHM_INFO); CopyWindowToVram(WIN_TMHM_INFO, COPYWIN_GFX); diff --git a/src/move_relearner.c b/src/move_relearner.c index 975663e4d3..19da0cb0fb 100644 --- a/src/move_relearner.c +++ b/src/move_relearner.c @@ -705,9 +705,9 @@ static void DoMoveRelearnerMain(void) } else { - u16 moveId = GetMonData(&gPlayerParty[sMoveRelearnerStruct->partyMon], MON_DATA_MOVE1 + sMoveRelearnerStruct->moveSlot); + u16 move = GetMonData(&gPlayerParty[sMoveRelearnerStruct->partyMon], MON_DATA_MOVE1 + sMoveRelearnerStruct->moveSlot); - StringCopy(gStringVar3, gMoveNames[moveId]); + StringCopy(gStringVar3, gMoveNames[move]); RemoveMonPPBonus(&gPlayerParty[sMoveRelearnerStruct->partyMon], sMoveRelearnerStruct->moveSlot); SetMonMoveSlot(&gPlayerParty[sMoveRelearnerStruct->partyMon], GetCurrentSelectedMove(), sMoveRelearnerStruct->moveSlot); StringCopy(gStringVar2, gMoveNames[GetCurrentSelectedMove()]); @@ -916,19 +916,19 @@ static void CreateLearnableMovesList(void) sMoveRelearnerStruct->numToShowAtOnce = LoadMoveRelearnerMovesList(sMoveRelearnerStruct->menuItems, sMoveRelearnerStruct->numMenuChoices); } -void MoveRelearnerShowHideHearts(s32 moveId) +void MoveRelearnerShowHideHearts(s32 move) { u16 numHearts; u16 i; - if (!sMoveRelearnerMenuSate.showContestInfo || moveId == LIST_CANCEL) + if (!sMoveRelearnerMenuSate.showContestInfo || move == LIST_CANCEL) { for (i = 0; i < 16; i++) gSprites[sMoveRelearnerStruct->heartSpriteIds[i]].invisible = TRUE; } else { - numHearts = (u8)(gContestEffects[gContestMoves[moveId].effect].appeal / 10); + numHearts = (u8)(gContestEffects[gContestMoves[move].effect].appeal / 10); if (numHearts == 0xFF) numHearts = 0; @@ -942,7 +942,7 @@ void MoveRelearnerShowHideHearts(s32 moveId) gSprites[sMoveRelearnerStruct->heartSpriteIds[i]].invisible = FALSE; } - numHearts = (u8)(gContestEffects[gContestMoves[moveId].effect].jam / 10); + numHearts = (u8)(gContestEffects[gContestMoves[move].effect].jam / 10); if (numHearts == 0xFF) numHearts = 0; diff --git a/src/pokemon.c b/src/pokemon.c index 310d686e69..d0b6c3302e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -5095,17 +5095,17 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // Heal PP for all moves for (temp2 = 0; (signed)(temp2) < (signed)(MAX_MON_MOVES); temp2++) { - u16 moveId; + u16 move; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2, NULL); - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); - if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) + move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); + if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { dataUnsigned += itemEffect[itemEffectParam]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant - if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) + move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant - dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); + move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); // Redundant + dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); } SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); @@ -5121,17 +5121,17 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov else { // Heal PP for one move - u16 moveId; + u16 move; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); - if (dataUnsigned != CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) + move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); + if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { dataUnsigned += itemEffect[itemEffectParam++]; - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant - if (dataUnsigned > CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) + move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) { - moveId = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant - dataUnsigned = CalculatePPWithBonus(moveId, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); // Redundant + dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); } SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index b9caa364b1..6a24f24945 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -9633,9 +9633,9 @@ u32 CountAllStorageMons(void) return count; } -bool32 AnyStorageMonWithMove(u16 moveId) +bool32 AnyStorageMonWithMove(u16 move) { - u16 moves[] = {moveId, MOVES_COUNT}; + u16 moves[] = {move, MOVES_COUNT}; s32 i, j; for (i = 0; i < TOTAL_BOXES_COUNT; i++) diff --git a/src/scrcmd.c b/src/scrcmd.c index 218be539f5..916cea02d1 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1607,9 +1607,9 @@ bool8 ScrCmd_bufferdecorationname(struct ScriptContext *ctx) bool8 ScrCmd_buffermovename(struct ScriptContext *ctx) { u8 stringVarIndex = ScriptReadByte(ctx); - u16 moveId = VarGet(ScriptReadHalfword(ctx)); + u16 move = VarGet(ScriptReadHalfword(ctx)); - StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[moveId]); + StringCopy(sScriptStringVars[stringVarIndex], gMoveNames[move]); return FALSE; } @@ -1712,7 +1712,7 @@ bool8 ScrCmd_setmonmove(struct ScriptContext *ctx) bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) { u8 i; - u16 moveId = ScriptReadHalfword(ctx); + u16 move = ScriptReadHalfword(ctx); gSpecialVar_Result = PARTY_SIZE; for (i = 0; i < PARTY_SIZE; i++) @@ -1720,7 +1720,7 @@ bool8 ScrCmd_checkpartymove(struct ScriptContext *ctx) 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) + if (!GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG) && MonKnowsMove(&gPlayerParty[i], move) == TRUE) { gSpecialVar_Result = i; gSpecialVar_0x8004 = species; diff --git a/src/secret_base.c b/src/secret_base.c index 9509cd0fc5..7d4975e388 100644 --- a/src/secret_base.c +++ b/src/secret_base.c @@ -771,7 +771,7 @@ static u8 GetAverageEVs(struct Pokemon *pokemon) void SetPlayerSecretBaseParty(void) { u16 i; - u16 moveIdx; + u16 moveIndex; u16 partyId; struct SecretBaseParty *party; @@ -781,8 +781,8 @@ void SetPlayerSecretBaseParty(void) { for (i = 0; i < PARTY_SIZE; i++) { - for (moveIdx = 0; moveIdx < MAX_MON_MOVES; moveIdx++) - party->moves[i * MAX_MON_MOVES + moveIdx] = MOVE_NONE; + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + party->moves[i * MAX_MON_MOVES + moveIndex] = MOVE_NONE; party->species[i] = SPECIES_NONE; party->heldItems[i] = ITEM_NONE; @@ -793,8 +793,8 @@ void SetPlayerSecretBaseParty(void) if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != SPECIES_NONE && !GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) { - for (moveIdx = 0; moveIdx < MAX_MON_MOVES; moveIdx++) - party->moves[partyId * MAX_MON_MOVES + moveIdx] = GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveIdx); + for (moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) + party->moves[partyId * MAX_MON_MOVES + moveIndex] = GetMonData(&gPlayerParty[i], MON_DATA_MOVE1 + moveIndex); party->species[partyId] = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES); party->heldItems[partyId] = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM); diff --git a/src/tv.c b/src/tv.c index 26d568642f..dbbf64d33c 100644 --- a/src/tv.c +++ b/src/tv.c @@ -2199,7 +2199,7 @@ void TryPutLotteryWinnerReportOnAir(void) } } -void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16 *movePtr, u16 betterMove) +void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIndex, const u16 *movePtr, u16 betterMove) { TVShow *show; u8 i; @@ -2214,10 +2214,10 @@ void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIdx, const u16 StringCopy(show->battleSeminar.playerName, gSaveBlock2Ptr->playerName); show->battleSeminar.foeSpecies = foeSpecies; show->battleSeminar.species = species; - show->battleSeminar.move = movePtr[moveIdx]; + show->battleSeminar.move = movePtr[moveIndex]; for (i = 0, j = 0; i < MAX_MON_MOVES; i++) { - if (i != moveIdx && movePtr[i]) + if (i != moveIndex && movePtr[i]) { show->battleSeminar.otherMoves[j] = movePtr[i]; j++; From d60aba377399dc204a79318fc9337bb734558543 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Fri, 9 May 2025 21:50:17 +0200 Subject: [PATCH 034/187] revert changelog changes --- docs/changelogs/1.6.x/1.6.0.md | 2 +- docs/changelogs/1.9.x/1.9.0.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelogs/1.6.x/1.6.0.md b/docs/changelogs/1.6.x/1.6.0.md index f391940205..f215ffb673 100644 --- a/docs/changelogs/1.6.x/1.6.0.md +++ b/docs/changelogs/1.6.x/1.6.0.md @@ -143,7 +143,7 @@ * Prevent certain status moves when item is known + Fake Out changes by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3219 * Improve AI switching with bad moves by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3213 * Fixed `CanTargetFaintAi` index issue by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/3306 -* Transform updates `gAiPartyData` data by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3295 +* Transform updates `AI_PARTY` data by @ghoulslash in https://github.com/rh-hideout/pokeemerald-expansion/pull/3295 * Greatly reduce AI lag by @DizzyEggg in https://github.com/rh-hideout/pokeemerald-expansion/pull/3308 ### Cleanup diff --git a/docs/changelogs/1.9.x/1.9.0.md b/docs/changelogs/1.9.x/1.9.0.md index 44d5a8aec7..b0815c6e2a 100644 --- a/docs/changelogs/1.9.x/1.9.0.md +++ b/docs/changelogs/1.9.x/1.9.0.md @@ -510,7 +510,7 @@ * `AI_STRIKES_FIRST` is also replaced by `AI_IsFaster`. * Switch AI uses trapping abilities aggressively by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4669 * Use 9th roll instead of average in AI calcs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4679 -* Use `gAiLogicData->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 +* Use `AI_DATA->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 * Minor switch AI cleanup by @Pawkkie, @DizzyEggg, @AlexOn1ine and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4849 * Removed `SetBattlerData` from `AI_CalcDamage` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4881 * Removed unused `AI_FLAG_HELP_PARTNER` by @pkmnsnfrn and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4918 From 51b000860be6d26da989c8b2e51a3f66c664083e Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 11 May 2025 08:36:39 +0200 Subject: [PATCH 035/187] Add BattlerId enum and document (#2135) --- include/constants/battle.h | 21 +++- src/battle_controllers.c | 228 ++++++++++++++++++------------------- src/battle_gfx_sfx_util.c | 12 +- src/contest.c | 12 +- 4 files changed, 142 insertions(+), 131 deletions(-) diff --git a/include/constants/battle.h b/include/constants/battle.h index e00008de71..0bc9cc658e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -23,12 +23,23 @@ * +---------------------------+ */ -#define MAX_BATTLERS_COUNT 4 +enum BattlerPosition +{ + B_POSITION_PLAYER_LEFT, + B_POSITION_OPPONENT_LEFT, + B_POSITION_PLAYER_RIGHT, + B_POSITION_OPPONENT_RIGHT, + MAX_POSITION_COUNT, +}; -#define B_POSITION_PLAYER_LEFT 0 -#define B_POSITION_OPPONENT_LEFT 1 -#define B_POSITION_PLAYER_RIGHT 2 -#define B_POSITION_OPPONENT_RIGHT 3 +enum BattlerId +{ + B_BATTLER_0, + B_BATTLER_1, + B_BATTLER_2, + B_BATTLER_3, + MAX_BATTLERS_COUNT, +}; // These macros can be used with either battler ID or positions to get the partner or the opposite mon #define BATTLE_OPPOSITE(id) ((id) ^ BIT_SIDE) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 76f763909a..9586e18457 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -114,31 +114,31 @@ static void InitSinglePlayerBtlControllers(void) if (gBattleTypeFlags & BATTLE_TYPE_RECORDED) { - gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToPlayerPartner; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; } else { - gBattlerControllerFuncs[0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToPlayerPartner; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayerPartner; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; } gBattlersCount = MAX_BATTLERS_COUNT; @@ -158,16 +158,16 @@ static void InitSinglePlayerBtlControllers(void) gBattleMainFunc = BeginBattleIntro; if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) - gBattlerControllerFuncs[0] = SetControllerToSafari; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToSafari; else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) - gBattlerControllerFuncs[0] = SetControllerToWally; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToWally; else - gBattlerControllerFuncs[0] = SetControllerToPlayer; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; @@ -179,32 +179,32 @@ static void InitSinglePlayerBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToRecordedOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } else // see how the banks are switched { - gBattlerControllerFuncs[1] = SetControllerToRecordedPlayer; - gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[0] = SetControllerToRecordedOpponent; - gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } } else { - gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; } } } @@ -212,17 +212,17 @@ static void InitSinglePlayerBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToPlayer; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; @@ -232,17 +232,17 @@ static void InitSinglePlayerBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToRecordedPlayer; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; @@ -330,52 +330,52 @@ static void InitSinglePlayerBtlControllers(void) } else if (gBattleTypeFlags & BATTLE_TYPE_IS_MASTER) { - gBattlerControllerFuncs[0] = SetControllerToRecordedPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[2] = SetControllerToRecordedPlayer; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - gBattlerControllerFuncs[1] = SetControllerToRecordedOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[3] = SetControllerToRecordedOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; } else { - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; } } else { - gBattlerControllerFuncs[1] = SetControllerToRecordedPlayer; - gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[3] = SetControllerToRecordedPlayer; - gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToRecordedPlayer; + gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; if (gBattleTypeFlags & BATTLE_TYPE_RECORDED_LINK) { - gBattlerControllerFuncs[0] = SetControllerToRecordedOpponent; - gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToRecordedOpponent; - gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToRecordedOpponent; + gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; } else { - gBattlerControllerFuncs[0] = SetControllerToOpponent; - gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToOpponent; - gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; } } } @@ -393,21 +393,21 @@ static void InitLinkBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToLinkOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } else { - gBattlerControllerFuncs[1] = SetControllerToPlayer; - gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[0] = SetControllerToLinkOpponent; - gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; gBattlersCount = 2; } @@ -418,33 +418,33 @@ static void InitLinkBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToLinkOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToPlayer; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToLinkOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } else { - gBattlerControllerFuncs[1] = SetControllerToPlayer; - gBattlerPositions[1] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_1] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[0] = SetControllerToLinkOpponent; - gBattlerPositions[0] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_0] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[3] = SetControllerToPlayer; - gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[2] = SetControllerToLinkOpponent; - gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } @@ -455,33 +455,33 @@ static void InitLinkBtlControllers(void) { gBattleMainFunc = BeginBattleIntro; - gBattlerControllerFuncs[0] = SetControllerToPlayer; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToLinkPartner; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToLinkPartner; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } else { - gBattlerControllerFuncs[0] = SetControllerToLinkPartner; - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; + gBattlerControllerFuncs[B_BATTLER_0] = SetControllerToLinkPartner; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; - gBattlerControllerFuncs[1] = SetControllerToLinkOpponent; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; + gBattlerControllerFuncs[B_BATTLER_1] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; - gBattlerControllerFuncs[2] = SetControllerToPlayer; - gBattlerPositions[2] = B_POSITION_PLAYER_RIGHT; + gBattlerControllerFuncs[B_BATTLER_2] = SetControllerToPlayer; + gBattlerPositions[B_BATTLER_2] = B_POSITION_PLAYER_RIGHT; - gBattlerControllerFuncs[3] = SetControllerToLinkOpponent; - gBattlerPositions[3] = B_POSITION_OPPONENT_RIGHT; + gBattlerControllerFuncs[B_BATTLER_3] = SetControllerToLinkOpponent; + gBattlerPositions[B_BATTLER_3] = B_POSITION_OPPONENT_RIGHT; gBattlersCount = MAX_BATTLERS_COUNT; } diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 56906804c8..8cc2555e4d 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -778,11 +778,11 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) } else if (state == 4) { - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_0]]); } else if (state == 5) { - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_1]]); } else { @@ -800,13 +800,13 @@ bool8 BattleLoadAllHealthBoxesGfx(u8 state) else if (state == 5) LoadCompressedSpriteSheet(&sSpriteSheets_DoublesOpponentHealthbox[1]); else if (state == 6) - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[0]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_0]]); else if (state == 7) - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[1]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_1]]); else if (state == 8) - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[2]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_2]]); else if (state == 9) - LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[3]]); + LoadCompressedSpriteSheet(&sSpriteSheets_HealthBar[gBattlerPositions[B_BATTLER_3]]); else retVal = TRUE; } diff --git a/src/contest.c b/src/contest.c index c48df49334..85a8179f4d 100644 --- a/src/contest.c +++ b/src/contest.c @@ -1347,13 +1347,13 @@ static bool8 SetupContestGraphics(u8 *stateVar) CreateApplauseMeterSprite(); CreateJudgeAttentionEyeTask(); CreateUnusedBlendTask(); - gBattlerPositions[0] = B_POSITION_PLAYER_LEFT; - gBattlerPositions[1] = B_POSITION_OPPONENT_LEFT; - gBattlerPositions[2] = B_POSITION_OPPONENT_RIGHT; - gBattlerPositions[3] = B_POSITION_PLAYER_RIGHT; + gBattlerPositions[B_BATTLER_0] = B_POSITION_PLAYER_LEFT; + gBattlerPositions[B_BATTLER_1] = B_POSITION_OPPONENT_LEFT; + gBattlerPositions[B_BATTLER_2] = B_POSITION_OPPONENT_RIGHT; + gBattlerPositions[B_BATTLER_3] = B_POSITION_PLAYER_RIGHT; gBattleTypeFlags = 0; - gBattlerAttacker = B_POSITION_PLAYER_RIGHT; - gBattlerTarget = B_POSITION_OPPONENT_RIGHT; + gBattlerAttacker = B_BATTLER_2; + gBattlerTarget = B_BATTLER_3; // Unclear why judge sprite is assigned here // Overwritten in APPEALSTATE_SLIDE_MON_IN with the attacking contest mon gBattlerSpriteIds[gBattlerAttacker] = CreateJudgeSprite(); From be03feca94bc66e313dcd864532da6b1242b7c84 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Mon, 12 May 2025 18:07:22 +0200 Subject: [PATCH 036/187] Fixed double battles send out breaking (#6822) --- src/battle_script_commands.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cd3ef5a232..f6fbff240f 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5345,6 +5345,27 @@ static void Cmd_getexp(void) } } +static u32 CountAliveMonsForBattlerSide(u32 battler) +{ + u32 aliveMons = 0; + struct Pokemon *party = GetBattlerParty(battler); + + for (u32 partyMon = 0; partyMon < PARTY_SIZE; partyMon++) + { + if (GetMonData(&party[partyMon], MON_DATA_SPECIES) + && GetMonData(&party[partyMon], MON_DATA_HP) > 0 + && !GetMonData(&party[partyMon], MON_DATA_IS_EGG)) + aliveMons++; + } + + return aliveMons; +} + +bool32 NoAliveMonsForBattlerSide(u32 battler) +{ + return CountAliveMonsForBattlerSide(battler) == 0; +} + bool32 NoAliveMonsForPlayer(void) { u32 i; @@ -5460,7 +5481,12 @@ static void Cmd_checkteamslost(void) } else { - if (emptyOpponentSpots != 0 && emptyPlayerSpots != 0) + u32 occupiedPlayerSpots = (gBattlersCount / 2) - emptyPlayerSpots; + u32 occupiedOpponentSpots = (gBattlersCount / 2) - emptyOpponentSpots; + u32 alivePlayerPartyMons = CountAliveMonsForBattlerSide(B_POSITION_PLAYER_LEFT) - occupiedPlayerSpots; + u32 aliveOpponentPartyMons = CountAliveMonsForBattlerSide(B_POSITION_OPPONENT_LEFT) - occupiedOpponentSpots; + + if (emptyPlayerSpots > 0 && alivePlayerPartyMons > 0 && emptyOpponentSpots > 0 && aliveOpponentPartyMons > 0) gBattlescriptCurrInstr = cmd->jumpInstr; else gBattlescriptCurrInstr = cmd->nextInstr; From 14a66d612f0e7e7cc6d13cc45d66d9a4babe410a Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 12 May 2025 21:06:12 -0400 Subject: [PATCH 037/187] combine BattleScript_BerryStatRaiseRet and BattleScript_BerryStatRaiseEnd2, check ripen popup doesn't trigger except on berries --- data/battle_scripts_1.s | 19 +++++++------------ src/battle_util.c | 4 ++-- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4d278a6179..1236b6587f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9008,21 +9008,15 @@ BattleScript_BerryConfuseHealRet_Anim: return BattleScript_BerryStatRaiseEnd2:: - jumpifability BS_ATTACKER, ABILITY_RIPEN, BattleScript_BerryStatRaiseEnd2_AbilityPopup - goto BattleScript_BerryStatRaiseEnd2_Anim -BattleScript_BerryStatRaiseEnd2_AbilityPopup: - call BattleScript_AbilityPopUp -BattleScript_BerryStatRaiseEnd2_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR | MOVE_EFFECT_AFFECTS_USER, BattleScript_BerryStatRaiseEnd2_End - setgraphicalstatchangevalues - playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 - setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM - call BattleScript_StatUp - removeitem BS_ATTACKER -BattleScript_BerryStatRaiseEnd2_End:: + call BattleScript_BerryStatRaiseRet end2 BattleScript_BerryStatRaiseRet:: + @ to ensure `statbuffchange` has correct battler id, backup and use target + savetarget + copybyte gBattlerTarget, sBATTLER + jumpifnotberry BS_ATTACKER, BattleScript_BerryStatRaiseRet_Anim + @ check ripen popup if consuming berry jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryStatRaiseRet_AbilityPopup goto BattleScript_BerryStatRaiseRet_Anim BattleScript_BerryStatRaiseRet_AbilityPopup: @@ -9035,6 +9029,7 @@ BattleScript_BerryStatRaiseRet_Anim: call BattleScript_StatUp removeitem BS_SCRIPTING BattleScript_BerryStatRaiseRet_End: + restoretarget return BattleScript_BerryFocusEnergyRet:: diff --git a/src/battle_util.c b/src/battle_util.c index 3b6818b8dd..668c2db2a5 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6972,7 +6972,7 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum if (CompareStat(battler, statId, MAX_STAT_STAGE, CMP_LESS_THAN) && HasEnoughHpToEatBerry(battler, GetBattlerItemHoldEffectParam(battler, itemId), itemId)) { BufferStatChange(battler, statId, STRINGID_STATROSE); - gEffectBattler = battler; + gEffectBattler = gBattleScripting.battler = battler; if (GetBattlerAbility(battler) == ABILITY_RIPEN) SET_STATCHANGER(statId, 2, FALSE); else @@ -7010,7 +7010,7 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa u16 battlerAbility = GetBattlerAbility(battler); u32 savedAttacker = gBattlerAttacker; // MoodyCantRaiseStat requires that the battler is set to gBattlerAttacker - gBattlerAttacker = battler; + gBattlerAttacker = gBattleScripting.battler = battler; stat = RandomUniformExcept(RNG_RANDOM_STAT_UP, STAT_ATK, NUM_STATS - 1, MoodyCantRaiseStat); gBattlerAttacker = savedAttacker; From d4c64d3b672735ac0b0ddbd4be0686da97c8dbd8 Mon Sep 17 00:00:00 2001 From: ghoulslash Date: Mon, 12 May 2025 21:11:25 -0400 Subject: [PATCH 038/187] rename berrystatraise script to consumablestatraise --- data/battle_scripts_1.s | 20 ++++++++++---------- include/battle_scripts.h | 4 ++-- src/battle_script_commands.c | 2 +- src/battle_util.c | 16 ++++++++-------- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1236b6587f..ada937ff4a 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -9007,28 +9007,28 @@ BattleScript_BerryConfuseHealRet_Anim: removeitem BS_TARGET return -BattleScript_BerryStatRaiseEnd2:: - call BattleScript_BerryStatRaiseRet +BattleScript_ConsumableStatRaiseEnd2:: + call BattleScript_ConsumableStatRaiseRet end2 -BattleScript_BerryStatRaiseRet:: +BattleScript_ConsumableStatRaiseRet:: @ to ensure `statbuffchange` has correct battler id, backup and use target savetarget copybyte gBattlerTarget, sBATTLER - jumpifnotberry BS_ATTACKER, BattleScript_BerryStatRaiseRet_Anim + jumpifnotberry BS_SCRIPTING, BattleScript_ConsumableStatRaiseRet_Anim @ check ripen popup if consuming berry - jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_BerryStatRaiseRet_AbilityPopup - goto BattleScript_BerryStatRaiseRet_Anim -BattleScript_BerryStatRaiseRet_AbilityPopup: + jumpifability BS_SCRIPTING, ABILITY_RIPEN, BattleScript_ConsumableStatRaiseRet_AbilityPopup + goto BattleScript_ConsumableStatRaiseRet_Anim +BattleScript_ConsumableStatRaiseRet_AbilityPopup: call BattleScript_AbilityPopUp -BattleScript_BerryStatRaiseRet_Anim: - statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_BerryStatRaiseRet_End +BattleScript_ConsumableStatRaiseRet_Anim: + statbuffchange STAT_CHANGE_ALLOW_PTR, BattleScript_ConsumableStatRaiseRet_End setgraphicalstatchangevalues playanimation BS_SCRIPTING, B_ANIM_HELD_ITEM_EFFECT, sB_ANIM_ARG1 setbyte cMULTISTRING_CHOOSER, B_MSG_STAT_ROSE_ITEM call BattleScript_StatUp removeitem BS_SCRIPTING -BattleScript_BerryStatRaiseRet_End: +BattleScript_ConsumableStatRaiseRet_End: restoretarget return diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 958cd71892..1e1189a688 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -237,8 +237,8 @@ extern const u8 BattleScript_SelectingNotAllowedMoveChoiceItemInPalace[]; extern const u8 BattleScript_HangedOnMsg[]; extern const u8 BattleScript_BerryConfuseHealEnd2[]; extern const u8 BattleScript_BerryConfuseHealRet[]; -extern const u8 BattleScript_BerryStatRaiseEnd2[]; -extern const u8 BattleScript_BerryStatRaiseRet[]; +extern const u8 BattleScript_ConsumableStatRaiseEnd2[]; +extern const u8 BattleScript_ConsumableStatRaiseRet[]; extern const u8 BattleScript_BerryFocusEnergyRet[]; extern const u8 BattleScript_BerryFocusEnergyEnd2[]; extern const u8 BattleScript_ActionSelectionItemsCantBeUsed[]; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f6fbff240f..9d9e183a46 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11310,7 +11310,7 @@ static void Cmd_various(void) if (GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_ROOM_SERVICE && TryRoomService(battler)) { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } else { diff --git a/src/battle_util.c b/src/battle_util.c index 668c2db2a5..0e2be3fd76 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6983,12 +6983,12 @@ static enum ItemEffect StatRaiseBerry(u32 battler, u32 itemId, u32 statId, enum if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; } @@ -7034,12 +7034,12 @@ static enum ItemEffect RandomStatRaiseBerry(u32 battler, u32 itemId, enum ItemCa gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN || caseID == ITEMEFFECT_NORMAL) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; @@ -7109,7 +7109,7 @@ static enum ItemEffect DamagedStatBoostBerryEffect(u32 battler, u8 statId, u8 ca gBattleScripting.animArg1 = STAT_ANIM_PLUS1 + statId; gBattleScripting.animArg2 = 0; BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; return ITEM_STATS_CHANGE; } return ITEM_NO_EFFECT; @@ -7127,12 +7127,12 @@ enum ItemEffect TryHandleSeed(u32 battler, u32 terrainFlag, u32 statId, u32 item gBattleScripting.animArg2 = 0; if (caseID == ITEMEFFECT_ON_SWITCH_IN_FIRST_TURN) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); } else { BattleScriptPushCursor(); - gBattlescriptCurrInstr = BattleScript_BerryStatRaiseRet; + gBattlescriptCurrInstr = BattleScript_ConsumableStatRaiseRet; } return ITEM_STATS_CHANGE; } @@ -7845,7 +7845,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) case HOLD_EFFECT_ROOM_SERVICE: if (TryRoomService(battler)) { - BattleScriptExecute(BattleScript_BerryStatRaiseEnd2); + BattleScriptExecute(BattleScript_ConsumableStatRaiseEnd2); effect = ITEM_STATS_CHANGE; } break; From 60587682e3dce87c7e8f8695c34c773442a81c61 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Tue, 13 May 2025 10:32:03 +0200 Subject: [PATCH 039/187] Remove redundant script declaration in `battle_scripts.h` (#6837) --- include/battle_scripts.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 958cd71892..d8b3fb41ea 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -489,7 +489,6 @@ extern const u8 BattleScript_ShellTrapSetUp[]; extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_CouldntFullyProtect[]; extern const u8 BattleScript_MoveEffectStockpileWoreOff[]; -extern const u8 BattleScript_StealthRockActivates[]; extern const u8 BattleScript_SpikesActivates[]; extern const u8 BattleScript_BerserkGeneRet[]; extern const u8 BattleScript_BerserkGeneRetEnd2[]; From e64d260f522f5368ae9f4cd5d5d646ef9fad2ae2 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 13 May 2025 04:34:06 -0400 Subject: [PATCH 040/187] Added Ability TODO tests B (#6836) --- test/battle/ability/bad_dreams.c | 2 +- test/battle/ability/ball_fetch.c | 7 +++++++ test/battle/ability/battery.c | 5 +++++ test/battle/ability/beads_of_ruin.c | 2 ++ test/battle/ability/beast_boost.c | 13 +++++++++++++ test/battle/ability/berserk.c | 2 +- test/battle/ability/bulletproof.c | 4 ++++ .../ability/{cheeck_pouch.c => cheek_pouch.c} | 0 8 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 test/battle/ability/ball_fetch.c create mode 100644 test/battle/ability/battery.c create mode 100644 test/battle/ability/bulletproof.c rename test/battle/ability/{cheeck_pouch.c => cheek_pouch.c} (100%) diff --git a/test/battle/ability/bad_dreams.c b/test/battle/ability/bad_dreams.c index 8a1d3669a2..41cedf8e3e 100644 --- a/test/battle/ability/bad_dreams.c +++ b/test/battle/ability/bad_dreams.c @@ -2,7 +2,7 @@ #include "test/battle.h" // Also checks that non-sleeping enemy is not affected. -SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of hp") +SINGLE_BATTLE_TEST("Bad Dreams causes the sleeping enemy Pokemon to lose 1/8 of HP") { u32 status; PARAMETRIZE { status = STATUS1_NONE; } diff --git a/test/battle/ability/ball_fetch.c b/test/battle/ability/ball_fetch.c new file mode 100644 index 0000000000..7411d60a7d --- /dev/null +++ b/test/battle/ability/ball_fetch.c @@ -0,0 +1,7 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Ball Fetch causes the PokΓ©mon to pick up the last failed Ball at the end of the turn"); +TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger if the PokΓ©mon is already holding an item"); +TO_DO_BATTLE_TEST("Ball Fetch only picks up the first failed ball, once per battle"); // Bestow can help test this +TO_DO_BATTLE_TEST("Ball Fetch doesn't trigger in Max Raid Battles"); diff --git a/test/battle/ability/battery.c b/test/battle/ability/battery.c new file mode 100644 index 0000000000..cecfa81d0c --- /dev/null +++ b/test/battle/ability/battery.c @@ -0,0 +1,5 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Battery increases Sp. Attack damage of allies by ~30%"); // 5325/4096 +TO_DO_BATTLE_TEST("Battery does not increase its own Sp. Attack damage"); diff --git a/test/battle/ability/beads_of_ruin.c b/test/battle/ability/beads_of_ruin.c index cfcfb17467..37240d2d68 100644 --- a/test/battle/ability/beads_of_ruin.c +++ b/test/battle/ability/beads_of_ruin.c @@ -73,3 +73,5 @@ SINGLE_BATTLE_TEST("Beads of Ruin's message displays correctly after all battler MESSAGE("The opposing Chi-Yu's Beads of Ruin weakened the Sp. Def of all surrounding PokΓ©mon!"); } } + +TO_DO_BATTLE_TEST("Beads of Ruin reduce Defense if Wonder Room is active"); diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index 9b07c51f1d..8f823ab3f6 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -56,3 +56,16 @@ SINGLE_BATTLE_TEST("Beast Boost doesn't trigger if user is fainted") MESSAGE("2 sent out Wobbuffet!"); } } + +TO_DO_BATTLE_TEST("Beast Boost boosts Attack 1st in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Defense 2nd in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Special Attack 3rd in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost boosts Special Defense 4th in case of a stat tie"); +TO_DO_BATTLE_TEST("Beast Boost considers Power Split"); +TO_DO_BATTLE_TEST("Beast Boost considers Guard Split"); +TO_DO_BATTLE_TEST("Beast Boost considers Power Trick"); +TO_DO_BATTLE_TEST("Beast Boost considers Wonder Room"); +TO_DO_BATTLE_TEST("Beast Boost considers Speed Swap"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider stat stages"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider held items"); +TO_DO_BATTLE_TEST("Beast Boost doesn't consider status condition reductions"); diff --git a/test/battle/ability/berserk.c b/test/battle/ability/berserk.c index e4d625ebc5..80e418e3c5 100644 --- a/test/battle/ability/berserk.c +++ b/test/battle/ability/berserk.c @@ -1,7 +1,7 @@ #include "global.h" #include "test/battle.h" -SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of its hp") +SINGLE_BATTLE_TEST("Berserk activates only if the target had more than 50% of its HP") { bool32 activates = FALSE; u16 maxHp = 500, hp = 0; diff --git a/test/battle/ability/bulletproof.c b/test/battle/ability/bulletproof.c new file mode 100644 index 0000000000..733eb63a11 --- /dev/null +++ b/test/battle/ability/bulletproof.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("Bulletproof makes ballistic moves fail against the ability user"); diff --git a/test/battle/ability/cheeck_pouch.c b/test/battle/ability/cheek_pouch.c similarity index 100% rename from test/battle/ability/cheeck_pouch.c rename to test/battle/ability/cheek_pouch.c From face37e8f3d87a695681f13f2035883a446c2eca Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Tue, 13 May 2025 09:54:54 -0400 Subject: [PATCH 041/187] Battle TV expansion (#6826) --- src/battle_tv.c | 477 ++++++++++++++++----------------- src/data/battle_move_effects.h | 4 +- 2 files changed, 235 insertions(+), 246 deletions(-) diff --git a/src/battle_tv.c b/src/battle_tv.c index 0758bf4107..8879fcde59 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -27,10 +27,10 @@ enum { PTS_RAIN, PTS_SUN, PTS_SANDSTORM, - PTS_HAIL, + PTS_HAIL_SNOW, PTS_ELECTRIC, PTS_STATUS_DMG, - PTS_STATUS, + PTS_STATUS_SKIP_TURN, PTS_SPIKES, PTS_WATER_SPORT, PTS_MUD_SPORT, @@ -45,9 +45,11 @@ enum { PTS_FLINCHED, PTS_STAT_INCREASE_1, PTS_STAT_INCREASE_2, + PTS_STAT_INCREASE_3, PTS_STAT_DECREASE_SELF, PTS_STAT_DECREASE_1, PTS_STAT_DECREASE_2, + PTS_STAT_DECREASE_3, PTS_STAT_INCREASE_NOT_SELF, }; @@ -100,89 +102,6 @@ static const u16 sPoints_SetUp[] = 6, 2 // Ingrain }; -static const u16 sPoints_RainMoves[] = -{ - MOVE_BUBBLE, 3, - MOVE_WHIRLPOOL, 3, - MOVE_OCTAZOOKA, 3, - MOVE_CLAMP, 3, - MOVE_WITHDRAW, 3, - MOVE_CRABHAMMER, 3, - MOVE_WATER_SPOUT, 3, - MOVE_DIVE, 3, - MOVE_WATERFALL, 3, - MOVE_MUDDY_WATER, 3, - MOVE_SURF, 3, - MOVE_HYDRO_CANNON, 3, - MOVE_HYDRO_PUMP, 3, - MOVE_BUBBLE_BEAM, 3, - MOVE_WATER_SPORT, 0, // Unnecessary, unlisted moves are already given 0 points - MOVE_WATER_GUN, 3, - MOVE_WATER_PULSE, 3, - MOVE_WEATHER_BALL, 3, - MOVE_THUNDER, 3, - MOVE_SOLAR_BEAM, -4, - MOVE_OVERHEAT, -4, - MOVE_FLAME_WHEEL, -4, - MOVE_FLAMETHROWER, -4, - MOVE_SACRED_FIRE, -4, - MOVE_FIRE_BLAST, -4, - MOVE_HEAT_WAVE, -4, - MOVE_EMBER, -4, - MOVE_BLAST_BURN, -4, - MOVE_BLAZE_KICK, -4, - MOVE_ERUPTION, -4, - MOVE_FIRE_SPIN, -4, - MOVE_FIRE_PUNCH, -4, - MOVE_SOLAR_BEAM, -4, // Repeated - TABLE_END, 0 -}; -static const u16 sPoints_SunMoves[] = -{ - MOVE_OVERHEAT, 3, - MOVE_FLAME_WHEEL, 3, - MOVE_FLAMETHROWER, 3, - MOVE_SACRED_FIRE, 3, - MOVE_FIRE_BLAST, 3, - MOVE_HEAT_WAVE, 3, - MOVE_EMBER, 3, - MOVE_BLAST_BURN, 3, - MOVE_BLAZE_KICK, 3, - MOVE_ERUPTION, 3, - MOVE_FIRE_SPIN, 3, - MOVE_FIRE_PUNCH, 3, - MOVE_SOLAR_BEAM, 5, - MOVE_SYNTHESIS, 3, - MOVE_MORNING_SUN, 3, - MOVE_MOONLIGHT, 3, - MOVE_WEATHER_BALL, 3, - TABLE_END, 0 -}; -static const u16 sPoints_SandstormMoves[] = -{ - MOVE_WEATHER_BALL, 3, - MOVE_SOLAR_BEAM, -3, - TABLE_END, 0 -}; -static const u16 sPoints_HailMoves[] = -{ - MOVE_WEATHER_BALL, 3, - MOVE_SOLAR_BEAM, -3, - TABLE_END, 0 -}; -static const u16 sPoints_ElectricMoves[] = -{ - MOVE_THUNDERBOLT, 3, - MOVE_THUNDER_PUNCH, 3, - MOVE_SPARK, 3, - MOVE_THUNDER_SHOCK, 3, - MOVE_ZAP_CANNON, 3, - MOVE_SHOCK_WAVE, 3, - MOVE_THUNDER_WAVE, 0, // Unnecessary, unlisted moves are already given 0 points - MOVE_THUNDER, 3, - MOVE_VOLT_TACKLE, 3, - TABLE_END, 0 -}; static const u16 sPoints_StatusDmg[] = { 5, // Curse @@ -193,117 +112,12 @@ static const u16 sPoints_StatusDmg[] = 3, // Nightmare 3 // Wrap (Trapping move) }; -static const u16 sPoints_Status[] = -{ - 5, // Attraction - 5, // Confusion - 5, // Paralysis - 5, // Sleep - 5 // Freeze -}; - -static const u16 sPoints_Spikes[] = { 4 }; -static const u16 sPoints_WaterSport[] = { 5 }; -static const u16 sPoints_MudSport[] = { 5 }; -static const u16 sPoints_Reflect[] = { 3 }; -static const u16 sPoints_LightScreen[] = { 3 }; -static const u16 sPoints_Safeguard[] = { 4 }; -static const u16 sPoints_Mist[] = { 3 }; -static const u16 sPoints_BreakWall[] = { 6 }; -static const u16 sPoints_CriticalHit[] = { 6 }; -static const u16 sPoints_Faint[] = { 6 }; -static const u16 sPoints_Flinched[] = { 4 }; - -static const u16 sPoints_StatIncrease1[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 2, - [STAT_DEF - 1] = 2, - [STAT_SPEED - 1] = 2, - [STAT_SPATK - 1] = 2, - [STAT_SPDEF - 1] = 2, - [STAT_ACC - 1] = 2, - [STAT_EVASION - 1] = 2 -}; -static const u16 sPoints_StatIncrease2[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 4, - [STAT_DEF - 1] = 4, - [STAT_SPEED - 1] = 4, - [STAT_SPATK - 1] = 4, - [STAT_SPDEF - 1] = 4, - [STAT_ACC - 1] = 4, - [STAT_EVASION - 1] = 4 -}; -static const u16 sPoints_StatDecreaseSelf[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = -1, - [STAT_DEF - 1] = -1, - [STAT_SPEED - 1] = -1, - [STAT_SPATK - 1] = -1, - [STAT_SPDEF - 1] = -1, - [STAT_ACC - 1] = -1, - [STAT_EVASION - 1] = -1 -}; -static const u16 sPoints_StatDecrease1[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 2, - [STAT_DEF - 1] = 2, - [STAT_SPEED - 1] = 2, - [STAT_SPATK - 1] = 2, - [STAT_SPDEF - 1] = 2, - [STAT_ACC - 1] = 2, - [STAT_EVASION - 1] = 2 -}; -static const u16 sPoints_StatDecrease2[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = 4, - [STAT_DEF - 1] = 4, - [STAT_SPEED - 1] = 4, - [STAT_SPATK - 1] = 4, - [STAT_SPDEF - 1] = 4, - [STAT_ACC - 1] = 4, - [STAT_EVASION - 1] = 4 -}; -static const u16 sPoints_StatIncreaseNotSelf[NUM_BATTLE_STATS - 1] = -{ - [STAT_ATK - 1] = -2, - [STAT_DEF - 1] = -2, - [STAT_SPEED - 1] = -2, - [STAT_SPATK - 1] = -2, - [STAT_SPDEF - 1] = -2, - [STAT_ACC - 1] = -2, - [STAT_EVASION - 1] = -2 -}; static const u16 *const sPointsArray[] = { [PTS_EFFECTIVENESS] = sPoints_Effectiveness, [PTS_SET_UP] = sPoints_SetUp, - [PTS_RAIN] = sPoints_RainMoves, - [PTS_SUN] = sPoints_SunMoves, - [PTS_SANDSTORM] = sPoints_SandstormMoves, - [PTS_HAIL] = sPoints_HailMoves, - [PTS_ELECTRIC] = sPoints_ElectricMoves, [PTS_STATUS_DMG] = sPoints_StatusDmg, - [PTS_STATUS] = sPoints_Status, - [PTS_SPIKES] = sPoints_Spikes, - [PTS_WATER_SPORT] = sPoints_WaterSport, - [PTS_MUD_SPORT] = sPoints_MudSport, - [PTS_REFLECT] = sPoints_Reflect, - [PTS_LIGHT_SCREEN] = sPoints_LightScreen, - [PTS_SAFEGUARD] = sPoints_Safeguard, - [PTS_MIST] = sPoints_Mist, - [PTS_BREAK_WALL] = sPoints_BreakWall, - [PTS_CRITICAL_HIT] = sPoints_CriticalHit, - [PTS_FAINT] = sPoints_Faint, - [PTS_FAINT_SET_UP] = sPoints_Faint, - [PTS_FLINCHED] = sPoints_Flinched, - [PTS_STAT_INCREASE_1] = sPoints_StatIncrease1, - [PTS_STAT_INCREASE_2] = sPoints_StatIncrease2, - [PTS_STAT_DECREASE_SELF] = sPoints_StatDecreaseSelf, - [PTS_STAT_DECREASE_1] = sPoints_StatDecrease1, - [PTS_STAT_DECREASE_2] = sPoints_StatDecrease2, - [PTS_STAT_INCREASE_NOT_SELF] = sPoints_StatIncreaseNotSelf }; // Points will always be calculated for these messages @@ -359,16 +173,19 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) switch (stringId) { case STRINGID_ITDOESNTAFFECT: + case STRINGID_ITDOESNTAFFECTTWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 2, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK)) TrySetBattleSeminarShow(); break; case STRINGID_NOTVERYEFFECTIVE: + case STRINGID_NOTVERYEFFECTIVETWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 1, 0); if (!(gBattleTypeFlags & BATTLE_TYPE_LINK) && GetMonData(defMon, MON_DATA_HP, NULL) != 0) TrySetBattleSeminarShow(); break; case STRINGID_SUPEREFFECTIVE: + case STRINGID_SUPEREFFECTIVETWOFOES: AddMovePoints(PTS_EFFECTIVENESS, moveSlot, 0, 0); break; case STRINGID_PKMNFORESAWATTACK: @@ -441,7 +258,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) case STRINGID_ATTACKERSSTATROSE: if (gBattleTextBuff1[2] != 0) { - if (*statStringId == STRINGID_STATSHARPLY) + if (*statStringId == STRINGID_DRASTICALLY) + AddMovePoints(PTS_STAT_INCREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATSHARPLY) AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -452,7 +271,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) { if (gBattlerAttacker == gBattlerTarget) { - if (*statStringId == STRINGID_STATSHARPLY) + if (*statStringId == STRINGID_DRASTICALLY) + AddMovePoints(PTS_STAT_INCREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATSHARPLY) AddMovePoints(PTS_STAT_INCREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_INCREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -470,7 +291,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) case STRINGID_DEFENDERSSTATFELL: if (gBattleTextBuff1[2] != 0) { - if (*statStringId == STRINGID_STATHARSHLY) + if (*statStringId == STRINGID_SEVERELY) + AddMovePoints(PTS_STAT_DECREASE_3, moveSlot, gBattleTextBuff1[2] - 1, 0); + else if (*statStringId == STRINGID_STATHARSHLY) AddMovePoints(PTS_STAT_DECREASE_2, moveSlot, gBattleTextBuff1[2] - 1, 0); else AddMovePoints(PTS_STAT_DECREASE_1, moveSlot, gBattleTextBuff1[2] - 1, 0); @@ -569,7 +392,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNIMMOBILIZEDBYLOVE: if (tvPtr->pos[atkSide][atkFlank].attractMonId != 0) - AddMovePoints(PTS_STATUS, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 0, tvPtr->pos[atkSide][atkFlank].attractMonId - 1, tvPtr->pos[atkSide][atkFlank].attractMoveSlot); break; case STRINGID_PKMNWASPARALYZED: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].prlzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -577,7 +400,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNISPARALYZED: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId != 0) - AddMovePoints(PTS_STATUS, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 2, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].prlzMoveSlot); break; case STRINGID_PKMNFELLASLEEP: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].slpMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -585,9 +408,9 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNFASTASLEEP: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId != 0 - && gBattleMsgDataPtr->currentMove != MOVE_SNORE - && gBattleMsgDataPtr->currentMove != MOVE_SLEEP_TALK) - AddMovePoints(PTS_STATUS, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); + && GetMoveEffect(gBattleMsgDataPtr->currentMove) != EFFECT_SNORE + && GetMoveEffect(gBattleMsgDataPtr->currentMove) != EFFECT_SLEEP_TALK) + AddMovePoints(PTS_STATUS_SKIP_TURN, 3, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].slpMoveSlot); break; case STRINGID_PKMNWASFROZEN: tvPtr->mon[effSide][gBattlerPartyIndexes[gEffectBattler]].frzMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -595,7 +418,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_PKMNISFROZEN: if (tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId != 0) - AddMovePoints(PTS_STATUS, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 4, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMonId - 1, tvPtr->mon[atkSide][gBattlerPartyIndexes[gBattlerAttacker]].frzMoveSlot); break; case STRINGID_PKMNWASCONFUSED: tvPtr->pos[effSide][effFlank].confusionMonId = gBattlerPartyIndexes[gBattlerAttacker] + 1; @@ -603,7 +426,7 @@ void BattleTv_SetDataBasedOnString(enum StringID stringId) break; case STRINGID_ITHURTCONFUSION: if (tvPtr->pos[atkSide][atkFlank].confusionMonId != 0) - AddMovePoints(PTS_STATUS, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); + AddMovePoints(PTS_STATUS_SKIP_TURN, 1, tvPtr->pos[atkSide][atkFlank].confusionMonId - 1, tvPtr->pos[atkSide][atkFlank].confusionMoveSlot); tvPtr->side[atkSide].faintCause = FNT_CONFUSION; break; case STRINGID_SPIKESSCATTERED: @@ -924,85 +747,251 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) struct BattleTv *tvPtr = &gBattleStruct->tv; u32 atkSide = GetBattlerSide(gBattlerAttacker); u32 defSide = GetBattlerSide(gBattlerTarget); - const u16 *ptr; s32 i; switch (caseId) { +#define move arg2 case PTS_MOVE_EFFECT: // arg1 -> move slot, arg2 -> move { - u8 baseFromEffect = gBattleMoveEffects[GetMoveEffect(arg2)].battleTvScore; + enum BattleMoveEffects effect = GetMoveEffect(move); + u8 baseFromEffect = gBattleMoveEffects[effect].battleTvScore; + + // Changes depending on the effect + switch (effect) + { + case EFFECT_FIXED_DAMAGE_ARG: + baseFromEffect *= (GetMoveFixedDamage(move) / 20); + break; + case EFFECT_TWO_TURNS_ATTACK: + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch ((enum MoveEffects)additionalEffect->moveEffect) + { + case MOVE_EFFECT_ATK_PLUS_1: + case MOVE_EFFECT_DEF_PLUS_1: + case MOVE_EFFECT_SP_ATK_PLUS_1: + case MOVE_EFFECT_SP_DEF_PLUS_1: + case MOVE_EFFECT_SPD_PLUS_1: + case MOVE_EFFECT_ACC_PLUS_1: + case MOVE_EFFECT_EVS_PLUS_1: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 2; + break; + case MOVE_EFFECT_ATK_PLUS_2: + case MOVE_EFFECT_DEF_PLUS_2: + case MOVE_EFFECT_SP_ATK_PLUS_2: + case MOVE_EFFECT_SP_DEF_PLUS_2: + case MOVE_EFFECT_SPD_PLUS_2: + case MOVE_EFFECT_ACC_PLUS_2: + case MOVE_EFFECT_EVS_PLUS_2: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 3; + break; + case MOVE_EFFECT_FLINCH: + if (additionalEffect->self == FALSE) + baseFromEffect += 3; + break; + default: + break; + } + } + break; + case EFFECT_FIRST_TURN_ONLY: + if (MoveHasAdditionalEffectWithChance(move, MOVE_EFFECT_FLINCH, 100)) + baseFromEffect += 3; + break; + case EFFECT_CONFUSE: + if (GetMoveTarget(move) == MOVE_TARGET_FOES_AND_ALLY) + baseFromEffect += 2; + break; + default: + break; + } - // Various cases to add/remove points - if (GetMoveRecoil(arg2) > 0) - baseFromEffect++; // Recoil moves - if (GetMoveEffect(arg2) == EFFECT_RAPID_SPIN) + // Guaranteed hit but without negative priority + if (GetMoveAccuracy(move) == 0 && GetMovePriority(move) >= 0) baseFromEffect++; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_SP_ATK_MINUS_2) || MoveHasAdditionalEffect(arg2, MOVE_EFFECT_ATK_DEF_DOWN)) - baseFromEffect += 2; // Overheat, Superpower, etc. - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_STEAL_ITEM)) - baseFromEffect += 3; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_WRAP) || MoveHasAdditionalEffectSelf(arg2, MOVE_EFFECT_THRASH)) - baseFromEffect += 3; - if (MoveHasAdditionalEffect(arg2, MOVE_EFFECT_RECHARGE)) - baseFromEffect += 4; + // User recoil damage + if (GetMoveRecoil(move) > 0) + baseFromEffect++; + + // Additional move effects in any move + for (i = 0; i < GetMoveAdditionalEffectCount(move); i++) + { + const struct AdditionalEffect *additionalEffect = GetMoveAdditionalEffectById(move, i); + switch (additionalEffect->moveEffect) + { + case MOVE_EFFECT_STEAL_ITEM: + if ((additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 3; + break; + case MOVE_EFFECT_THRASH: + if (additionalEffect->self == TRUE) + baseFromEffect += 3; + break; + case MOVE_EFFECT_WRAP: + if (additionalEffect->self == FALSE) + baseFromEffect += 3; + break; + case MOVE_EFFECT_RECHARGE: + if (additionalEffect->self == TRUE) + baseFromEffect += 4; + break; + case MOVE_EFFECT_ATK_DEF_DOWN: + case MOVE_EFFECT_ATK_MINUS_2: + case MOVE_EFFECT_DEF_MINUS_2: + case MOVE_EFFECT_SP_ATK_MINUS_2: + case MOVE_EFFECT_SP_DEF_MINUS_2: + case MOVE_EFFECT_SPD_MINUS_2: + case MOVE_EFFECT_ACC_MINUS_2: + case MOVE_EFFECT_EVS_MINUS_2: + if (additionalEffect->self == TRUE && (additionalEffect->chance == 100 || additionalEffect->chance == 0)) + baseFromEffect += 2; + break; + } + } movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += baseFromEffect; break; } +#undef move case PTS_EFFECTIVENESS: - case PTS_CRITICAL_HIT: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += sPointsArray[caseId][arg2]; + break; case PTS_STAT_INCREASE_1: - case PTS_STAT_INCREASE_2: - case PTS_STAT_DECREASE_SELF: case PTS_STAT_DECREASE_1: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 2; + break; + case PTS_STAT_INCREASE_2: case PTS_STAT_DECREASE_2: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 4; + break; + case PTS_STAT_INCREASE_3: + case PTS_STAT_DECREASE_3: + case PTS_CRITICAL_HIT: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += 6; + break; + case PTS_STAT_DECREASE_SELF: + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] -= 1; + break; case PTS_STAT_INCREASE_NOT_SELF: - movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] += sPointsArray[caseId][arg2]; + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg1] -= 2; break; #define move arg1 case PTS_RAIN: - case PTS_SUN: - case PTS_SANDSTORM: - case PTS_HAIL: - case PTS_ELECTRIC: - i = 0; - ptr = sPointsArray[caseId]; - do + { + s32 points = 0; + + if (!IsBattleMoveStatus(move)) { - if (move == ptr[i]) + switch (GetMoveType(move)) { - movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += ptr[i+1]; - break; + case TYPE_WATER: points += 3; break; + case TYPE_FIRE: points -= 4; break; + default: break; } - i += 2; - } while (ptr[i] != TABLE_END); + } + else if (move == MOVE_WITHDRAW) // For some reason, vanilla gives points to it + { + points += 3; + } + + switch (GetMoveEffect(move)) + { + case EFFECT_WEATHER_BALL: + case EFFECT_THUNDER: + points += 3; + break; + case EFFECT_SOLAR_BEAM: + points -= 4; + break; + default: + break; + } + + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_SUN: + { + s32 points = 0; + + if (!IsBattleMoveStatus(move) && GetMoveType(move) == TYPE_FIRE) + points += 3; + + switch (GetMoveEffect(move)) + { + case EFFECT_SOLAR_BEAM: + points += 5; + break; + case EFFECT_WEATHER_BALL: + case EFFECT_SYNTHESIS: + case EFFECT_MORNING_SUN: + case EFFECT_MOONLIGHT: + points += 3; + break; + default: + break; + } + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_SANDSTORM: + case PTS_HAIL_SNOW: + { + s32 points = 0; + switch (GetMoveEffect(move)) + { + case EFFECT_WEATHER_BALL: + points += 3; + break; + case EFFECT_SOLAR_BEAM: + points -= 3; + break; + default: + break; + } + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; + break; + } + case PTS_ELECTRIC: + if (!IsBattleMoveStatus(move) && GetMoveType(move) == TYPE_ELECTRIC) + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += 3; break; #undef move case PTS_FAINT: - tvPtr->side[arg2 ^ 1].faintCause = FNT_NONE; - movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; + tvPtr->side[arg2 ^ BIT_SIDE].faintCause = FNT_NONE; + movePoints->points[arg2][0 * 4 + arg3] += 6; break; case PTS_FAINT_SET_UP: tvPtr->side[arg2].faintCause = FNT_NONE; - // fallthrough + movePoints->points[arg2][0 * 4 + arg3] += 6; + break; case PTS_SET_UP: movePoints->points[arg2][0 * 4 + arg3] += sPointsArray[caseId][arg1]; break; case PTS_BREAK_WALL: - movePoints->points[atkSide][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; + movePoints->points[atkSide][arg2 * 4 + arg3] += 6; break; case PTS_STATUS_DMG: - case PTS_STATUS: - case PTS_SAFEGUARD: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; + break; + case PTS_STATUS_SKIP_TURN: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 5; + break; case PTS_MIST: + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 3; + break; + case PTS_SAFEGUARD: case PTS_FLINCHED: - movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += sPointsArray[caseId][arg1]; + movePoints->points[atkSide ^ BIT_SIDE][arg2 * 4 + arg3] += 4; break; case PTS_SPIKES: - movePoints->points[arg1][arg2 * 4 + arg3] += sPointsArray[caseId][0]; + movePoints->points[arg1][arg2 * 4 + arg3] += 4; break; #define move arg1 @@ -1014,12 +1003,12 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (tvPtr->pos[defSide][0].waterSportMonId != 0) { u32 id = (tvPtr->pos[defSide][0].waterSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][0].waterSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][0].waterSportMoveSlot] += 5; } if (tvPtr->pos[defSide][1].waterSportMonId != 0) { u32 id = (tvPtr->pos[defSide][1].waterSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][1].waterSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][1].waterSportMoveSlot] += 5; } } break; @@ -1030,12 +1019,12 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (tvPtr->pos[defSide][0].mudSportMonId != 0) { u32 id = (tvPtr->pos[defSide][0].mudSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][0].mudSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][0].mudSportMoveSlot] += 5; } if (tvPtr->pos[defSide][1].mudSportMonId != 0) { u32 id = (tvPtr->pos[defSide][1].mudSportMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->pos[defSide][1].mudSportMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->pos[defSide][1].mudSportMoveSlot] += 5; } } break; @@ -1044,7 +1033,7 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) if (IsBattleMovePhysical(move) && power != 0 && tvPtr->side[defSide].reflectMonId != 0) { u32 id = (tvPtr->side[defSide].reflectMonId - 1) * 4; - movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += sPointsArray[caseId][0]; + movePoints->points[defSide][id + tvPtr->side[defSide].reflectMoveSlot] += 3; } break; case PTS_LIGHT_SCREEN: @@ -1387,5 +1376,5 @@ static void AddPointsBasedOnWeather(u16 weatherFlags, u16 moveId, u8 moveSlot) else if (weatherFlags & B_WEATHER_SANDSTORM) AddMovePoints(PTS_SANDSTORM, moveId, moveSlot, 0); else if (weatherFlags & (B_WEATHER_HAIL | B_WEATHER_SNOW)) - AddMovePoints(PTS_HAIL, moveId, moveSlot, 0); + AddMovePoints(PTS_HAIL_SNOW, moveId, moveSlot, 0); } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 9e29b064d3..f034d8953d 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2149,7 +2149,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_BLIZZARD] = { .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 1, }, [EFFECT_RAIN_ALWAYS_HIT] = @@ -2238,7 +2238,7 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = [EFFECT_RAPID_SPIN] = { .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points + .battleTvScore = 2, }, [EFFECT_SPECTRAL_THIEF] = From 484c41c49d712a82b4e18e6b55bb31239ba51da3 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 13 May 2025 14:56:31 +0100 Subject: [PATCH 042/187] Remove files that should not have been committed --- src/data/map_group_count.h | 1 - tools/mgba-rom-test-hydra/mgba-rom-test-hydra | Bin 30888 -> 0 bytes tools/patchelf/patchelf | Bin 16272 -> 0 bytes tools/trainerproc/trainerproc | Bin 55696 -> 0 bytes 4 files changed, 1 deletion(-) delete mode 100644 src/data/map_group_count.h delete mode 100755 tools/mgba-rom-test-hydra/mgba-rom-test-hydra delete mode 100755 tools/patchelf/patchelf delete mode 100755 tools/trainerproc/trainerproc diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h deleted file mode 100644 index 4fe8a21b3b..0000000000 --- a/src/data/map_group_count.h +++ /dev/null @@ -1 +0,0 @@ -static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/tools/mgba-rom-test-hydra/mgba-rom-test-hydra b/tools/mgba-rom-test-hydra/mgba-rom-test-hydra deleted file mode 100755 index f92182a1818ff806241fded0d3420b45c99a7204..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30888 zcmeHwdwf*Ywf~tUBQX#rD5>}!l_(Dr5?&Gzn;-)R%OgTiDz!sMCS)WpXC^#UG&+nj zJxrV0VrlEIrPX@9^I#n6zXCA~zuTSdr zNj*h}s3JHNRq-S<^j9b2nN4euM@J2xH7#4ON9twM$x>cXDuWK9^p{*m+-T}%)C{kx zuD0e6p(fJH_D}IOQcqFkXPwkbULypuX{*#zRQY)|^eCSH>>-;$TP@48Yd@VD3WuVy zS-75+z^Sh-UAb1v>(=7ri^_Ls4(4UI(efm(@=10g{-`-fzvcFyPQUGo$3A$xWaz3y z;@aA3$MIKZwE8#Bojs$qsl3(S-nFfK+q}8ub7xlsJ1ScSr051UTP!%u#Nn!Hu!IC>;Tr>_{%=>ZRD?p zU@kxVY~(+&k$=)g{v8{68VU-t1c8+pGCPM6JG{b9U~{9`uq->{Lt z&j$a%#?A&C{23d3r;YtnZSbu&cJ8#nAF{FYjt#!t27lSceu0hrAshTs*m2`8`}jV9 zTJ$rtc#@&`k{K>dmB-~EY!R^7uj`n60 zh_V_tdmCFedz%|z&9}|h*xE_f8avuLwXSwt**0s<&8=O*7Ol!^aL zv%iA^(Ae4$^ubnR8qp`Z$8w@r!ASk4XFi`D69bK(dZHig* z)_^~RLJ@D6zcJVm2x)C?4V_x2zY~@b$Pi_=Q?78dA;dLB-P&kTFju2miqz8O%NAYf zomnxnVveTLvu2GXD`uPN%gj{O2so0OH5)xE5C7%!8S5BH2^0Snm??!=sS~*ltaTMO z25VB49!<%*Q#;j^K=nZJhFtl!SIkYj_KV&{B{Os%ZoT9BuLY(3vD(sGTSIGyHz6iNzp8KSi4@`H7rgpnYEQk8*y#woLM({5-RKweDBr zwsSIhp=t3pK^5+n`2MW%toVZ+LLScZ8c%SrW5LHL5VX&NUtq!eEqIj$KW@S2TJQl2 zKHq|?`H0rJw6;`-nvV#l^`?1riWK>X<}i;!3yu()M~MZeHL*G-S#T;t9c~LwF;d4A z3$9{Kd6gDit;GqSXTggIkVlOLAFDu6-GYy^;B^)p9m+h`S@7{Ds%aZ6xXXgKSnv`H z-f6)nSnzEY+nYDIVaJuhMM~?+BRUqhI3;sC^zR!Z6VZk4?;FB!)ehYr4 z1wUxP&$8fg3x2i*@3Y|NSnz%ePHQ=J9Jk=-DG+qPf}d}}lNQ``b!YmsoJO1)pNU)xHgtJJo_$TI8o$@Oc(|x&^PX z;Iu|khi<{k6$n~q!7D8IItxC-f^V?kl@`3kg3q+zofdqS1>a`D=?bNeZVNs~fuOrA z_+=Kn$AZtZ;Cn52wFTd2!53KYlgX12I2nPH5jYuvlMy%>fs+w98G(}#I2nPH5%_;4 z0`I%d`&bX3DAWz-6RWVD5s8QL(*1h)=Y{k{K-1E5o&%gNdmd-k`87xp-$Gfbfi#Y? zqr}sePO6{zL&VcoPAbm)BgE6=%+!A7e@r}W>7@2C|3l(wD<{>%{C9|_Eu2(0^LG-+%g_5dc{^OP4Y3n3a z!~A>1)0Ro9lKDRpPg^A^H}h{3Pg^9Z66Rkep0-9(8uPy(p0-3%L;s-qKS#Wq_yOjR z5>H!qpsW|hG5Kmhnsr}6Vn0VR(N$q3)hs4v?N2-VU?+{O09;t5T?<1{7uBumPV?E`2g{>m657s{s!V{3nS%bek1X;b&)Dz z{yO3-h}W23P5cbvhd$xzaWP0sp$dN`Q0S6s8B7UFRKPim+3*Za_ne3x?fv8V zj{cX1qel(T2}gg_^MP&@uYiz&RAav$?bjV~-O;c24xlD|dek$l8=hgKrm))cdaw{u zWUbs-`?`dqy_C?6ni3MPJ{lMcnQ+_@^_&`ZeK2ZnH;Z0W@o*!(|je;^7I25WXRAMbvPe=2n6tSYvK2jsWc&%5 zw)I%)n;2etG?5&_gaFy&$U9C~3O6T=wMl*IQ9b-|(XB29!to;1*{ z4?;w9ic4RJbFpjZ4@pL(@1ke9oF3=e**%iJ>n@cZ8`{YEW4CT)S`^X+-MWeCm{5hF zTd!rB7b;?!9~w94(Qo$+q|^C%g9|uyo0dOV#i@L4%-|&=H+|~hxn}BgGj*y;QG=s? zbwym?>Z74cEa5vutzrgn^WRb9uqU3Mx}V%fy%E*#i!co7;T=O-*JP{mSgUe{R31Bc z12l&)cB0&mNQJs`2}qwFD}EdEuO5974aWT|dF*fL^x#aTLY;X)pNeioBWy%%&VE*t zI(I{d932apI7Uy>bw>;nELC;5NuMsdX2_YmVK|+BRt&rFiJIt+=ehrqj?p~{*Htuc zKZewC)Pt%^aG`()Qa57VfHHYoG$`h~ zA|7Efi7W>o*O7QQSsNan=(?){IcR{`#0Xa|=KK_fjeqKm|wOWC_bvK9^SGzPhryo8#XJ z`Kv|H;tMam=E!C;y62%U#OkO6#G^gLqzc5u7B{*tx8@O(N{X2Wc{O0e!&SF+lBOQ( zk&%!&Xo22=LIkL83p<4iPaoQ^K##sc)mb8ZV?E*ZD7^=B>5Z3qqIlD7@+GyxbZxQK zZDLYYW}a^AHsy@C{c5h_zxDx#G}G-&y>Sj|gRJUaEA@38><+iR- z&WLNoj4I-T_j9!VjS`n6XPc1>h_}Q7e_oTp^Ogc99kg^tu>^nf0*GKlM@by`yJtRM%p(LIIAsy^zv z;|XYSm?ajQDA;HZi%MUjOV~%-4VS*1cB@c z0nEH-VpaQ#3pmcn*^m?y#7&~JS)xonSk&3m*f^RJ5&!q()HO?WAWLv)zT~AB9N-2S zoIW^JH%cF0#Id0waK)gd4@gEsI)xL%x&v9XigfTQXjq?0YYkr2^&g>|PMQtoy@$R_ zOF_E&x+0s!Y)due>lcf!KnZj`O&TQ3aTS-b>9mX#({Z$?(CjppWOs>Z)2BF@c zDu~Kn-5+0f1*QyI+13>9jE6QOw`X)N=FUQ@{R{7=)8XNC*J6nIbBi6Jg3O^e4t_*E zpM-aOk`B4hUnW!OA0*iIc+JdaQmJAU0k|GV7o@wVJd&iFDDHL-3cdZ%+mBnN zEOQ6pC{>Oe-b*y$=_ZnT2q(kSEpNCucgL|Nx@JT>Uua+Wzt!Fw_H@(ofTB|AdOTk3>2~d|rIrfs=+Rs|OK74D1~Z_a!_#IUL*39SqM-zQ|#bAjY$!-_WQPuFjq5dc1DD@~gSJ-*v~O zx#f(Sf`xF`;kuK4M4YRXnnEgOh?^vb5A05#Xy<{P`UP0A=FBL>@|4Gk^FMJjghn4ZA`x*mo-JE?KeWZ2eN+hYVKAEE~N=tJ5@*hx|K z(M_x|XDk=z`~*KvWKVoo#0!1b0Vd%g2PWR7m>e6~Mk2Wsa(Xm! zoXQ9vCZf@{5d*jb*%`+)Mg}pBQDua+?jMm&NB3bOTIiam>4$sCac~2s281ah8eg}a zvZz~3H;l#ECxl&~NWdbR9iZ8ZJ_`AI(@*ANplLthHQ(MS?bAiP9`*(zza#Wee{s1r-V zhZnIjNH~4-#ZMyP$ONfzPm(PT35!H9WN5VOv4{qrxNuxe2G3NTBzYg4h(_WN4Iien z7FvZ`4`5c*V~>%J!I@9cuP;&bWa<)z^Nnh{IdlEN32}D2qa=fiFUc3}-oH!^7?^MG5D5NV-vi;hcmN=BY@0TS>F) z-Dls^UDNuSb=R$Z=x))Y`b&QdW7q7|qsWU>-qH75>*AD8r}lXAH?VABr@>)}T^f%% zpP5JIpTId9Kf>!AIC2xWmGdE>2rsMP2<1cjoFW9@-ITNV-b?jkSto2Isa$8F9 zt%5A=xA-Ys4v*xmgHe2h@@-1{YzKZgs6NRw*ZhiEw$i|~+v!S^Af z=9}>6M478lrZBw+spJ4o(a7^K5I#(2F^g=J!WWvtEl3Fo++FOzlI{q(!j}Y5>uceZ zDr=!s{~a(@K{WWAV07TKIu!VJVBgjIqo6I*|Vr5LMz3 z9%fMpZ#3o4Fy#TiY7spyMVFYOCw>R#E`vz)D1s-Zui|G}Y-Ia!Da2*&p>B+!BfY3U ziWId^aclH*80jp+c%LllHROs4-;ScpIUcK(7){HF0M5AZ!qa^upla16^}lQC*OIH3 z!j)*`WiE`)qOkQ+xZM<<2;uNyl0ch119y$m8}SebwRiZKn(k~7T&G};A@w%H zGJMnEGoJsJpyIB`z2r{J`5PgS{2m%c1aI-%T%@?LP_+(061FLB>ntsNKx#Ibnnlnw z_$n42xD7LODIGsj$nBg+-a&PbMuw?(h7S`FE5Ul~J=5?Hn57&I8wxL=X1ZtP+Ej^}XG6U{R6XA_b%y&H=$;0Xm zH>z~QhTVSG<9h_~su*$~y^mWP_6ZM3nTFW|gn=9}oTs8By5M~YH;v)L?EJ0R%5(PO zp|-Jyc&sF!pFpiPGR6KL#T(8SAwmyzILwEjPctJmEVfqfMCX%-U6Jbgqm56Lp z!SP_dj6Devl~GNH+wfENVns%`tjolL$V;9n1#?FUyMAIntN8P|^83_-psAS4i_ftU z*(Fv%b3UoaQ3UpX#3r1h*DO9ZJF}||Vbt<0xAC_$^Y@`v;lp$mGyk_sD2|C_2=Noa zID{11+sIWQ7QVY^kI!H`ybzwVF_$2=VV}dErPvQF{d_JFbOH`B-`yO>^fgk2?9n1a zK8Zs91N2;bNo?9Al2hIoY3zQNsNXkHdr`kvk@^e+B_ny`G9%gd(W}uCG}Vpe@L&)7 zZk+*9^rC|Bzth~~2y@lYqe;qeUIq>7(f@+yhvvB6hl(U3w?F_1ZSY3K{0y?p(CFbv z3(Sx3Gmz2w=5v6Tk&SWkZIX(SVX?qGG>$_crsJnxM{KwVct09w9WN z{+Rw^d>2W95}o-+|=0mU z$4WoN4?1#Hy9U9pW+~V1)42PV{?bO2oJC^}Oh@{L2 zy_!**j`vX;>guB+^v16_LRb7VHtEsjNQAH)vauP3&2WT@LxjjHiqPv*az{w#2$7VC zP$KegNLwmT>`3MJc$@CsMH_Mfr2IK$>o2JCF^hRtw< zibLheE2{jP_)$cz?mI6p%`*p_GX1 zN1@z0Z{i$2Ol;Myml|B-Slx>#_z?X(B3672tBovxeuu!Mo`MoYzQwfq%F4NbZS$gPDHahVNIf9a z6z!#-Cj9(WA;o0G&js9oWY%GDZ5MFeT)SNuzv07t!7$_XVi_s-9>UaUR^)Crm`GlT ziXE)4l z(TEiimUxY2+Z?Ymek0?B=_1n<#p~_K?B|chWX5YO{0wt75ihd7fQP<{*KQ!18L#h= z4a94vC0>WvU?TY*3?(85NghW^^epJ1bfh<45sHlq9WwID+yzZ057}S9f zFPh=^konAbUHVHiUVIG@5|((qc9E)o^1o$Qr3+A|DT>!4Bp561Iz`Eg1`_?@gEVKGMe7URpvH1_NzuVck;Wm&$Rg?AxSW8o?mCLY2Q zv%*!+!qf|eZ~+Sw4`El9@FgtVV+#NJLUMz62p44ufBXybncJP+_%RC;4`FAP@Cy(| zrSD{!okHg7ESY~5G8*Ph%{Rd;}tfT+FOZ;umrg z`Ny01g`CcU*AGAYOmh$ae%~nl!v&gF^cUcg6@=Yvmyp;uSLh<57G0nb!o8J85N{nA; z1mrn5w)lZ7ZvsxlP+tkM>#3bzWv=R%+<7t-%>e%}mI554lx_vM1lxW8!#o zkIKS$F{SBMJH96ORzEsY16r5fcT}X6Hzj;_}~{HQ3QeKZU^z2Ave7R39(nM_~|V}?)qh`u3UQUvXyJDQ~25I z%bJ#)z5XhGYmx%#MM=uQdcWBsvZaJ!3$7v{dyplkXk~|+#sS>u=xT4ODAJ1D?z7j= zs%l$OyKK2<@!9Ju+l0XUBF*hC7kLfsP42QLcUwomho7{Oj3rZJopKB{SkuTJHDpi( z7N%#l)vj5yc10bkx^j(oq?nNcX0?4r0khgfoQ0pW+P<)I)wL_x41Q-f;x0Klv#kzA zNqEHk%+E4EQ<~SxrQ6xTnD15xB7mc|smWdMSyR7e;U()X!E8#yRECthQmDn}Zt~%k zQ|Mcr0VK9@SgiJQRDwz=YohpZ$Zcar9w<2xW{z;D?hF;TzuAqdAy;%CyeiDs9`bkKeORsA-DFR63u`?^dx%bD zacq?Tv)k%d)z>c1?Z4yf`~|Iu3-)fbdC#WP`#|?TpHA-r{rU^(bRTH-i+G>|`Yvc8 zZZP)aIy(h)DXlX>{{h+pdK#`FJ3%*r-VfS}9k8E+9v_B2C>?lIz=z|e)tX~liR0{X zV+wnaNBBATD@55?&}-V_G1xH_?}V8R+S8X#Z^%bte94mWldf`&-CEeKeg3Qk(`HS^ zx3yYSK{JY1f{MP}0gtcTY`;(CO3I1ZZ`@(ao5q%`d_9VpMPUNk%=H=Cy zzRg4algM`#SakEX0upcoT8I37*cG~gZuyk&dN@D-`m@*u1@jijBtOJD0BLoQIm$y8 zzgLxT!szehaWVoYBXBYT|35`Qy+=^JH<0EvI_O=9bSR$QeMkpg_xNxNQY?t}@+y%y zQ}XJ4g=b41mlQr|x}`(Cw~*#?I#m8&KTUTK-%r;r98N*BB<*S7z`egXhm*Q!bR{OM0=Sb0u9O={1rzOS(nUJ0-nG(g!3xAn7qlUy<}3Nk5eI zl#68fl3pz7TuGNmdX1#bl5UYyXk$%!qev~i^2+({DR@KtRCm>Eyw0`CJ+pG=oXVM% zmnq5I)B(6a`wQ<`S|w;aIPgBr`FpNs^K2L;h)fD-;|Z0pj&Yf@1BI-BvmQwY^GUWJOB>WE& zSM$euiGM6{UUvec`!$kZRfPl&UT=zI&iHgAkL2U4gpgWW-UZfy*(!T{^{`lpmb^yD ztMh#0dgKx9JzhZ;GfsUHX{{OO(-w(V5ejd#7^Kl#b|0Fzbym_5e^?J!h z{`WR`+6Jfp+a#C&7ueu)ZE*SyMJ_wn+2EUP@Y`(guiN1F+u)Dc;C(juYrv^pvincc zM*idz$fHQGUr>BMc*mO73YmM_*Sx`x$r_%VL{ESciPDB zwZR{c`DFr!4lw32)tR_pG}%z%xZFz{U8DZq0Qe|trv z)-E@fHA%fq{!RW+P;2ez*xc3WZD?u=_<}+CLVo!;MQg!EZ>!JC@BJ4KbG&#E6U0uw zKQvRLry&gipVIXOwT)f=)+R5W>}>34_2Q{ct51{f$oDS(;>y|;%dW(m^RbrldUWrS z)wL@;UVZUu&AW8@sztTSy{nciS>vhq*4Hjt?(xzm2Jq7V8ujvgdXfI9&j^^gcuBtS z&qPR`-`3x`eKgkAnSp)QCmY1`rA%?Eeg;C{49F^nzaNkxB)*Q20nvvQ{7o5<*Voh# zYM_Tr^tp%3EbLPIsZw|jn3<9Fl?O9(Hh;jtWGN=}04W1dACkxb`DsT6!p|-;5PCS3 z0muhr85n<%Ap;SgddPsNe`NsT6Au}Xcq)?tdA$@W@l^>53qH({kuN^~kOA>`H8K$S z1&RzT`!gNhreKFxj0O3z2vZ!NY@p9c(8DMbo)sMn6CY$$&;Z{;mkNpa=5< z@%E08uVPbsS4C$4(GK8)DitQg6Kpv?ZBjuGbON0k3$`@i<1H0U+uJeo3K|NCoGo}D zjfXxNj2C$UUn?G#Zbt^EI$J|z5zbfOlO{OxOj8l);JK*6*Wzss&@T^KnxLyV=~nHc zW#yrUO+w$>5C}BDVbWJ=6w}b=Z-fsWu#8g$7bi@kUuqS&khJ0HROW^5|B$2ov@!U@ zGK&xOy*ou~B(8|MpH@76@tvXHgLN4licS`+dB(CK8pK3Mb$nc zMEJ<|zY!?y*(rUsPp9auQct>JmZRi5kxzSoidXx9itdy82Hwx zkcz5(NL9YlSM`rd{YBEC+SgQ6?Sqp38TiZA{{}FMiMbE!21AFN&zjor72N3OVqZmu zRo^Z36y;}@N*T07rWO4*c&onpzNn&WF109I^cDL3EPb_at*F}1R`S{X|3^|^#b4cz zDf*5X7-2!hPuctTEPb`FqiCxVlr+2iC$sd|T`L3?rDwy|BfI?nK&Ey6$o}r8+p3Io zcKN>qMqA->*lKE@Uwz*)yFA4!`X+R77i;RP=K%5R0pd_{f*au#K8Oqou_|Bfm#OcZ z4$1nfW>9*n|9k*l5>fivHWy+s0$Ym^4}&rG3RwB#f>C)isbg|kR=d(Bt6k0R z$_VEH%_0w*wKB?sOwwjtl1y7WZD-uZHiQMWez= zua>GBcf+r~N69f{zU|LYeBpuvUPWi<)T7*twJ84BrkU`R)|=3f^#~=s39UDw^=wE1 z5nn^jC*_3xJ9R$YFaREvfV>Lf)*IG(Zg`uPXGlJ%5TySPE+y=&o{mOOjx=UWQcm1P4+@4b>N zhAPlYpc}Ku-&8@K`g1n>k5`}{sz6Uwpg&rHzN-Sg7Wpy2bC<;+%oZn&ui5C7=Go|n zE70dx@EfZj|Md#=2SL}jAZpWP8LG3z^P8YwFK!Yi0!o(eFVPoCrIIOOS?NqD{8201 z^HD1rip525`cNV)dixW-p+0cKnL~XM>wpzchDEY3k^l*#F-%&ijMW>8B}6*Y1zRH8 zmx?7aQPLR*S(`?k$ntTzAZ>DqL4jZJLxueIx|*9dFdo*fnfjC9A+nMi8SjxF(I zBC;oRARd9=?%rfVx5ZMTvkD5_XEnITYH+{T*nfnpKdRN@{~G+O;sO37syx5EFBY3e zcjz}Y?VF$dB5v1OaYp0wC4Y{%pz;1ivFm77_<_csmhxWlPr#}0`ojI$s5^gLuOCb= z=ym-_K&sj60ON&w6`ke|8q-`ZIOyCa;*B}zdI^;(;|@BvnHUoe`un7$y6||Ud6VWT zy98A2S^%$2#QNo+^IT8tMh9K4_e4Zl7?41a9cmjFBcN(Tr++TZ0aYU!=Z+|?0lF$# zbckKn2UL~h^%g`D0uK6IB_gk;gN}hB|eap;VtTXeq=T-_~4i+-r@|cW>4e0;MmR0i zrD2Kx9^te^mySsMbA;2fTI!SdrwOMexwK#6pCX)=;!>x?A0eEU;8H;1DZ*)MQfig> zM+m2-xMWED0O7O*ml`GhAmOz1mIQFh&#HgjmizvP&D=km*_SVM?g_3cta{!Y+Vl^Q zDKGe#Ux;5t{l3LVfg*uJn^wVqIaIrXz=o;J0;KlC5TevxSDx@KK0OG)DcGWa^aXNOZbR{Y&;r-H_c28|Lp`44`LoXI{8m zE}OY$3IJVZeoj-f^bwp|RTv!{1ChFabnx#`qhgK@7Iif%RXv}ammee>*$EG_&|>BX z$&{IIMAH@_By(uq$Iu04?r+W9=qVTz#Tp2d{vP9kg|h_=QgN0>mMwJoKg;Eu^qV~+ zz4zZ+d=Rv}$c+}SCl|SMGxW*flSqd-w050zsJ$JBQmLD~4IQUpm6t}%+>5aDWAL(5 z<^K8T)LWHOQOe&bqYDn3x${cC{aX}zd#>;;O2}y%^nXp1;_L5FC^9Q%_KZx9H1`vX zLo}w?LGFvVDG)4iPt*N@q>M^FC8hX7m_Y8D(SYI|q;>8z?W@m{Cj|C2ZD}r9dVJav zywWg+T>|-lk$X=2Fg;^n)=e{gCj)KK!9qW|7}PFqak%KzE}ldrrH#r386`d6Nf;Y5 z&rNvA?74{=Q~HtCr60Pt;Fv%@(C7+cAu&e>FQMh|Cs3Wz)zQImT`TrgZ&5$0*b z9+=ZPZ1tTiY>-6XWAiEG>=~I5*&na1P+d-sOx)$KVv?g~+yv*PKf!$g4VgEoF*1wB znAZ5kThKT}8hP2OD|^IHIU{pdGMm919sEb`m?;dwyhP0}q3h?Uu9p@(V|g)H@E!fm z)kJ(JI~yEnh;A73ed;S$Q_ww3VW>e&6MMx7FgzRn+u^zXY8LXHa}b{t3CvyoT<-YG zX!_{j1g>(O8oi3{QH7v$Df!_|hQF2e3#Tm$mzEJ5B9>4gNiC!3PVkVGBVP zenK?0SY(!{X&cmtL-NO3^3Orb%jM0?@15#0Z=WyMy-aQKMsS`Vp%pSWbu9SKkx#s{ z@{>MXHypmscQ*J=w%9tk66k(Oj56^9lZ!wMNMZ*Q@0_eXg`}4ENprig6XpQPD22qkR)iB`fHZ-^b`V z7JQ}H^FMaC(Ra2V?$G9J(Tn!_&R&4?rUI|8536`mOrjbf`OWm(i3q?vBRd zkwmCBa*y$$yVHky4*aT!=BD%=#!hS3)(`AjZqSFKNEd0> zrgDwZDilfN`gFyZ{M^JyQ~E9=`EVo^jVBMLjWj+_8O=@c{^j+8II(y< z(jAH$k#soJ7cm|hXbM+kRALcbcy6xQ*otn$o1kF`{Yt=G!WE4QIa-zGa@Uw*i0 zXzXZMc)#yG2kVZAdlzk7vHG^9Bu=^y;eQGIE~U3B?G25OdbiBGrskGw;X?914)XgE z&rU#_@4cVc!T{+j_}>M7J?(y3KbWnl5nd?+s{9U4fzhf)-?6FSkx~9jq$33p)_)Hi3$F~*P9`m%+x)AHw$`?_t!=G$ zx+9*6Q{Lx@U&`->P7aN8ub3x3tp~JxRt1g5E73P<`c8+^Y<8N#_uxdLJAbRBUZdc1 z=xk=Il)up)pG)OsunknD8 zz|IpDa=YjSe+qU40HYN!x zXj&b++IIvkbL%c)-M4+`=JxH@&W?`V!9CWV_RZUaIKAyYm>#eXjN=rz>x8+@qtoJ7 zJt7|I3S~m-RQyaOoN$l9?#$!!w#XX!GSo)NjeHe3gQAYa&mdVA`BO*I>Fhj?$IsyF zQ}#1x?qlp$S2}6+gc4nJ#C_XN80(59tp0SQOIVQvF4lo`TDwqhOJ|sqhx+NP{|u`7 zy}%5TI>bMNWLY?1Zv`LNYF+I(J^vN55qD<0W;(-<|09_odM4ROXPFCLQRH;b%9oF5$;-8zQMbAq9Iv z=^o+lI+VcsY6UYX#lg$vH2r`7;u*4tHuy7<0bJ!^@~4t=u=yiB zRy2jz<5o`>bQ#lOwQt_mk_mMyeJhkog%B|5a~*C%y|FN2NWwBMe(6q`M$Zd>IN949 zNo4pQ{&gVj7isH*+g%p^T^GZErZeFE7vpq#&8a`EH%<)cJ-4&)JkGRsR510~{ww{i zkmX6%S+)Ve=jJ5GKc@XNWdHWQ)~Ss8Zv4|8mi2j`%dk;1Xdg_zx&6G~{19m5lJ$At z%#ioV5Rt_le;8ESld?YVLmA$o^*DZ(W7r2i?Qt3BeJ;cOTHhVNCX2(UP@k|q@3R^5 zKAZi!+n>|=o3%mSw=?8@KIzlm-mU+6&?qPToMEp|dY$6u8HmW@9zUM})v0f2J%*C0 zbqVnD$MDN;eZ7C+eME*Ic(e`H)2R3Zmp<>$81nNP%e&+ML#@yG7lxM9koHH;!uey` zpP@n`tk3&fhV+feS=|2r5=^K5mzF4Lh6SfG>Tdtv2F-c@yMJG5xb)rre+Yg9{`GBZ zKgaU#INkmjXZR9yu}ie|`8jvI1w<5mt0{G43W`op%Ss<0kII_Trn=Y9G>tCHt9*$nI1IFyOT z@t+7N&an#mhGN@SdTt>9THL0yzWe?qSt?G*V^?w1^$BfoTn9$affOgl&+{)m|8wk0 fQ(ceffq&3toc*#a-R`sLzp+k9+~87hq2j*)l~D2Y diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc deleted file mode 100755 index 89dba8c1dd10cab1b28159895472e947ba446cba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55696 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%0De8-r2ozsZ;{mhiUII{GXVTyz%5cKN$I8m@b>^d zV$f-c`C5|Dv!M|fr-~RTP#3%YIRKv{fM-GetnHEmPiHWE`0Xor{#;S~{Q!K1AJ@PB z#{f?JV==)%B;y$VaHaSh4q(rTa64fDK8^w4R}KKb4sgTmJj-8Y;|t@p5E39qGN*8vYZn2AHF5}bU5Ch0!k+gM-I zZ?zK&6~RirfHUxMBhIkzIi!KPUzl_jh*Lx8fzb;u68L@2CUIgT_-8m>AZzYDWh4Yh z0Dgwr*5^!<;f&MI(8@N`$tYfB?@1{`{%5!p30n3p4oslI*XLN4?DKxDX=0yKU;I?3 zho4f+FDx`7{ERRY1g_zT89ySH3LKcrMS_Vu*T$(uZeX$^F)WOI-y)mOM-9Cem>59S z0YfQ2g{ttxS0m5TDRd?^Da&8V9&o5!pztHPcv;!w!E(ssR6S)g>=jOr>X@N;%H7jT z>~7EWvNF5?j8{NQ+)j^D+wAidm%CjhrJe~`Iu(Jk-ap@qQ4Uw&p$ZeF7fe(z_8Yv5 zni3#J;Hs+d;5;l|4{U)WsH!Nf$N9~wYP<&xe0uRG1sxSu*Q7w$TaGCZkFTaWP_5K@ z>l<5ArK2|q8&b(Vwf+V_NmlRcm6f*yjquXRzJ;FJYJYvAiit|IZ%H3E9=!D6Lz`1j ziO(Xu+~+ei0w-#{34XjX5}B)wgfVIfg5y=q6cX;&YExkWyt0x4@pu;C1E&UqlwPh(Wr)MGN^J{#ehL`f(ihb;zokXAiA+JM zrGudGOXo#XyUpW)S$J?--s6FUu$O+V#pCg|R#SK4McNw-4A92`GAA7P zOsP!CZ&|u1P(2?hG{e$5d50GheEAC+g86vkvk6_hRLM_(<_G=tHRJp>N(YJ+W#AZzd?e!lC3LnE>NV!0xpw8d?5h&NR#Q;2s)Ws zC80=V94Ntd+?enu>)#~kWh(a{B|hOMUoK>hU=L2xcL;i!P7=rn7ujW$pSEdePg2s$ zeM_0@q5xqQlT*^mb@N=nsY*#N_d#VU_dS8aE~ETjKxvOr(#w6tL@MZ{{1Q*5v<*Rf zmNGB*EoE9P=#BCVFx!8kK9Te>(LkBXeN$P#vHcooiM~WKlp8l9?Gz0rdeWJZ{x^UT z3dzSVOKK|jrv;SNCGRP{9e>I677IZYMW*cRFbA>UEO9T>dyr42m-~V;t(l)hj9W`; zR(SyVWO})-l&Rc*mt;o!e^}5<{mb=|OjW5*!9dC_`Tf~IFZTmvN@vuQFJt}B80cF! zaBP{5q`{qZ$^Mg|=W&xf{#QNDOJr)1h$1!C|2p8bha-lqBA-jh)L5U)%k%(fvC2%) z%jXs{m3Tm5m(0tw3s6##tY7Yn$#kPZU<>2Y`_qkEvRz3p_i1F>DfBPxTh=T4(S-8k z`ZsRlyk(l(TNS&L^fEopKrf%0$aM4nLT@(Eua9v8nMye&8(FW+pA33}$@a%$yhN^d zDLj5|54;&t!`SK4&6(5&oq7(tlI2l$}%XU;PE1 c?vfoR3T3?#m-buxqkpV}W1M3kFl3eg2h{~ Date: Wed, 14 May 2025 07:45:08 -0400 Subject: [PATCH 043/187] Combined type-enhancing hold effects (#6846) --- asm/macros/battle_script.inc | 5 +- data/battle_scripts_1.s | 14 ++--- include/constants/battle_script_commands.h | 1 - include/constants/hold_effects.h | 19 +----- src/battle_debug.c | 38 +----------- src/battle_script_commands.c | 19 +++--- src/battle_util.c | 52 +--------------- src/data/items.h | 69 ++++++++++++++-------- test/battle/ability/corrosion.c | 3 +- test/battle/hold_effect/type_power.c | 55 +++++++++++++++++ 10 files changed, 127 insertions(+), 148 deletions(-) create mode 100644 test/battle/hold_effect/type_power.c diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index adc9fcc195..2c19ebb515 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2322,9 +2322,10 @@ .4byte \jumpInstr .endm - .macro jumpiflastuseditemholdeffect battler:req, holdEffect:req, jumpInstr:req - various \battler, VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT + .macro jumpiflastuseditemholdeffect holdEffect:req, secondaryId:req, jumpInstr:req + callnative BS_JumpIfLastUsedItemHoldEffect .byte \holdEffect + .2byte \secondaryId .4byte \jumpInstr .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 22e8395e4a..1cf302afc4 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -774,13 +774,13 @@ BattleScript_EffectFling:: waitmessage B_WAIT_TIME_MED jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry jumpifability BS_TARGET, ABILITY_SHIELD_DUST, BattleScript_FlingBlockedByShieldDust - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb - jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_WHITE_HERB, BattleScript_FlingWhiteHerb + jumpiflastuseditemholdeffect HOLD_EFFECT_FLAME_ORB, 0, BattleScript_FlingFlameOrb + jumpiflastuseditemholdeffect HOLD_EFFECT_FLINCH, 0, BattleScript_FlingFlinch + jumpiflastuseditemholdeffect HOLD_EFFECT_LIGHT_BALL, 0, BattleScript_FlingLightBall + jumpiflastuseditemholdeffect HOLD_EFFECT_MENTAL_HERB, 0, BattleScript_FlingMentalHerb + jumpiflastuseditemholdeffect HOLD_EFFECT_TYPE_POWER, TYPE_POISON, BattleScript_FlingPoisonBarb + jumpiflastuseditemholdeffect HOLD_EFFECT_TOXIC_ORB, 0, BattleScript_FlingToxicOrb + jumpiflastuseditemholdeffect HOLD_EFFECT_WHITE_HERB, 0, BattleScript_FlingWhiteHerb goto BattleScript_FlingEnd BattleScript_EffectFlingConsumeBerry: savebattleritem BS_TARGET diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 051a49b076..34fc40452f 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -203,7 +203,6 @@ enum CmdVarious VARIOUS_CURE_CERTAIN_STATUSES, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY, - VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT, VARIOUS_SAVE_BATTLER_ITEM, VARIOUS_RESTORE_BATTLER_ITEM, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM, diff --git a/include/constants/hold_effects.h b/include/constants/hold_effects.h index 096d9ad624..c7ed811601 100644 --- a/include/constants/hold_effects.h +++ b/include/constants/hold_effects.h @@ -34,7 +34,6 @@ enum ItemHoldEffect HOLD_EFFECT_MENTAL_HERB, HOLD_EFFECT_CHOICE_BAND, HOLD_EFFECT_FLINCH, - HOLD_EFFECT_BUG_POWER, HOLD_EFFECT_DOUBLE_PRIZE, HOLD_EFFECT_REPEL, HOLD_EFFECT_SOUL_DEW, @@ -45,25 +44,10 @@ enum ItemHoldEffect HOLD_EFFECT_FOCUS_BAND, HOLD_EFFECT_LUCKY_EGG, HOLD_EFFECT_SCOPE_LENS, - HOLD_EFFECT_STEEL_POWER, HOLD_EFFECT_LEFTOVERS, HOLD_EFFECT_DRAGON_SCALE, HOLD_EFFECT_LIGHT_BALL, - HOLD_EFFECT_GROUND_POWER, - HOLD_EFFECT_ROCK_POWER, - HOLD_EFFECT_GRASS_POWER, - HOLD_EFFECT_DARK_POWER, - HOLD_EFFECT_FIGHTING_POWER, - HOLD_EFFECT_ELECTRIC_POWER, - HOLD_EFFECT_WATER_POWER, - HOLD_EFFECT_FLYING_POWER, - HOLD_EFFECT_POISON_POWER, - HOLD_EFFECT_ICE_POWER, - HOLD_EFFECT_GHOST_POWER, - HOLD_EFFECT_PSYCHIC_POWER, - HOLD_EFFECT_FIRE_POWER, - HOLD_EFFECT_DRAGON_POWER, - HOLD_EFFECT_NORMAL_POWER, + HOLD_EFFECT_TYPE_POWER, HOLD_EFFECT_UPGRADE, HOLD_EFFECT_SHELL_BELL, HOLD_EFFECT_LUCKY_PUNCH, @@ -127,7 +111,6 @@ enum ItemHoldEffect HOLD_EFFECT_ABSORB_BULB, HOLD_EFFECT_CELL_BATTERY, // Gen6 hold effects - HOLD_EFFECT_FAIRY_POWER, HOLD_EFFECT_MEGA_STONE, HOLD_EFFECT_SAFETY_GOGGLES, HOLD_EFFECT_LUMINOUS_MOSS, diff --git a/src/battle_debug.c b/src/battle_debug.c index 2f83f1d4ab..b70441c353 100644 --- a/src/battle_debug.c +++ b/src/battle_debug.c @@ -2339,7 +2339,6 @@ static const u8 sText_HoldEffectFriendshipUp[] = _("Friendship Up"); static const u8 sText_HoldEffectMentalHerb[] = _("Mental Herb"); static const u8 sText_HoldEffectChoiceBand[] = _("Choice Band"); static const u8 sText_HoldEffectFlinch[] = _("Flinch"); -static const u8 sText_HoldEffectBugPower[] = _("Bug Power"); static const u8 sText_HoldEffectDoublePrize[] = _("Double Prize"); static const u8 sText_HoldEffectRepel[] = _("Repel"); static const u8 sText_HoldEffectSoulDew[] = _("Soul Dew"); @@ -2350,25 +2349,10 @@ static const u8 sText_HoldEffectPreventEvolve[] = _("Prevent Evolve"); static const u8 sText_HoldEffectFocusBand[] = _("Focus Band"); static const u8 sText_HoldEffectLuckyEgg[] = _("Lucky Egg"); static const u8 sText_HoldEffectScopeLens[] = _("Scope Lens"); -static const u8 sText_HoldEffectSteelPower[] = _("Steel Power"); static const u8 sText_HoldEffectLeftovers[] = _("Leftovers"); static const u8 sText_HoldEffectDragonScale[] = _("Dragon Scale"); static const u8 sText_HoldEffectLightBall[] = _("Light Ball"); -static const u8 sText_HoldEffectGroundPower[] = _("Ground Power"); -static const u8 sText_HoldEffectRockPower[] = _("Rock Power"); -static const u8 sText_HoldEffectGrassPower[] = _("Grass Power"); -static const u8 sText_HoldEffectDarkPower[] = _("Dark Power"); -static const u8 sText_HoldEffectFightingPower[] = _("Fighting Power"); -static const u8 sText_HoldEffectElectricPower[] = _("Electric Power"); -static const u8 sText_HoldEffectWaterPower[] = _("Water Power"); -static const u8 sText_HoldEffectFlyingPower[] = _("Flying Power"); -static const u8 sText_HoldEffectPoisonPower[] = _("Poison Power"); -static const u8 sText_HoldEffectIcePower[] = _("Ice Power"); -static const u8 sText_HoldEffectGhostPower[] = _("Ghost Power"); -static const u8 sText_HoldEffectPsychicPower[] = _("Psychic Power"); -static const u8 sText_HoldEffectFirePower[] = _("Fire Power"); -static const u8 sText_HoldEffectDragonPower[] = _("Dragon Power"); -static const u8 sText_HoldEffectNormalPower[] = _("Normal Power"); +static const u8 sText_HoldEffectTypePower[] = _("Type Power"); static const u8 sText_HoldEffectUpgrade[] = _("Upgrade"); static const u8 sText_HoldEffectShellBell[] = _("Shell Bell"); static const u8 sText_HoldEffectLuckyPunch[] = _("Lucky Punch"); @@ -2428,7 +2412,6 @@ static const u8 sText_HoldEffectBindingBand[] = _("Binding Band"); static const u8 sText_HoldEffectEjectButton[] = _("Eject Button"); static const u8 sText_HoldEffectAbsorbBulb[] = _("Absorb Bulb"); static const u8 sText_HoldEffectCellBattery[] = _("Cell Battery"); -static const u8 sText_HoldEffectFairyPower[] = _("Fairy Power"); static const u8 sText_HoldEffectMegaStone[] = _("Mega Stone"); static const u8 sText_HoldEffectSafetyGoggles[] = _("Safety Goggles"); static const u8 sText_HoldEffectLuminousMoss[] = _("Luminous Moss"); @@ -2490,7 +2473,6 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_MENTAL_HERB] = sText_HoldEffectMentalHerb, [HOLD_EFFECT_CHOICE_BAND] = sText_HoldEffectChoiceBand, [HOLD_EFFECT_FLINCH] = sText_HoldEffectFlinch, - [HOLD_EFFECT_BUG_POWER] = sText_HoldEffectBugPower, [HOLD_EFFECT_DOUBLE_PRIZE] = sText_HoldEffectDoublePrize, [HOLD_EFFECT_REPEL] = sText_HoldEffectRepel, [HOLD_EFFECT_SOUL_DEW] = sText_HoldEffectSoulDew, @@ -2501,25 +2483,10 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_FOCUS_BAND] = sText_HoldEffectFocusBand, [HOLD_EFFECT_LUCKY_EGG] = sText_HoldEffectLuckyEgg, [HOLD_EFFECT_SCOPE_LENS] = sText_HoldEffectScopeLens, - [HOLD_EFFECT_STEEL_POWER] = sText_HoldEffectSteelPower, [HOLD_EFFECT_LEFTOVERS] = sText_HoldEffectLeftovers, [HOLD_EFFECT_DRAGON_SCALE] = sText_HoldEffectDragonScale, [HOLD_EFFECT_LIGHT_BALL] = sText_HoldEffectLightBall, - [HOLD_EFFECT_GROUND_POWER] = sText_HoldEffectGroundPower, - [HOLD_EFFECT_ROCK_POWER] = sText_HoldEffectRockPower, - [HOLD_EFFECT_GRASS_POWER] = sText_HoldEffectGrassPower, - [HOLD_EFFECT_DARK_POWER] = sText_HoldEffectDarkPower, - [HOLD_EFFECT_FIGHTING_POWER] = sText_HoldEffectFightingPower, - [HOLD_EFFECT_ELECTRIC_POWER] = sText_HoldEffectElectricPower, - [HOLD_EFFECT_WATER_POWER] = sText_HoldEffectWaterPower, - [HOLD_EFFECT_FLYING_POWER] = sText_HoldEffectFlyingPower, - [HOLD_EFFECT_POISON_POWER] = sText_HoldEffectPoisonPower, - [HOLD_EFFECT_ICE_POWER] = sText_HoldEffectIcePower, - [HOLD_EFFECT_GHOST_POWER] = sText_HoldEffectGhostPower, - [HOLD_EFFECT_PSYCHIC_POWER] = sText_HoldEffectPsychicPower, - [HOLD_EFFECT_FIRE_POWER] = sText_HoldEffectFirePower, - [HOLD_EFFECT_DRAGON_POWER] = sText_HoldEffectDragonPower, - [HOLD_EFFECT_NORMAL_POWER] = sText_HoldEffectNormalPower, + [HOLD_EFFECT_TYPE_POWER] = sText_HoldEffectTypePower, [HOLD_EFFECT_UPGRADE] = sText_HoldEffectUpgrade, [HOLD_EFFECT_SHELL_BELL] = sText_HoldEffectShellBell, [HOLD_EFFECT_LUCKY_PUNCH] = sText_HoldEffectLuckyPunch, @@ -2580,7 +2547,6 @@ static const u8 *const sHoldEffectNames[] = [HOLD_EFFECT_EJECT_BUTTON] = sText_HoldEffectEjectButton, [HOLD_EFFECT_ABSORB_BULB] = sText_HoldEffectAbsorbBulb, [HOLD_EFFECT_CELL_BATTERY] = sText_HoldEffectCellBattery, - [HOLD_EFFECT_FAIRY_POWER] = sText_HoldEffectFairyPower, [HOLD_EFFECT_MEGA_STONE] = sText_HoldEffectMegaStone, [HOLD_EFFECT_SAFETY_GOGGLES] = sText_HoldEffectSafetyGoggles, [HOLD_EFFECT_LUMINOUS_MOSS] = sText_HoldEffectLuminousMoss, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index e077892cbc..08fa177a03 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11586,15 +11586,6 @@ static void Cmd_various(void) gBattlescriptCurrInstr = cmd->nextInstr; return; } - case VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT: - { - VARIOUS_ARGS(u8 holdEffect, const u8 *jumpInstr); - if (ItemId_GetHoldEffect(gLastUsedItem) == cmd->holdEffect) - gBattlescriptCurrInstr = cmd->jumpInstr; - else - gBattlescriptCurrInstr = cmd->nextInstr; - return; - } case VARIOUS_SAVE_BATTLER_ITEM: { VARIOUS_ARGS(); @@ -18683,3 +18674,13 @@ void BS_JumpIfCanGigantamax(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_JumpIfLastUsedItemHoldEffect(void) +{ + NATIVE_ARGS(u8 holdEffect, u16 secondaryId, const u8 *jumpInstr); + if (ItemId_GetHoldEffect(gLastUsedItem) == cmd->holdEffect + && (cmd->secondaryId == 0 || ItemId_GetSecondaryId(gLastUsedItem) == cmd->secondaryId)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_util.c b/src/battle_util.c index 1a899e6145..2e104dcf46 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -917,28 +917,6 @@ void HandleAction_ActionFinished(void) } } -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}, - {HOLD_EFFECT_FAIRY_POWER, TYPE_FAIRY}, -}; - // code ARM_FUNC NOINLINE static uq4_12_t PercentToUQ4_12(u32 percent) @@ -8320,7 +8298,6 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData *damageCalcData, u32 atkAbility, u32 defAbility, enum ItemHoldEffect holdEffectAtk, u32 weather) { - u32 i; u32 holdEffectParamAtk; u32 basePower = CalcMoveBasePower(damageCalcData, defAbility, weather); u32 battlerAtk = damageCalcData->battlerAtk; @@ -8595,34 +8572,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * || (B_SOUL_DEW_BOOST < GEN_7 && !(gBattleTypeFlags & BATTLE_TYPE_FRONTIER) && IsBattleMoveSpecial(move)))) modifier = uq4_12_multiply(modifier, holdEffectModifier); break; - case HOLD_EFFECT_BUG_POWER: - case HOLD_EFFECT_STEEL_POWER: - case HOLD_EFFECT_GROUND_POWER: - case HOLD_EFFECT_ROCK_POWER: - case HOLD_EFFECT_GRASS_POWER: - case HOLD_EFFECT_DARK_POWER: - case HOLD_EFFECT_FIGHTING_POWER: - case HOLD_EFFECT_ELECTRIC_POWER: - case HOLD_EFFECT_WATER_POWER: - case HOLD_EFFECT_FLYING_POWER: - case HOLD_EFFECT_POISON_POWER: - case HOLD_EFFECT_ICE_POWER: - case HOLD_EFFECT_GHOST_POWER: - case HOLD_EFFECT_PSYCHIC_POWER: - case HOLD_EFFECT_FIRE_POWER: - case HOLD_EFFECT_DRAGON_POWER: - case HOLD_EFFECT_NORMAL_POWER: - case HOLD_EFFECT_FAIRY_POWER: - for (i = 0; i < ARRAY_COUNT(sHoldEffectToType); i++) - { - if (holdEffectAtk == sHoldEffectToType[i][0]) - { - if (moveType == sHoldEffectToType[i][1]) - modifier = uq4_12_multiply(modifier, holdEffectModifier); - break; - } - } - break; + case HOLD_EFFECT_TYPE_POWER: case HOLD_EFFECT_PLATE: if (moveType == ItemId_GetSecondaryId(gBattleMons[battlerAtk].item)) modifier = uq4_12_multiply(modifier, holdEffectModifier); diff --git a/src/data/items.h b/src/data/items.h index 696c5f9954..187b4bc399 100644 --- a/src/data/items.h +++ b/src/data/items.h @@ -7200,12 +7200,13 @@ const struct Item gItemsInfo[] = { .name = _("Sea Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 10, .iconPic = gItemIcon_SeaIncense, .iconPalette = gItemIconPalette_SeaIncense, @@ -7233,12 +7234,13 @@ const struct Item gItemsInfo[] = { .name = _("Odd Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_PSYCHIC, .flingPower = 10, .iconPic = gItemIcon_OddIncense, .iconPalette = gItemIconPalette_OddIncense, @@ -7248,12 +7250,13 @@ const struct Item gItemsInfo[] = { .name = _("Rock Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_ROCK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ROCK, .flingPower = 10, .iconPic = gItemIcon_RockIncense, .iconPalette = gItemIconPalette_RockIncense, @@ -7278,12 +7281,13 @@ const struct Item gItemsInfo[] = { .name = _("Wave Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sSeaIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 10, .iconPic = gItemIcon_WaveIncense, .iconPalette = gItemIconPalette_WaveIncense, @@ -7293,12 +7297,13 @@ const struct Item gItemsInfo[] = { .name = _("Rose Incense"), .price = (I_PRICE >= GEN_7) ? 2000 : 9600, - .holdEffect = HOLD_EFFECT_GRASS_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = 20, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GRASS, .flingPower = 10, .iconPic = gItemIcon_RoseIncense, .iconPalette = gItemIconPalette_RoseIncense, @@ -7560,7 +7565,7 @@ const struct Item gItemsInfo[] = .name = _("Silk Scarf"), .pluralName = _("Silk Scarves"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_NORMAL_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7569,6 +7574,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_NORMAL, .flingPower = 10, .iconPic = gItemIcon_SilkScarf, .iconPalette = gItemIconPalette_SilkScarf, @@ -7578,7 +7584,7 @@ const struct Item gItemsInfo[] = { .name = _("Charcoal"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 9800), - .holdEffect = HOLD_EFFECT_FIRE_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7587,6 +7593,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FIRE, .flingPower = 30, .iconPic = gItemIcon_Charcoal, .iconPalette = gItemIconPalette_Charcoal, @@ -7597,7 +7604,7 @@ const struct Item gItemsInfo[] = .name = _("Mystic Water"), .pluralName = _("Mystic Water"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_WATER_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7606,6 +7613,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_WATER, .flingPower = 30, .iconPic = gItemIcon_MysticWater, .iconPalette = gItemIconPalette_MysticWater, @@ -7615,7 +7623,7 @@ const struct Item gItemsInfo[] = { .name = _("Magnet"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ELECTRIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7624,6 +7632,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ELECTRIC, .flingPower = 30, .iconPic = gItemIcon_Magnet, .iconPalette = gItemIconPalette_Magnet, @@ -7633,12 +7642,13 @@ const struct Item gItemsInfo[] = { .name = _("Miracle Seed"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GRASS_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRoseIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GRASS, .flingPower = 30, .iconPic = gItemIcon_MiracleSeed, .iconPalette = gItemIconPalette_MiracleSeed, @@ -7649,7 +7659,7 @@ const struct Item gItemsInfo[] = .name = _("Never-Melt Ice"), .pluralName = _("Never-Melt Ice"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ICE_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7658,6 +7668,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ICE, .flingPower = 30, .iconPic = gItemIcon_NeverMeltIce, .iconPalette = gItemIconPalette_NeverMeltIce, @@ -7667,7 +7678,7 @@ const struct Item gItemsInfo[] = { .name = _("Black Belt"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_FIGHTING_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7676,6 +7687,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FIGHTING, .flingPower = 30, .iconPic = gItemIcon_BlackBelt, .iconPalette = gItemIconPalette_BlackTypeEnhancingItem, @@ -7685,7 +7697,7 @@ const struct Item gItemsInfo[] = { .name = _("Poison Barb"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_POISON_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7694,6 +7706,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_POISON, .flingPower = 70, .iconPic = gItemIcon_PoisonBarb, .iconPalette = gItemIconPalette_PoisonBarb, @@ -7704,7 +7717,7 @@ const struct Item gItemsInfo[] = .name = _("Soft Sand"), .pluralName = _("Soft Sand"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GROUND_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7713,6 +7726,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GROUND, .flingPower = 10, .iconPic = gItemIcon_SoftSand, .iconPalette = gItemIconPalette_SoftSand, @@ -7722,7 +7736,7 @@ const struct Item gItemsInfo[] = { .name = _("Sharp Beak"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_FLYING_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7731,6 +7745,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FLYING, .flingPower = 50, .iconPic = gItemIcon_SharpBeak, .iconPalette = gItemIconPalette_SharpBeak, @@ -7740,12 +7755,13 @@ const struct Item gItemsInfo[] = { .name = _("Twisted Spoon"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_PSYCHIC_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sOddIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_PSYCHIC, .flingPower = 30, .iconPic = gItemIcon_TwistedSpoon, .iconPalette = gItemIconPalette_TwistedSpoon, @@ -7756,7 +7772,7 @@ const struct Item gItemsInfo[] = .name = _("Silver Powder"), .pluralName = _("Silver Powder"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_BUG_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7765,6 +7781,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_BUG, .flingPower = 10, .iconPic = gItemIcon_SilverPowder, .iconPalette = gItemIconPalette_SilverPowder, @@ -7774,12 +7791,13 @@ const struct Item gItemsInfo[] = { .name = _("Hard Stone"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_ROCK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = sRockIncenseDesc, .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_ROCK, .flingPower = 100, .iconPic = gItemIcon_HardStone, .iconPalette = gItemIconPalette_HardStone, @@ -7789,7 +7807,7 @@ const struct Item gItemsInfo[] = { .name = _("Spell Tag"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_GHOST_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7798,6 +7816,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_GHOST, .flingPower = 30, .iconPic = gItemIcon_SpellTag, .iconPalette = gItemIconPalette_SpellTag, @@ -7807,7 +7826,7 @@ const struct Item gItemsInfo[] = { .name = _("Dragon Fang"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_DRAGON_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7816,6 +7835,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_DRAGON, .flingPower = 70, .iconPic = gItemIcon_DragonFang, .iconPalette = gItemIconPalette_DragonFang, @@ -7826,7 +7846,7 @@ const struct Item gItemsInfo[] = .name = _("Black Glasses"), .pluralName = _("Black Glasses"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 1000 : 100), - .holdEffect = HOLD_EFFECT_DARK_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7835,6 +7855,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_DARK, .flingPower = 30, .iconPic = gItemIcon_BlackGlasses, .iconPalette = gItemIconPalette_BlackTypeEnhancingItem, @@ -7844,7 +7865,7 @@ const struct Item gItemsInfo[] = { .name = _("Metal Coat"), .price = (I_PRICE >= GEN_9) ? 3000 : ((I_PRICE >= GEN_7) ? 2000 : 100), - .holdEffect = HOLD_EFFECT_STEEL_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -7854,6 +7875,7 @@ const struct Item gItemsInfo[] = .type = EVO_HELD_ITEM_TYPE, .fieldUseFunc = EVO_HELD_ITEM_FIELD_FUNC, .effect = gItemEffect_EvoItem, + .secondaryId = TYPE_STEEL, .flingPower = 30, .iconPic = gItemIcon_MetalCoat, .iconPalette = gItemIconPalette_MetalCoat, @@ -13631,7 +13653,7 @@ const struct Item gItemsInfo[] = { .name = _("Fairy Feather"), .price = 1000, - .holdEffect = HOLD_EFFECT_FAIRY_POWER, + .holdEffect = HOLD_EFFECT_TYPE_POWER, .holdEffectParam = TYPE_BOOST_PARAM, .description = COMPOUND_STRING( "A hold item that\n" @@ -13640,6 +13662,7 @@ const struct Item gItemsInfo[] = .pocket = POCKET_ITEMS, .type = ITEM_USE_BAG_MENU, .fieldUseFunc = ItemUseOutOfBattle_CannotUse, + .secondaryId = TYPE_FAIRY, .flingPower = 10, .iconPic = gItemIcon_FairyFeather, .iconPalette = gItemIconPalette_FairyFeather, diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index 8541c21f27..ffac25e54e 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -73,7 +73,8 @@ SINGLE_BATTLE_TEST("Corrosion can poison Poison- and Steel-type targets if it us GIVEN { ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); - ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_POISON_POWER); + ASSUME(gItemsInfo[ITEM_POISON_BARB].holdEffect == HOLD_EFFECT_TYPE_POWER); + ASSUME(gItemsInfo[ITEM_POISON_BARB].secondaryId == TYPE_POISON); ASSUME(gItemsInfo[ITEM_TOXIC_ORB].holdEffect == HOLD_EFFECT_TOXIC_ORB); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); Item(heldItem); } OPPONENT(SPECIES_ODDISH); diff --git a/test/battle/hold_effect/type_power.c b/test/battle/hold_effect/type_power.c new file mode 100644 index 0000000000..535183b629 --- /dev/null +++ b/test/battle/hold_effect/type_power.c @@ -0,0 +1,55 @@ +#include "global.h" +#include "test/battle.h" + +static const u16 sMoveItemTable[][18] = +{ + { TYPE_NORMAL, MOVE_SCRATCH, ITEM_SILK_SCARF }, + { TYPE_FIGHTING, MOVE_KARATE_CHOP, ITEM_BLACK_BELT }, + { TYPE_FLYING, MOVE_WING_ATTACK, ITEM_SHARP_BEAK }, + { TYPE_POISON, MOVE_POISON_STING, ITEM_POISON_BARB }, + { TYPE_GROUND, MOVE_MUD_SHOT, ITEM_SOFT_SAND }, + { TYPE_ROCK, MOVE_ROCK_THROW, ITEM_HARD_STONE }, + { TYPE_BUG, MOVE_BUG_BITE, ITEM_SILVER_POWDER }, + { TYPE_GHOST, MOVE_SHADOW_PUNCH, ITEM_SPELL_TAG }, + { TYPE_STEEL, MOVE_METAL_CLAW, ITEM_METAL_COAT }, + { TYPE_FIRE, MOVE_EMBER, ITEM_CHARCOAL }, + { TYPE_WATER, MOVE_WATER_GUN, ITEM_MYSTIC_WATER }, + { TYPE_GRASS, MOVE_VINE_WHIP, ITEM_MIRACLE_SEED }, + { TYPE_ELECTRIC, MOVE_THUNDER_SHOCK, ITEM_MAGNET }, + { TYPE_PSYCHIC, MOVE_CONFUSION, ITEM_TWISTED_SPOON }, + { TYPE_ICE, MOVE_AURORA_BEAM, ITEM_NEVER_MELT_ICE }, + { TYPE_DRAGON, MOVE_DRAGON_BREATH, ITEM_DRAGON_FANG }, + { TYPE_DARK, MOVE_BITE, ITEM_BLACK_GLASSES }, + { TYPE_FAIRY, MOVE_DISARMING_VOICE, ITEM_FAIRY_FEATHER }, +}; + +SINGLE_BATTLE_TEST("Type-enhancing items increase the base power of moves by 20%", s16 damage) +{ + u32 move = 0, item = 0, type = 0; + + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = ITEM_NONE; } + PARAMETRIZE { type = sMoveItemTable[j][0]; move = sMoveItemTable[j][1]; item = sMoveItemTable[j][2]; } + } + + GIVEN { + ASSUME(GetMovePower(move) > 0); + if (item != ITEM_NONE) { + ASSUME(ItemId_GetHoldEffect(item) == HOLD_EFFECT_TYPE_POWER); + ASSUME(ItemId_GetSecondaryId(item) == type); + } + PLAYER(SPECIES_WOBBUFFET) { Item(item); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, move); } + } SCENE { + HP_BAR(opponent, captureDamage: &results[i].damage); + } FINALLY { + for (u32 j = 0; j < ARRAY_COUNT(sMoveItemTable); j++) { + if (I_TYPE_BOOST_POWER >= GEN_4) + EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(1.2), results[(j*2)+1].damage); + else + EXPECT_MUL_EQ(results[j*2].damage, Q_4_12(1.1), results[(j*2)+1].damage); + } + } +} From 12bc5a10b7d8d26ab60cb90f1fe6f82e14447f3f Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 14 May 2025 16:40:10 -0400 Subject: [PATCH 044/187] Removed multiple instances of hardcoded move IDs (#6856) --- src/battle_ai_switch_items.c | 2 +- src/battle_anim_effects_1.c | 3 ++- src/battle_anim_rock.c | 6 +----- src/battle_script_commands.c | 10 ++++++---- src/battle_util.c | 10 +++++----- src/battle_z_move.c | 2 +- 6 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index c1ecf13913..fdfd4eb23e 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -2078,7 +2078,7 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, canSwitchinWin1v1 = CanSwitchinWin1v1(hitsToKOAI, GetNoOfHitsToKOBattlerDmg(damageDealt, opposingBattler), isSwitchinFirst, isFreeSwitch); // Check for Baton Pass; hitsToKO requirements mean mon can boost and BP without dying whether it's slower or not - if (aiMove == MOVE_BATON_PASS) + if (GetMoveEffect(aiMove) == EFFECT_BATON_PASS) { if ((isSwitchinFirst && hitsToKOAI > 1) || hitsToKOAI > 2) // Need to take an extra hit if slower bits |= 1u << i; diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 1fe3b7fc0b..d7dbfa36b2 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -15,6 +15,7 @@ #include "trig.h" #include "util.h" #include "constants/abilities.h" +#include "constants/battle_move_effects.h" #include "constants/rgb.h" #include "constants/songs.h" #include "constants/moves.h" @@ -6931,7 +6932,7 @@ static void AnimTask_AllySwitchDataSwap(u8 taskId) if (!IsBattlerAlly(gBattleStruct->moveTarget[i], battlerAtk)) continue; - if (gChosenMoveByBattler[i] == MOVE_SNIPE_SHOT || ability == ABILITY_PROPELLER_TAIL || ability == ABILITY_STALWART) + if (GetMoveEffect(gChosenMoveByBattler[i]) == EFFECT_SNIPE_SHOT || ability == ABILITY_PROPELLER_TAIL || ability == ABILITY_STALWART) gBattleStruct->moveTarget[i] ^= BIT_FLANK; } diff --git a/src/battle_anim_rock.c b/src/battle_anim_rock.c index 2fccb9201d..9fe1ad5a85 100644 --- a/src/battle_anim_rock.c +++ b/src/battle_anim_rock.c @@ -485,11 +485,7 @@ void AnimRockFragment(struct Sprite *sprite) // args[6] - attacker or target void AnimParticleInVortex(struct Sprite *sprite) { - if (IsDoubleBattle() - && (gAnimMoveIndex == MOVE_BLEAKWIND_STORM - || gAnimMoveIndex == MOVE_SANDSEAR_STORM - || gAnimMoveIndex == MOVE_SPRINGTIDE_STORM - || gAnimMoveIndex == MOVE_WILDBOLT_STORM)) + if (IsDoubleBattle() && GetMoveTarget(gAnimMoveIndex) == MOVE_TARGET_BOTH) InitSpritePosToAnimTargetsCentre(sprite, FALSE); else InitSpritePosToAnimBattler(gBattleAnimArgs[6], sprite, FALSE); diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 08fa177a03..63ef2f871c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3381,7 +3381,7 @@ void SetMoveEffect(bool32 primary, bool32 certain) // If the confusion is activating due to being released from Sky Drop, go to "confused due to fatigue" script. // Otherwise, do normal confusion script. - if (gCurrentMove == MOVE_SKY_DROP) + if (GetMoveEffect(gCurrentMove) == EFFECT_SKY_DROP) { gBattleMons[gEffectBattler].status2 &= ~(STATUS2_LOCK_CONFUSE); gBattlerAttacker = gEffectBattler; @@ -6895,9 +6895,11 @@ static void Cmd_moveend(void) && !TargetFullyImmuneToCurrMove(gBattlerAttacker, BATTLE_PARTNER(gBattlerTarget))) gBattlerTarget = BATTLE_PARTNER(gBattlerTarget); // Target the partner in doubles for second hit. + enum BattleMoveEffects chosenEffect = GetMoveEffect(gChosenMove); + if (gBattleMons[gBattlerAttacker].hp && gBattleMons[gBattlerTarget].hp - && (gChosenMove == MOVE_SLEEP_TALK || (gChosenMove == MOVE_SNORE) || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) + && (chosenEffect == EFFECT_SLEEP_TALK || chosenEffect == EFFECT_SNORE || !(gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP)) && !(gBattleMons[gBattlerAttacker].status1 & STATUS1_FREEZE)) { if (gSpecialStatuses[gBattlerAttacker].parentalBondState) @@ -13614,7 +13616,7 @@ static void Cmd_copymovepermanently(void) for (i = 0; i < MAX_MON_MOVES; i++) { - if (gBattleMons[gBattlerAttacker].moves[i] == MOVE_SKETCH) + if (GetMoveEffect(gBattleMons[gBattlerAttacker].moves[i]) == EFFECT_SKETCH) continue; if (gBattleMons[gBattlerAttacker].moves[i] == gLastPrintedMoves[gBattlerTarget]) break; @@ -14390,7 +14392,7 @@ static void Cmd_recoverbasedonsunlight(void) gBattlerTarget = gBattlerAttacker; if (gBattleMons[gBattlerAttacker].hp != gBattleMons[gBattlerAttacker].maxHP) { - if (gCurrentMove == MOVE_SHORE_UP) + if (GetMoveEffect(gCurrentMove) == EFFECT_SHORE_UP) { if (HasWeatherEffect() && gBattleWeather & B_WEATHER_SANDSTORM) gBattleStruct->moveDamage[gBattlerAttacker] = 20 * GetNonDynamaxMaxHP(gBattlerAttacker) / 30; diff --git a/src/battle_util.c b/src/battle_util.c index 2e104dcf46..80bfd66239 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -6072,7 +6072,7 @@ static enum ItemEffect TryEjectPack(u32 battler, enum ItemCaseId caseID) if (gProtectStructs[battler].statFell && !gProtectStructs[battler].disableEjectPack && CountUsablePartyMons(battler) > 0 - && !(gCurrentMove == MOVE_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) // Does not activate if attacker used Parting Shot and can switch out + && !(GetMoveEffect(gCurrentMove) == EFFECT_PARTING_SHOT && CanBattlerSwitch(gBattlerAttacker))) // Does not activate if attacker used Parting Shot and can switch out { gProtectStructs[battler].statFell = FALSE; gBattleScripting.battler = battler; @@ -7587,9 +7587,9 @@ u8 GetAttackerObedienceForAction() } // is not obedient - if (gCurrentMove == MOVE_RAGE) - gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; enum BattleMoveEffects moveEffect = GetMoveEffect(gCurrentMove); + if (moveEffect == EFFECT_RAGE) + gBattleMons[gBattlerAttacker].status2 &= ~STATUS2_RAGE; if (gBattleMons[gBattlerAttacker].status1 & STATUS1_SLEEP && (moveEffect == EFFECT_SNORE || moveEffect == EFFECT_SLEEP_TALK)) return DISOBEYS_WHILE_ASLEEP; @@ -10853,9 +10853,9 @@ bool32 IsBattlerWeatherAffected(u32 battler, u32 weatherFlags) // Possible return values are defined in battle.h following MOVE_TARGET_SELECTED u32 GetBattlerMoveTargetType(u32 battler, u32 move) { - if (move == MOVE_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) - return MOVE_TARGET_USER; enum BattleMoveEffects effect = GetMoveEffect(move); + if (effect == EFFECT_CURSE && !IS_BATTLER_OF_TYPE(battler, TYPE_GHOST)) + return MOVE_TARGET_USER; if (effect == EFFECT_EXPANDING_FORCE && IsBattlerTerrainAffected(battler, STATUS_FIELD_PSYCHIC_TERRAIN)) return MOVE_TARGET_BOTH; if (effect == EFFECT_TERA_STARSTORM && gBattleMons[battler].species == SPECIES_TERAPAGOS_STELLAR) diff --git a/src/battle_z_move.c b/src/battle_z_move.c index 01f2069304..ea2c64ad9d 100644 --- a/src/battle_z_move.c +++ b/src/battle_z_move.c @@ -364,7 +364,7 @@ bool32 MoveSelectionDisplayZMove(u16 zmove, u32 battler) gDisplayedStringBattle[1] = CHAR_HYPHEN; StringCopy(gDisplayedStringBattle + 2, GetMoveName(move)); } - else if (zmove == MOVE_EXTREME_EVOBOOST) + else if (GetMoveEffect(zmove) == EFFECT_EXTREME_EVOBOOST) { // Damaging move -> status z move StringCopy(gDisplayedStringBattle, sText_StatsPlus2); From 19e2bb82b5f6b6b10a1d6fd19e5c857e31a7b2fd Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Wed, 14 May 2025 23:34:43 +0200 Subject: [PATCH 045/187] clean up --- docs/changelogs/1.9.x/1.9.0.md | 2 +- include/config/debug.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/changelogs/1.9.x/1.9.0.md b/docs/changelogs/1.9.x/1.9.0.md index 44d5a8aec7..b0815c6e2a 100644 --- a/docs/changelogs/1.9.x/1.9.0.md +++ b/docs/changelogs/1.9.x/1.9.0.md @@ -510,7 +510,7 @@ * `AI_STRIKES_FIRST` is also replaced by `AI_IsFaster`. * Switch AI uses trapping abilities aggressively by @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4669 * Use 9th roll instead of average in AI calcs by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4679 -* Use `gAiLogicData->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 +* Use `AI_DATA->abilities` in more places by @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4729 * Minor switch AI cleanup by @Pawkkie, @DizzyEggg, @AlexOn1ine and @Sneed69 in https://github.com/rh-hideout/pokeemerald-expansion/pull/4849 * Removed `SetBattlerData` from `AI_CalcDamage` by @AlexOn1ine in https://github.com/rh-hideout/pokeemerald-expansion/pull/4881 * Removed unused `AI_FLAG_HELP_PARTNER` by @pkmnsnfrn and @Pawkkie in https://github.com/rh-hideout/pokeemerald-expansion/pull/4918 diff --git a/include/config/debug.h b/include/config/debug.h index 1542015e50..2446b9360c 100644 --- a/include/config/debug.h +++ b/include/config/debug.h @@ -9,7 +9,7 @@ // Battle Debug Menu #define DEBUG_BATTLE_MENU TRUE // If set to TRUE, enables a debug menu to use in battles by pressing the Select button. -#define DEBUG_AI_DELAY_TIMER TRUE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. +#define DEBUG_AI_DELAY_TIMER FALSE // If set to TRUE, displays the number of frames it takes for the AI to choose a move. Replaces the "What will PKMN do" text. Useful for devs or anyone who modifies the AI code and wants to see if it doesn't take too long to run. // PokΓ©mon Debug #define DEBUG_POKEMON_SPRITE_VISUALIZER TRUE // Enables a debug menu for PokΓ©mon sprites and icons, accessed by pressing Select in the summary screen. From 56c9549bbe0b968d244b43274e5a0d4c9b30c0a9 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Wed, 14 May 2025 23:45:31 +0200 Subject: [PATCH 046/187] fix test --- test/battle/ai/ai.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 738b08aa9b..3f799d09ab 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -942,15 +942,15 @@ SINGLE_BATTLE_TEST("AI correctly records used moves") TURN { MOVE(player, MOVE_TORCH_SONG); MOVE(opponent, MOVE_PSYCHIC); } TURN { MOVE(player, MOVE_GROWL); MOVE(opponent, MOVE_RAGE_FIST); } } THEN { - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_GROWL); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FLOWER_TRICK); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_TORCH_SONG); - - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_OPPONENT_LEFT][0], MOVE_RAGE_FIST); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_OPPONENT_LEFT][1], MOVE_PSYCHIC); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_OPPONENT_LEFT][2], MOVE_SCRATCH); - EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_OPPONENT_LEFT][3], MOVE_EARTHQUAKE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][0], MOVE_TACKLE); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][1], MOVE_GROWL); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][2], MOVE_FLOWER_TRICK); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_PLAYER_LEFT][3], MOVE_TORCH_SONG); + + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_OPPONENT_LEFT][0], MOVE_RAGE_FIST); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_OPPONENT_LEFT][1], MOVE_PSYCHIC); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_OPPONENT_LEFT][2], MOVE_SCRATCH); + EXPECT_EQ(gBattleHistory->usedMoves[B_POSITION_OPPONENT_LEFT][3], MOVE_EARTHQUAKE); } } From 243c43e6a4cc5512c8d62544f9dbac3a2c2a99b4 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Thu, 15 May 2025 08:10:19 +0200 Subject: [PATCH 047/187] Add prediction function --- include/battle_ai_util.h | 1 + src/battle_ai_switch_items.c | 5 +++-- src/battle_ai_util.c | 15 ++++++++++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index ca3f7c1d1e..2fce8cce95 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -238,6 +238,7 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsBattlerItemEnabled(u32 battler); bool32 IsBattlerPredictedToSwitch(u32 battler); +u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData); bool32 HasLowAccuracyMove(u32 battlerAtk, u32 battlerDef); bool32 HasBattlerSideAbility(u32 battlerDef, u32 ability, struct AiLogicData *aiData); u32 GetThinkingBattler(u32 battler); diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 49bdaaf11c..4445a54869 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -449,7 +449,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) struct Pokemon *party; u16 monAbility, aiMove; u32 opposingBattler = GetOppositeBattler(battler); - u32 incomingMove = ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) && gAiLogicData->predictingMove) ? gAiLogicData->predictedMove[opposingBattler] : gAiLogicData->lastUsedMove[opposingBattler]; + u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); u32 incomingType = GetMoveType(incomingMove); bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); s32 i, j; @@ -574,7 +574,8 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) static bool32 ShouldSwitchIfOpponentChargingOrInvulnerable(u32 battler) { u32 opposingBattler = GetOppositeBattler(battler); - u32 incomingMove = ((gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) && gAiLogicData->predictingMove) ? gAiLogicData->predictedMove[opposingBattler] : gAiLogicData->lastUsedMove[opposingBattler]; + u32 incomingMove = GetIncomingMove(battler, opposingBattler, gAiLogicData); + bool32 isOpposingBattlerChargingOrInvulnerable = (IsSemiInvulnerable(opposingBattler, incomingMove) || IsTwoTurnNotSemiInvulnerableMove(opposingBattler, incomingMove)); if (IsDoubleBattle() || !(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 192d511f68..73a9ec3cb9 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -145,14 +145,23 @@ bool32 IsBattlerPredictedToSwitch(u32 battler) { // Check for prediction flag on AI, whether they're using those predictions this turn, and whether the AI thinks the player should switch if (gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH - || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) - { + || gAiThinkingStruct->aiFlags[gAiLogicData->battlerDoingPrediction] & AI_FLAG_PREDICT_SWITCH) + { if (gAiLogicData->predictingSwitch && gAiLogicData->shouldSwitch & (1u << battler)) return TRUE; - } + } return FALSE; } +// Either a predicted move or the last used move from an opposing battler +u32 GetIncomingMove(u32 battler, u32 opposingBattler, struct AiLogicData *aiData) +{ + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE && aiData->predictingMove) + return aiData->predictedMove[opposingBattler]; + + return aiData->lastUsedMove[opposingBattler]; +} + void ClearBattlerMoveHistory(u32 battlerId) { memset(gBattleHistory->usedMoves[battlerId], 0, sizeof(gBattleHistory->usedMoves[battlerId])); From b5fbced6918f2b2bd10367556465690fabcb82d9 Mon Sep 17 00:00:00 2001 From: Jonathan Lin <35115312+LinathanZel@users.noreply.github.com> Date: Thu, 15 May 2025 03:40:02 -0400 Subject: [PATCH 048/187] New animations for Mega Evolution, Primal Reversion, Ultra Burst, and Power Construct (#6834) --- data/battle_anim_scripts.s | 145 ++++++++++++++++++++++---- data/battle_scripts_1.s | 15 +++ include/battle_anim.h | 2 + include/battle_anim_scripts.h | 1 + include/battle_scripts.h | 1 + include/constants/battle_anim.h | 3 +- include/constants/battle_string_ids.h | 2 + src/battle_anim.c | 2 + src/battle_anim_effects_3.c | 62 +++++++++-- src/battle_anim_new.c | 69 ++++++++++++ src/battle_message.c | 2 + src/battle_util.c | 9 +- test/battle/gimmick/dynamax.c | 2 +- 13 files changed, 283 insertions(+), 32 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index adab9de89f..8ced318ac7 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -28672,6 +28672,8 @@ gBattleAnimGeneral_MegaEvolution:: loadspritegfx ANIM_TAG_MEGA_STONE loadspritegfx ANIM_TAG_MEGA_PARTICLES loadspritegfx ANIM_TAG_MEGA_SYMBOL + loadspritegfx ANIM_TAG_ELECTRICITY + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(228, 0, 120) monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 @@ -28685,12 +28687,13 @@ gBattleAnimGeneral_MegaEvolution:: delay 20 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA waitforvisualfinish + createvisualtask SoundTask_PlayNormalCry, 0 createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 - waitforvisualfinish - createvisualtask SoundTask_PlayNormalCry, 0 - createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 2 + createsprite gMegaSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER + delay 2 + call MegaEvolutionSpinEffect waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff @@ -28713,6 +28716,21 @@ MegaEvolutionParticles: delay 3 return +MegaEvolutionSpinEffect: + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 528, 30, 13, 50, 0 + delay 2 + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 0, 480, 20, 16, -46, 0 + delay 2 + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 576, 20, 8, 42, 0 + delay 2 + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 15, 400, 25, 11, -42, 0 + delay 2 + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 12, 512, 25, 16, 46, 0 + delay 2 + createsprite gMegaSmokeSpriteTemplate ANIM_ATTACKER, 7, 0, 1, 464, 30, 15, -50, 0 + delay 2 + return + gBattleAnimGeneral_TeraCharge:: loadspritegfx ANIM_TAG_TERA_CRYSTAL loadspritegfx ANIM_TAG_TERA_SHATTER @@ -28859,18 +28877,14 @@ gBattleAnimGeneral_PrimalReversion:: createvisualtask AnimTask_PrimalReversion, 0x5 jumpargeq 0x0, ITEM_RED_ORB, General_PrimalReversion_Omega jumpargeq 0x0, ITEM_BLUE_ORB, General_PrimalReversion_Alpha + goto gBattleAnimGeneral_MegaEvolution General_PrimalReversion_Alpha: loadspritegfx ANIM_TAG_ALPHA_STONE loadspritegfx ANIM_TAG_MEGA_PARTICLES loadspritegfx ANIM_TAG_ALPHA_SYMBOL + loadspritegfx ANIM_TAG_HYDRO_PUMP monbg ANIM_ATTACKER 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 MegaEvolutionParticles - call MegaEvolutionParticles - call MegaEvolutionParticles - waitforvisualfinish playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER createsprite gAlphaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 delay 20 @@ -28879,25 +28893,31 @@ General_PrimalReversion_Alpha: createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 - waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 - createsprite gAlphaSymbolSpriteTemplate ANIM_ATTACKER, 2 + createsprite gAlphaSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER + call WaterGeyser + call WaterGeyser waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end +WaterGeyser: + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -4, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 16, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 4, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -16, 24 + delay 1 + return General_PrimalReversion_Omega: loadspritegfx ANIM_TAG_OMEGA_STONE loadspritegfx ANIM_TAG_MEGA_PARTICLES loadspritegfx ANIM_TAG_OMEGA_SYMBOL + loadspritegfx ANIM_TAG_SMALL_EMBER monbg ANIM_ATTACKER 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 MegaEvolutionParticles - call MegaEvolutionParticles - call MegaEvolutionParticles - waitforvisualfinish playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_ATTACKER createsprite gOmegaStoneSpriteTemplate, ANIM_ATTACKER, 41, 0, 0, 0, 0 delay 20 @@ -28906,13 +28926,82 @@ General_PrimalReversion_Omega: createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 + createvisualtask SoundTask_PlayNormalCry, 0 + createsprite gOmegaSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER + call FireGeyser + call FireGeyser waitforvisualfinish + clearmonbg ANIM_ATK_PARTNER + blendoff + end +FireGeyser: + createsprite gOmegaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -4, 24 + delay 1 + createsprite gOmegaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 16, 24 + delay 1 + createsprite gOmegaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 4, 24 + delay 1 + createsprite gOmegaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -16, 24 + delay 1 + return + +gBattleAnimGeneral_PowerConstruct:: + loadspritegfx ANIM_TAG_SNORE_Z + loadspritegfx ANIM_TAG_ZYGARDE_HEXES @hexagon + loadspritegfx ANIM_TAG_VERTICAL_HEX @arrow + loadspritegfx ANIM_TAG_FLYING_DIRT + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SNORE_Z, 0, 10, 10, RGB(8, 20, 26) @Green + monbg ANIM_ATTACKER + setalpha 12, 8 + loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 + call PowerConstructParticles + call PowerConstructParticles + call PowerConstructParticles + waitforvisualfinish + playsewithpan SE_ORB, SOUND_PAN_ATTACKER + createsprite gPowerConstructEmergeSpriteTemplate, ANIM_ATTACKER, 0, 0, 0, 0, 0 + delay 20 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA + waitforvisualfinish + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 + createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA + createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 createvisualtask SoundTask_PlayNormalCry, 0 - createsprite gOmegaSymbolSpriteTemplate ANIM_ATTACKER, 2 + createsprite gZSymbolSpriteTemplate ANIM_ATTACKER, 3, 0, 0, ANIM_ATTACKER + call ZGeyser + call ZGeyser + call ZGeyser + call ZGeyser waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end +PowerConstructParticles: + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, 40, -10, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, -35, -10, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, 15, -40, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, -10, -32, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, 25, -20, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, -40, -20, 13 + delay 3 + createsprite gPowerConstructSpriteTemplate, ANIM_ATTACKER, 2, 5, -40, 13 + delay 3 + return +ZGeyser: + createsprite gThousandArrowsGreenHexTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -4, 24 + delay 1 + createsprite gThousandArrowsGreenHexTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 16, 24 + delay 1 + createsprite gThousandArrowsGreenHexTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 4, 24 + delay 1 + createsprite gThousandArrowsGreenHexTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -16, 24 + delay 1 + return gBattleAnimGeneral_UltraBurst:: loadspritegfx ANIM_TAG_ULTRA_BURST_SYMBOL @@ -28920,8 +29009,10 @@ gBattleAnimGeneral_UltraBurst:: loadspritegfx ANIM_TAG_LEAF @green loadspritegfx ANIM_TAG_ELECTRIC_ORBS @charge particles loadspritegfx ANIM_TAG_CIRCLE_OF_LIGHT @psycho boost + loadspritegfx ANIM_TAG_HYDRO_PUMP monbg ANIM_ATTACKER setalpha 12, 8 + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(250, 240, 230) createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker @@ -28938,18 +29029,32 @@ gBattleAnimGeneral_UltraBurst:: call LightThatBurnsTheSkyGreenSparks call LightThatBurnsTheSkyGreenSparks delay 20 + playsewithpan SE_ORB, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 0, 16, RGB_WHITEALPHA - createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createsprite gUltraBurstSymbolSpriteTemplate, ANIM_ATTACKER, 0x0, 0x0, 0x0, 0x0, 0x0 waitforvisualfinish + createvisualtask AnimTask_HideSwapSprite, 2, 1, 0 createvisualtask AnimTask_BlendBattleAnimPalExclude, 5, 5, 2, 16, 0, RGB_WHITEALPHA createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 5, 14 - waitforvisualfinish createvisualtask SoundTask_PlayNormalCry, 0 + call LightGeyser + call LightGeyser + call LightGeyser + call LightGeyser waitforvisualfinish clearmonbg ANIM_ATK_PARTNER blendoff end +LightGeyser: + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -4, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 16, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, 4, 24 + delay 1 + createsprite gAlphaGeyserSpriteTemplate ANIM_ATTACKER, 3, ANIM_ATTACKER, -16, 24 + delay 1 + return gBattleAnimGeneral_AffectionHangedOn:: loadspritegfx ANIM_TAG_RED_HEART diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 1cf302afc4..7a8bc5dd73 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -6727,6 +6727,21 @@ BattleScript_PrimalReversion:: switchinabilities BS_SCRIPTING end3 +BattleScript_PowerConstruct:: + flushtextbox + printstring STRINGID_POWERCONSTRUCTPRESENCEOFMANY + waitmessage B_WAIT_TIME_SHORT + copybyte gBattlerAbility, gBattlerAttacker + call BattleScript_AbilityPopUp + handleformchange BS_ATTACKER, 0 + handleformchange BS_ATTACKER, 1 + playanimation BS_ATTACKER, B_ANIM_POWER_CONSTRUCT + waitanimation + handleformchange BS_ATTACKER, 2 + printstring STRINGID_POWERCONSTRUCTTRANSFORM + waitmessage B_WAIT_TIME_SHORT + end3 + BattleScript_UltraBurst:: flushtextbox trytrainerslidezmovemsg diff --git a/include/battle_anim.h b/include/battle_anim.h index 0075010f77..c28546f1e8 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -555,6 +555,8 @@ void AnimDracoMeteorRock(struct Sprite *sprite); void CoreEnforcerLoadBeamTarget(struct Sprite *sprite); void SpriteCB_RandomCentredHits(struct Sprite *sprite); void InitSpritePosToAnimTargetsCentre(struct Sprite *sprite, bool32 respectMonPicOffsets); +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_PrimalSymbol[]; +extern const union AffineAnimCmd *const gSpriteAffineAnimTable_MegaSymbol[]; // battle_anim_bug.c void AnimTranslateStinger(struct Sprite *sprite); diff --git a/include/battle_anim_scripts.h b/include/battle_anim_scripts.h index 6c49788975..0bffbda8ea 100644 --- a/include/battle_anim_scripts.h +++ b/include/battle_anim_scripts.h @@ -1003,6 +1003,7 @@ extern const u8 gBattleAnimGeneral_Fog[]; extern const u8 gBattleAnimGeneral_TeraCharge[]; extern const u8 gBattleAnimGeneral_TeraActivate[]; extern const u8 gBattleAnimGeneral_SimpleHeal[]; +extern const u8 gBattleAnimGeneral_PowerConstruct[]; // special animations extern const u8 gBattleAnimSpecial_LevelUp[]; diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 09c98d3c57..406be9a2be 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -519,6 +519,7 @@ extern const u8 BattleScript_BoosterEnergyRet[]; extern const u8 BattleScript_TeraShellDistortingTypeMatchups[]; extern const u8 BattleScript_TeraFormChange[]; extern const u8 BattleScript_SleepClausePreventsEnd[]; +extern const u8 BattleScript_PowerConstruct[]; extern const u8 BattleScript_AbilityProtectsDoesntAffect[]; extern const u8 BattleScript_ImmunityProtected[]; diff --git a/include/constants/battle_anim.h b/include/constants/battle_anim.h index ac312a3c01..c85dcc9fe7 100644 --- a/include/constants/battle_anim.h +++ b/include/constants/battle_anim.h @@ -586,8 +586,9 @@ #define B_ANIM_TERA_CHARGE 50 #define B_ANIM_TERA_ACTIVATE 51 #define B_ANIM_SIMPLE_HEAL 52 +#define B_ANIM_POWER_CONSTRUCT 53 -#define NUM_B_ANIMS_GENERAL 53 +#define NUM_B_ANIMS_GENERAL 54 // special animations table (sBattleAnims_Special) #define B_ANIM_LVL_UP 0 diff --git a/include/constants/battle_string_ids.h b/include/constants/battle_string_ids.h index 456211c802..8e8503458d 100644 --- a/include/constants/battle_string_ids.h +++ b/include/constants/battle_string_ids.h @@ -736,6 +736,8 @@ enum StringID STRINGID_QUESTIONFORFEITBATTLE, STRINGID_FORFEITBATTLEGAVEMONEY, STRINGID_TOXICSPIKESBADLYPOISONED, + STRINGID_POWERCONSTRUCTPRESENCEOFMANY, + STRINGID_POWERCONSTRUCTTRANSFORM, STRINGID_COUNT }; diff --git a/src/battle_anim.c b/src/battle_anim.c index b8118313dd..bf75d4a142 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -252,6 +252,7 @@ static const u8* const sBattleAnims_General[NUM_B_ANIMS_GENERAL] = [B_ANIM_TERA_CHARGE] = gBattleAnimGeneral_TeraCharge, [B_ANIM_TERA_ACTIVATE] = gBattleAnimGeneral_TeraActivate, [B_ANIM_SIMPLE_HEAL] = gBattleAnimGeneral_SimpleHeal, + [B_ANIM_POWER_CONSTRUCT] = gBattleAnimGeneral_PowerConstruct, }; static const u8* const sBattleAnims_Special[NUM_B_ANIMS_SPECIAL] = @@ -351,6 +352,7 @@ void LaunchBattleAnimation(u32 animType, u32 animId) case B_ANIM_WISH_HEAL: case B_ANIM_MEGA_EVOLUTION: case B_ANIM_PRIMAL_REVERSION: + case B_ANIM_POWER_CONSTRUCT: case B_ANIM_ULTRA_BURST: case B_ANIM_GULP_MISSILE: case B_ANIM_RAINBOW: diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index affa5e7ce3..409244ccac 100644 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1204,15 +1204,26 @@ const struct SpriteTemplate gMegaParticlesSpriteTemplate = .callback = AnimPowerAbsorptionOrb, }; +const struct SpriteTemplate gMegaSmokeSpriteTemplate = +{ + .tileTag = ANIM_TAG_ELECTRICITY, + .paletteTag = ANIM_TAG_ELECTRICITY, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_ElectricPuff, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = AnimParticleInVortex, +}; + const struct SpriteTemplate gMegaSymbolSpriteTemplate = { .tileTag = ANIM_TAG_MEGA_SYMBOL, .paletteTag = ANIM_TAG_MEGA_SYMBOL, - .oam = &gOamData_AffineOff_ObjBlend_32x32, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimGhostStatusSprite, + .affineAnims = gSpriteAffineAnimTable_MegaSymbol, + .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gAlphaStoneSpriteTemplate = @@ -1241,22 +1252,55 @@ const struct SpriteTemplate gAlphaSymbolSpriteTemplate = { .tileTag = ANIM_TAG_ALPHA_SYMBOL, .paletteTag = ANIM_TAG_ALPHA_SYMBOL, - .oam = &gOamData_AffineOff_ObjBlend_32x32, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimGhostStatusSprite, + .affineAnims = gSpriteAffineAnimTable_PrimalSymbol, + .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gOmegaSymbolSpriteTemplate = { .tileTag = ANIM_TAG_OMEGA_SYMBOL, .paletteTag = ANIM_TAG_OMEGA_SYMBOL, - .oam = &gOamData_AffineOff_ObjBlend_32x32, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, .anims = gDummySpriteAnimTable, .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = AnimGhostStatusSprite, + .affineAnims = gSpriteAffineAnimTable_PrimalSymbol, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gPowerConstructSpriteTemplate = +{ + .tileTag = ANIM_TAG_VERTICAL_HEX, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineOff_ObjNormal_16x16, + .anims = gPowerAbsorptionOrbAnimTable, + .images = NULL, + .affineAnims = gPowerAbsorptionOrbAffineAnimTable, + .callback = AnimPowerAbsorptionOrb, +}; + +const struct SpriteTemplate gPowerConstructEmergeSpriteTemplate = +{ + .tileTag = ANIM_TAG_VERTICAL_HEX, + .paletteTag = ANIM_TAG_ZYGARDE_HEXES, + .oam = &gOamData_AffineDouble_ObjBlend_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gAffineAnims_LusterPurgeCircle, + .callback = AnimSpriteOnMonPos, +}; + +const struct SpriteTemplate gZSymbolSpriteTemplate = +{ + .tileTag = ANIM_TAG_SNORE_Z, + .paletteTag = ANIM_TAG_SNORE_Z, + .oam = &gOamData_AffineDouble_ObjBlend_32x32, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_MegaSymbol, + .callback = AnimSpriteOnMonPos, }; const struct SpriteTemplate gTeraCrystalSpriteTemplate = diff --git a/src/battle_anim_new.c b/src/battle_anim_new.c index 1ecf064be8..35a8bac32e 100644 --- a/src/battle_anim_new.c +++ b/src/battle_anim_new.c @@ -7279,6 +7279,28 @@ const struct SpriteTemplate gMoonUpSpriteTemplate = .callback = AnimWeatherBallUp, }; +const struct SpriteTemplate gAlphaGeyserSpriteTemplate = +{ + .tileTag = ANIM_TAG_HYDRO_PUMP, + .paletteTag = ANIM_TAG_HYDRO_PUMP, + .oam = &gOamData_AffineOff_ObjBlend_16x16, + .anims = gDummySpriteAnimTable, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_PrimalSymbol, + .callback = SpriteCB_Geyser, +}; + +const struct SpriteTemplate gOmegaGeyserSpriteTemplate = +{ + .tileTag = ANIM_TAG_SMALL_EMBER, + .paletteTag = ANIM_TAG_SMALL_EMBER, + .oam = &gOamData_AffineOff_ObjNormal_32x32, + .anims = gAnims_BasicFire, + .images = NULL, + .affineAnims = gSpriteAffineAnimTable_PrimalSymbol, + .callback = SpriteCB_Geyser, +}; + const union AnimCmd gSproutAnimCmds[] = { ANIMCMD_FRAME(96, 5), @@ -9301,3 +9323,50 @@ void AnimTask_RandomBool(u8 taskId) DestroyAnimVisualTask(taskId); } + +// Credit to Skeli +#define PRIMAL_PULSE_SCALE_SIZE 16 +#define PRIMAL_PULSE_FRAME_COUNT 4 +static const union AffineAnimCmd sSpriteAffineAnim_PrimalSymbol[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), + AFFINEANIMCMD_FRAME(32, 32, 0, 15), + AFFINEANIMCMD_FRAME(0, 0, 0, 2), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-32, -32, 0, 15), //Shrink down again + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_PrimalSymbol[] = +{ + sSpriteAffineAnim_PrimalSymbol, +}; + +static const union AffineAnimCmd sSpriteAffineAnim_MegaSymbol[] = +{ + AFFINEANIMCMD_FRAME(16, 16, 0, 0), //Start small + AFFINEANIMCMD_FRAME(32, 32, 0, 15), //Grow sprite + AFFINEANIMCMD_FRAME(0, 0, 0, 2), //Pause + + //Pulsate + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-PRIMAL_PULSE_SCALE_SIZE, -PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME( PRIMAL_PULSE_SCALE_SIZE, PRIMAL_PULSE_SCALE_SIZE, 0, PRIMAL_PULSE_FRAME_COUNT), + AFFINEANIMCMD_FRAME(-32, -32, 0, 15), //Shrink down again + AFFINEANIMCMD_END, +}; + +const union AffineAnimCmd* const gSpriteAffineAnimTable_MegaSymbol[] = +{ + sSpriteAffineAnim_MegaSymbol, +}; diff --git a/src/battle_message.c b/src/battle_message.c index ca69ed93bb..0f239cb4e6 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -899,6 +899,8 @@ const u8 *const gBattleStringsTable[STRINGID_COUNT] = [STRINGID_TIMETOGIGANTAMAX] = COMPOUND_STRING("Time to Gigantamax!"), [STRINGID_QUESTIONFORFEITBATTLE] = COMPOUND_STRING("Would you like to give up on this battle and quit now? Quitting the battle is the same as losing the battle."), [STRINGID_FORFEITBATTLEGAVEMONEY] = COMPOUND_STRING("You gave Β₯{B_BUFF1} to the winner…{PAUSE_UNTIL_PRESS}"), + [STRINGID_POWERCONSTRUCTPRESENCEOFMANY] = COMPOUND_STRING("You sense the presence of many!"), + [STRINGID_POWERCONSTRUCTTRANSFORM] = COMPOUND_STRING("{B_ATK_NAME_WITH_PREFIX} transformed into its Complete Forme!"), }; const u16 gTrainerUsedItemStringIds[] = diff --git a/src/battle_util.c b/src/battle_util.c index b8f793db81..bdffa67624 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4285,7 +4285,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // Fallthrough case ABILITY_ZEN_MODE: case ABILITY_SHIELDS_DOWN: - case ABILITY_POWER_CONSTRUCT: if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) { gBattlerAttacker = battler; @@ -4293,6 +4292,14 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 effect++; } break; + case ABILITY_POWER_CONSTRUCT: + if (TryBattleFormChange(battler, FORM_CHANGE_BATTLE_HP_PERCENT)) + { + gBattlerAttacker = battler; + BattleScriptPushCursorAndCallback(BattleScript_PowerConstruct); + effect++; + } + break; case ABILITY_BALL_FETCH: if (gBattleMons[battler].item == ITEM_NONE && gBattleResults.catchAttempts[gLastUsedBall - ITEM_ULTRA_BALL] >= 1 diff --git a/test/battle/gimmick/dynamax.c b/test/battle/gimmick/dynamax.c index ee12bac875..a929c82068 100644 --- a/test/battle/gimmick/dynamax.c +++ b/test/battle/gimmick/dynamax.c @@ -455,7 +455,7 @@ SINGLE_BATTLE_TEST("Dynamax: Dynamaxed Pokemon that changes forms does not gain } SCENE { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_DYNAMAX_GROWTH, player); ANIMATION(ANIM_TYPE_MOVE, MOVE_MAX_STRIKE, player); - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_FORM_CHANGE, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_POWER_CONSTRUCT, player); } THEN { EXPECT_MUL_EQ(maxHP - hp, GetDynamaxLevelHPMultiplier(0, FALSE), player->maxHP - player->hp); } From ad0e98bb127114b0f85eef4a2c155c220b452e12 Mon Sep 17 00:00:00 2001 From: mudskipper13 <105766191+mudskipper13@users.noreply.github.com> Date: Thu, 15 May 2025 15:15:22 +0700 Subject: [PATCH 049/187] Prevent scaninc touching tests when `make`-ing non-test builds (#6812) --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index 6777b6c482..78d5e4694b 100644 --- a/Makefile +++ b/Makefile @@ -404,6 +404,7 @@ ifneq ($(NODEP),1) -include $(addprefix $(OBJ_DIR)/,$(C_SRCS:.c=.d)) endif +ifeq ($(TEST),1) $(TEST_BUILDDIR)/%.o: $(TEST_SUBDIR)/%.c @echo "$(CC1) -o $@ $<" @$(CPP) $(CPPFLAGS) $< | $(PREPROC) -i $< charmap.txt | $(CC1) $(CFLAGS) -o - - | cat - <(echo -e ".text\n\t.align\t2, 0") | $(AS) $(ASFLAGS) -o $@ - @@ -414,6 +415,7 @@ $(TEST_BUILDDIR)/%.d: $(TEST_SUBDIR)/%.c ifneq ($(NODEP),1) -include $(addprefix $(OBJ_DIR)/,$(TEST_SRCS:.c=.d)) endif +endif $(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $(AS) $(ASFLAGS) -o $@ $< From 34918f5f0d14f5659f53a778ca290a1bc6d8298d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 10:39:31 +0200 Subject: [PATCH 050/187] Fixes wrongly usage of arguments without checking effect (#6859) --- include/battle.h | 5 ----- src/battle_ai_util.c | 4 +--- src/battle_util.c | 2 +- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/include/battle.h b/include/battle.h index 941c9c1d3e..a2a142c9ae 100644 --- a/include/battle.h +++ b/include/battle.h @@ -819,11 +819,6 @@ static inline bool32 IsBattleMoveStatus(u32 move) return GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS; } -static inline bool32 IsBattleMoveRecoil(u32 move) -{ - return GetMoveRecoil(move) > 0 || GetMoveEffect(move) == EFFECT_RECOIL_IF_MISS; -} - /* Checks if 'battlerId' is any of the types. * Passing multiple types is more efficient than calling this multiple * times with one type because it shares the 'GetBattlerTypes' result. */ diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 192d511f68..d84a739cbf 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -972,10 +972,8 @@ static bool32 AI_IsMoveEffectInMinus(u32 battlerAtk, u32 battlerDef, u32 move, s case EFFECT_EXPLOSION: case EFFECT_FINAL_GAMBIT: return TRUE; - case EFFECT_RECOIL_IF_MISS: - if (AI_IsDamagedByRecoil(battlerAtk)) - return TRUE; case EFFECT_RECOIL: + case EFFECT_RECOIL_IF_MISS: if (AI_IsDamagedByRecoil(battlerAtk)) return TRUE; break; diff --git a/src/battle_util.c b/src/battle_util.c index bdffa67624..e7e7dbe10b 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8396,7 +8396,7 @@ static inline u32 CalcMoveBasePowerAfterModifiers(struct DamageCalculationData * modifier = uq4_12_multiply(modifier, UQ_4_12(1.5)); break; case ABILITY_RECKLESS: - if (IsBattleMoveRecoil(move)) + if (moveEffect == EFFECT_RECOIL || moveEffect == EFFECT_RECOIL_IF_MISS) modifier = uq4_12_multiply(modifier, UQ_4_12(1.2)); break; case ABILITY_IRON_FIST: From 9924ae33915999ae82c171af511a4978a21bbf35 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 15 May 2025 10:40:35 +0200 Subject: [PATCH 051/187] Make make clean work again (#6848) Co-authored-by: Hedara --- Makefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/Makefile b/Makefile index 52b4c94b9e..f2128cc25d 100644 --- a/Makefile +++ b/Makefile @@ -350,9 +350,6 @@ clean-generated: COMPETITIVE_PARTY_SYNTAX := $(shell PATH="$(PATH)"; echo 'COMPETITIVE_PARTY_SYNTAX' | $(CPP) $(CPPFLAGS) -imacros include/gba/defines.h -imacros include/config/general.h | tail -n1) ifeq ($(COMPETITIVE_PARTY_SYNTAX),1) %.h: %.party ; $(CPP) $(CPPFLAGS) -traditional-cpp - < $< | $(TRAINERPROC) -o $@ -i $< - - -AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/trainers.h -AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/battle_partners.h endif $(C_BUILDDIR)/librfu_intr.o: CFLAGS := -mthumb-interwork -O2 -mabi=apcs-gnu -mtune=arm7tdmi -march=armv4t -fno-toplevel-reorder -Wno-pointer-to-int-cast From 54e9505d2bf0e4ed245d06a4f8126e63401f6831 Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Tue, 13 May 2025 14:58:40 +0100 Subject: [PATCH 052/187] Warn on suspicious setvar usages --- asm/macros/event.inc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index b8dedb7ffc..3356a8b98d 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -145,7 +145,10 @@ .endm @ Changes the value of destination to value. - .macro setvar destination:req, value:req + .macro setvar destination:req, value:req, warn=TRUE + .if \warn && ((\value >= VARS_START && \value <= VARS_END) || (\value >= SPECIAL_VARS_START && \value <= SPECIAL_VARS_END)) + .warning "setvar with a value that might be a VAR_ constant; did you mean copyvar instead?" + .endif .byte SCR_OP_SETVAR .2byte \destination .2byte \value From 4474bd5b809b61b36b1f9a7225b1b19068756e8b Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Thu, 15 May 2025 03:44:09 -0500 Subject: [PATCH 053/187] Add move description data for Z-Moves and Max/G-Max moves (#6852) --- src/data/moves_info.h | 368 +++++++++++++++++++++++++++++++----------- test/text.c | 2 +- 2 files changed, 271 insertions(+), 99 deletions(-) diff --git a/src/data/moves_info.h b/src/data/moves_info.h index f9897650a5..fa93c75054 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -105,6 +105,14 @@ static const u8 sFeintDescription[] = _( "An attack that hits foes\n" "using moves like Protect."); +static const u8 sProtectDescription[] = _( + "Evades attack, but may fail\n" + "if used in succession."); + +static const u8 sGMaxOneBlowDescription[] = _( + "G-max Urshifu attack.\n" + "Ignores Max Guard."); + const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { [MOVE_NONE] = @@ -4778,9 +4786,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_PROTECT] = { .name = COMPOUND_STRING("Protect"), - .description = COMPOUND_STRING( - "Evades attack, but may fail\n" - "if used in succession."), + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_NORMAL, @@ -5168,9 +5174,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DETECT] = { .name = COMPOUND_STRING("Detect"), - .description = COMPOUND_STRING( - "Evades attack, but may fail\n" - "if used in succession."), + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_FIGHTING, @@ -21011,7 +21015,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BREAKNECK_BLITZ] = { .name = COMPOUND_STRING("Breakneck Blitz"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Builds momentum and crashes\n" + "into the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_NORMAL, @@ -21024,8 +21030,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_ALL_OUT_PUMMELING] = { - .name = COMPOUND_STRING("All Out Pummeling"), - .description = sNullDescription, + .name = COMPOUND_STRING("All-Out Pummeling"), + .description = COMPOUND_STRING( + "Rams an energy orb into\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FIGHTING, @@ -21039,7 +21047,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SUPERSONIC_SKYSTRIKE] = { .name = COMPOUND_STRING("Supersonic Skystrike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Soars up and plummets toward\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FLYING, @@ -21053,7 +21063,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_ACID_DOWNPOUR] = { .name = COMPOUND_STRING("Acid Downpour"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Sinks the target in a poison\n" + "swamp. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_POISON, @@ -21067,7 +21079,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TECTONIC_RAGE] = { .name = COMPOUND_STRING("Tectonic Rage"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Burrows deep and slams into\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GROUND, @@ -21082,7 +21096,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CONTINENTAL_CRUSH] = { .name = COMPOUND_STRING("Continental Crush"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Drops a huge rock mountain\n" + "on the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ROCK, @@ -21095,8 +21111,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_SAVAGE_SPIN_OUT] = { - .name = COMPOUND_STRING("Savage Spin Out"), - .description = sNullDescription, + .name = COMPOUND_STRING("Savage Spin-Out"), + .description = COMPOUND_STRING( + "Spits threads of silk to\n" + "bind the foe. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_BUG, @@ -21109,8 +21127,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_NEVER_ENDING_NIGHTMARE] = { - .name = COMPOUND_STRING("Never Ending Nightmare"), - .description = sNullDescription, + .name = COMPOUND_STRING("Never-Ending Nightmare"), + .description = COMPOUND_STRING( + "Deep-seated grudges trap\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GHOST, @@ -21124,7 +21144,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CORKSCREW_CRASH] = { .name = COMPOUND_STRING("Corkscrew Crash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Spins very fast and rams\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_STEEL, @@ -21138,7 +21160,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_INFERNO_OVERDRIVE] = { .name = COMPOUND_STRING("Inferno Overdrive"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Breathes intense fire at\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FIRE, @@ -21152,7 +21176,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_HYDRO_VORTEX] = { .name = COMPOUND_STRING("Hydro Vortex"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "A huge whirlpool swallows\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_WATER, @@ -21166,7 +21192,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BLOOM_DOOM] = { .name = COMPOUND_STRING("Bloom Doom"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Uses plant energy to attack\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_GRASS, @@ -21180,7 +21208,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GIGAVOLT_HAVOC] = { .name = COMPOUND_STRING("Gigavolt Havoc"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Hits the foe with powerful\n" + "electricity. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ELECTRIC, @@ -21194,7 +21224,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SHATTERED_PSYCHE] = { .name = COMPOUND_STRING("Shattered Psyche"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Controls the target to\n" + "hurt it. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_PSYCHIC, @@ -21208,7 +21240,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SUBZERO_SLAMMER] = { .name = COMPOUND_STRING("Subzero Slammer"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Drops the temp and freezes\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_ICE, @@ -21222,7 +21256,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_DEVASTATING_DRAKE] = { .name = COMPOUND_STRING("Devastating Drake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Develops aura and attacks\n" + "the target. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_DRAGON, @@ -21236,7 +21272,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_BLACK_HOLE_ECLIPSE] = { .name = COMPOUND_STRING("Black Hole Eclipse"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Sucks the target into dark\n" + "energy. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_DARK, @@ -21250,7 +21288,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TWINKLE_TACKLE] = { .name = COMPOUND_STRING("Twinkle Tackle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Toys with the target in a\n" + "charming space. Power varies."), .effect = EFFECT_HIT, .power = 1, .type = TYPE_FAIRY, @@ -21264,7 +21304,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CATASTROPIKA] = { .name = COMPOUND_STRING("Catastropika"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Pikachu uses the max amount\n" + "of electricity and pounces."), .effect = EFFECT_HIT, .power = 210, .type = TYPE_ELECTRIC, @@ -21278,7 +21320,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_10000000_VOLT_THUNDERBOLT] = { .name = COMPOUND_STRING("10,000,000 Volt Thunderbolt"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Cap Pikachu unleashes jolt.\n" + "High critical-hit ratio."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_ELECTRIC, @@ -21293,7 +21337,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_STOKED_SPARKSURFER] = { .name = COMPOUND_STRING("Stoked Sparksurfer"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Alolan Raichu attacks with\n" + "full force. Causes paralysis."), .effect = EFFECT_HIT, .power = 175, .type = TYPE_ELECTRIC, @@ -21311,7 +21357,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_EXTREME_EVOBOOST] = { .name = COMPOUND_STRING("Extreme Evoboost"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Eevee gets energy from\n" + "its friends. Boosts stats."), .effect = EFFECT_EXTREME_EVOBOOST, .power = 0, .type = TYPE_NORMAL, @@ -21325,7 +21373,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_PULVERIZING_PANCAKE] = { .name = COMPOUND_STRING("Pulverizing Pancake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Snorlax energetically moves\n" + "and attacks with full force."), .effect = EFFECT_HIT, .power = 210, .type = TYPE_NORMAL, @@ -21339,7 +21389,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GENESIS_SUPERNOVA] = { .name = COMPOUND_STRING("Genesis Supernova"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Mew attacks with full force.\n" + "Psychically charges terrain."), .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, .power = 185, .type = TYPE_PSYCHIC, @@ -21354,7 +21406,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SINISTER_ARROW_RAID] = { .name = COMPOUND_STRING("Sinister Arrow Raid"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Decidueye shoots countless\n" + "arrows with full force."), .effect = EFFECT_HIT, .power = 180, .type = TYPE_GHOST, @@ -21368,7 +21422,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MALICIOUS_MOONSAULT] = { .name = COMPOUND_STRING("Malicious Moonsault"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Incineroar crashes into\n" + "the target with full force."), .effect = EFFECT_HIT, .power = 180, .type = TYPE_DARK, @@ -21382,7 +21438,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_OCEANIC_OPERETTA] = { .name = COMPOUND_STRING("Oceanic Operetta"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Primarina summons a massive\n" + "amount of water at the foe."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_WATER, @@ -21396,7 +21454,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SPLINTERED_STORMSHARDS] = { .name = COMPOUND_STRING("Splintered Stormshards"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Lycanroc attacks with full\n" + "force. Removes all terrain."), .effect = EFFECT_HIT_SET_REMOVE_TERRAIN, .power = 190, .type = TYPE_ROCK, @@ -21411,7 +21471,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_LETS_SNUGGLE_FOREVER] = { .name = COMPOUND_STRING("Let's Snuggle Forever"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Mimikyu punches the target\n" + "with full force."), .effect = EFFECT_HIT, .power = 190, .type = TYPE_FAIRY, @@ -21425,7 +21487,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_CLANGOROUS_SOULBLAZE] = { .name = COMPOUND_STRING("Clangorous Soulblaze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Kommo-o attacks with full\n" + "force. Boosts all stats."), .effect = EFFECT_HIT, .power = 185, .type = TYPE_DRAGON, @@ -21446,7 +21510,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_GUARDIAN_OF_ALOLA] = { .name = COMPOUND_STRING("Guardian of Alola"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "The Land Spirit PokΓ©mon\n" + "greatly reduces the foe's HP."), .effect = EFFECT_GUARDIAN_OF_ALOLA, .power = 1, .type = TYPE_FAIRY, @@ -21460,7 +21526,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_SEARING_SUNRAZE_SMASH] = { .name = COMPOUND_STRING("Searing Sunraze Smash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Solgaleo attacks with full\n" + "force. Ignores abilities."), .effect = EFFECT_HIT, .power = 200, .type = TYPE_STEEL, @@ -21475,7 +21543,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MENACING_MOONRAZE_MAELSTROM] = { .name = COMPOUND_STRING("Menacing Moonraze Maelstrom"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Lunala attacks with full\n" + "force. Ignores abilities."), .effect = EFFECT_HIT, .power = 200, .type = TYPE_GHOST, @@ -21489,8 +21559,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_LIGHT_THAT_BURNS_THE_SKY] = { - .name = COMPOUND_STRING("Light That Burns The Sky"), - .description = sNullDescription, + .name = COMPOUND_STRING("Light That Burns the Sky"), + .description = COMPOUND_STRING( + "Uses Necrozma's highest\n" + "attack. Ignores abilities."), .effect = EFFECT_PHOTON_GEYSER, .power = 200, .type = TYPE_PSYCHIC, @@ -21504,8 +21576,10 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = }, [MOVE_SOUL_STEALING_7_STAR_STRIKE] = { - .name = COMPOUND_STRING("Soul Stealing 7 Star Strike"), - .description = sNullDescription, + .name = COMPOUND_STRING("Soul-Stealing 7-Star Strike"), + .description = COMPOUND_STRING( + "Marshadow punches and\n" + "kicks with full force."), .effect = EFFECT_HIT, .power = 195, .type = TYPE_GHOST, @@ -21520,7 +21594,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_GUARD] = { .name = COMPOUND_STRING("Max Guard"), - .description = sNullDescription, + .description = sProtectDescription, .effect = EFFECT_PROTECT, .power = 0, .type = TYPE_NORMAL, @@ -21535,7 +21609,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_FLARE] = { .name = COMPOUND_STRING("Max Flare"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fire Dynamax attack.\n" + "Intensifies sun for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FIRE, @@ -21555,7 +21631,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_FLUTTERBY] = { .name = COMPOUND_STRING("Max Flutterby"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Bug Dynamax attack.\n" + "Lowers foe's Sp. Atk stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_BUG, @@ -21575,7 +21653,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_LIGHTNING] = { .name = COMPOUND_STRING("Max Lightning"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Electric Dynamax attack.\n" + "Turns the terrain electric."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ELECTRIC, @@ -21595,7 +21675,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STRIKE] = { .name = COMPOUND_STRING("Max Strike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Normal Dynamax attack.\n" + "Lowers foe's Speed stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_NORMAL, @@ -21615,7 +21697,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_KNUCKLE] = { .name = COMPOUND_STRING("Max Knuckle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fighting Dynamax attack.\n" + "Boosts ally Attack stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FIGHTING, @@ -21635,7 +21719,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_PHANTASM] = { .name = COMPOUND_STRING("Max Phantasm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ghost Dynamax attack.\n" + "Lowers foe's Defense stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_GHOST, @@ -21655,7 +21741,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_HAILSTORM] = { .name = COMPOUND_STRING("Max Hailstorm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ice Dynamax attack.\n" + "Summons hail for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ICE, @@ -21675,7 +21763,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_OOZE] = { .name = COMPOUND_STRING("Max Ooze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Poison Dynamax attack.\n" + "Boosts ally Sp. Atk stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_POISON, @@ -21695,7 +21785,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_GEYSER] = { .name = COMPOUND_STRING("Max Geyser"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Water Dynamax attack.\n" + "Summons rain for 5 turns."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_WATER, @@ -21715,7 +21807,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_AIRSTREAM] = { .name = COMPOUND_STRING("Max Airstream"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Flying Dynamax attack.\n" + "Boosts ally Speed stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FLYING, @@ -21735,7 +21829,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STARFALL] = { .name = COMPOUND_STRING("Max Starfall"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Fairy Dynamax attack.\n" + "Turns the terrain misty."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_FAIRY, @@ -21755,7 +21851,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_WYRMWIND] = { .name = COMPOUND_STRING("Max Wyrmwind"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Dragon Dynamax attack.\n" + "Lowers foe's Attack stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_DRAGON, @@ -21775,7 +21873,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_MINDSTORM] = { .name = COMPOUND_STRING("Max Mindstorm"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Psychic Dynamax attack.\n" + "Turns the terrain psychic."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_PSYCHIC, @@ -21795,7 +21895,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_ROCKFALL] = { .name = COMPOUND_STRING("Max Rockfall"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Rock Dynamax attack.\n" + "Summons a sandstorm."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_ROCK, @@ -21815,7 +21917,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_QUAKE] = { .name = COMPOUND_STRING("Max Quake"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Ground Dynamax attack.\n" + "Boosts ally Sp. Def stats."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_GROUND, @@ -21836,7 +21940,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_DARKNESS] = { .name = COMPOUND_STRING("Max Darkness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Dark Dynamax attack.\n" + "Lowers foe's Sp. Def stat."), .effect = EFFECT_MAX_MOVE, .power = 1, .type = TYPE_DARK, @@ -21856,7 +21962,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_OVERGROWTH] = { .name = COMPOUND_STRING("Max Overgrowth"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Grass Dynamax attack.\n" + "Turns the terrain grassy."), .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -21876,7 +21984,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_MAX_STEELSPIKE] = { .name = COMPOUND_STRING("Max Steelspike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "Steel Dynamax attack.\n" + "Boosts ally Defense stats."), .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -21896,7 +22006,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VINE_LASH] = { .name = COMPOUND_STRING("G-Max Vine Lash"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Venusaur attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -21916,7 +22028,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_WILDFIRE] = { .name = COMPOUND_STRING("G-Max Wildfire"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Charizard attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -21936,7 +22050,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CANNONADE] = { .name = COMPOUND_STRING("G-Max Cannonade"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Blastoise attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -21956,7 +22072,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_BEFUDDLE] = { .name = COMPOUND_STRING("G-Max Befuddle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Butterfree attack.\n" + "Poison, paralysis, or sleep."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_BUG, @@ -21976,7 +22094,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VOLT_CRASH] = { .name = COMPOUND_STRING("G-Max Volt Crash"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Pikachu attack.\n" + "Paralyzes opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ELECTRIC, @@ -21996,7 +22116,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_GOLD_RUSH] = { .name = COMPOUND_STRING("G-Max Gold Rush"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Meowth attack.\n" + "Confuses and earns money."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22016,7 +22138,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CHI_STRIKE] = { .name = COMPOUND_STRING("G-Max Chi Strike"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Machamp attack.\n" + "Boosts critical-hit ratio."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIGHTING, @@ -22036,7 +22160,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_TERROR] = { .name = COMPOUND_STRING("G-Max Terror"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Gengar attack.\n" + "Prevents foes from escaping."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GHOST, @@ -22056,7 +22182,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FOAM_BURST] = { .name = COMPOUND_STRING("G-Max Foam Burst"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Kingler attack.\n" + "Harshly lowers foe's Speed."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22076,7 +22204,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_RESONANCE] = { .name = COMPOUND_STRING("G-Max Resonance"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Lapras attack.\n" + "Reduces damage for 5 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ICE, @@ -22096,7 +22226,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CUDDLE] = { .name = COMPOUND_STRING("G-Max Cuddle"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Eevee attack.\n" + "Infatuates opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22116,7 +22248,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_REPLENISH] = { .name = COMPOUND_STRING("G-Max Replenish"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Snorlax attack.\n" + "Restores eaten Berries."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_NORMAL, @@ -22136,7 +22270,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_MALODOR] = { .name = COMPOUND_STRING("G-Max Malodor"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Garbodor attack.\n" + "Poisons opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_POISON, @@ -22156,7 +22292,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_MELTDOWN] = { .name = COMPOUND_STRING("G-Max Meltdown"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Melmetal attack.\n" + "Prevents repeat move use."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -22176,7 +22314,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_DRUM_SOLO] = { .name = COMPOUND_STRING("G-Max Drum Solo"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Rillaboom attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22197,7 +22337,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FIREBALL] = { .name = COMPOUND_STRING("G-Max Fireball"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Cinderace attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -22218,7 +22360,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_HYDROSNIPE] = { .name = COMPOUND_STRING("G-Max Hydrosnipe"), - .description = sNullDescription, //ANIM TODO + .description = COMPOUND_STRING( + "G-max Inteleon attack.\n" + "Ignores target's abilities."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22239,7 +22383,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_WIND_RAGE] = { .name = COMPOUND_STRING("G-Max Wind Rage"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Corviknight attack.\n" + "Removes opponent screens."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FLYING, @@ -22259,7 +22405,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_GRAVITAS] = { .name = COMPOUND_STRING("G-Max Gravitas"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Orbeetle attack.\n" + "Changes gravity for 5 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_PSYCHIC, @@ -22279,7 +22427,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STONESURGE] = { .name = COMPOUND_STRING("G-Max Stonesurge"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Drednaw attack.\n" + "Scatters sharp rocks."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, @@ -22299,7 +22449,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_VOLCALITH] = { .name = COMPOUND_STRING("G-Max Volcalith"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Coalossal attack.\n" + "Damages for 4 turns."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ROCK, @@ -22319,7 +22471,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_TARTNESS] = { .name = COMPOUND_STRING("G-Max Tartness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Flapple attack.\n" + "Lowers foe's evasiveness."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22339,7 +22493,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SWEETNESS] = { .name = COMPOUND_STRING("G-Max Sweetness"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Appletun attack.\n" + "Heals ally status conditions."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GRASS, @@ -22359,7 +22515,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SANDBLAST] = { .name = COMPOUND_STRING("G-Max Sandblast"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Sandaconda attack.\n" + "Traps foes in a sandstorm."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_GROUND, @@ -22379,7 +22537,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STUN_SHOCK] = { .name = COMPOUND_STRING("G-Max Stun Shock"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Toxtricity attack.\n" + "Poisons or paralyzes foes."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_ELECTRIC, @@ -22399,7 +22559,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_CENTIFERNO] = { .name = COMPOUND_STRING("G-Max Centiferno"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Toxtricity attack.\n" + "Traps foes in flames."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FIRE, @@ -22419,7 +22581,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SMITE] = { .name = COMPOUND_STRING("G-Max Smite"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Hatterene attack.\n" + "Confuses opponents."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FAIRY, @@ -22440,7 +22604,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_SNOOZE] = { .name = COMPOUND_STRING("G-Max Snooze"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Grimmsnarl attack.\n" + "Lulls foes into sleep."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DARK, @@ -22460,7 +22626,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_FINALE] = { .name = COMPOUND_STRING("G-Max Finale"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Alcremie attack.\n" + "Heals ally HP."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_FAIRY, @@ -22480,7 +22648,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_STEELSURGE] = { .name = COMPOUND_STRING("G-Max Steelsurge"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Copperajah attack.\n" + "Scatters sharp spikes."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_STEEL, @@ -22500,7 +22670,9 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_DEPLETION] = { .name = COMPOUND_STRING("G-Max Depletion"), - .description = sNullDescription, + .description = COMPOUND_STRING( + "G-max Duraludon attack.\n" + "Reduces target's PP."), //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DRAGON, @@ -22520,7 +22692,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_ONE_BLOW] = { .name = COMPOUND_STRING("G-Max One Blow"), - .description = sNullDescription, + .description = sGMaxOneBlowDescription, //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_DARK, @@ -22536,7 +22708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_G_MAX_RAPID_FLOW] = { .name = COMPOUND_STRING("G-Max Rapid Flow"), - .description = sNullDescription, + .description = sGMaxOneBlowDescription, //ANIM TODO .effect = EFFECT_MAX_MOVE, .power = 10, .type = TYPE_WATER, diff --git a/test/text.c b/test/text.c index 7650c2dd59..8e9a205196 100644 --- a/test/text.c +++ b/test/text.c @@ -93,7 +93,7 @@ TEST("Move descriptions fit on Pokemon Summary Screen") u32 i; const u32 fontId = FONT_NORMAL, widthPx = 152; u32 move = MOVE_NONE; - for (i = 1; i < MOVES_COUNT; i++) + for (i = 1; i < MOVES_COUNT_ALL; i++) { PARAMETRIZE_LABEL("%S", GetMoveDescription(i)) { move = i; } } From 75cd16dae0c279b4db4f57196b6e02875bc9a214 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 10:44:37 +0200 Subject: [PATCH 054/187] Fix potential bug in BattleScript_FriskActivates (#6850) --- data/battle_scripts_1.s | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index ada937ff4a..4967e90d95 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -8528,9 +8528,11 @@ BattleScript_FriskMsg:: BattleScript_FriskActivates:: saveattacker + savetarget copybyte gBattlerAttacker, sBATTLER tryfriskmsg BS_SCRIPTING restoreattacker + restoretarget end3 BattleScript_ImposterActivates:: From a086d5f592a944fb97e6deb044cf67180e8f248d Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 10:45:48 +0200 Subject: [PATCH 055/187] Reverts wrongly done gem fix and renames struggle effect (#6806) --- data/battle_scripts_1.s | 2 +- include/battle_scripts.h | 2 +- include/constants/battle_move_effects.h | 2 +- src/battle_main.c | 6 ++++-- src/battle_script_commands.c | 3 +-- src/data/battle_move_effects.h | 4 ++-- src/data/moves_info.h | 2 +- test/battle/hold_effect/gems.c | 16 ---------------- 8 files changed, 11 insertions(+), 26 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 4967e90d95..7abff820b9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5229,7 +5229,7 @@ BattleScript_EffectSnatch:: waitmessage B_WAIT_TIME_LONG goto BattleScript_MoveEnd -BattleScript_EffectRecoilHP25:: +BattleScript_EffectStruggle:: jumpifnotmove MOVE_STRUGGLE, BattleScript_EffectHit incrementgamestat GAME_STAT_USED_STRUGGLE goto BattleScript_EffectHit diff --git a/include/battle_scripts.h b/include/battle_scripts.h index 25d96dc4b8..ab25df0684 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -816,7 +816,7 @@ extern const u8 BattleScript_MoveEffectEerieSpell[]; extern const u8 BattleScript_EffectJungleHealing[]; extern const u8 BattleScript_EffectCoaching[]; extern const u8 BattleScript_EffectDecorate[]; -extern const u8 BattleScript_EffectRecoilHP25[]; +extern const u8 BattleScript_EffectStruggle[]; extern const u8 BattleScript_EffectStuffCheeks[]; extern const u8 BattleScript_MoveEffectLightScreen[]; extern const u8 BattleScript_MoveEffectReflect[]; diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 6525cf1544..073d4d2058 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -292,7 +292,7 @@ enum { EFFECT_DYNAMAX_DOUBLE_DMG, EFFECT_DECORATE, EFFECT_SNIPE_SHOT, - EFFECT_RECOIL_HP_25, + EFFECT_STRUGGLE, EFFECT_STUFF_CHEEKS, EFFECT_GRAV_APPLE, EFFECT_HYPERSPACE_FURY, diff --git a/src/battle_main.c b/src/battle_main.c index 3f6c5e8617..7b33e16374 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -6074,10 +6074,12 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) gBattleStruct->dynamicMoveType = TYPE_ELECTRIC | F_DYNAMIC_TYPE_SET; // Check if a gem should activate. + u32 effect = GetMoveEffect(move); if (holdEffect == HOLD_EFFECT_GEMS && GetBattleMoveType(move) == ItemId_GetSecondaryId(heldItem) - && GetMoveEffect(move) != EFFECT_PLEDGE - && GetMovePower(move) > 1) + && effect != EFFECT_PLEDGE + && effect != EFFECT_OHKO + && effect != EFFECT_STRUGGLE) { gSpecialStatuses[battler].gemParam = GetBattlerHoldEffectParam(battler); gSpecialStatuses[battler].gemBoost = TRUE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 9d9e183a46..716e562aeb 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2201,8 +2201,7 @@ static void Cmd_adjustdamage(void) if (gSpecialStatuses[gBattlerAttacker].gemBoost && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && gBattleMons[gBattlerAttacker].item - && gCurrentMove != MOVE_STRUGGLE) + && gBattleMons[gBattlerAttacker].item) { BattleScriptPushCursor(); gBattlescriptCurrInstr = BattleScript_GemActivates; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index d5b3d5dc54..6b4741ab5e 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -1876,9 +1876,9 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_RECOIL_HP_25] = + [EFFECT_STRUGGLE] = { - .battleScript = BattleScript_EffectRecoilHP25, + .battleScript = BattleScript_EffectStruggle, .battleTvScore = 0, // TODO: Assign points }, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index fa93c75054..70d3184ece 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -4333,7 +4333,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = "Used only if all PP are gone.\n" "Also hurts the user a little."), #if B_UPDATED_MOVE_DATA >= GEN_4 - .effect = EFFECT_RECOIL_HP_25, + .effect = EFFECT_STRUGGLE, .accuracy = 0, .mirrorMoveBanned = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ diff --git a/test/battle/hold_effect/gems.c b/test/battle/hold_effect/gems.c index 5486443808..52c85d7fb5 100644 --- a/test/battle/hold_effect/gems.c +++ b/test/battle/hold_effect/gems.c @@ -87,19 +87,3 @@ SINGLE_BATTLE_TEST("Gem is consumed if the move type is changed") ANIMATION(ANIM_TYPE_MOVE, MOVE_FEINT_ATTACK, player); } } - -SINGLE_BATTLE_TEST("Gem is not consumed if a no type damage move is used") //ie. Counter, Psywave, Super Fang. All these moves have 1 base power. -{ - ASSUME(GetMovePower(MOVE_PSYWAVE) == 1); - GIVEN { - PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_PSYCHIC_GEM); }; - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(player, MOVE_PSYWAVE); } - } SCENE { - NONE_OF { - ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, player); - MESSAGE("The Psychic Gem strengthened Wobbuffet's power!"); - } - } -} From e42890e95461e490bc12618f4c7ab16aa3232cac Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Thu, 15 May 2025 11:26:18 +0200 Subject: [PATCH 056/187] Consolidates a bunch of battle controller functions (#6838) --- include/battle_controllers.h | 9 ++ src/battle_controller_link_opponent.c | 66 ++----------- src/battle_controller_link_partner.c | 42 +------- src/battle_controller_opponent.c | 55 +---------- src/battle_controller_player.c | 14 +-- src/battle_controller_player_partner.c | 42 +------- src/battle_controller_recorded_opponent.c | 82 ++-------------- src/battle_controller_recorded_player.c | 42 +------- src/battle_controllers.c | 113 ++++++++++++++++++++++ 9 files changed, 155 insertions(+), 310 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index a338e8707a..be83f5864a 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -336,4 +336,13 @@ void SetControllerToLinkOpponent(u32 battler); // link partner void SetControllerToLinkPartner(u32 battler); +void TrySetBattlerShadowSpriteCallback(u32 battler); + +bool32 TryShinyAnimAfterMonAnimUtil(u32 battler); +bool32 SwitchIn_ShowSubstituteUtil(u32 battler); +bool32 SwitchIn_WaitAndEndUtil(u32 battler); +bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler); +bool32 SwitchIn_ShowHealthboxUtil(u32 battler); +bool32 SwitchIn_TryShinyAnimUtil(u32 battler); + #endif // GUARD_BATTLE_CONTROLLERS_H diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index 2f4d579996..b9cced954f 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -280,84 +280,32 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) static void TryShinyAnimAfterMonAnim(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - else if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - LinkOpponentBufferExecCompleted(battler); - } - } + if (TryShinyAnimAfterMonAnimUtil(battler)) + LinkOpponentBufferExecCompleted(battler); } static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; - } } static void SwitchIn_HandleSoundAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) - { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2) - { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - LinkOpponentBufferExecCompleted(battler); - } - } + if (SwitchIn_HandleSoundAndEndUtil(battler)) + LinkOpponentBufferExecCompleted(battler); } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - CopyBattleSpriteInvisibility(battler); + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void LinkOpponentBufferExecCompleted(u32 battler) diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index 7815793ca8..54f42be7ec 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -130,60 +130,26 @@ static void WaitForMonAnimAfterLoad(u32 battler) static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(battler); - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; - } } static void SwitchIn_WaitAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { + if (SwitchIn_WaitAndEndUtil(battler)) LinkPartnerBufferExecCompleted(battler); - } } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(GetBattlerMon(battler), battler); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void LinkPartnerBufferExecCompleted(u32 battler) diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 9b24833965..908d2eca8e 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -212,19 +212,6 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } } -static void TrySetBattlerShadowSpriteCallback(u32 battler) -{ - if (gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdPrimary].callback == SpriteCallbackDummy) - { - if (B_ENEMY_MON_SHADOW_STYLE <= GEN_3 - || P_GBA_STYLE_SPECIES_GFX == TRUE - || gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdSecondary].callback == SpriteCallbackDummy) - { - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); - } - } -} - static void Intro_TryShinyAnimShowHealthbox(u32 battler) { bool32 bgmRestored = FALSE; @@ -343,58 +330,26 @@ static void TryShinyAnimAfterMonAnim(u32 battler) static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; - } } static void SwitchIn_HandleSoundAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive && !IsCryPlayingOrClearCrySongs()) - { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2) - { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - OpponentBufferExecCompleted(battler); - } - } + if (SwitchIn_HandleSoundAndEndUtil(battler)) + OpponentBufferExecCompleted(battler); } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - CopyBattleSpriteInvisibility(battler); + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - TryShinyAnimation(battler, GetBattlerMon(battler)); - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void OpponentBufferExecCompleted(u32 battler) diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index 2acf9ebb5f..54ca464d64 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1384,10 +1384,8 @@ static void SwitchIn_CleanShinyAnimShowSubstitute(u32 battler) static void SwitchIn_HandleSoundAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && !IsCryPlayingOrClearCrySongs()) + if (SwitchIn_HandleSoundAndEndUtil(battler)) { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); HandleLowHpMusicChange(GetBattlerMon(battler), battler); PlayerBufferExecCompleted(battler); } @@ -1395,16 +1393,8 @@ static void SwitchIn_HandleSoundAndEnd(u32 battler) static void SwitchIn_TryShinyAnimShowHealthbox(u32 battler) { - // Start shiny animation if applicable - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - TryShinyAnimation(battler, GetBattlerMon(battler)); - - // Wait for ball anim, then show healthbox - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) + if (SwitchIn_TryShinyAnimUtil(battler)) { - DestroySprite(&gSprites[gBattleControllerData[battler]]); UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); StartHealthboxSlideIn(battler); SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index ed3cb9db0b..182b86db88 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -202,60 +202,26 @@ static void WaitForMonAnimAfterLoad(u32 battler) static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(battler); - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; - } } static void SwitchIn_WaitAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { + if (SwitchIn_WaitAndEndUtil(battler)) PlayerPartnerBufferExecCompleted(battler); - } } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(GetBattlerMon(battler), battler); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void PlayerPartnerBufferExecCompleted(u32 battler) diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 7cfd74c057..8223566f1b 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -196,20 +196,6 @@ static void Intro_WaitForShinyAnimAndHealthbox(u32 battler) } } -static void TrySetBattlerShadowSpriteCallback(u32 battler) -{ - - if (gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdPrimary].callback == SpriteCallbackDummy) - { - if (B_ENEMY_MON_SHADOW_STYLE <= GEN_3 - || P_GBA_STYLE_SPECIES_GFX == TRUE - || gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdSecondary].callback == SpriteCallbackDummy) - { - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); - } - } -} - static void Intro_TryShinyAnimShowHealthbox(u32 battler) { bool32 bgmRestored = FALSE; @@ -302,86 +288,32 @@ static void Intro_TryShinyAnimShowHealthbox(u32 battler) static void TryShinyAnimAfterMonAnim(u32 battler) { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - && gSprites[gBattlerSpriteIds[battler]].x2 == 0) - { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - else - { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - RecordedOpponentBufferExecCompleted(battler); - } - } - } + if (TryShinyAnimAfterMonAnimUtil(battler)) + RecordedOpponentBufferExecCompleted(battler); } static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_HandleSoundAndEnd; - } } static void SwitchIn_HandleSoundAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && !IsCryPlayingOrClearCrySongs()) - { - if (gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy - || gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy_2) - { - m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); - RecordedOpponentBufferExecCompleted(battler); - } - } + if (SwitchIn_HandleSoundAndEndUtil(battler)) + RecordedOpponentBufferExecCompleted(battler); } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - CopyBattleSpriteInvisibility(battler); + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive - && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) - TryShinyAnimation(battler, GetBattlerMon(battler)); - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); - SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void RecordedOpponentHandleLoadMonSprite(u32 battler) diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index bf7b6c03d4..9249bbded1 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -279,60 +279,26 @@ static void WaitForMonAnimAfterLoad(u32 battler) static void SwitchIn_ShowSubstitute(u32 battler) { - if (gSprites[gHealthboxSpriteIds[battler]].callback == SpriteCallbackDummy) - { - CopyBattleSpriteInvisibility(battler); - if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) - InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); - + if (SwitchIn_ShowSubstituteUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_WaitAndEnd; - } } static void SwitchIn_WaitAndEnd(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive - && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy) - { + if (SwitchIn_WaitAndEndUtil(battler)) RecordedPlayerBufferExecCompleted(battler); - } } static void SwitchIn_ShowHealthbox(u32 battler) { - if (gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) - { - gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; - gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; - - FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); - FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); - - CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); - HandleLowHpMusicChange(GetBattlerMon(battler), battler); - StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); - UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); - StartHealthboxSlideIn(battler); - SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); - + if (SwitchIn_ShowHealthboxUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowSubstitute; - } } static void SwitchIn_TryShinyAnim(u32 battler) { - if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - TryShinyAnimation(battler, GetBattlerMon(battler)); - } - - if (gSprites[gBattleControllerData[battler]].callback == SpriteCallbackDummy - && !gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) - { - DestroySprite(&gSprites[gBattleControllerData[battler]]); + if (SwitchIn_TryShinyAnimUtil(battler)) gBattlerControllerFuncs[battler] = SwitchIn_ShowHealthbox; - } } static void RecordedPlayerBufferExecCompleted(u32 battler) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index ed6a95ef8d..0dbc123da9 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -14,6 +14,7 @@ #include "event_object_movement.h" #include "link.h" #include "link_rfu.h" +#include "m4a.h" #include "palette.h" #include "party_menu.h" #include "recorded_battle.h" @@ -3081,3 +3082,115 @@ static u32 ReturnAnimIdForBattler(bool32 wasPlayerSideKnockedOut, u32 specificBa return GetSpeciesBackAnimSet(species); } +void TrySetBattlerShadowSpriteCallback(u32 battler) +{ + if (gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdPrimary].callback == SpriteCallbackDummy + && (B_ENEMY_MON_SHADOW_STYLE <= GEN_3 || P_GBA_STYLE_SPECIES_GFX == TRUE + || gSprites[gBattleSpritesDataPtr->healthBoxesData[battler].shadowSpriteIdSecondary].callback == SpriteCallbackDummy)) + SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); +} + +bool32 TryShinyAnimAfterMonAnimUtil(u32 battler) +{ + if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy + || gSprites[gBattlerSpriteIds[battler]].x2 != 0) + return FALSE; + + if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + { + TryShinyAnimation(battler, GetBattlerMon(battler)); + return FALSE; + } + + if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim) + return FALSE; + + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + return TRUE; +} + +bool32 SwitchIn_ShowSubstituteUtil(u32 battler) +{ + if (gSprites[gHealthboxSpriteIds[battler]].callback != SpriteCallbackDummy) + return FALSE; + + if (GetBattlerSide(battler) == B_SIDE_PLAYER) + CopyBattleSpriteInvisibility(battler); + + if (gBattleSpritesDataPtr->battlerData[battler].behindSubstitute) + InitAndLaunchSpecialAnimation(battler, battler, battler, B_ANIM_MON_TO_SUBSTITUTE); + + return TRUE; +} + +bool32 SwitchIn_WaitAndEndUtil(u32 battler) +{ + return !gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive + && gSprites[gBattlerSpriteIds[battler]].callback == SpriteCallbackDummy; +} + +bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler) +{ + if (gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive || IsCryPlayingOrClearCrySongs()) + return FALSE; + + if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy + && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy_2 + && GetBattlerSide(battler) == B_SIDE_OPPONENT) + return FALSE; + + m4aMPlayVolumeControl(&gMPlayInfo_BGM, TRACKS_ALL, 0x100); + return TRUE; +} + +bool32 SwitchIn_ShowHealthboxUtil(u32 battler) +{ + u32 side = GetBattlerSide(battler); + + if (!gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim + || (side == B_SIDE_OPPONENT && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy)) + return FALSE; + + gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim = FALSE; + gBattleSpritesDataPtr->healthBoxesData[battler].finishedShinyMonAnim = FALSE; + FreeSpriteTilesByTag(ANIM_TAG_GOLD_STARS); + FreeSpritePaletteByTag(ANIM_TAG_GOLD_STARS); + + if (side == B_SIDE_PLAYER) + { + CreateTask(Task_PlayerController_RestoreBgmAfterCry, 10); + HandleLowHpMusicChange(GetBattlerMon(battler), battler); + } + + StartSpriteAnim(&gSprites[gBattlerSpriteIds[battler]], 0); + UpdateHealthboxAttribute(gHealthboxSpriteIds[battler], GetBattlerMon(battler), HEALTHBOX_ALL); + StartHealthboxSlideIn(battler); + SetHealthboxSpriteVisible(gHealthboxSpriteIds[battler]); + + if (side == B_SIDE_OPPONENT) + CopyBattleSpriteInvisibility(battler); + + return TRUE; +} + +bool32 SwitchIn_TryShinyAnimUtil(u32 battler) +{ + if (!gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive + && !gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) + TryShinyAnimation(battler, GetBattlerMon(battler)); + + if (gSprites[gBattleControllerData[battler]].callback != SpriteCallbackDummy + || gBattleSpritesDataPtr->healthBoxesData[battler].ballAnimActive) + return FALSE; + + DestroySprite(&gSprites[gBattleControllerData[battler]]); + + if (GetBattlerSide(battler) == B_SIDE_OPPONENT) + SetBattlerShadowSpriteCallback(battler, GetMonData(GetBattlerMon(battler), MON_DATA_SPECIES)); + + return TRUE; +} From 44d9b9c9e60a42a33d2cfe7c9c81e314f9056c53 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 15 May 2025 12:43:50 +0200 Subject: [PATCH 057/187] Further moveend changes (move blocks) (#6820) --- include/battle.h | 1 - include/constants/battle.h | 2 - include/constants/battle_move_effects.h | 1 + include/constants/battle_script_commands.h | 1 - src/battle_ai_main.c | 44 ++-- src/battle_script_commands.c | 231 ++++++++++----------- src/battle_util.c | 2 - src/data/battle_move_effects.h | 6 + src/data/moves_info.h | 21 +- test/battle/ability/harvest.c | 2 +- test/battle/ability/parental_bond.c | 2 +- test/battle/ability/pickup.c | 2 +- test/battle/ability/shield_dust.c | 4 +- test/battle/ability/unburden.c | 6 +- test/battle/hold_effect/covert_cloak.c | 4 +- test/battle/move_effect/smack_down.c | 2 +- test/battle/move_effect/thousand_arrows.c | 2 +- 17 files changed, 157 insertions(+), 176 deletions(-) diff --git a/include/battle.h b/include/battle.h index a2a142c9ae..785f92de4c 100644 --- a/include/battle.h +++ b/include/battle.h @@ -720,7 +720,6 @@ struct BattleStruct u8 soulheartBattlerId; u8 friskedBattler; // Frisk needs to identify 2 battlers in double battles. u8 sameMoveTurns[MAX_BATTLERS_COUNT]; // For Metronome, number of times the same moves has been SUCCESFULLY used. - u16 moveEffect2; // For Knock Off u16 changedSpecies[NUM_BATTLE_SIDES][PARTY_SIZE]; // For forms when multiple mons can change into the same pokemon. u8 quickClawBattlerId; struct LostItem itemLost[NUM_BATTLE_SIDES][PARTY_SIZE]; // Pokemon that had items consumed or stolen (two bytes per party member per side) diff --git a/include/constants/battle.h b/include/constants/battle.h index 577303ccd4..881be000c8 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -374,10 +374,8 @@ enum MoveEffects MOVE_EFFECT_EVS_MINUS_2, MOVE_EFFECT_SCALE_SHOT, MOVE_EFFECT_THRASH, - MOVE_EFFECT_KNOCK_OFF, MOVE_EFFECT_DEF_SPDEF_DOWN, MOVE_EFFECT_CLEAR_SMOG, - MOVE_EFFECT_SMACK_DOWN, MOVE_EFFECT_FLAME_BURST, MOVE_EFFECT_FEINT, MOVE_EFFECT_V_CREATE, diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 1bd9975e56..a714e04998 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -354,6 +354,7 @@ enum BattleMoveEffects EFFECT_RAPID_SPIN, EFFECT_SPECTRAL_THIEF, EFFECT_RECOIL, + EFFECT_SMACK_DOWN, NUM_BATTLE_MOVE_EFFECTS, }; diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index 34fc40452f..2eeac282ce 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -263,7 +263,6 @@ enum MoveEndEffects MOVEEND_FIRST_MOVE_BLOCK, MOVEEND_ITEM_EFFECTS_ALL, MOVEEND_SYMBIOSIS, - MOVEEND_HIT_SWITCH_TARGET, MOVEEND_KINGSROCK, // These item effects will occur each strike of a multi-hit move MOVEEND_SUBSTITUTE, MOVEEND_SKY_DROP_CONFUSE, diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index ac5a635b4e..0a43bc81ed 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4765,6 +4765,28 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_SPECTRAL_THIEF: ADJUST_SCORE(AI_ShouldCopyStatChanges(battlerAtk, battlerDef)); break; + case EFFECT_SMACK_DOWN: + if (!IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case EFFECT_KNOCK_OFF: + if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) + { + switch (aiData->holdEffects[battlerDef]) + { + case HOLD_EFFECT_IRON_BALL: + if (HasMoveEffect(battlerDef, EFFECT_FLING)) + ADJUST_SCORE(DECENT_EFFECT); + break; + case HOLD_EFFECT_LAGGING_TAIL: + case HOLD_EFFECT_STICKY_BARB: + break; + default: + ADJUST_SCORE(DECENT_EFFECT); + break; + } + } + break; default: break; } // move effect checks @@ -4904,28 +4926,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) else if (ItemId_GetPocket(aiData->items[battlerDef]) == POCKET_BERRIES || aiData->holdEffects[battlerDef] == HOLD_EFFECT_GEMS) ADJUST_SCORE(DECENT_EFFECT); break; - case MOVE_EFFECT_SMACK_DOWN: - if (!IsBattlerGrounded(battlerDef) && HasDamagingMoveOfType(battlerAtk, TYPE_GROUND) && !CanTargetFaintAi(battlerDef, battlerAtk)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case MOVE_EFFECT_KNOCK_OFF: - if (CanKnockOffItem(battlerDef, aiData->items[battlerDef])) - { - switch (aiData->holdEffects[battlerDef]) - { - case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) - ADJUST_SCORE(DECENT_EFFECT); - break; - case HOLD_EFFECT_LAGGING_TAIL: - case HOLD_EFFECT_STICKY_BARB: - break; - default: - ADJUST_SCORE(DECENT_EFFECT); - break; - } - } - break; case MOVE_EFFECT_STEAL_ITEM: { bool32 canSteal = FALSE; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 056882d191..51ada23c36 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -964,7 +964,6 @@ static const u16 sFinalStrikeOnlyEffects[] = MOVE_EFFECT_BUG_BITE, MOVE_EFFECT_STEAL_ITEM, MOVE_EFFECT_REMOVE_ARG_TYPE, - MOVE_EFFECT_SMACK_DOWN, MOVE_EFFECT_REMOVE_STATUS, MOVE_EFFECT_RECOIL_HP_25, MOVE_EFFECT_PREVENT_ESCAPE, @@ -3282,17 +3281,11 @@ void SetMoveEffect(bool32 primary, bool32 certain) switch (gBattleScripting.moveEffect) // Set move effects which happen later on { - case MOVE_EFFECT_KNOCK_OFF: - case MOVE_EFFECT_SMACK_DOWN: - case MOVE_EFFECT_REMOVE_STATUS: - gBattleStruct->moveEffect2 = gBattleScripting.moveEffect; - gBattlescriptCurrInstr++; - return; case MOVE_EFFECT_STEALTH_ROCK: case MOVE_EFFECT_SPIKES: case MOVE_EFFECT_PAYDAY: - case MOVE_EFFECT_STEAL_ITEM: case MOVE_EFFECT_BUG_BITE: + case MOVE_EFFECT_STEAL_ITEM: activateAfterFaint = TRUE; break; } @@ -3636,34 +3629,32 @@ void SetMoveEffect(bool32 primary, bool32 certain) gBattlescriptCurrInstr++; break; case MOVE_EFFECT_STEAL_ITEM: + if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) + || gBattleMons[gBattlerAttacker].item != ITEM_NONE + || gBattleMons[gBattlerTarget].item == ITEM_NONE) { - if (!CanStealItem(gBattlerAttacker, gBattlerTarget, gBattleMons[gBattlerTarget].item) - || gBattleMons[gBattlerAttacker].item != ITEM_NONE - || gBattleMons[gBattlerTarget].item == ITEM_NONE) - { - gBattlescriptCurrInstr++; - } - else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) - { - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_NoItemSteal; + gBattlescriptCurrInstr++; + } + else if (GetBattlerAbility(gBattlerTarget) == ABILITY_STICKY_HOLD) + { + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; - gLastUsedAbility = gBattleMons[gBattlerTarget].ability; - RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); - } - else - { - StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item + gLastUsedAbility = gBattleMons[gBattlerTarget].ability; + RecordAbilityBattle(gBattlerTarget, gLastUsedAbility); + } + else + { + StealTargetItem(gBattlerAttacker, gBattlerTarget); // Attacker steals target item - if (!(B_STEAL_WILD_ITEMS >= GEN_9 - && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) - { - gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) - gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later - } - BattleScriptPush(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BattleScript_ItemSteal; + if (!(B_STEAL_WILD_ITEMS >= GEN_9 + && !(gBattleTypeFlags & (BATTLE_TYPE_TRAINER | BATTLE_TYPE_PALACE)))) + { + gBattleMons[gBattlerAttacker].item = ITEM_NONE; // Item assigned later on with thief (see MOVEEND_CHANGED_ITEMS) + gBattleStruct->changedItems[gBattlerAttacker] = gLastUsedItem; // Stolen item to be assigned later } + BattleScriptPush(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = BattleScript_ItemSteal; } break; case MOVE_EFFECT_PREVENT_ESCAPE: @@ -4447,6 +4438,44 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; } + case MOVE_EFFECT_REMOVE_STATUS: + { + u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); + if ((gBattleMons[gEffectBattler].status1 & argStatus) + && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gEffectBattler)))) + { + gBattleMons[gEffectBattler].status1 &= ~(argStatus); + BtlController_EmitSetMonData(gEffectBattler, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBattler].status1); + MarkBattlerForControllerExec(gEffectBattler); + BattleScriptPush(gBattlescriptCurrInstr + 1); + + switch (argStatus) + { + case STATUS1_PARALYSIS: + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; + break; + case STATUS1_SLEEP: + TryDeactivateSleepClause(GetBattlerSide(gEffectBattler), gBattlerPartyIndexes[gBattlerTarget]); + gBattlescriptCurrInstr = BattleScript_TargetWokeUp; + break; + case STATUS1_BURN: + gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; + break; + case STATUS1_FREEZE: + gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; + break; + case STATUS1_FROSTBITE: + gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; + break; + case STATUS1_POISON: + case STATUS1_TOXIC_POISON: + case STATUS1_PSN_ANY: + gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; + break; + } + } + break; + } } } } @@ -6513,17 +6542,56 @@ static void Cmd_moveend(void) effect = TRUE; gBattleScripting.moveendState++; break; - case MOVEEND_FIRST_MOVE_BLOCK: // For effects which should happen after target items, for example Knock Off after damage from Rocky Helmet. - { - switch (gBattleStruct->moveEffect2) + case MOVEEND_FIRST_MOVE_BLOCK: + if ((gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && IsBattlerAlive(gBattlerTarget)) + || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) + { + gBattleScripting.moveendState++; + break; + } + + switch (moveEffect) { - case MOVE_EFFECT_KNOCK_OFF: + case EFFECT_KNOCK_OFF: if (!DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) - { effect = TryKnockOffBattleScript(gBattlerTarget); + break; + case EFFECT_HIT_SWITCH_TARGET: + if (IsBattlerTurnDamaged(gBattlerTarget) + && IsBattlerAlive(gBattlerTarget) + && IsBattlerAlive(gBattlerAttacker) + && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER) + && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) + { + u32 targetAbility = GetBattlerAbility(gBattlerTarget); + if (targetAbility == ABILITY_GUARD_DOG) + { + gBattleScripting.moveendState++; + break; + } + + effect = TRUE; + BattleScriptPushCursor(); + if (targetAbility == ABILITY_SUCTION_CUPS) + { + gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet; + } + else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) + { + gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet; + } + else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) + { + gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed; + } + else + { + gBattleScripting.switchCase = B_SWITCH_HIT; + gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget; + } } break; - case MOVE_EFFECT_SMACK_DOWN: + case EFFECT_SMACK_DOWN: if (!IsBattlerGrounded(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove)) @@ -6535,97 +6603,17 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_MoveEffectSmackDown; } break; - case MOVE_EFFECT_REMOVE_STATUS: // Smelling salts, Wake-Up Slap, Sparkling Aria - { - u32 argStatus = GetMoveEffectArg_Status(gCurrentMove); - if ((gBattleMons[gBattlerTarget].status1 & argStatus) - && IsBattlerAlive(gBattlerTarget) - && !DoesSubstituteBlockMove(gBattlerAttacker, gBattlerTarget, gCurrentMove) - && (NumAffectedSpreadMoveTargets() > 1 || !IsMoveEffectBlockedByTarget(GetBattlerAbility(gBattlerTarget)))) - { - gBattleMons[gBattlerTarget].status1 &= ~(argStatus); - - BtlController_EmitSetMonData(gBattlerTarget, 0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBattlerTarget].status1); - MarkBattlerForControllerExec(gBattlerTarget); - effect = TRUE; - BattleScriptPush(gBattlescriptCurrInstr); - - switch (argStatus) - { - case STATUS1_PARALYSIS: - gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; - break; - case STATUS1_SLEEP: - TryDeactivateSleepClause(GetBattlerSide(gBattlerTarget), gBattlerPartyIndexes[gBattlerTarget]); - gBattlescriptCurrInstr = BattleScript_TargetWokeUp; - break; - case STATUS1_BURN: - gBattlescriptCurrInstr = BattleScript_TargetBurnHeal; - break; - case STATUS1_FREEZE: - gBattlescriptCurrInstr = BattleScript_DefrostedViaFireMove; - break; - case STATUS1_FROSTBITE: - gBattlescriptCurrInstr = BattleScript_FrostbiteHealedViaFireMove; - break; - case STATUS1_POISON: - case STATUS1_TOXIC_POISON: - case STATUS1_PSN_ANY: - gBattlescriptCurrInstr = BattleScript_TargetPoisonHealed; - break; - } - } - break; // MOVE_EFFECT_REMOVE_STATUS - } + default: + break; } - gBattleStruct->moveEffect2 = 0; gBattleScripting.moveendState++; - break; // MOVEEND_MOVE_EFFECTS2 - } + 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_HIT_SWITCH_TARGET: - if (GetMoveEffect(gCurrentMove) == EFFECT_HIT_SWITCH_TARGET - && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) - && IsBattlerTurnDamaged(gBattlerTarget) - && IsBattlerAlive(gBattlerTarget) - && IsBattlerAlive(gBattlerAttacker) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER) - && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) - { - u32 targetAbility = GetBattlerAbility(gBattlerTarget); - if (targetAbility == ABILITY_GUARD_DOG) - { - gBattleScripting.moveendState++; - break; - } - - effect = TRUE; - BattleScriptPushCursor(); - if (targetAbility == ABILITY_SUCTION_CUPS) - { - gBattlescriptCurrInstr = BattleScript_AbilityPreventsPhasingOutRet; - } - else if (gStatuses3[gBattlerTarget] & STATUS3_ROOTED) - { - gBattlescriptCurrInstr = BattleScript_PrintMonIsRootedRet; - } - else if (GetActiveGimmick(gBattlerTarget) == GIMMICK_DYNAMAX) - { - gBattlescriptCurrInstr = BattleScript_HitSwitchTargetDynamaxed; - } - else - { - gBattleScripting.switchCase = B_SWITCH_HIT; - gBattlescriptCurrInstr = BattleScript_TryHitSwitchTarget; - } - } - gBattleScripting.moveendState++; - break; case MOVEEND_KINGSROCK: // King's rock // These effects will occur at each hit in a multi-strike move if (ItemBattleEffects(ITEMEFFECT_KINGSROCK, 0, FALSE)) @@ -7038,6 +7026,7 @@ static void Cmd_moveend(void) gBattlescriptCurrInstr = BattleScript_FellStingerRaisesStat; effect = TRUE; } + break; default: break; } diff --git a/src/battle_util.c b/src/battle_util.c index e7e7dbe10b..7c08b3e2f6 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8118,9 +8118,7 @@ static inline u32 CalcMoveBasePower(struct DamageCalculationData *damageCalcData // Comatose targets treated as if asleep if ((gBattleMons[battlerDef].status1 | (STATUS1_SLEEP * (abilityDef == ABILITY_COMATOSE))) & GetMoveEffectArg_Status(move) && !((GetMoveAdditionalEffectById(move, 0)->moveEffect == MOVE_EFFECT_REMOVE_STATUS) && DoesSubstituteBlockMove(battlerAtk, battlerDef, move))) - { basePower *= 2; - } break; case EFFECT_POWER_BASED_ON_TARGET_HP: basePower = gBattleMons[battlerDef].hp * basePower / gBattleMons[battlerDef].maxHP; diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index f034d8953d..90ec220b2b 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -2252,4 +2252,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleScript = BattleScript_EffectHit, .battleTvScore = 0, // TODO: Assign points }, + + [EFFECT_SMACK_DOWN] = + { + .battleScript = BattleScript_EffectHit, + .battleTvScore = 0, // TODO: Assign points + }, }; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 3676cbc955..951d8db34e 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -4441,14 +4441,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, + .additionalEffects = ADDITIONAL_EFFECTS({ + .moveEffect = MOVE_EFFECT_STEAL_ITEM, + }), .ignoresKingsRock = (B_UPDATED_MOVE_FLAGS == GEN_3 || B_UPDATED_MOVE_FLAGS == GEN_4), .meFirstBanned = TRUE, .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_STEAL_ITEM, - }), .contestEffect = CONTEST_EFFECT_APPEAL_AS_GOOD_AS_PREV_ONES, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -7412,9 +7412,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_PHYSICAL, .makesContact = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_KNOCK_OFF, - }), .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_SMART, .contestComboStarterId = 0, @@ -12295,7 +12292,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Throws a rock to knock the\n" "foe down to the ground."), - .effect = EFFECT_HIT, + .effect = EFFECT_SMACK_DOWN, .power = 50, .type = TYPE_ROCK, .accuracy = 100, @@ -12305,9 +12302,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_PHYSICAL, .damagesAirborne = TRUE, .skyBattleBanned = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_SMACK_DOWN, - }), .contestEffect = CONTEST_EFFECT_BADLY_STARTLE_FRONT_MON, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = 0, @@ -15598,7 +15592,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Can hit Flying foes, then\n" "knocks them to the ground."), - .effect = EFFECT_HIT, + .effect = EFFECT_SMACK_DOWN, .power = 90, .type = TYPE_GROUND, .accuracy = 100, @@ -15610,9 +15604,6 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .ignoreTypeIfFlyingAndUngrounded = TRUE, .metronomeBanned = TRUE, .skyBattleBanned = TRUE, - .additionalEffects = ADDITIONAL_EFFECTS({ - .moveEffect = MOVE_EFFECT_SMACK_DOWN, - }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_TOUGH, .contestComboStarterId = COMBO_STARTER_THOUSAND_ARROWS, @@ -15929,7 +15920,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .soundMove = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_REMOVE_STATUS, - .chance = 100, + .sheerForceBoost = SHEER_FORCE_BOOST, }), .contestEffect = CONTEST_EFFECT_HIGHLY_APPEALING, .contestCategory = CONTEST_CATEGORY_BEAUTY, diff --git a/test/battle/ability/harvest.c b/test/battle/ability/harvest.c index 8b9a445a0a..403d044f8f 100644 --- a/test/battle/ability/harvest.c +++ b/test/battle/ability/harvest.c @@ -135,7 +135,7 @@ SINGLE_BATTLE_TEST("Harvest doesn't restore a Berry when knocked off by Knock Of { PASSES_RANDOMLY(1, 1, RNG_HARVEST); GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_EXEGGUTOR) { Ability(ABILITY_HARVEST); Item(ITEM_SITRUS_BERRY); } } WHEN { diff --git a/test/battle/ability/parental_bond.c b/test/battle/ability/parental_bond.c index ef97341aa9..2635c740df 100644 --- a/test/battle/ability/parental_bond.c +++ b/test/battle/ability/parental_bond.c @@ -254,9 +254,9 @@ SINGLE_BATTLE_TEST("Parental Bond has no affect on multi hit moves and they stil SINGLE_BATTLE_TEST("Parental Bond Smack Down effect triggers after 2nd hit") { GIVEN { + ASSUME(GetMoveEffect(MOVE_SMACK_DOWN) == EFFECT_SMACK_DOWN); ASSUME(GetMoveCategory(MOVE_SMACK_DOWN) != DAMAGE_CATEGORY_STATUS); ASSUME(GetMoveStrikeCount(MOVE_SMACK_DOWN) < 2); - ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN)); PLAYER(SPECIES_KANGASKHAN) { Item(ITEM_KANGASKHANITE); } OPPONENT(SPECIES_SKARMORY); } WHEN { diff --git a/test/battle/ability/pickup.c b/test/battle/ability/pickup.c index 501e7f37bd..9db7c0f2de 100644 --- a/test/battle/ability/pickup.c +++ b/test/battle/ability/pickup.c @@ -164,7 +164,7 @@ SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it destroyed the item with I SINGLE_BATTLE_TEST("Pickup doesn't grant an item if it knocked off that item") { GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_ZIGZAGOON) { Ability(ABILITY_PICKUP); } OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); } } WHEN { diff --git a/test/battle/ability/shield_dust.c b/test/battle/ability/shield_dust.c index a2c0b16030..da6bbf87df 100644 --- a/test/battle/ability/shield_dust.c +++ b/test/battle/ability/shield_dust.c @@ -49,11 +49,11 @@ SINGLE_BATTLE_TEST("Shield Dust does not block primary effects") PARAMETRIZE { move = MOVE_PAY_DAY; } GIVEN { + ASSUME(GetMoveEffect(MOVE_THOUSAND_ARROWS) == EFFECT_SMACK_DOWN); + ASSUME(GetMoveEffect(MOVE_SMACK_DOWN) == EFFECT_SMACK_DOWN); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_INFESTATION, MOVE_EFFECT_WRAP, 0) == TRUE); - ASSUME(MoveHasAdditionalEffectWithChance(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN, 0) == TRUE); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_JAW_LOCK, MOVE_EFFECT_TRAP_BOTH, 0) == TRUE); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_PAY_DAY, MOVE_EFFECT_PAYDAY, 0) == TRUE); - ASSUME(MoveHasAdditionalEffectWithChance(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN, 0) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_VIVILLON) { Ability(ABILITY_SHIELD_DUST); } } WHEN { diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c index 63a72e2ace..a156906d35 100644 --- a/test/battle/ability/unburden.c +++ b/test/battle/ability/unburden.c @@ -26,7 +26,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") SINGLE_BATTLE_TEST("Unburden doubles speed once user gets their item knocked off") { GIVEN { - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } } WHEN { @@ -46,7 +46,7 @@ SINGLE_BATTLE_TEST("Unburden doesn't activate when item is consumed in Neutraliz { GIVEN { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } OPPONENT(SPECIES_WEEZING) { Speed(7); Ability(ABILITY_NEUTRALIZING_GAS); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } @@ -73,7 +73,7 @@ SINGLE_BATTLE_TEST("Unburden doubling speed effect is ignored by Neutralizing Ga { GIVEN { ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); - ASSUME(MoveHasAdditionalEffect(MOVE_KNOCK_OFF, MOVE_EFFECT_KNOCK_OFF)); + ASSUME(GetMoveEffect(MOVE_KNOCK_OFF) == EFFECT_KNOCK_OFF); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_POTION); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } OPPONENT(SPECIES_WEEZING) { Speed(7); Ability(ABILITY_NEUTRALIZING_GAS); } diff --git a/test/battle/hold_effect/covert_cloak.c b/test/battle/hold_effect/covert_cloak.c index 47c5f3f358..90593e7cc5 100644 --- a/test/battle/hold_effect/covert_cloak.c +++ b/test/battle/hold_effect/covert_cloak.c @@ -54,11 +54,11 @@ SINGLE_BATTLE_TEST("Covert Cloak does not block primary effects") PARAMETRIZE { move = MOVE_PAY_DAY; } GIVEN { + ASSUME(GetMoveEffect(MOVE_THOUSAND_ARROWS) == EFFECT_SMACK_DOWN); + ASSUME(GetMoveEffect(MOVE_SMACK_DOWN) == EFFECT_SMACK_DOWN); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_INFESTATION, MOVE_EFFECT_WRAP, 0) == TRUE); - ASSUME(MoveHasAdditionalEffectWithChance(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN, 0) == TRUE); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_JAW_LOCK, MOVE_EFFECT_TRAP_BOTH, 0) == TRUE); ASSUME(MoveHasAdditionalEffectWithChance(MOVE_PAY_DAY, MOVE_EFFECT_PAYDAY, 0) == TRUE); - ASSUME(MoveHasAdditionalEffectWithChance(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN, 0) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SKARMORY) { Item(ITEM_COVERT_CLOAK); } } WHEN { diff --git a/test/battle/move_effect/smack_down.c b/test/battle/move_effect/smack_down.c index eb924ea1ac..116ac36ce0 100644 --- a/test/battle/move_effect/smack_down.c +++ b/test/battle/move_effect/smack_down.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN) == TRUE); + ASSUME(GetMoveEffect(MOVE_SMACK_DOWN) == EFFECT_SMACK_DOWN); } SINGLE_BATTLE_TEST("Smack Down does not ground mons behind substitutes") diff --git a/test/battle/move_effect/thousand_arrows.c b/test/battle/move_effect/thousand_arrows.c index c62e71001d..53f27cc282 100644 --- a/test/battle/move_effect/thousand_arrows.c +++ b/test/battle/move_effect/thousand_arrows.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(MoveHasAdditionalEffect(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN)); + ASSUME(GetMoveEffect(MOVE_THOUSAND_ARROWS) == EFFECT_SMACK_DOWN); ASSUME(MoveIgnoresTypeIfFlyingAndUngrounded(MOVE_THOUSAND_ARROWS) == TRUE); } From 39022f3e6a14f32459e050202c7ad40c7aa1e433 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 15 May 2025 13:42:06 -0400 Subject: [PATCH 058/187] Fix FindMonThatAbsorbsOpponentsMove not seeing Mold Breaker or choice items (#6864) --- src/battle_ai_switch_items.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4445a54869..4b81908349 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -462,6 +462,8 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) return FALSE; if (AreStatsRaised(battler)) return FALSE; + if (IsMoldBreakerTypeAbility(opposingBattler, gAiLogicData->abilities[opposingBattler])) + return FALSE; // Don't switch if mon could OHKO for (i = 0; i < MAX_MON_MOVES; i++) @@ -472,7 +474,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) // Only check damage if it's a damaging move if (!IsBattleMoveStatus(aiMove)) { - if (AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) + if (!AI_DoesChoiceItemBlockMove(battler, aiMove) && AI_GetDamage(battler, opposingBattler, i, AI_ATTACKING, gAiLogicData) > gBattleMons[opposingBattler].hp) return FALSE; } } From 0ea1ebe8de03b5e3495050fe9193e0c37d1333bc Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 15 May 2025 13:53:51 -0400 Subject: [PATCH 059/187] Fix AI_FLAG_PREDICT_MOVES scoring bug (#6867) --- src/battle_ai_main.c | 18 +++++++++--------- src/battle_ai_util.c | 2 +- test/battle/ai/ai_flag_predict_move.c | 13 +++++++++++++ 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 0a43bc81ed..cbf4e9f6c2 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -358,7 +358,6 @@ void SetupAIPredictionData(u32 battler, enum SwitchType switchType) if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE) { gAiLogicData->predictedMove[opposingBattler] = gBattleMons[opposingBattler].moves[BattleAI_ChooseMoveIndex(opposingBattler)]; - DebugPrintf("Predicted move: %d", gAiLogicData->predictedMove[opposingBattler]); ModifySwitchAfterMoveScoring(opposingBattler); // Determine whether AI will use predictions this turn @@ -678,16 +677,17 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) u32 numOfBestMoves; s32 i; u64 flags = gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)]; + u32 opposingBattler = GetOppositeBattler(battler); gAiLogicData->partnerMove = 0; // no ally while (flags != 0) { if (flags & 1) { - if (IsBattlerPredictedToSwitch(gBattlerTarget) && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_INCOMING_MON)) - BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battler, gBattlerTarget); + if (IsBattlerPredictedToSwitch(opposingBattler) && (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_INCOMING_MON)) + BattleAI_DoAIProcessing_PredictedSwitchin(gAiThinkingStruct, gAiLogicData, battler, opposingBattler); else - BattleAI_DoAIProcessing(gAiThinkingStruct, battler, gBattlerTarget); + BattleAI_DoAIProcessing(gAiThinkingStruct, battler, opposingBattler); } flags >>= (u64)1; gAiThinkingStruct->aiLogicId++; @@ -695,7 +695,7 @@ static u32 ChooseMoveOrAction_Singles(u32 battler) for (i = 0; i < MAX_MON_MOVES; i++) { - gAiBattleData->finalScore[battler][gBattlerTarget][i] = gAiThinkingStruct->score[i]; + gAiBattleData->finalScore[battler][opposingBattler][i] = gAiThinkingStruct->score[i]; } numOfBestMoves = 1; @@ -1003,7 +1003,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); u32 i; u32 weather; - u32 predictedMove = ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE) && aiData->predictingMove) ? gAiLogicData->predictedMove[battlerDef] : aiData->lastUsedMove[battlerDef]; + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); u32 abilityAtk = aiData->abilities[battlerAtk]; u32 abilityDef = aiData->abilities[battlerDef]; s32 atkPriority = GetBattleMovePriority(battlerAtk, abilityAtk, move); @@ -2932,7 +2932,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) bool32 partnerProtecting = (partnerEffect == EFFECT_PROTECT); bool32 attackerHasBadAbility = (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating < 0); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); - u32 predictedMove = ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE) && aiData->predictingMove) ? gAiLogicData->predictedMove[battlerDef] : aiData->lastUsedMove[battlerDef]; + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); @@ -3503,7 +3503,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][movesetIndex]; s32 score = 0; - u32 predictedMove = ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE) && aiData->predictingMove) ? gAiLogicData->predictedMove[battlerDef] : aiData->lastUsedMove[battlerDef]; + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); u32 predictedType = GetMoveType(predictedMove); u32 predictedMoveSlot = GetMoveSlot(GetMovesArray(battlerDef), predictedMove); bool32 isDoubleBattle = IsValidDoubleBattle(battlerAtk); @@ -5611,7 +5611,7 @@ static s32 AI_PredictSwitch(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) enum BattleMoveEffects moveEffect = GetMoveEffect(move); struct AiLogicData *aiData = gAiLogicData; uq4_12_t effectiveness = aiData->effectiveness[battlerAtk][battlerDef][gAiThinkingStruct->movesetIndex]; - u32 predictedMove = ((gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_PREDICT_MOVE) && aiData->predictingMove) ? aiData->predictedMove[battlerDef] : aiData->lastUsedMove[battlerDef]; + u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); // Switch benefit switch (moveEffect) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 0b532b865c..c080ee5b43 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1142,7 +1142,7 @@ s32 AI_WhoStrikesFirst(u32 battlerAI, u32 battler, u32 moveConsidered) u32 abilityAI = gAiLogicData->abilities[battlerAI]; u32 abilityPlayer = gAiLogicData->abilities[battler]; - u32 predictedMove = ((gAiThinkingStruct->aiFlags[battlerAI] & AI_FLAG_PREDICT_MOVE) && gAiLogicData->predictingMove) ? gAiLogicData->predictedMove[battler] : gAiLogicData->lastUsedMove[battler]; + u32 predictedMove = GetIncomingMove(battlerAI, battler, gAiLogicData); s8 aiPriority = GetBattleMovePriority(battlerAI, abilityAI, moveConsidered); s8 playerPriority = GetBattleMovePriority(battler, abilityPlayer, predictedMove); diff --git a/test/battle/ai/ai_flag_predict_move.c b/test/battle/ai/ai_flag_predict_move.c index 362783f731..97a7c12afa 100644 --- a/test/battle/ai/ai_flag_predict_move.c +++ b/test/battle/ai/ai_flag_predict_move.c @@ -14,3 +14,16 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_MOVE: AI will predict player's move") TURN { MOVE(player, MOVE_SURF); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_PREDICT_MOVE: AI will still attack you when it should") +{ + PASSES_RANDOMLY(PREDICT_MOVE_CHANCE, 100, RNG_AI_PREDICT_MOVE); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_PREDICT_MOVE); + PLAYER(SPECIES_VAPOREON) { Ability(ABILITY_WATER_ABSORB); Moves(MOVE_SURF, MOVE_TACKLE); } + OPPONENT(SPECIES_SCEPTILE) { Moves(MOVE_LEAF_BLADE); } + OPPONENT(SPECIES_RHYDON) { Ability(ABILITY_ROCK_HEAD); Moves(MOVE_EARTHQUAKE); } + } WHEN { + TURN { MOVE(player, MOVE_SURF); EXPECT_MOVE(opponent, MOVE_LEAF_BLADE); } + } +} From 305690928633725b238c492cc1cabbceff5bce71 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 16 May 2025 01:58:40 -0400 Subject: [PATCH 060/187] Added weather accuracy move flags (#6857) --- include/battle_ai_util.h | 3 ++ include/constants/battle_move_effects.h | 3 -- include/move.h | 20 +++++++- src/battle_ai_main.c | 2 +- src/battle_ai_util.c | 49 ++++++++++++++++--- src/battle_dome.c | 16 ++++-- src/battle_script_commands.c | 7 ++- src/battle_tv.c | 4 +- src/data/battle_move_effects.h | 18 ------- src/data/moves_info.h | 20 +++++--- test/battle/move_effect_secondary/freeze.c | 16 ------ test/battle/move_effects_combined/hurricane.c | 3 +- .../accuracy_50_in_sun.c} | 15 +----- .../move_flags/always_hits_in_hail_snow.c | 19 +++++++ test/battle/move_flags/always_hits_in_rain.c | 16 ++++++ 15 files changed, 134 insertions(+), 77 deletions(-) rename test/battle/{move_effect/thunder.c => move_flags/accuracy_50_in_sun.c} (53%) create mode 100644 test/battle/move_flags/always_hits_in_hail_snow.c create mode 100644 test/battle/move_flags/always_hits_in_rain.c diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 2fce8cce95..03e6b9e21f 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -171,6 +171,9 @@ bool32 HasSubstituteIgnoringMove(u32 battler); bool32 HasHighCritRatioMove(u32 battler); bool32 HasMagicCoatAffectedMove(u32 battler); bool32 HasSnatchAffectedMove(u32 battler); +bool32 HasMoveThatAlwaysHitsInRain(u32 battler); +bool32 HasMoveThatHas50AccuracyInSun(u32 battler); +bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler); bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index a714e04998..0e0e8d6ecb 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -124,7 +124,6 @@ enum BattleMoveEffects EFFECT_EARTHQUAKE, EFFECT_FUTURE_SIGHT, EFFECT_SOLAR_BEAM, - EFFECT_THUNDER, EFFECT_TELEPORT, EFFECT_BEAT_UP, EFFECT_SEMI_INVULNERABLE, @@ -337,8 +336,6 @@ enum BattleMoveEffects EFFECT_FILLET_AWAY, EFFECT_IVY_CUDGEL, EFFECT_FICKLE_BEAM, - EFFECT_BLIZZARD, - EFFECT_RAIN_ALWAYS_HIT, // Unlike EFFECT_THUNDER, it doesn't get its accuracy reduced under sun. EFFECT_SHED_TAIL, EFFECT_UPPER_HAND, EFFECT_DRAGON_CHEER, diff --git a/include/move.h b/include/move.h index c49ba84f9a..1a70a81460 100644 --- a/include/move.h +++ b/include/move.h @@ -113,6 +113,9 @@ struct MoveInfo bool32 ignoresSubstitute:1; bool32 forcePressure:1; bool32 cantUseTwice:1; + bool32 alwaysHitsInRain:1; + bool32 accuracy50InSun:1; + bool32 alwaysHitsInHailSnow:1; // Ban flags bool32 gravityBanned:1; bool32 mirrorMoveBanned:1; @@ -129,7 +132,7 @@ struct MoveInfo bool32 sketchBanned:1; //Other bool32 validApprenticeMove:1; - u32 padding:10; + u32 padding:7; // end of word union { @@ -389,6 +392,21 @@ static inline bool32 MoveCantBeUsedTwice(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].cantUseTwice; } +static inline bool32 MoveAlwaysHitsInRain(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].alwaysHitsInRain; +} + +static inline bool32 MoveHas50AccuracyInSun(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].accuracy50InSun; +} + +static inline bool32 MoveAlwaysHitsInHailSnow(u32 moveId) +{ + return gMovesInfo[SanitizeMoveId(moveId)].alwaysHitsInHailSnow; +} + static inline bool32 IsMoveGravityBanned(u32 moveId) { return gMovesInfo[SanitizeMoveId(moveId)].gravityBanned; diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index cbf4e9f6c2..9fea906cff 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -4101,7 +4101,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_THUNDER) || HasMoveEffect(BATTLE_PARTNER(battlerDef), EFFECT_THUNDER)) + if (HasMoveThatHas50AccuracyInSun(battlerDef) || HasMoveThatHas50AccuracyInSun(BATTLE_PARTNER(battlerDef))) ADJUST_SCORE(WEAK_EFFECT); } break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index c080ee5b43..3c08f108dc 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1639,13 +1639,12 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) // discouraged from hitting weather = AI_GetWeather(); - if ((weather & B_WEATHER_SUN) && effect == EFFECT_THUNDER) + if ((weather & B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) return FALSE; - // increased accuracy but don't always hit - if ((weather & B_WEATHER_RAIN) && effect == EFFECT_THUNDER) + if ((weather & B_WEATHER_RAIN) && MoveAlwaysHitsInRain(move)) return TRUE; - if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && effect == EFFECT_BLIZZARD) + if ((weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) return TRUE; if (B_MINIMIZE_DMG_ACC >= GEN_6 && (gStatuses3[battlerDef] & STATUS3_MINIMIZED) && MoveIncreasesPowerToMinimizedTargets(move)) return TRUE; @@ -1722,7 +1721,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_OVERCOAT || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveEffect(battler, EFFECT_BLIZZARD) + || HasMoveThatAlwaysHitsInHailSnow(battler) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -1743,7 +1742,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff || atkAbility == ABILITY_HYDRATION || atkAbility == ABILITY_RAIN_DISH || atkAbility == ABILITY_DRY_SKIN - || HasMoveEffect(battlerAtk, EFFECT_THUNDER) + || HasMoveThatAlwaysHitsInRain(battlerAtk) || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) || HasMoveWithType(battlerAtk, TYPE_WATER))) { @@ -1789,7 +1788,7 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_FORECAST || ability == ABILITY_SLUSH_RUSH || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveEffect(battler, EFFECT_BLIZZARD) + || HasMoveThatAlwaysHitsInHailSnow(battler) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -2653,6 +2652,42 @@ bool32 HasSnatchAffectedMove(u32 battler) return FALSE; } +bool32 HasMoveThatAlwaysHitsInRain(u32 battler) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInRain(moves[i])) + return TRUE; + } + return FALSE; +} + +bool32 HasMoveThatHas50AccuracyInSun(u32 battler) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveHas50AccuracyInSun(moves[i])) + return TRUE; + } + return FALSE; +} + +bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler) +{ + s32 i; + u16 *moves = GetMovesArray(battler); + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInHailSnow(moves[i])) + return TRUE; + } + return FALSE; +} + bool32 IsTwoTurnNotSemiInvulnerableMove(u32 battlerAtk, u32 move) { switch (GetMoveEffect(move)) diff --git a/src/battle_dome.c b/src/battle_dome.c index 9c7c4527cb..0cfc8e8cb9 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4044,8 +4044,9 @@ static bool32 IsDomeRareMove(u32 move) return TRUE; } -static bool32 IsDomeComboMoveEffect(enum BattleMoveEffects effect) +static bool32 IsDomeComboMove(u32 move) { + enum BattleMoveEffects effect = GetMoveEffect(move); switch(effect) { // Weather moves @@ -4064,8 +4065,6 @@ static bool32 IsDomeComboMoveEffect(enum BattleMoveEffects effect) case EFFECT_MORNING_SUN: case EFFECT_MOONLIGHT: case EFFECT_SHORE_UP: - case EFFECT_THUNDER: - case EFFECT_BLIZZARD: case EFFECT_SOLAR_BEAM: case EFFECT_GROWTH: case EFFECT_AURORA_VEIL: @@ -4119,8 +4118,15 @@ static bool32 IsDomeComboMoveEffect(enum BattleMoveEffects effect) case EFFECT_ROAR: return TRUE; default: - return FALSE; + break; } + + if (MoveAlwaysHitsInRain(move)) + return TRUE; + else if (MoveAlwaysHitsInHailSnow(move)) + return TRUE; + + return FALSE; } // allocatedArray below needs to be large enough to hold stat totals for each mon, or totals of each type of move points @@ -4307,7 +4313,7 @@ static void DisplayTrainerInfoOnCard(u8 flags, u8 trainerTourneyId) switch (k) { case MOVE_POINTS_COMBO: - allocatedArray[k] = IsDomeComboMoveEffect(effect) ? 1 : 0; + allocatedArray[k] = IsDomeComboMove(move) ? 1 : 0; break; case MOVE_POINTS_STAT_RAISE: allocatedArray[k] = IsStatRaisingEffect(effect) ? 1 : 0; diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 51ada23c36..7f6ffc8a8b 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1552,10 +1552,9 @@ static bool32 AccuracyCalcHelper(u32 move, u32 battler) if (!effect && HasWeatherEffect()) { - if ((moveEffect == EFFECT_THUNDER || moveEffect == EFFECT_RAIN_ALWAYS_HIT) - && IsBattlerWeatherAffected(battler, B_WEATHER_RAIN)) + if (MoveAlwaysHitsInRain(move) && IsBattlerWeatherAffected(battler, B_WEATHER_RAIN)) effect = TRUE; - else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && moveEffect == EFFECT_BLIZZARD) + else if ((gBattleWeather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) && MoveAlwaysHitsInHailSnow(move)) effect = TRUE; if (effect) @@ -1600,7 +1599,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u moveAcc = GetMoveAccuracy(move); // Check Thunder and Hurricane on sunny weather. - if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && GetMoveEffect(move) == EFFECT_THUNDER) + if (IsBattlerWeatherAffected(battlerDef, B_WEATHER_SUN) && MoveHas50AccuracyInSun(move)) moveAcc = 50; // Check Wonder Skin. if (defAbility == ABILITY_WONDER_SKIN && IsBattleMoveStatus(move) && moveAcc > 50) diff --git a/src/battle_tv.c b/src/battle_tv.c index 8879fcde59..27d88ec88a 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -902,7 +902,6 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) switch (GetMoveEffect(move)) { case EFFECT_WEATHER_BALL: - case EFFECT_THUNDER: points += 3; break; case EFFECT_SOLAR_BEAM: @@ -912,6 +911,9 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) break; } + if (MoveAlwaysHitsInRain(move)) + points += 3; + movePoints->points[atkSide][gBattlerPartyIndexes[gBattlerAttacker] * 4 + arg2] += points; break; } diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 90ec220b2b..5ac30a76f2 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -792,12 +792,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .twoTurnEffect = TRUE, }, - [EFFECT_THUNDER] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 1, - }, - [EFFECT_TELEPORT] = { .battleScript = BattleScript_EffectTeleport, @@ -2146,18 +2140,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 0, // TODO: Assign points }, - [EFFECT_BLIZZARD] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 1, - }, - - [EFFECT_RAIN_ALWAYS_HIT] = - { - .battleScript = BattleScript_EffectHit, - .battleTvScore = 0, // TODO: Assign points - }, - [EFFECT_SHED_TAIL] = { .battleScript = BattleScript_EffectShedTail, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 951d8db34e..d9684f8beb 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1613,7 +1613,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #else "storm that may freeze it."), #endif - .effect = B_BLIZZARD_HAIL >= GEN_4 ? EFFECT_BLIZZARD : EFFECT_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 110 : 120, .type = TYPE_ICE, .accuracy = 70, @@ -1622,6 +1622,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, + .alwaysHitsInHailSnow = B_BLIZZARD_HAIL >= GEN_4, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_FREEZE_OR_FROSTBITE, .chance = 10, @@ -2321,7 +2322,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A lightning attack that may\n" "cause paralysis."), - .effect = EFFECT_THUNDER, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 110 : 120, .type = TYPE_ELECTRIC, .accuracy = 70, @@ -2330,6 +2331,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .damagesAirborne = TRUE, + .alwaysHitsInRain = TRUE, + .accuracy50InSun = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 30, @@ -13786,7 +13789,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Traps the foe in a fierce\n" "wind. May cause confusion."), - .effect = EFFECT_THUNDER, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 110 : 120, .type = TYPE_FLYING, .accuracy = 70, @@ -13796,6 +13799,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, .damagesAirborne = TRUE, + .alwaysHitsInRain = TRUE, + .accuracy50InSun = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_CONFUSION, .chance = 30, @@ -19473,7 +19478,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hits with brutal, cold winds.\n" "May lower the foe's Speed."), - .effect = EFFECT_RAIN_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 100 : 95, .type = TYPE_FLYING, .accuracy = 80, @@ -19482,6 +19487,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, + .alwaysHitsInRain = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_SPD_MINUS_1, .chance = 30, @@ -19495,7 +19501,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hits with a brutal tempest.\n" "May inflict paralysis."), - .effect = EFFECT_RAIN_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 100 : 95, .type = TYPE_ELECTRIC, .accuracy = 80, @@ -19504,6 +19510,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, + .alwaysHitsInRain = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_PARALYSIS, .chance = 20, @@ -19517,7 +19524,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Hits with brutally hot sand.\n" "May inflict a burn."), - .effect = EFFECT_RAIN_ALWAYS_HIT, + .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_9 ? 100 : 95, .type = TYPE_GROUND, .accuracy = 80, @@ -19526,6 +19533,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .priority = 0, .category = DAMAGE_CATEGORY_SPECIAL, .windMove = TRUE, + .alwaysHitsInRain = TRUE, .additionalEffects = ADDITIONAL_EFFECTS({ .moveEffect = MOVE_EFFECT_BURN, .chance = 20, diff --git a/test/battle/move_effect_secondary/freeze.c b/test/battle/move_effect_secondary/freeze.c index bfaadcebe1..645c134a81 100644 --- a/test/battle/move_effect_secondary/freeze.c +++ b/test/battle/move_effect_secondary/freeze.c @@ -4,7 +4,6 @@ ASSUMPTIONS { ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); - ASSUME(GetMoveAccuracy(MOVE_BLIZZARD) == 70); } #if B_USE_FROSTBITE == TRUE @@ -60,21 +59,6 @@ SINGLE_BATTLE_TEST("Freeze cannot be inflicted in Sunlight") } } -SINGLE_BATTLE_TEST("Blizzard bypasses accuracy checks in Hail and Snow") -{ - u32 move; - PARAMETRIZE { move = MOVE_HAIL; } - PARAMETRIZE { move = MOVE_SNOWSCAPE; } - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, move); MOVE(player, MOVE_BLIZZARD); } - } SCENE { - NOT MESSAGE("Wobbuffet's attack missed!"); - } -} - #if B_STATUS_TYPE_IMMUNITY > GEN_1 #if B_USE_FROSTBITE == TRUE SINGLE_BATTLE_TEST("Freezing Glare should frostbite Psychic-types") diff --git a/test/battle/move_effects_combined/hurricane.c b/test/battle/move_effects_combined/hurricane.c index 02620f4d05..91a3435cf4 100644 --- a/test/battle/move_effects_combined/hurricane.c +++ b/test/battle/move_effects_combined/hurricane.c @@ -3,8 +3,9 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HURRICANE) == EFFECT_THUNDER); ASSUME(GetMoveAccuracy(MOVE_HURRICANE) == 70); + ASSUME(MoveAlwaysHitsInRain(MOVE_HURRICANE) == TRUE); + ASSUME(MoveHas50AccuracyInSun(MOVE_HURRICANE) == TRUE); } SINGLE_BATTLE_TEST("Hurricane's accuracy is lowered to 50% in Sunlight") diff --git a/test/battle/move_effect/thunder.c b/test/battle/move_flags/accuracy_50_in_sun.c similarity index 53% rename from test/battle/move_effect/thunder.c rename to test/battle/move_flags/accuracy_50_in_sun.c index 81ebd416ca..50a2911d31 100644 --- a/test/battle/move_effect/thunder.c +++ b/test/battle/move_flags/accuracy_50_in_sun.c @@ -3,8 +3,8 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_THUNDER) == EFFECT_THUNDER); ASSUME(GetMoveAccuracy(MOVE_THUNDER) == 70); + ASSUME(MoveHas50AccuracyInSun(MOVE_HURRICANE) == TRUE); } SINGLE_BATTLE_TEST("Thunder's accuracy is lowered to 50% in Sunlight") @@ -19,16 +19,3 @@ SINGLE_BATTLE_TEST("Thunder's accuracy is lowered to 50% in Sunlight") ANIMATION(ANIM_TYPE_MOVE, MOVE_THUNDER, opponent); } } - -SINGLE_BATTLE_TEST("Thunder bypasses accuracy checks in Rain") -{ - PASSES_RANDOMLY(100, 100, RNG_ACCURACY); - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET); - } WHEN { - TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, MOVE_THUNDER); } - } SCENE { - NONE_OF { MESSAGE("Wobbuffet's attack missed!"); } - } -} diff --git a/test/battle/move_flags/always_hits_in_hail_snow.c b/test/battle/move_flags/always_hits_in_hail_snow.c new file mode 100644 index 0000000000..5673c0df8a --- /dev/null +++ b/test/battle/move_flags/always_hits_in_hail_snow.c @@ -0,0 +1,19 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Blizzard bypasses accuracy checks in Hail and Snow") +{ + u32 move; + PARAMETRIZE { move = MOVE_HAIL; } + PARAMETRIZE { move = MOVE_SNOWSCAPE; } + GIVEN { + ASSUME(GetMoveAccuracy(MOVE_BLIZZARD) == 70); + ASSUME(MoveAlwaysHitsInHailSnow(MOVE_BLIZZARD)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, move); MOVE(player, MOVE_BLIZZARD); } + } SCENE { + NOT MESSAGE("Wobbuffet's attack missed!"); + } +} diff --git a/test/battle/move_flags/always_hits_in_rain.c b/test/battle/move_flags/always_hits_in_rain.c new file mode 100644 index 0000000000..c4c5b5138b --- /dev/null +++ b/test/battle/move_flags/always_hits_in_rain.c @@ -0,0 +1,16 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Thunder bypasses accuracy checks in Rain") +{ + PASSES_RANDOMLY(100, 100, RNG_ACCURACY); + GIVEN { + ASSUME(MoveAlwaysHitsInRain(MOVE_THUNDER) == TRUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(opponent, MOVE_RAIN_DANCE); MOVE(player, MOVE_THUNDER); } + } SCENE { + NONE_OF { MESSAGE("Wobbuffet's attack missed!"); } + } +} From 38cd80760bf15016905777b99ae4c2071b35ba32 Mon Sep 17 00:00:00 2001 From: spindrift64 <102487911+spindrift64@users.noreply.github.com> Date: Fri, 16 May 2025 08:09:18 +0200 Subject: [PATCH 061/187] Gen 1 no recharge on KO (#6869) --- include/config/battle.h | 1 + src/battle_script_commands.c | 3 +++ src/data/moves_info.h | 6 ++++++ 3 files changed, 10 insertions(+) diff --git a/include/config/battle.h b/include/config/battle.h index 195e1f82b4..becf2c8c9a 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -128,6 +128,7 @@ #define B_QUASH_TURN_ORDER GEN_LATEST // In Gen8+, Quash-affected battlers move according to speed order. Before Gen8, Quash-affected battlers move in the order they were affected by Quash. #define B_DESTINY_BOND_FAIL GEN_LATEST // In Gen7+, Destiny Bond fails if used repeatedly. #define B_PURSUIT_TARGET GEN_LATEST // In Gen4+, Pursuit attacks a switching opponent even if they weren't targeting them. Before Gen4, Pursuit only attacks a switching opponent that it originally targeted. +#define B_SKIP_RECHARGE GEN_LATEST // In Gen1, recharging moves such as Hyper Beam skip the recharge if the target gets KO'd // Ability settings #define B_GALE_WINGS GEN_LATEST // In Gen7+ requires full HP to trigger. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 7f6ffc8a8b..caa16a3ef4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -3618,6 +3618,9 @@ void SetMoveEffect(bool32 primary, bool32 certain) } break; case MOVE_EFFECT_RECHARGE: + if (B_SKIP_RECHARGE == GEN_1 && !IsBattlerAlive(gBattlerTarget)) // Skip recharge if gen 1 and foe is KO'd + break; + gBattleMons[gEffectBattler].status2 |= STATUS2_RECHARGE; gDisableStructs[gEffectBattler].rechargeTimer = 2; gLockedMoves[gEffectBattler] = gCurrentMove; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index d9684f8beb..a7c0ee165e 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -29,9 +29,15 @@ static const u8 sMegaDrainDescription[] = _( "An attack that absorbs\n" "half the damage inflicted."); +#if B_SKIP_RECHARGE != GEN_1 static const u8 sHyperBeamDescription[] = _( "Powerful, but leaves the\n" "user immobile the next turn."); +#else +static const u8 sHyperBeamDescription[] = _( + "Leaves the user immobile\n" + "if target is not KO'd."); +#endif static const u8 sRevengeDescription[] = _( "An attack that gains power\n" From 7359d234c80621ae2f105c308cdaefdd212380b9 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Fri, 16 May 2025 02:35:30 -0500 Subject: [PATCH 062/187] PokeCommunity sprites batch (April 2025) (#6840) --- graphics/pokemon/bombirdier/back.png | Bin 638 -> 567 bytes graphics/pokemon/bombirdier/front.png | Bin 877 -> 780 bytes graphics/pokemon/bombirdier/normal.pal | 24 +++++----- graphics/pokemon/bombirdier/shiny.pal | 24 +++++----- graphics/pokemon/dipplin/back.png | Bin 538 -> 531 bytes graphics/pokemon/dipplin/front.png | Bin 550 -> 520 bytes graphics/pokemon/dipplin/normal.pal | 24 +++++----- graphics/pokemon/dipplin/shiny.pal | 24 +++++----- graphics/pokemon/hydrapple/back.png | Bin 829 -> 786 bytes graphics/pokemon/hydrapple/front.png | Bin 1159 -> 980 bytes graphics/pokemon/hydrapple/normal.pal | 30 ++++++------- graphics/pokemon/hydrapple/shiny.pal | 30 ++++++------- graphics/pokemon/oinkologne/back.png | Bin 495 -> 489 bytes graphics/pokemon/oinkologne/f/back.png | Bin 613 -> 490 bytes graphics/pokemon/oinkologne/f/front.png | Bin 771 -> 719 bytes graphics/pokemon/oinkologne/f/normal.pal | 31 ++++++------- graphics/pokemon/oinkologne/f/shiny.pal | 31 ++++++------- graphics/pokemon/oinkologne/front.png | Bin 602 -> 649 bytes graphics/pokemon/oinkologne/normal.pal | 30 ++++++------- graphics/pokemon/oinkologne/shiny.pal | 30 ++++++------- graphics/pokemon/terapagos/anim_front.png | Bin 1284 -> 0 bytes graphics/pokemon/terapagos/back.png | Bin 611 -> 533 bytes graphics/pokemon/terapagos/front.png | Bin 0 -> 995 bytes graphics/pokemon/terapagos/normal.pal | 30 ++++++------- graphics/pokemon/terapagos/shiny.pal | 30 ++++++------- .../pokemon/terapagos/terastal/anim_front.png | Bin 5458 -> 0 bytes graphics/pokemon/terapagos/terastal/back.png | Bin 4904 -> 1168 bytes graphics/pokemon/terapagos/terastal/front.png | Bin 0 -> 1216 bytes .../pokemon/terapagos/terastal/normal.pal | 30 ++++++------- graphics/pokemon/terapagos/terastal/shiny.pal | 30 ++++++------- src/data/graphics/pokemon.h | 4 +- .../pokemon/species_info/gen_8_families.h | 8 ++-- .../pokemon/species_info/gen_9_families.h | 42 +++++++++--------- 33 files changed, 228 insertions(+), 224 deletions(-) delete mode 100644 graphics/pokemon/terapagos/anim_front.png create mode 100644 graphics/pokemon/terapagos/front.png delete mode 100644 graphics/pokemon/terapagos/terastal/anim_front.png create mode 100644 graphics/pokemon/terapagos/terastal/front.png diff --git a/graphics/pokemon/bombirdier/back.png b/graphics/pokemon/bombirdier/back.png index eb45117013530504a8dab426d3bc1d746db2b869..d2f321a35be0e0549e55e9c058b22f1adcd9d42b 100644 GIT binary patch delta 542 zcmV+(0^$As1h)i`B!2;OQb$4nuFf3k0000mP)t-snbV~-DKJz~QA#;NW?NvoP-J;{ zcfGi}lYND>rK%7R5aHL_=G@-^000000000032jpu0005CNkl~B@*f`yfQNhtj||{kZGW&pF($}{MB6|C;0Jg$ zC@qdY1q;Xkit42<16V8f6YuyZmwF7TVWN<&3*TkHvaKi(TvtX{UR)WBX%7`daRxD+b2B3uH*Qn*+aX`)*o635F$BOkv;Ap+S6=!%2YEqXhp*4M^0n zVQ6zw|0r6AE`QUG4AgK#X+3J3&T^e9?cQIta6kZ!<1?9o~ zehSlqkEPJ}Re6&__ys9EZsYe;m~W#Brc=mGm`x!IW`9$7AV}{qARgan<26_tQ-DW4 zMhBxQ5Kf@1VC+#4DthIk^D}~yKn#AQ2{tfP_?TWQ0|IPW8nsgIRpmwn^gY2NbUN|LYxa gK9Gl>m>0hgKR%)=qHIw7N&o-=07*qoM6N<$f^=&1NdN!< delta 613 zcmV-r0-F7|1pWk&B!4haOjJdg(xfygFiJT>4-XF}(xGNsV7aQV@8jW)~De@28n5a2f=F8>@6kN5cD!}%2^GbW&O7CCO|13=Cb zkOY;$**S+3$7$>WKzTAE5CpXZIy-ZPn0L#vM1b-EpbM!Bw1H5;ruafwDv$uL3dprd zK$nMvc!&cKD}QVn5Gs_DfS6CfNd=s(>j%pM2{@^MZl2rqJHRUyP%7ZC%wJUyw=j(Z z@c>G|Z~oZB=~193KnL{uAZ&x5j52?*hYslSm%vmX!!Cadh|Aac1JIwSynGw~1(XVh z(6=82l7M3V2H-#};J3?*kT;+z|!ey zfo%wYc=UL=`U?%}0;dlXpWpngQ4lazV1i~HBNrG2m`K1r3V2z7eIElRlgAgr5Wv4r z!%wX=fnL~m7QpY7Al(GcR(U>3z)2roD?!The=}F-F&xJ|j{WY?{(sL8jx|tFQieC`00000NkvXXu0mjf=^-A| diff --git a/graphics/pokemon/bombirdier/front.png b/graphics/pokemon/bombirdier/front.png index b8aa83644ba1f142ff37e0e980d17ef7b4ef173b..618c5c7c9b66ce98cb5420f3d29cd7240a8bf87b 100644 GIT binary patch delta 737 zcmV<70v`SC28;%fH-FQmG$}Ap9VJRRLS|cFb!l#yK1t?GVv~J^w56&L5D?+l+WGhR z000000000000`d~h5!Hpib+I4R9JA9 z3nIGP_D>Nsp8YGs*WbP*ZWsV2z6F#7M#bW5GZh=mB8s z?R@P7xLd#xTE`H=r4`_|15O575Yi{$nO@7l3PFiVkiD&XnoWVJiAI1zmH?KAMKl6e z3qm;b4#38Icqnz4iGjx{bOd6M@z)Fx!gL!?2phfPOH`CVFvgOlMD@R0M|p>0Gay&R zJw8`n0is_8SOzhzIp_vd&vNfv1xVRr*j5eLURu_V6Ck??N;zGPJM00000NkvXXu0mjf1+hFv delta 835 zcmV-J1HAl<2JHrrH-FNkG$}AjIYJK)4<^!~W?Nvns;}?k;gfxZP#q;rN=xQUV*mU9 znLbIUtEYQ{doJbV^Z)q$gGR9J<*mVwTzAPj|trU)wf{%?Cv3o1Gk_Aj|zwz!S+ zd0JZHF#P{8=10B#4PfjufO-HgdSly!{r=TDbO4~2MW((~e}8=~km${UsRE2`=ygrK z4$5r5sl->MgbLzJf<4zK0Y*p5=LA77kX#TU8q+v0me6gIb2i&YGv@p0?`9t+{^v5 z1vSBDVEzOcmwy0M*@6NfVL+i$KNk9@8eRZn1>iJ`w<4SXRsf#>?=(!V!g~>R0203e z#KfDvumDC;hQonY!5E^Zg*}VAKJTM74}{W!X2Ev@c_X@#kZ^Q&AY=5H!JXiIYD#-L zFizU&*}*WlQ}4aE-eavTEVT3kksz$x-h0Lygli7wEq{ZAAR4VdLI5%g2#>#74ss<< z087!7pkF&2DBvKlT*!HszxT)!phyA$=Y${$bm~3Y=mg-jcgaHY{%AgC5`6)X=E)9P zdOmuT|N9$15SAqy!3s#6g~1!lNhEjgn4=ZObDp~7TN_N2%iCv z8;V3x0Dn~nahzzGq=M4H%d!fBcLQnxgc&ws6%gl0B2Pzw7+{tU093C*6lRGEAmZns z^XOOsax8(s-my6WLsSQIRUc`eI@)VWgdI!19dHZqD_XOYEHFLr}ja9N30k5cj9b1d{}iB!2;OQb$4nuFf3k0000mP)t-s0JraeK>(mND=T3RxLp9&j{*PF z7GJ9!|8_#fs8Ij#W(C{F4cO)l;eQ(e;o}=I9f1X5ZjS$= zhdBenJH|LG`1UZ}!&?Lw-v=TRkgg6vK-qx0hh5tD`+-R|R07(ieF3Bx)gffQe=Sd^8k-@ec!%VCON)t04<$j5o$hA-2HyP=4bVEn|!b zywUQ$3%0nKC6};1UzxVT+H|r)cz;l3-Az-l+IU`=Dln5dM{5d2+s&ur>-#c{Mb85cXw&wm=P~ z0BD$&=TrPGfO8J6;EIdJqkvtY3n9EHGR`+rq~_zi8zA9bDn9dG4=zPA?GFQ!mSOM8 vLgkY>;YkX$pekvmji)~^IyGGQGM>~ArEDHztGHd&00000NkvXXu0mjfT|?hW delta 512 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 diff --git a/graphics/pokemon/hydrapple/front.png b/graphics/pokemon/hydrapple/front.png index eecdea6d782df1824dd4c7112ecc90d50d6a6517..ca82294df1952bd446323b9e547339c79ceab5e6 100644 GIT binary patch delta 970 zcmV;*12z1I3DgIW7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-s0JrZD5D;Y$ z3?xk)D`5_g6AQf@5W*}v=1MiwB0XQL9r}oC%&K;z*h=u-oqYfRk}^@w000A0Nklw>Ew41^mRsj^7l|837q0%)&d4?lLTb-sk$q?gN=rGK*jcYbL$rR4tth^Snz zzXN1h7Px&YR9j>%zEj0Y{pgwiCX?MU|1c`-x80D75jH~BcE<#t2ss41m2 z^cI4Iw6A&t;k}&tEN+xJbr)<49?g}6+c!YTyZBcZY_`<_W`^%t0H;cvN&apLJobwqD2^csL|fF|ngxOSEF z`fhm*0#$C91TLFW_M+G0qpO72bkVPnP-`;tV&Lp6ri`Zcf3A1Lz|T0T#+x5g4B1XS zHf9g?f!#1o+a|1){0Kbq`yqJny%szV);$N&HU delta 1150 zcmV-^1cCe12Zsre7=Hu<00013M{Ml?001yhOjJdf(4bg2AP^7`m>3XX5C|Yh7>HOn z*ib-7fH?S|punh5C}0R!s2HHwNbtx|AXo_QchqYD00a0*L_t(YiG7tZi{nNV$7dC% z($-rKV<&ef$s%Y3E&^e(6_$g$bb+g{$OkwF#I~-MY)G*wmVaw?ML^aHVUn<{EEjIF z*rUdQkgPRVs5)dapCNC?a`x_!cM41R{pP(l|Nk3=&~6>zPh9*hMtj#0KJmXkdjR;n zb9(8H_Qwxiwtjizn&|_87QP9ld9n}CULsT{ft$h! z`W>5pSu74CzJF?n>m|xpv&{NIh$vq-0y;NEclDDHRaDo|(+_|{z7*YgKp+L*0<(>N ze;_?Lnx~$+67FSaiD0612 zg%|*2cYoYtDH-RGQH&?nS*m(0Mj4CW0brB^*F(qxU@nNL7&}Vo2Aqyi?L>3Z2^93 z#eW-}-N6>721dikSwP!*RU|F%8|c!aUqS*5hnf&|RXo>LH|FZsp8u7I{-nKOKOals z+H!l#qkW--yjoxSLrQzT?^6R*)XD*j0~(MvxUFssf9=<6=tyNnhkD207^##i+P}r? z%N^iiH4hGP?_EXD|JlWTO0k*;vWsnjKYx7x(m(Zk5U2RPoxAl6QeVOmdcz&?(Hh9q zPMfxeggOmzr1gB4ww=!4l}DNqAVi040@()_u7^Ku0tT-rg)%2UclzkM>D%(uevU`BtR>000hUSV?A0O#mtY000O800000007cc QlK=n!07*qoM6N<$g3^T&&Hw-a diff --git a/graphics/pokemon/hydrapple/normal.pal b/graphics/pokemon/hydrapple/normal.pal index 6fec9a7957..b29a319b81 100644 --- a/graphics/pokemon/hydrapple/normal.pal +++ b/graphics/pokemon/hydrapple/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 56 32 +0 183 239 16 16 16 -152 24 16 -96 16 8 -32 72 24 -136 88 56 -216 80 64 -72 128 56 -248 160 160 -192 168 80 -40 96 8 -88 168 24 -160 216 72 -240 200 80 -32 88 8 +101 16 12 +36 77 28 +43 97 14 +143 19 11 +189 28 16 +194 44 58 +230 74 53 +211 34 61 +95 171 29 +250 136 107 +204 170 118 +164 216 74 +240 221 157 +125 0 0 diff --git a/graphics/pokemon/hydrapple/shiny.pal b/graphics/pokemon/hydrapple/shiny.pal index d3d0f68f92..35e42dc80f 100644 --- a/graphics/pokemon/hydrapple/shiny.pal +++ b/graphics/pokemon/hydrapple/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -152 208 160 -88 56 32 +0 183 239 16 16 16 -216 136 0 -192 80 0 -32 72 24 -136 88 56 -248 208 16 -72 128 56 -248 232 144 -192 168 80 -40 96 8 -88 168 24 -160 216 72 -240 200 80 -32 88 8 +128 65 0 +160 53 43 +43 97 14 +184 93 0 +214 143 1 +194 44 58 +255 211 22 +29 171 38 +95 171 29 +255 250 137 +204 170 118 +164 216 74 +240 221 157 +0 83 0 diff --git a/graphics/pokemon/oinkologne/back.png b/graphics/pokemon/oinkologne/back.png index 81810c233fd613adf011c9bbca4fba2cf59b6386..42c6c3bf303b3eea890e9a7e4d606f521beda196 100644 GIT binary patch delta 445 zcmV;u0Yd)o1L*^hHh-DZrFdv?u253Qy0pQ1fcW6(a3Db0q^X!VXvmOI@KB(*xVR7y z5cueb`1tq$000*XWC;KO0cS}>K~z|U?bX|sgCGnAPy<20!T$f}P9j19<>ow&=b;Z> z>+B|Y>9V|e^QId(^0e(7NX2<(IH!_;nC|-@myQEUp;%VVOn+Ze8^BtB5Mazk86_Om zIou9g0Bqv~_gqDHuE826yQ%)2rD`}0LX7j;pb!5zW@sCzVCJdxQrlo+w14R)-uBi(=5eI?@$$`?tczK5|Ns9vJVExl z&G+f+|Kje0JX*q0!twwB0c}Y{K~z|U?bgeVgD?yQ&?-)YEP2HL|Lxcg2_Y{Gt!6Re zO5H&3sS{At*XzlXC*}YkBEaoBE-^O=t-s$ggyvSCdrQhi1An!$9CJZHS$WxoYXYXm zv2Pb}(63cv! zfCL~Bs6BnOjJdg)1|IZQg~=^!Fqt%q^Zcdw16-$_~7WcP+-WAP`J3b z@PLRA5D@t2i1_&U0001J*mukT00C%8L_t(oh3(eCmV+P+1<*o>K#l$X&mDq@U^RfV zoAIsGp4=vg9$&8~PyTZBn!DwsZ44?Rx>Ij+j4^7QAWYF30Dp`Dbr%SN_e`)baYg|q zQknS!`I0Cr8T$0cL_H9%UCWd-|y@9+V5ljJKH-LIO zh9sy#APBV9SAvyyQhgIKyx9S=K;uARY(VEtI2fzY0etO(iip3;6I=l+@hgCdIDtHZ z5`e_W^mq77$1Cfv$FlRtbNIZao3!osR2~>LOPX%Z*v`2qd28!%mL?pOc-002ovPDHLkV1f+*&1(Pv delta 575 zcmV-F0>J(11LXveF@G&kOjJdf(4g2*fcT)ukSIX-c#s$v80f&x*`Blbpa}Tz@Bjb+ z@!#V3$O!oO_^6-@Di*#DGh4QD0V_ zht(?49L5-&PSa0clXK5}Zk}%uithnHi~_h`2LWc3fACg}On-3mUBKj)Vs$yqWx}%H zUcn7N6Py#sasz;fAs{Bmyxi~u1kZ9@$@S&4-TUBftFAq+v9}Yi& zvTvk_pGpEUA_;nX>WvR$g7}+T}_V74nn0VIS)!2Ke4Air1I0ddP4+Y>SXfJPED{){-c{!_T)lod*k05dsab&;xiXC#lI~0)OO<0YK@5=dsc;Hq?IUmbC@@ zYsJU}to-feX#qSSKoMxD)c{T4@Yn(rll%h!ve|bLs#KX!y=@M%5uvUtq6sMZtq2t% z4X0`mI5tpL|3sietPyYo7!WEz+`uUWlmNlrfrda$fGPis=m2jCRfMwfxX(d+yK+y! z10W300XR+pjIYB9Kml2R6BQIa4G_%F+a-YEzqSPr0rvO#G2o|vpg;1CHAclEgf##F N002ovPDHLkV1i4e1f2i? diff --git a/graphics/pokemon/oinkologne/f/front.png b/graphics/pokemon/oinkologne/f/front.png index c3f10ed9f325e3c30e22176fa67146585769956f..a4841d6b0ff8b8b78f2a0778bb9cab2b3a0d209c 100644 GIT binary patch delta 682 zcmV;b0#*Hk2G0eMF@G>nOjJdg)1@dF7+5GMKrk>^KtOm%K!7kXuxMDgP+-WAP`J3b z@PLRA5D@t2i1_&U0002*GGJH$00K=(L_t(oh3%HxlB^&MMGXOjCi?%MJGr3J9vgAy z=~Q*PYDyXRViN;#n!fRk@rdz{`ci&{aL&~$ip2xKh~f}UZhxL<+HMHF_t-~(C^(#{ zT;S_q*D*#gLI(jp1S6=b;uOF+D89x=g3N%9h+GJP7Xto(O*|}XK>7QL0NxYjoJG$< zzV(L%UPI!4ljh=@0D{i~FzW&cyM>q%)qK(?01BSMCaLQnuv`#LTO3YduXMFD^k zk_~!$4B&$WoqxiKzSz4UjSxZ$07)d$6+pu+@s&)^t4=9~cK}Z=ucHUZeysq0^#*7N z*0fY!pL{tnPs2s;3u0BEnl#y~^p?dOA_;ZFcns~UZVAQ#N|5IPcLRJDJ+oklYJsGuJpmX&&cIqb zdKS`Sfb^1TfcDW}0PqdaJ(u^0Er8pdsbJVZOfg;nBJ%JEzwK zM8yJ8)8;FcF#vZrZcx=pIvOK?@|K|#Y@b!?BqPyzcsw>Ie~713e&c_P9~({}7Z3iT QQvd(}07*qoM6N<$f&i2)J^%m! delta 734 zcmV<40wMj+1%n2VF@G&kOjJdf(4g2*fcT)ukSIX-c#s$v7+^q1Kqx5qpa{rlSO5S3 zkXTUo$O!oO_^6+|_l#|*2F1bPY`e_zD=@+Gu0${7O{MydMcx!dRhUn zg22w94Nx{9`|Pl!hce1yV^y<|Km22w=V@vP{wx|^_-Fv0nChf724I>VkEsRNF2;U7 z8!$ko4PXrb@(Td0$`Qbp!NBsgXBL2oNS^$hTz>>$u79K6Ym2Lx^#sE7c>d*V{wFhZ z1RP7~02_Sz=^N|?2|?(nENnr&f&^}x?V@Egd)BMoGpk0RPCEeE#3hP zkwFC{eH-8q^G_Fmqy83<$_7j=;AG$qFsMHR*n`&@$fmymc<)qgdmGAbDAt2J^fEe#F zknDIQ-B?NM$uXu50Nxc+d9yRqg;mGD*ZZw&Hh9U^^LTgI{(W2Y8~-}K0FVkR`Px)C QcK`qY07*qoM6N<$f<9_aegFUf diff --git a/graphics/pokemon/oinkologne/f/normal.pal b/graphics/pokemon/oinkologne/f/normal.pal index ba2c645dc6..2dc009715d 100644 --- a/graphics/pokemon/oinkologne/f/normal.pal +++ b/graphics/pokemon/oinkologne/f/normal.pal @@ -1,18 +1,19 @@ JASC-PAL 0100 -15 -152 208 160 -216 80 128 -248 160 200 -144 40 64 -248 120 144 -24 24 24 -96 64 72 -64 40 40 -248 160 8 -200 104 88 -0 0 0 -144 88 80 -248 200 8 +16 +153 211 165 +40 24 24 +88 40 40 +64 48 48 +88 64 64 +120 72 64 +128 48 48 +176 104 88 +184 80 96 +200 144 80 +184 184 184 +240 128 136 +16 16 16 +248 232 136 248 248 248 -168 160 160 +0 0 0 diff --git a/graphics/pokemon/oinkologne/f/shiny.pal b/graphics/pokemon/oinkologne/f/shiny.pal index 9a427f2a72..ed20dc8af3 100644 --- a/graphics/pokemon/oinkologne/f/shiny.pal +++ b/graphics/pokemon/oinkologne/f/shiny.pal @@ -1,18 +1,19 @@ JASC-PAL 0100 -15 -152 208 160 -216 80 128 -248 160 200 -144 40 64 -248 120 144 -24 24 24 -232 192 206 -217 158 179 -248 160 8 -248 240 240 -0 0 0 -241 223 226 -248 200 8 +16 +153 211 165 +174 80 82 +120 104 112 +193 122 128 +217 164 169 +200 186 180 +128 48 48 +248 224 232 +184 80 96 +200 144 80 +184 184 184 +240 128 136 +16 16 16 +248 232 136 248 248 248 -168 160 160 +0 0 0 diff --git a/graphics/pokemon/oinkologne/front.png b/graphics/pokemon/oinkologne/front.png index 22263f09036f9766a95bd0d10fb3faa7731577a6..d3fd42dd299046b26a129117522fd4b03c2dee40 100644 GIT binary patch delta 606 zcmV-k0-^od1c?QZHh-DZr63R}C?GH}C^$zxOh7nLa3DZlR%MttXvmOI@KB(*xVR7y z5cueb`1tq$005~+aYFzA0tZP%K~z|U?Umbd!ypVqV zT?36wd_sUipOcvo020$4Ko8~Plwbm#rb%+jAbb@71F#TQ08G-<56?j~OUfFjmr^nC z2EacVK+-Gc9e+VpaTP>0V=Fa=Y0}vM2 zwk$CM#H+PmTR$R>#^z_<!p32>6B}9O|8L92(}kR0%u%*=b%8jtyK`_(^E!yMF*J0~de|p{c(DtO()PfN-Wi zxzQ^^iI$u@0DHB4ZUC6ydfw@80qXtZs&)7Fy9R6sa}d|KQ78bQEu*yQF2D&zvNAw) z+d)|a>QDtJ8q31YZ{wO^FG8Nr4)irOw=LL6S`29I?E~oBKo>xkfet{qb3n-=-2g}u zX#j+m?pG_l6%OH|@v84{VPMnTeF*?UN*OdS^Gh6!d=H=sfT_$%u0_bZ+ZCySC}lib s8GLI_D#{TDfP*S_8__xEC;nl41LYkcPG~h{y8r+H07*qoM6N<$f=U(we*gdg delta 559 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 delta 568 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 Vw^yuNkOj&bPU0OPKI|El@^8Fi|L6b! diff --git a/graphics/pokemon/terapagos/terastal/back.png b/graphics/pokemon/terapagos/terastal/back.png index cfa96b0ab0759268db77436517b04a7c45c58f88..083593c6fb55cb4bf1b73b1825ac4b6964b32051 100644 GIT binary patch delta 789 zcmV+w1M2*!CXfk`7$67(0001;w}I>c00D$)LqkwWLqi~Na&Km7Y-IodD3P-i0d)a? z{&{6`0000mP)t-snbV~j8XEUS8voTTJ$}GGRmMiq?CrN#lTN_DC{Zlau|b6MrRJFs z5D@jC-v9sqIKlEf0007uNkl$2N02!zih!f`;@@Bg-479=~FOq))Bb;kHy zoJji#&`Li)S6p$$6<7Qz%kcvThY z-w?REQ=z8bmcF9 zJpmv@Z$A>)?nt%au~U$sr0oya0LUkRWTtIt*sdL+0=#2kd6Y#%22f~Wb}z^;`50kv3WLaht{mWLj$Y)b*M{ki=? zu)TJUNhgBv%m~e40YeY}@}y!S*N987nl`^ki{|~nU2O5V&kmvh+bnZ`$Z6I~55oO^ z58a@p4WehKJx~wZ6Mk5VlKY+d1n_W}4rAy+@J$SZae>zI(JM^=SLTOx&GR*kcibwz z1|1Ho%PX(rk-`Lkum*tlOPr-?W@mQL?R)6Mjan&80xEa`fG}$i#Q+Yq?jx!X)q}J} z_H>;lwW9{%=qrGZ=}Aav3$cV`4Z`U#VJZ&OJK)uW1;ATg)245y(GS2L06DqXj(1d_ z8+qEsJoSF)cdP3uOCQ%|0wgX4$+I#xfdj7W9&d!MbrwGaF7K@Qgt+30|2}>JQ(-+Y T7@-rV00000NkvXXu0mjfF)nnI literal 4904 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 QkgSj_Fid)6PD1v-0b+CC^8f$< diff --git a/graphics/pokemon/terapagos/terastal/front.png b/graphics/pokemon/terapagos/terastal/front.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdf844767e75c862319014f7ce61695796d7bb9 GIT binary patch literal 1216 zcmV;x1V8(UP)EX>4Tx04R}tkv&MmP!xqvQ)@*k4t5Z6$WWc^qEZ}d6^c+H)C#RSn7s54ni!H4 z7e~Rh;NZ_<)xpJCR|i)?5c~mgc5qU3krMAq3N2#1@OU5R-E(;FK0s*Jm}d1P0Zq5f zY&s?83oByy6}<=`j08e5vy53u%D}h2?x~mRF3z+3`~Iu}wP-OQAQC5;VcNv&#EDJY z;Ji;9WffT^J|~_q>4LKlnXct28y~B}Gy|=*4k9#(?lH&}ul&_p#%&PJrMuaHV(r8%<#5lk`SM ziyZ-j+rY(jM^pBI%N=0&$&gLim4dW{QVDoJqi-qzL$^TxsyDaxIZhvd9L*|o0~{Oz z<7LWT^Lck)_uT&NY0vKmR1R{Q{&{6`0000mP)t-snbV~j8XEUS8voTTEiH^bRmN3S z%JN2;lTN@WioYz=u|b6MrRJFs5D@jC-v9sqIwMR^0008JNkl(D`YFoJtmkYBBTodK0*j3jj_nS z1QI+nGbZss1p_`cVTIoy=pDx*fR?+n6b=G1SW4I+hPQaNXgJQ23IOh+9SxRv)@2R8|D>l_pyhi2WxxfAM1(Fs>=h}sbhUmg; zUM52=T4sks=8F!~`)$le)AOb05Ky(}&pKpH513Sek)kqgLVNsY22?(skZ|R&oga~% e+WdF@r|S>e)H~k$c)N`N0000 Date: Fri, 16 May 2025 02:54:22 -0500 Subject: [PATCH 063/187] Bug fix: add proper elevation handling for npc followers (#6871) --- src/event_object_movement.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/event_object_movement.c b/src/event_object_movement.c index 1184c27ec4..b55f9a6277 100644 --- a/src/event_object_movement.c +++ b/src/event_object_movement.c @@ -9826,11 +9826,11 @@ static void UpdateObjectEventElevationAndPriority(struct ObjectEvent *objEvent, return; ObjectEventUpdateElevation(objEvent, sprite); - if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER) + if (objEvent->localId == OBJ_EVENT_ID_FOLLOWER || objEvent->localId == OBJ_EVENT_ID_NPC_FOLLOWER) { // keep subspriteMode synced with player's // so that it disappears under bridges when they do - if (OW_LARGE_OW_SUPPORT) + if (OW_LARGE_OW_SUPPORT && objEvent->localId == OBJ_EVENT_ID_FOLLOWER) sprite->subspriteMode |= gSprites[gPlayerAvatar.spriteId].subspriteMode & SUBSPRITES_IGNORE_PRIORITY; // if transitioning between elevations, use the player's elevation if (!objEvent->currentElevation) @@ -9889,7 +9889,7 @@ static void ObjectEventUpdateSubpriority(struct ObjectEvent *objEvent, struct Sp return; // If transitioning between elevations, use the player's elevation - if (!objEvent->currentElevation && objEvent->localId == OBJ_EVENT_ID_FOLLOWER) + if (!objEvent->currentElevation && (objEvent->localId == OBJ_EVENT_ID_FOLLOWER || objEvent->localId == OBJ_EVENT_ID_NPC_FOLLOWER)) objEvent = &gObjectEvents[gPlayerAvatar.objectEventId]; SetObjectSubpriorityByElevation(objEvent->previousElevation, sprite, 1); From 49584e134b25f4b4b63c890365fb807ab4aba3f4 Mon Sep 17 00:00:00 2001 From: innocenthedgehog <56793981+innocenthedgehog@users.noreply.github.com> Date: Fri, 16 May 2025 09:35:34 +0100 Subject: [PATCH 064/187] Switch AI considers Bulletproof ability (#6872) --- src/battle_ai_switch_items.c | 4 ++++ test/battle/ai/ai_switching.c | 1 + 2 files changed, 5 insertions(+) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 4b81908349..317dc63b66 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -526,6 +526,10 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_SOUNDPROOF; } + else if (IsBallisticMove(incomingMove) || (isOpposingBattlerChargingOrInvulnerable && IsBallisticMove(incomingMove))) + { + absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_BULLETPROOF; + } else if (IsWindMove(incomingMove) || (isOpposingBattlerChargingOrInvulnerable && IsWindMove(incomingMove))) { absorbingTypeAbilities[numAbsorbingAbilities++] = ABILITY_WIND_RIDER; diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index bb33ab4489..afde8a62ab 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -837,6 +837,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has an PARAMETRIZE { aiMon = SPECIES_ORTHWORM; absorbingAbility = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE;} PARAMETRIZE { aiMon = SPECIES_BRONZONG; absorbingAbility = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE;} PARAMETRIZE { aiMon = SPECIES_ELECTRODE; absorbingAbility = ABILITY_SOUNDPROOF; move = MOVE_HYPER_VOICE;} + PARAMETRIZE { aiMon = SPECIES_CHESNAUGHT; absorbingAbility = ABILITY_BULLETPROOF; move = MOVE_SLUDGE_BOMB;} PARAMETRIZE { aiMon = SPECIES_SHIFTRY; absorbingAbility = ABILITY_WIND_RIDER; move = MOVE_HURRICANE;} GIVEN { ASSUME(B_REDIRECT_ABILITY_IMMUNITY >= GEN_5); From 3a3c24650939a40b568a01376723bf170e559617 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 16 May 2025 06:09:39 -0400 Subject: [PATCH 065/187] Consolidated stat-priority ability tests (#6863) --- test/battle/ability/beast_boost.c | 37 ++++++++++++++-- test/battle/ability/protosynthesis.c | 65 +++++++++------------------- test/battle/ability/quark_drive.c | 65 +++++++++------------------- 3 files changed, 75 insertions(+), 92 deletions(-) diff --git a/test/battle/ability/beast_boost.c b/test/battle/ability/beast_boost.c index 8f823ab3f6..3adb4eb9cd 100644 --- a/test/battle/ability/beast_boost.c +++ b/test/battle/ability/beast_boost.c @@ -57,10 +57,39 @@ SINGLE_BATTLE_TEST("Beast Boost doesn't trigger if user is fainted") } } -TO_DO_BATTLE_TEST("Beast Boost boosts Attack 1st in case of a stat tie"); -TO_DO_BATTLE_TEST("Beast Boost boosts Defense 2nd in case of a stat tie"); -TO_DO_BATTLE_TEST("Beast Boost boosts Special Attack 3rd in case of a stat tie"); -TO_DO_BATTLE_TEST("Beast Boost boosts Special Defense 4th in case of a stat tie"); +SINGLE_BATTLE_TEST("Beast Boost prioritizes stats in the case of a tie in the following order: Atk, Def, Sp.Atk, Sp.Def, Speed") +{ + u8 stats[] = {1, 1, 1, 1, 1}; + + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; stats[0] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; } + GIVEN { + PLAYER(SPECIES_NIHILEGO) { Ability(ABILITY_BEAST_BOOST); Attack(stats[0]); Defense(stats[1]); SpAttack(stats[2]); SpDefense(stats[3]); Speed(stats[4]); } + OPPONENT(SPECIES_WOBBUFFET) { HP(1); Speed(1); } + OPPONENT(SPECIES_WOBBUFFET) { Speed(1); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); SEND_OUT(opponent, 1); } + } SCENE { + ABILITY_POPUP(player, ABILITY_BEAST_BOOST); + switch(i) { + case 0: + MESSAGE("Nihilego's Beast Boost raised its Attack!"); + break; + case 1: + MESSAGE("Nihilego's Beast Boost raised its Defense!"); + break; + case 2: + MESSAGE("Nihilego's Beast Boost raised its Sp. Atk!"); + break; + case 3: + MESSAGE("Nihilego's Beast Boost raised its Sp. Def!"); + break; + } + } +} + TO_DO_BATTLE_TEST("Beast Boost considers Power Split"); TO_DO_BATTLE_TEST("Beast Boost considers Guard Split"); TO_DO_BATTLE_TEST("Beast Boost considers Power Trick"); diff --git a/test/battle/ability/protosynthesis.c b/test/battle/ability/protosynthesis.c index d895879c60..6fd271acb2 100644 --- a/test/battle/ability/protosynthesis.c +++ b/test/battle/ability/protosynthesis.c @@ -100,59 +100,36 @@ SINGLE_BATTLE_TEST("Protosynthesis activates on switch-in") } } -SINGLE_BATTLE_TEST("Protosynthesis boosts Attack 1st in case of a stat tie") +SINGLE_BATTLE_TEST("Protosynthesis prioritizes stats in the case of a tie in the following order: Atk, Def, Sp.Atk, Sp.Def, Speed") { - GIVEN { - PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_DROUGHT); - ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); - MESSAGE("Great Tusk's Attack was heightened!"); - } -} + u8 stats[] = {1, 1, 1, 1, 1}; -SINGLE_BATTLE_TEST("Protosynthesis boosts Defense 2nd in case of a stat tie") -{ + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; stats[0] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; } GIVEN { - PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(stats[0]); Defense(stats[1]); SpAttack(stats[2]); SpDefense(stats[3]); Speed(stats[4]); } OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } } WHEN { TURN { } } SCENE { ABILITY_POPUP(opponent, ABILITY_DROUGHT); ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); - MESSAGE("Great Tusk's Defense was heightened!"); - } -} - -SINGLE_BATTLE_TEST("Protosynthesis boosts Special Attack 3rd in case of a stat tie") -{ - GIVEN { - PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_DROUGHT); - ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); - MESSAGE("Great Tusk's Sp. Atk was heightened!"); - } -} - -SINGLE_BATTLE_TEST("Protosynthesis boosts Special Defense 4th in case of a stat tie") -{ - GIVEN { - PLAYER(SPECIES_GREAT_TUSK) { Ability(ABILITY_PROTOSYNTHESIS); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_GROUDON) { Ability(ABILITY_DROUGHT); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_DROUGHT); - ABILITY_POPUP(player, ABILITY_PROTOSYNTHESIS); - MESSAGE("Great Tusk's Sp. Def was heightened!"); + switch(i) { + case 0: + MESSAGE("Great Tusk's Attack was heightened!"); + break; + case 1: + MESSAGE("Great Tusk's Defense was heightened!"); + break; + case 2: + MESSAGE("Great Tusk's Sp. Atk was heightened!"); + break; + case 3: + MESSAGE("Great Tusk's Sp. Def was heightened!"); + break; + } } } diff --git a/test/battle/ability/quark_drive.c b/test/battle/ability/quark_drive.c index e4850e7001..61a51d3d35 100644 --- a/test/battle/ability/quark_drive.c +++ b/test/battle/ability/quark_drive.c @@ -115,59 +115,36 @@ SINGLE_BATTLE_TEST("Quark Drive activates on Electric Terrain even if not ground } } -SINGLE_BATTLE_TEST("Quark Drive boosts Attack 1st in case of a stat tie") +SINGLE_BATTLE_TEST("Quark Drive prioritizes stats in the case of a tie in the following order: Atk, Def, Sp.Atk, Sp.Def, Speed") { - GIVEN { - PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(5); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); - ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); - MESSAGE("Iron Treads's Attack was heightened!"); - } -} + u8 stats[] = {1, 1, 1, 1, 1}; -SINGLE_BATTLE_TEST("Quark Drive boosts Defense 2nd in case of a stat tie") -{ + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; stats[0] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; stats[1] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; stats[2] = 255; } + PARAMETRIZE { stats[4] = 255; stats[3] = 255; } GIVEN { - PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(5); SpAttack(5); SpDefense(5); Speed(5); } + PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(stats[0]); Defense(stats[1]); SpAttack(stats[2]); SpDefense(stats[3]); Speed(stats[4]); } OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } } WHEN { TURN { } } SCENE { ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); - MESSAGE("Iron Treads's Defense was heightened!"); - } -} - -SINGLE_BATTLE_TEST("Quark Drive boosts Special Attack 3rd in case of a stat tie") -{ - GIVEN { - PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(5); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); - ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); - MESSAGE("Iron Treads's Sp. Atk was heightened!"); - } -} - -SINGLE_BATTLE_TEST("Quark Drive boosts Special Defense 4th in case of a stat tie") -{ - GIVEN { - PLAYER(SPECIES_IRON_TREADS) { Ability(ABILITY_QUARK_DRIVE); Attack(4); Defense(4); SpAttack(4); SpDefense(5); Speed(5); } - OPPONENT(SPECIES_TAPU_KOKO) { Ability(ABILITY_ELECTRIC_SURGE); Speed(5); } - } WHEN { - TURN { } - } SCENE { - ABILITY_POPUP(opponent, ABILITY_ELECTRIC_SURGE); - ABILITY_POPUP(player, ABILITY_QUARK_DRIVE); - MESSAGE("Iron Treads's Sp. Def was heightened!"); + switch(i) { + case 0: + MESSAGE("Iron Treads's Attack was heightened!"); + break; + case 1: + MESSAGE("Iron Treads's Defense was heightened!"); + break; + case 2: + MESSAGE("Iron Treads's Sp. Atk was heightened!"); + break; + case 3: + MESSAGE("Iron Treads's Sp. Def was heightened!"); + break; + } } } From 6711df36a3956b359be120733d7f44cfc403a7d6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 16 May 2025 06:20:44 -0400 Subject: [PATCH 066/187] Create missing ability and move effect test files (#6845) --- test/battle/ability/competitive.c | 4 + test/battle/ability/dark_aura.c | 4 + test/battle/ability/delta_stream.c | 4 + test/battle/ability/early_bird.c | 4 + test/battle/ability/fairy_aura.c | 4 + test/battle/ability/filter.c | 4 + test/battle/ability/flare_boost.c | 4 + test/battle/ability/flower_veil.c | 4 + test/battle/ability/forewarn.c | 4 + test/battle/ability/friend_guard.c | 4 + test/battle/ability/fur_coat.c | 4 + test/battle/ability/gluttony.c | 4 + test/battle/ability/gooey.c | 4 + test/battle/ability/gorilla_tactics.c | 4 + test/battle/ability/grass_pelt.c | 4 + test/battle/ability/guts.c | 4 + test/battle/ability/hadron_engine.c | 4 + test/battle/ability/heatproof.c | 4 + test/battle/ability/heavy_metal.c | 4 + test/battle/ability/honey_gather.c | 4 + test/battle/ability/huge_power.c | 4 + test/battle/ability/hustle.c | 4 + test/battle/ability/illuminate.c | 4 + test/battle/ability/imposter.c | 4 + test/battle/ability/infiltrator.c | 4 + test/battle/ability/iron_barbs.c | 4 + test/battle/ability/iron_fist.c | 4 + test/battle/ability/justified.c | 4 + test/battle/ability/klutz.c | 4 + test/battle/ability/levitate.c | 4 + test/battle/ability/libero.c | 4 + test/battle/ability/light_metal.c | 4 + test/battle/ability/long_reach.c | 4 + test/battle/ability/magma_armor.c | 4 + test/battle/ability/magnet_pull.c | 4 + test/battle/ability/marvel_scale.c | 4 + test/battle/ability/mega_launcher.c | 4 + test/battle/ability/minus.c | 4 + test/battle/ability/mold_breaker.c | 4 + test/battle/ability/multiscale.c | 4 + test/battle/ability/multitype.c | 4 + test/battle/ability/natural_cure.c | 4 + test/battle/ability/no_guard.c | 4 + test/battle/ability/perish_body.c | 4 + test/battle/ability/pickpocket.c | 4 + test/battle/ability/plus.c | 4 + test/battle/ability/poison_puppeteer.c | 4 - test/battle/ability/power_construct.c | 4 + test/battle/ability/power_of_alchemy.c | 4 + test/battle/ability/power_spot.c | 4 + test/battle/ability/prism_armor.c | 4 + test/battle/ability/propeller_tail.c | 4 + test/battle/ability/punk_rock.c | 4 + test/battle/ability/pure_power.c | 4 + test/battle/ability/quick_feet.c | 4 + test/battle/ability/receiver.c | 4 + test/battle/ability/reckless.c | 4 + test/battle/ability/rks_system.c | 4 + test/battle/ability/rock_head.c | 4 + test/battle/ability/run_away.c | 4 + test/battle/ability/sand_spit.c | 4 + test/battle/ability/sand_stream.c | 4 + test/battle/ability/screen_cleaner.c | 4 + test/battle/ability/serene_grace.c | 4 + test/battle/ability/shadow_shield.c | 4 + test/battle/ability/shadow_tag.c | 4 + test/battle/ability/simple.c | 4 + test/battle/ability/skill_link.c | 4 + test/battle/ability/slow_start.c | 4 + test/battle/ability/soul_heart.c | 4 + test/battle/ability/soundproof.c | 4 + test/battle/ability/stakeout.c | 4 + test/battle/ability/stall.c | 4 + test/battle/ability/steadfast.c | 4 + test/battle/ability/steely_spirit.c | 4 + test/battle/ability/strong_jaw.c | 4 + test/battle/ability/suction_cups.c | 4 + test/battle/ability/surge_surfer.c | 4 + test/battle/ability/sweet_veil.c | 4 + test/battle/ability/synchronize.c | 4 + test/battle/ability/tangled_feet.c | 4 + test/battle/ability/technician.c | 4 + test/battle/ability/telepathy.c | 4 + test/battle/ability/teravolt.c | 4 + test/battle/ability/thick_fat.c | 4 + test/battle/ability/tinted_lens.c | 4 + test/battle/ability/tough_claws.c | 4 + test/battle/ability/toxic_boost.c | 4 + test/battle/ability/triage.c | 4 + test/battle/ability/truant.c | 4 + test/battle/ability/turboblaze.c | 4 + test/battle/ability/unaware.c | 4 + test/battle/ability/unseen_fist.c | 4 + test/battle/ability/victory_star.c | 4 + test/battle/ability/vital_spirit.c | 4 + test/battle/ability/wandering_spirit.c | 4 + test/battle/ability/water_bubble.c | 4 + test/battle/ability/water_veil.c | 4 + test/battle/ability/well_baked_body.c | 4 + test/battle/ability/wimp_out.c | 4 + test/battle/ability/wonder_guard.c | 4 + test/battle/ability/wonder_skin.c | 4 + test/battle/move_effect/facade.c | 4 + test/battle/move_effect/fairy_lock.c | 4 + test/battle/move_effect/false_swipe.c | 4 + test/battle/move_effect/fell_stinger.c | 4 + test/battle/move_effect/final_gambit.c | 4 + test/battle/move_effect/first_turn_only.c | 4 + test/battle/move_effect/flail.c | 4 + test/battle/move_effect/flatter.c | 4 + test/battle/move_effect/foresight.c | 4 + test/battle/move_effect/frustration.c | 4 + test/battle/move_effect/fusion_combo.c | 4 + test/battle/move_effect/gear_up.c | 4 + test/battle/move_effect/geomancy.c | 4 + test/battle/move_effect/grassy_glide.c | 4 + test/battle/move_effect/grav_apple.c | 4 + test/battle/move_effect/growth.c | 4 + test/battle/move_effect/grudge.c | 4 + test/battle/move_effect/guard_swap.c | 4 + test/battle/move_effect/guardian_of_alola.c | 4 + test/battle/move_effect/gyro_ball.c | 4 + test/battle/move_effect/hail.c | 4 + test/battle/move_effect/happy_hour.c | 4 + test/battle/move_effect/heal_block.c | 4 + test/battle/move_effect/heart_swap.c | 4 + test/battle/move_effect/heat_crash.c | 4 + test/battle/move_effect/helping_hand.c | 4 + test/battle/move_effect/hit_enemy_heal_ally.c | 4 + test/battle/move_effect/hyperspace_fury.c | 4 + test/battle/move_effect/imprison.c | 4 + test/battle/move_effect/ingrain.c | 4 + test/battle/move_effect/jungle_healing.c | 4 + test/battle/move_effect/lash_out.c | 4 + test/battle/move_effect/level_damage.c | 4 + test/battle/move_effect/light_screen.c | 4 + test/battle/move_effect/lock_on.c | 4 + test/battle/move_effect/low_kick.c | 4 + test/battle/move_effect/magic_room.c | 4 + test/battle/move_effect/magnet_rise.c | 4 + test/battle/move_effect/magnetic_flux.c | 4 + test/battle/move_effect/magnitude.c | 4 + test/battle/move_effect/mat_block.c | 4 + test/battle/move_effect/max_move.c | 4 + test/battle/move_effect/me_first.c | 4 + test/battle/move_effect/mean_look.c | 4 + test/battle/move_effect/memento.c | 4 + test/battle/move_effect/metal_burst.c | 4 + test/battle/move_effect/mimic.c | 4 + test/battle/move_effect/minimize.c | 4 + test/battle/move_effect/miracle_eye.c | 4 + test/battle/move_effect/mirror_coat.c | 4 + test/battle/move_effect/mist.c | 4 + test/battle/move_effect/mud_sport.c | 4 + test/battle/move_effect/natural_gift.c | 4 + test/battle/move_effect/nature_power.c | 4 + test/battle/move_effect/nightmare.c | 4 + test/battle/move_effect/no_retreat.c | 4 + test/battle/move_effect/noble_roar.c | 4 + test/battle/move_effect/order_up.c | 4 + test/battle/move_effect/pain_split.c | 4 + test/battle/move_effect/paralyze.c | 4 + test/battle/move_effect/parting_shot.c | 4 + test/battle/move_effect/payback.c | 4 + test/battle/move_effect/perish_song.c | 4 + test/battle/move_effect/placeholder.c | 4 + test/battle/move_effect/poison.c | 4 + test/battle/move_effect/poltergeist.c | 4 + test/battle/move_effect/power_swap.c | 4 + test/battle/move_effect/power_trick.c | 4 + test/battle/move_effect/present.c | 4 + test/battle/move_effect/psyblade.c | 4 + test/battle/move_effect/psych_up.c | 4 + test/battle/move_effect/psycho_shift.c | 4 + test/battle/move_effect/psyshock.c | 4 + test/battle/move_effect/psywave.c | 4 + test/battle/move_effect/punishment.c | 4 + test/battle/move_effect/purify.c | 4 + test/battle/move_effect/quiver_dance.c | 4 + test/battle/move_effect/rage.c | 4 + test/battle/move_effect/rain_always_hit.c | 4 + test/battle/move_effect/rain_dance.c | 4 + test/battle/move_effect/recoil_hp_25.c | 4 + test/battle/move_effect/recycle.c | 4 + test/battle/move_effect/rest.c | 4 + test/battle/move_effect/restore_hp.c | 4 + test/battle/move_effect/return.c | 4 + test/battle/move_effect/revenge.c | 4 + test/battle/move_effect/rising_voltage.c | 4 + test/battle/move_effect/rollout.c | 4 + test/battle/move_effect/safeguard.c | 4 + test/battle/move_effect/sandstorm.c | 4 + test/battle/move_effect/shell_smash.c | 4 + test/battle/move_effect/shift_gear.c | 4 + test/battle/move_effect/shore_up.c | 4 + test/battle/move_effect/sky_drop.c | 4 + test/battle/move_effect/smack_down.c | 19 --- test/battle/move_effect/smelling_salts.c | 63 --------- test/battle/move_effect/snatch.c | 4 + test/battle/move_effect/snipe_shot.c | 4 + test/battle/move_effect/snowscape.c | 4 + test/battle/move_effect/soak.c | 4 + test/battle/move_effect/softboiled.c | 4 + test/battle/move_effect/sparkling_aria.c | 25 ---- .../move_effect/special_attack_down_2.c | 4 + test/battle/move_effect/special_attack_up.c | 4 + test/battle/move_effect/special_attack_up_2.c | 4 + .../battle/move_effect/special_defense_down.c | 4 + .../move_effect/special_defense_down_2.c | 4 + test/battle/move_effect/special_defense_up.c | 4 + .../battle/move_effect/special_defense_up_2.c | 4 + test/battle/move_effect/speed_down_2.c | 4 + test/battle/move_effect/speed_up.c | 4 + test/battle/move_effect/speed_up_2.c | 4 + test/battle/move_effect/spite.c | 4 + test/battle/move_effect/stored_power.c | 4 + test/battle/move_effect/sunny_day.c | 4 + test/battle/move_effect/super_fang.c | 4 + test/battle/move_effect/swagger.c | 4 + test/battle/move_effect/synchronoise.c | 4 + test/battle/move_effect/taunt.c | 4 + test/battle/move_effect/terrain_pulse.c | 4 + test/battle/move_effect/third_type.c | 4 + test/battle/move_effect/tickle.c | 4 + test/battle/move_effect/topsy_turvy.c | 4 + test/battle/move_effect/toxic_thread.c | 4 + test/battle/move_effect/transform.c | 4 + test/battle/move_effect/trick.c | 4 + test/battle/move_effect/trick_room.c | 4 + test/battle/move_effect/trump_card.c | 4 + test/battle/move_effect/two_typed_move.c | 4 + test/battle/move_effect/venom_drench.c | 4 + test/battle/move_effect/victory_dance.c | 4 + test/battle/move_effect/wake_up_slap.c | 57 -------- test/battle/move_effect/water_sport.c | 4 + test/battle/move_effect/will_o_wisp.c | 4 + test/battle/move_effect/wish.c | 4 + test/battle/move_effect/wonder_room.c | 4 + test/battle/move_effect/yawn.c | 4 + .../flame_burst.c | 0 .../move_effect_secondary/remove_status.c | 132 ++++++++++++++++++ .../salt_cure.c | 0 .../battle/move_effect_secondary/smack_down.c | 28 ++++ .../move_effect_secondary/will_o_wisp.c | 4 + .../ignore_type_if_flying_and_ungrounded.c} | 19 +-- .../{ability => }/switch_in_abilities.c | 0 246 files changed, 1101 insertions(+), 186 deletions(-) create mode 100644 test/battle/ability/competitive.c create mode 100644 test/battle/ability/dark_aura.c create mode 100644 test/battle/ability/delta_stream.c create mode 100644 test/battle/ability/early_bird.c create mode 100644 test/battle/ability/fairy_aura.c create mode 100644 test/battle/ability/filter.c create mode 100644 test/battle/ability/flare_boost.c create mode 100644 test/battle/ability/flower_veil.c create mode 100644 test/battle/ability/forewarn.c create mode 100644 test/battle/ability/friend_guard.c create mode 100644 test/battle/ability/fur_coat.c create mode 100644 test/battle/ability/gluttony.c create mode 100644 test/battle/ability/gooey.c create mode 100644 test/battle/ability/gorilla_tactics.c create mode 100644 test/battle/ability/grass_pelt.c create mode 100644 test/battle/ability/guts.c create mode 100644 test/battle/ability/hadron_engine.c create mode 100644 test/battle/ability/heatproof.c create mode 100644 test/battle/ability/heavy_metal.c create mode 100644 test/battle/ability/honey_gather.c create mode 100644 test/battle/ability/huge_power.c create mode 100644 test/battle/ability/hustle.c create mode 100644 test/battle/ability/illuminate.c create mode 100644 test/battle/ability/imposter.c create mode 100644 test/battle/ability/infiltrator.c create mode 100644 test/battle/ability/iron_barbs.c create mode 100644 test/battle/ability/iron_fist.c create mode 100644 test/battle/ability/justified.c create mode 100644 test/battle/ability/klutz.c create mode 100644 test/battle/ability/levitate.c create mode 100644 test/battle/ability/libero.c create mode 100644 test/battle/ability/light_metal.c create mode 100644 test/battle/ability/long_reach.c create mode 100644 test/battle/ability/magma_armor.c create mode 100644 test/battle/ability/magnet_pull.c create mode 100644 test/battle/ability/marvel_scale.c create mode 100644 test/battle/ability/mega_launcher.c create mode 100644 test/battle/ability/minus.c create mode 100644 test/battle/ability/mold_breaker.c create mode 100644 test/battle/ability/multiscale.c create mode 100644 test/battle/ability/multitype.c create mode 100644 test/battle/ability/natural_cure.c create mode 100644 test/battle/ability/no_guard.c create mode 100644 test/battle/ability/perish_body.c create mode 100644 test/battle/ability/pickpocket.c create mode 100644 test/battle/ability/plus.c create mode 100644 test/battle/ability/power_construct.c create mode 100644 test/battle/ability/power_of_alchemy.c create mode 100644 test/battle/ability/power_spot.c create mode 100644 test/battle/ability/prism_armor.c create mode 100644 test/battle/ability/propeller_tail.c create mode 100644 test/battle/ability/punk_rock.c create mode 100644 test/battle/ability/pure_power.c create mode 100644 test/battle/ability/quick_feet.c create mode 100644 test/battle/ability/receiver.c create mode 100644 test/battle/ability/reckless.c create mode 100644 test/battle/ability/rks_system.c create mode 100644 test/battle/ability/rock_head.c create mode 100644 test/battle/ability/run_away.c create mode 100644 test/battle/ability/sand_spit.c create mode 100644 test/battle/ability/sand_stream.c create mode 100644 test/battle/ability/screen_cleaner.c create mode 100644 test/battle/ability/serene_grace.c create mode 100644 test/battle/ability/shadow_shield.c create mode 100644 test/battle/ability/shadow_tag.c create mode 100644 test/battle/ability/simple.c create mode 100644 test/battle/ability/skill_link.c create mode 100644 test/battle/ability/slow_start.c create mode 100644 test/battle/ability/soul_heart.c create mode 100644 test/battle/ability/soundproof.c create mode 100644 test/battle/ability/stakeout.c create mode 100644 test/battle/ability/stall.c create mode 100644 test/battle/ability/steadfast.c create mode 100644 test/battle/ability/steely_spirit.c create mode 100644 test/battle/ability/strong_jaw.c create mode 100644 test/battle/ability/suction_cups.c create mode 100644 test/battle/ability/surge_surfer.c create mode 100644 test/battle/ability/sweet_veil.c create mode 100644 test/battle/ability/synchronize.c create mode 100644 test/battle/ability/tangled_feet.c create mode 100644 test/battle/ability/technician.c create mode 100644 test/battle/ability/telepathy.c create mode 100644 test/battle/ability/teravolt.c create mode 100644 test/battle/ability/thick_fat.c create mode 100644 test/battle/ability/tinted_lens.c create mode 100644 test/battle/ability/tough_claws.c create mode 100644 test/battle/ability/toxic_boost.c create mode 100644 test/battle/ability/triage.c create mode 100644 test/battle/ability/truant.c create mode 100644 test/battle/ability/turboblaze.c create mode 100644 test/battle/ability/unaware.c create mode 100644 test/battle/ability/unseen_fist.c create mode 100644 test/battle/ability/victory_star.c create mode 100644 test/battle/ability/vital_spirit.c create mode 100644 test/battle/ability/wandering_spirit.c create mode 100644 test/battle/ability/water_bubble.c create mode 100644 test/battle/ability/water_veil.c create mode 100644 test/battle/ability/well_baked_body.c create mode 100644 test/battle/ability/wimp_out.c create mode 100644 test/battle/ability/wonder_guard.c create mode 100644 test/battle/ability/wonder_skin.c create mode 100644 test/battle/move_effect/facade.c create mode 100644 test/battle/move_effect/fairy_lock.c create mode 100644 test/battle/move_effect/false_swipe.c create mode 100644 test/battle/move_effect/fell_stinger.c create mode 100644 test/battle/move_effect/final_gambit.c create mode 100644 test/battle/move_effect/first_turn_only.c create mode 100644 test/battle/move_effect/flail.c create mode 100644 test/battle/move_effect/flatter.c create mode 100644 test/battle/move_effect/foresight.c create mode 100644 test/battle/move_effect/frustration.c create mode 100644 test/battle/move_effect/fusion_combo.c create mode 100644 test/battle/move_effect/gear_up.c create mode 100644 test/battle/move_effect/geomancy.c create mode 100644 test/battle/move_effect/grassy_glide.c create mode 100644 test/battle/move_effect/grav_apple.c create mode 100644 test/battle/move_effect/growth.c create mode 100644 test/battle/move_effect/grudge.c create mode 100644 test/battle/move_effect/guard_swap.c create mode 100644 test/battle/move_effect/guardian_of_alola.c create mode 100644 test/battle/move_effect/gyro_ball.c create mode 100644 test/battle/move_effect/hail.c create mode 100644 test/battle/move_effect/happy_hour.c create mode 100644 test/battle/move_effect/heal_block.c create mode 100644 test/battle/move_effect/heart_swap.c create mode 100644 test/battle/move_effect/heat_crash.c create mode 100644 test/battle/move_effect/helping_hand.c create mode 100644 test/battle/move_effect/hit_enemy_heal_ally.c create mode 100644 test/battle/move_effect/hyperspace_fury.c create mode 100644 test/battle/move_effect/imprison.c create mode 100644 test/battle/move_effect/ingrain.c create mode 100644 test/battle/move_effect/jungle_healing.c create mode 100644 test/battle/move_effect/lash_out.c create mode 100644 test/battle/move_effect/level_damage.c create mode 100644 test/battle/move_effect/light_screen.c create mode 100644 test/battle/move_effect/lock_on.c create mode 100644 test/battle/move_effect/low_kick.c create mode 100644 test/battle/move_effect/magic_room.c create mode 100644 test/battle/move_effect/magnet_rise.c create mode 100644 test/battle/move_effect/magnetic_flux.c create mode 100644 test/battle/move_effect/magnitude.c create mode 100644 test/battle/move_effect/mat_block.c create mode 100644 test/battle/move_effect/max_move.c create mode 100644 test/battle/move_effect/me_first.c create mode 100644 test/battle/move_effect/mean_look.c create mode 100644 test/battle/move_effect/memento.c create mode 100644 test/battle/move_effect/metal_burst.c create mode 100644 test/battle/move_effect/mimic.c create mode 100644 test/battle/move_effect/minimize.c create mode 100644 test/battle/move_effect/miracle_eye.c create mode 100644 test/battle/move_effect/mirror_coat.c create mode 100644 test/battle/move_effect/mist.c create mode 100644 test/battle/move_effect/mud_sport.c create mode 100644 test/battle/move_effect/natural_gift.c create mode 100644 test/battle/move_effect/nature_power.c create mode 100644 test/battle/move_effect/nightmare.c create mode 100644 test/battle/move_effect/no_retreat.c create mode 100644 test/battle/move_effect/noble_roar.c create mode 100644 test/battle/move_effect/order_up.c create mode 100644 test/battle/move_effect/pain_split.c create mode 100644 test/battle/move_effect/paralyze.c create mode 100644 test/battle/move_effect/parting_shot.c create mode 100644 test/battle/move_effect/payback.c create mode 100644 test/battle/move_effect/perish_song.c create mode 100644 test/battle/move_effect/placeholder.c create mode 100644 test/battle/move_effect/poison.c create mode 100644 test/battle/move_effect/poltergeist.c create mode 100644 test/battle/move_effect/power_swap.c create mode 100644 test/battle/move_effect/power_trick.c create mode 100644 test/battle/move_effect/present.c create mode 100644 test/battle/move_effect/psyblade.c create mode 100644 test/battle/move_effect/psych_up.c create mode 100644 test/battle/move_effect/psycho_shift.c create mode 100644 test/battle/move_effect/psyshock.c create mode 100644 test/battle/move_effect/psywave.c create mode 100644 test/battle/move_effect/punishment.c create mode 100644 test/battle/move_effect/purify.c create mode 100644 test/battle/move_effect/quiver_dance.c create mode 100644 test/battle/move_effect/rage.c create mode 100644 test/battle/move_effect/rain_always_hit.c create mode 100644 test/battle/move_effect/rain_dance.c create mode 100644 test/battle/move_effect/recoil_hp_25.c create mode 100644 test/battle/move_effect/recycle.c create mode 100644 test/battle/move_effect/rest.c create mode 100644 test/battle/move_effect/restore_hp.c create mode 100644 test/battle/move_effect/return.c create mode 100644 test/battle/move_effect/revenge.c create mode 100644 test/battle/move_effect/rising_voltage.c create mode 100644 test/battle/move_effect/rollout.c create mode 100644 test/battle/move_effect/safeguard.c create mode 100644 test/battle/move_effect/sandstorm.c create mode 100644 test/battle/move_effect/shell_smash.c create mode 100644 test/battle/move_effect/shift_gear.c create mode 100644 test/battle/move_effect/shore_up.c create mode 100644 test/battle/move_effect/sky_drop.c delete mode 100644 test/battle/move_effect/smack_down.c delete mode 100644 test/battle/move_effect/smelling_salts.c create mode 100644 test/battle/move_effect/snatch.c create mode 100644 test/battle/move_effect/snipe_shot.c create mode 100644 test/battle/move_effect/snowscape.c create mode 100644 test/battle/move_effect/soak.c create mode 100644 test/battle/move_effect/softboiled.c delete mode 100644 test/battle/move_effect/sparkling_aria.c create mode 100644 test/battle/move_effect/special_attack_down_2.c create mode 100644 test/battle/move_effect/special_attack_up.c create mode 100644 test/battle/move_effect/special_attack_up_2.c create mode 100644 test/battle/move_effect/special_defense_down.c create mode 100644 test/battle/move_effect/special_defense_down_2.c create mode 100644 test/battle/move_effect/special_defense_up.c create mode 100644 test/battle/move_effect/special_defense_up_2.c create mode 100644 test/battle/move_effect/speed_down_2.c create mode 100644 test/battle/move_effect/speed_up.c create mode 100644 test/battle/move_effect/speed_up_2.c create mode 100644 test/battle/move_effect/spite.c create mode 100644 test/battle/move_effect/stored_power.c create mode 100644 test/battle/move_effect/sunny_day.c create mode 100644 test/battle/move_effect/super_fang.c create mode 100644 test/battle/move_effect/swagger.c create mode 100644 test/battle/move_effect/synchronoise.c create mode 100644 test/battle/move_effect/taunt.c create mode 100644 test/battle/move_effect/terrain_pulse.c create mode 100644 test/battle/move_effect/third_type.c create mode 100644 test/battle/move_effect/tickle.c create mode 100644 test/battle/move_effect/topsy_turvy.c create mode 100644 test/battle/move_effect/toxic_thread.c create mode 100644 test/battle/move_effect/transform.c create mode 100644 test/battle/move_effect/trick.c create mode 100644 test/battle/move_effect/trick_room.c create mode 100644 test/battle/move_effect/trump_card.c create mode 100644 test/battle/move_effect/two_typed_move.c create mode 100644 test/battle/move_effect/venom_drench.c create mode 100644 test/battle/move_effect/victory_dance.c delete mode 100644 test/battle/move_effect/wake_up_slap.c create mode 100644 test/battle/move_effect/water_sport.c create mode 100644 test/battle/move_effect/will_o_wisp.c create mode 100644 test/battle/move_effect/wish.c create mode 100644 test/battle/move_effect/wonder_room.c create mode 100644 test/battle/move_effect/yawn.c rename test/battle/{move_effect => move_effect_secondary}/flame_burst.c (100%) create mode 100644 test/battle/move_effect_secondary/remove_status.c rename test/battle/{move_effect => move_effect_secondary}/salt_cure.c (100%) create mode 100644 test/battle/move_effect_secondary/smack_down.c create mode 100644 test/battle/move_effect_secondary/will_o_wisp.c rename test/battle/{move_effect/thousand_arrows.c => move_flags/ignore_type_if_flying_and_ungrounded.c} (70%) rename test/battle/{ability => }/switch_in_abilities.c (100%) diff --git a/test/battle/ability/competitive.c b/test/battle/ability/competitive.c new file mode 100644 index 0000000000..cc3e582eab --- /dev/null +++ b/test/battle/ability/competitive.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Competitive (Ability) test titles") diff --git a/test/battle/ability/dark_aura.c b/test/battle/ability/dark_aura.c new file mode 100644 index 0000000000..eb1bf05246 --- /dev/null +++ b/test/battle/ability/dark_aura.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Dark Aura (Ability) test titles") diff --git a/test/battle/ability/delta_stream.c b/test/battle/ability/delta_stream.c new file mode 100644 index 0000000000..5b4081cb1e --- /dev/null +++ b/test/battle/ability/delta_stream.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Delta Stream (Ability) test titles") diff --git a/test/battle/ability/early_bird.c b/test/battle/ability/early_bird.c new file mode 100644 index 0000000000..9b368970f6 --- /dev/null +++ b/test/battle/ability/early_bird.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Early Bird (Ability) test titles") diff --git a/test/battle/ability/fairy_aura.c b/test/battle/ability/fairy_aura.c new file mode 100644 index 0000000000..3b8d400b02 --- /dev/null +++ b/test/battle/ability/fairy_aura.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fairy Aura (Ability) test titles") diff --git a/test/battle/ability/filter.c b/test/battle/ability/filter.c new file mode 100644 index 0000000000..ca323b1be2 --- /dev/null +++ b/test/battle/ability/filter.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Filter (Ability) test titles") diff --git a/test/battle/ability/flare_boost.c b/test/battle/ability/flare_boost.c new file mode 100644 index 0000000000..a4ff14382a --- /dev/null +++ b/test/battle/ability/flare_boost.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flare Boost (Ability) test titles") diff --git a/test/battle/ability/flower_veil.c b/test/battle/ability/flower_veil.c new file mode 100644 index 0000000000..c1952360d1 --- /dev/null +++ b/test/battle/ability/flower_veil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flower Veil (Ability) test titles") diff --git a/test/battle/ability/forewarn.c b/test/battle/ability/forewarn.c new file mode 100644 index 0000000000..810fcd975f --- /dev/null +++ b/test/battle/ability/forewarn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Forewarn (Ability) test titles") diff --git a/test/battle/ability/friend_guard.c b/test/battle/ability/friend_guard.c new file mode 100644 index 0000000000..5e4776731e --- /dev/null +++ b/test/battle/ability/friend_guard.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Friend Guard (Ability) test titles") diff --git a/test/battle/ability/fur_coat.c b/test/battle/ability/fur_coat.c new file mode 100644 index 0000000000..56fb197114 --- /dev/null +++ b/test/battle/ability/fur_coat.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fur Coat (Ability) test titles") diff --git a/test/battle/ability/gluttony.c b/test/battle/ability/gluttony.c new file mode 100644 index 0000000000..4ceda945f6 --- /dev/null +++ b/test/battle/ability/gluttony.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Gluttony (Ability) test titles") diff --git a/test/battle/ability/gooey.c b/test/battle/ability/gooey.c new file mode 100644 index 0000000000..ad78e30c39 --- /dev/null +++ b/test/battle/ability/gooey.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Gooey (Ability) test titles") diff --git a/test/battle/ability/gorilla_tactics.c b/test/battle/ability/gorilla_tactics.c new file mode 100644 index 0000000000..2bafd88165 --- /dev/null +++ b/test/battle/ability/gorilla_tactics.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Gorilla Tactics (Ability) test titles") diff --git a/test/battle/ability/grass_pelt.c b/test/battle/ability/grass_pelt.c new file mode 100644 index 0000000000..1696b71e10 --- /dev/null +++ b/test/battle/ability/grass_pelt.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grass Pelt (Ability) test titles") diff --git a/test/battle/ability/guts.c b/test/battle/ability/guts.c new file mode 100644 index 0000000000..459adc0e69 --- /dev/null +++ b/test/battle/ability/guts.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Guts (Ability) test titles") diff --git a/test/battle/ability/hadron_engine.c b/test/battle/ability/hadron_engine.c new file mode 100644 index 0000000000..e6324c0c51 --- /dev/null +++ b/test/battle/ability/hadron_engine.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Hadron Engine (Ability) test titles") diff --git a/test/battle/ability/heatproof.c b/test/battle/ability/heatproof.c new file mode 100644 index 0000000000..7f1d772bb7 --- /dev/null +++ b/test/battle/ability/heatproof.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heatproof (Ability) test titles") diff --git a/test/battle/ability/heavy_metal.c b/test/battle/ability/heavy_metal.c new file mode 100644 index 0000000000..baaa039b19 --- /dev/null +++ b/test/battle/ability/heavy_metal.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heavy Metal (Ability) test titles") diff --git a/test/battle/ability/honey_gather.c b/test/battle/ability/honey_gather.c new file mode 100644 index 0000000000..56dbb22f2e --- /dev/null +++ b/test/battle/ability/honey_gather.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Honey Gather (Ability) test titles") diff --git a/test/battle/ability/huge_power.c b/test/battle/ability/huge_power.c new file mode 100644 index 0000000000..9362bf8ce3 --- /dev/null +++ b/test/battle/ability/huge_power.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Huge Power (Ability) test titles") diff --git a/test/battle/ability/hustle.c b/test/battle/ability/hustle.c new file mode 100644 index 0000000000..c399bfa501 --- /dev/null +++ b/test/battle/ability/hustle.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Hustle (Ability) test titles") diff --git a/test/battle/ability/illuminate.c b/test/battle/ability/illuminate.c new file mode 100644 index 0000000000..72bf1f6f81 --- /dev/null +++ b/test/battle/ability/illuminate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Illuminate (Ability) test titles") diff --git a/test/battle/ability/imposter.c b/test/battle/ability/imposter.c new file mode 100644 index 0000000000..98f6cc29fc --- /dev/null +++ b/test/battle/ability/imposter.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Imposter (Ability) test titles") diff --git a/test/battle/ability/infiltrator.c b/test/battle/ability/infiltrator.c new file mode 100644 index 0000000000..faf00ee113 --- /dev/null +++ b/test/battle/ability/infiltrator.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Infiltrator (Ability) test titles") diff --git a/test/battle/ability/iron_barbs.c b/test/battle/ability/iron_barbs.c new file mode 100644 index 0000000000..8b1525a9f6 --- /dev/null +++ b/test/battle/ability/iron_barbs.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Iron Barbs (Ability) test titles") diff --git a/test/battle/ability/iron_fist.c b/test/battle/ability/iron_fist.c new file mode 100644 index 0000000000..ae26f9cdd0 --- /dev/null +++ b/test/battle/ability/iron_fist.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Iron Fist (Ability) test titles") diff --git a/test/battle/ability/justified.c b/test/battle/ability/justified.c new file mode 100644 index 0000000000..3416d77415 --- /dev/null +++ b/test/battle/ability/justified.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Justified (Ability) test titles") diff --git a/test/battle/ability/klutz.c b/test/battle/ability/klutz.c new file mode 100644 index 0000000000..76216edd17 --- /dev/null +++ b/test/battle/ability/klutz.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Klutz (Ability) test titles") diff --git a/test/battle/ability/levitate.c b/test/battle/ability/levitate.c new file mode 100644 index 0000000000..a1c1dc927d --- /dev/null +++ b/test/battle/ability/levitate.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Levitate (Ability) test titles") diff --git a/test/battle/ability/libero.c b/test/battle/ability/libero.c new file mode 100644 index 0000000000..8ea93df3c0 --- /dev/null +++ b/test/battle/ability/libero.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Libero (Ability) test titles") diff --git a/test/battle/ability/light_metal.c b/test/battle/ability/light_metal.c new file mode 100644 index 0000000000..8ad4a6a4b5 --- /dev/null +++ b/test/battle/ability/light_metal.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Light Metal (Ability) test titles") diff --git a/test/battle/ability/long_reach.c b/test/battle/ability/long_reach.c new file mode 100644 index 0000000000..3558ea92b2 --- /dev/null +++ b/test/battle/ability/long_reach.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Long Reach (Ability) test titles") diff --git a/test/battle/ability/magma_armor.c b/test/battle/ability/magma_armor.c new file mode 100644 index 0000000000..e61444baee --- /dev/null +++ b/test/battle/ability/magma_armor.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magma Armor (Ability) test titles") diff --git a/test/battle/ability/magnet_pull.c b/test/battle/ability/magnet_pull.c new file mode 100644 index 0000000000..538b15f824 --- /dev/null +++ b/test/battle/ability/magnet_pull.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magnet Pull (Ability) test titles") diff --git a/test/battle/ability/marvel_scale.c b/test/battle/ability/marvel_scale.c new file mode 100644 index 0000000000..4fc7ee3c62 --- /dev/null +++ b/test/battle/ability/marvel_scale.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Marvel Scale (Ability) test titles") diff --git a/test/battle/ability/mega_launcher.c b/test/battle/ability/mega_launcher.c new file mode 100644 index 0000000000..dae3799f81 --- /dev/null +++ b/test/battle/ability/mega_launcher.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mega Launcher (Ability) test titles") diff --git a/test/battle/ability/minus.c b/test/battle/ability/minus.c new file mode 100644 index 0000000000..bf841465a6 --- /dev/null +++ b/test/battle/ability/minus.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Minus (Ability) test titles") diff --git a/test/battle/ability/mold_breaker.c b/test/battle/ability/mold_breaker.c new file mode 100644 index 0000000000..2c04deeeef --- /dev/null +++ b/test/battle/ability/mold_breaker.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mold Breaker (Ability) test titles") diff --git a/test/battle/ability/multiscale.c b/test/battle/ability/multiscale.c new file mode 100644 index 0000000000..f2a808d69a --- /dev/null +++ b/test/battle/ability/multiscale.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Multiscale (Ability) test titles") diff --git a/test/battle/ability/multitype.c b/test/battle/ability/multitype.c new file mode 100644 index 0000000000..a8b384180f --- /dev/null +++ b/test/battle/ability/multitype.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Multitype (Ability) test titles") diff --git a/test/battle/ability/natural_cure.c b/test/battle/ability/natural_cure.c new file mode 100644 index 0000000000..760c341e12 --- /dev/null +++ b/test/battle/ability/natural_cure.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Natural Cure (Ability) test titles") diff --git a/test/battle/ability/no_guard.c b/test/battle/ability/no_guard.c new file mode 100644 index 0000000000..e365968d45 --- /dev/null +++ b/test/battle/ability/no_guard.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write No Guard (Ability) test titles") diff --git a/test/battle/ability/perish_body.c b/test/battle/ability/perish_body.c new file mode 100644 index 0000000000..92562ef885 --- /dev/null +++ b/test/battle/ability/perish_body.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Perish Body (Ability) test titles") diff --git a/test/battle/ability/pickpocket.c b/test/battle/ability/pickpocket.c new file mode 100644 index 0000000000..1e8ec6a526 --- /dev/null +++ b/test/battle/ability/pickpocket.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Pickpocket (Ability) test titles") diff --git a/test/battle/ability/plus.c b/test/battle/ability/plus.c new file mode 100644 index 0000000000..5b56018bf6 --- /dev/null +++ b/test/battle/ability/plus.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Plus (Ability) test titles") diff --git a/test/battle/ability/poison_puppeteer.c b/test/battle/ability/poison_puppeteer.c index d5c470ad37..db27691415 100644 --- a/test/battle/ability/poison_puppeteer.c +++ b/test/battle/ability/poison_puppeteer.c @@ -1,10 +1,6 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ -} - SINGLE_BATTLE_TEST("Poison Puppeteer confuses target if it was poisoned by a damaging move") { GIVEN { diff --git a/test/battle/ability/power_construct.c b/test/battle/ability/power_construct.c new file mode 100644 index 0000000000..6a8ca9db5f --- /dev/null +++ b/test/battle/ability/power_construct.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Construct (Ability) test titles") diff --git a/test/battle/ability/power_of_alchemy.c b/test/battle/ability/power_of_alchemy.c new file mode 100644 index 0000000000..137a20a43d --- /dev/null +++ b/test/battle/ability/power_of_alchemy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power of Alchemy (Ability) test titles") diff --git a/test/battle/ability/power_spot.c b/test/battle/ability/power_spot.c new file mode 100644 index 0000000000..c44eb9a924 --- /dev/null +++ b/test/battle/ability/power_spot.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Spot (Ability) test titles") diff --git a/test/battle/ability/prism_armor.c b/test/battle/ability/prism_armor.c new file mode 100644 index 0000000000..532642d3a2 --- /dev/null +++ b/test/battle/ability/prism_armor.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Prism Armor (Ability) test titles") diff --git a/test/battle/ability/propeller_tail.c b/test/battle/ability/propeller_tail.c new file mode 100644 index 0000000000..eb8df38c8f --- /dev/null +++ b/test/battle/ability/propeller_tail.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Propeller Tail (Ability) test titles") diff --git a/test/battle/ability/punk_rock.c b/test/battle/ability/punk_rock.c new file mode 100644 index 0000000000..01a5459a0d --- /dev/null +++ b/test/battle/ability/punk_rock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Punk Rock (Ability) test titles") diff --git a/test/battle/ability/pure_power.c b/test/battle/ability/pure_power.c new file mode 100644 index 0000000000..e33479252c --- /dev/null +++ b/test/battle/ability/pure_power.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Pure Power (Ability) test titles") diff --git a/test/battle/ability/quick_feet.c b/test/battle/ability/quick_feet.c new file mode 100644 index 0000000000..fde10a7593 --- /dev/null +++ b/test/battle/ability/quick_feet.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Quick Feet (Ability) test titles") diff --git a/test/battle/ability/receiver.c b/test/battle/ability/receiver.c new file mode 100644 index 0000000000..a9155b7244 --- /dev/null +++ b/test/battle/ability/receiver.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Receiver (Ability) test titles") diff --git a/test/battle/ability/reckless.c b/test/battle/ability/reckless.c new file mode 100644 index 0000000000..49d5c59262 --- /dev/null +++ b/test/battle/ability/reckless.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Reckless (Ability) test titles") diff --git a/test/battle/ability/rks_system.c b/test/battle/ability/rks_system.c new file mode 100644 index 0000000000..17c4d2d4a7 --- /dev/null +++ b/test/battle/ability/rks_system.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write RKS System (Ability) test titles") diff --git a/test/battle/ability/rock_head.c b/test/battle/ability/rock_head.c new file mode 100644 index 0000000000..56db705778 --- /dev/null +++ b/test/battle/ability/rock_head.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rock Head (Ability) test titles") diff --git a/test/battle/ability/run_away.c b/test/battle/ability/run_away.c new file mode 100644 index 0000000000..c49eef7213 --- /dev/null +++ b/test/battle/ability/run_away.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Run Away (Ability) test titles") diff --git a/test/battle/ability/sand_spit.c b/test/battle/ability/sand_spit.c new file mode 100644 index 0000000000..c2128f65de --- /dev/null +++ b/test/battle/ability/sand_spit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sand Spit (Ability) test titles") diff --git a/test/battle/ability/sand_stream.c b/test/battle/ability/sand_stream.c new file mode 100644 index 0000000000..6cd1b06eb4 --- /dev/null +++ b/test/battle/ability/sand_stream.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sand Stream (Ability) test titles") diff --git a/test/battle/ability/screen_cleaner.c b/test/battle/ability/screen_cleaner.c new file mode 100644 index 0000000000..dd4ad761d1 --- /dev/null +++ b/test/battle/ability/screen_cleaner.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Screen Cleaner (Ability) test titles") diff --git a/test/battle/ability/serene_grace.c b/test/battle/ability/serene_grace.c new file mode 100644 index 0000000000..75dad60618 --- /dev/null +++ b/test/battle/ability/serene_grace.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Serene Grace (Ability) test titles") diff --git a/test/battle/ability/shadow_shield.c b/test/battle/ability/shadow_shield.c new file mode 100644 index 0000000000..7a28500761 --- /dev/null +++ b/test/battle/ability/shadow_shield.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Shadow Shield (Ability) test titles") diff --git a/test/battle/ability/shadow_tag.c b/test/battle/ability/shadow_tag.c new file mode 100644 index 0000000000..f00696d8b7 --- /dev/null +++ b/test/battle/ability/shadow_tag.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Shadow Tag (Ability) test titles") diff --git a/test/battle/ability/simple.c b/test/battle/ability/simple.c new file mode 100644 index 0000000000..cfdbf407ea --- /dev/null +++ b/test/battle/ability/simple.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Simple (Ability) test titles") diff --git a/test/battle/ability/skill_link.c b/test/battle/ability/skill_link.c new file mode 100644 index 0000000000..2da8ee2c58 --- /dev/null +++ b/test/battle/ability/skill_link.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Skill Link (Ability) test titles") diff --git a/test/battle/ability/slow_start.c b/test/battle/ability/slow_start.c new file mode 100644 index 0000000000..d5b3f5bcb5 --- /dev/null +++ b/test/battle/ability/slow_start.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Slow Start (Ability) test titles") diff --git a/test/battle/ability/soul_heart.c b/test/battle/ability/soul_heart.c new file mode 100644 index 0000000000..393fbb6c20 --- /dev/null +++ b/test/battle/ability/soul_heart.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soul Heart (Ability) test titles") diff --git a/test/battle/ability/soundproof.c b/test/battle/ability/soundproof.c new file mode 100644 index 0000000000..a7135942d1 --- /dev/null +++ b/test/battle/ability/soundproof.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soundproof (Ability) test titles") diff --git a/test/battle/ability/stakeout.c b/test/battle/ability/stakeout.c new file mode 100644 index 0000000000..2bbea394fd --- /dev/null +++ b/test/battle/ability/stakeout.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Stakeout (Ability) test titles") diff --git a/test/battle/ability/stall.c b/test/battle/ability/stall.c new file mode 100644 index 0000000000..f93eac14c4 --- /dev/null +++ b/test/battle/ability/stall.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Stall (Ability) test titles") diff --git a/test/battle/ability/steadfast.c b/test/battle/ability/steadfast.c new file mode 100644 index 0000000000..fc35e94278 --- /dev/null +++ b/test/battle/ability/steadfast.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Steadfast (Ability) test titles") diff --git a/test/battle/ability/steely_spirit.c b/test/battle/ability/steely_spirit.c new file mode 100644 index 0000000000..e84893ad8c --- /dev/null +++ b/test/battle/ability/steely_spirit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Steely Spirit (Ability) test titles") diff --git a/test/battle/ability/strong_jaw.c b/test/battle/ability/strong_jaw.c new file mode 100644 index 0000000000..1b9ce7fba7 --- /dev/null +++ b/test/battle/ability/strong_jaw.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Strong Jaw (Ability) test titles") diff --git a/test/battle/ability/suction_cups.c b/test/battle/ability/suction_cups.c new file mode 100644 index 0000000000..bcf23c5e18 --- /dev/null +++ b/test/battle/ability/suction_cups.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Suction Cups (Ability) test titles") diff --git a/test/battle/ability/surge_surfer.c b/test/battle/ability/surge_surfer.c new file mode 100644 index 0000000000..c0b1056a2d --- /dev/null +++ b/test/battle/ability/surge_surfer.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Surge Surfer (Ability) test titles") diff --git a/test/battle/ability/sweet_veil.c b/test/battle/ability/sweet_veil.c new file mode 100644 index 0000000000..2cedae3c14 --- /dev/null +++ b/test/battle/ability/sweet_veil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sweet Veil (Ability) test titles") diff --git a/test/battle/ability/synchronize.c b/test/battle/ability/synchronize.c new file mode 100644 index 0000000000..43cf87d5fe --- /dev/null +++ b/test/battle/ability/synchronize.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Synchronize (Ability) test titles") diff --git a/test/battle/ability/tangled_feet.c b/test/battle/ability/tangled_feet.c new file mode 100644 index 0000000000..fb50ba191d --- /dev/null +++ b/test/battle/ability/tangled_feet.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Tangled Feet (Ability) test titles") diff --git a/test/battle/ability/technician.c b/test/battle/ability/technician.c new file mode 100644 index 0000000000..bd529a5a01 --- /dev/null +++ b/test/battle/ability/technician.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Technician (Ability) test titles") diff --git a/test/battle/ability/telepathy.c b/test/battle/ability/telepathy.c new file mode 100644 index 0000000000..220b2e7180 --- /dev/null +++ b/test/battle/ability/telepathy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Telepathy (Ability) test titles") diff --git a/test/battle/ability/teravolt.c b/test/battle/ability/teravolt.c new file mode 100644 index 0000000000..e9739a720d --- /dev/null +++ b/test/battle/ability/teravolt.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Teravolt (Ability) test titles") diff --git a/test/battle/ability/thick_fat.c b/test/battle/ability/thick_fat.c new file mode 100644 index 0000000000..bcc4c9487c --- /dev/null +++ b/test/battle/ability/thick_fat.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Thick Fat (Ability) test titles") diff --git a/test/battle/ability/tinted_lens.c b/test/battle/ability/tinted_lens.c new file mode 100644 index 0000000000..9ddb69ec17 --- /dev/null +++ b/test/battle/ability/tinted_lens.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Tinted Lens (Ability) test titles") diff --git a/test/battle/ability/tough_claws.c b/test/battle/ability/tough_claws.c new file mode 100644 index 0000000000..4e6f4ecf8b --- /dev/null +++ b/test/battle/ability/tough_claws.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Tough Claws (Ability) test titles") diff --git a/test/battle/ability/toxic_boost.c b/test/battle/ability/toxic_boost.c new file mode 100644 index 0000000000..85960c5b02 --- /dev/null +++ b/test/battle/ability/toxic_boost.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Toxic Boost (Ability) test titles") diff --git a/test/battle/ability/triage.c b/test/battle/ability/triage.c new file mode 100644 index 0000000000..753d32b717 --- /dev/null +++ b/test/battle/ability/triage.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Triage (Ability) test titles") diff --git a/test/battle/ability/truant.c b/test/battle/ability/truant.c new file mode 100644 index 0000000000..85c0fe7749 --- /dev/null +++ b/test/battle/ability/truant.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Truant (Ability) test titles") diff --git a/test/battle/ability/turboblaze.c b/test/battle/ability/turboblaze.c new file mode 100644 index 0000000000..a715c23111 --- /dev/null +++ b/test/battle/ability/turboblaze.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Turboblaze (Ability) test titles") diff --git a/test/battle/ability/unaware.c b/test/battle/ability/unaware.c new file mode 100644 index 0000000000..5eb83cb9df --- /dev/null +++ b/test/battle/ability/unaware.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Unaware (Ability) test titles") diff --git a/test/battle/ability/unseen_fist.c b/test/battle/ability/unseen_fist.c new file mode 100644 index 0000000000..046ef7d2fb --- /dev/null +++ b/test/battle/ability/unseen_fist.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Unseen Fist (Ability) test titles") diff --git a/test/battle/ability/victory_star.c b/test/battle/ability/victory_star.c new file mode 100644 index 0000000000..46c3aca825 --- /dev/null +++ b/test/battle/ability/victory_star.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Victory Star (Ability) test titles") diff --git a/test/battle/ability/vital_spirit.c b/test/battle/ability/vital_spirit.c new file mode 100644 index 0000000000..2539df2334 --- /dev/null +++ b/test/battle/ability/vital_spirit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Vital Spirit (Ability) test titles") diff --git a/test/battle/ability/wandering_spirit.c b/test/battle/ability/wandering_spirit.c new file mode 100644 index 0000000000..d32fb7c7b2 --- /dev/null +++ b/test/battle/ability/wandering_spirit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wandering Spirit (Ability) test titles") diff --git a/test/battle/ability/water_bubble.c b/test/battle/ability/water_bubble.c new file mode 100644 index 0000000000..2f04b18096 --- /dev/null +++ b/test/battle/ability/water_bubble.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Water Bubble (Ability) test titles") diff --git a/test/battle/ability/water_veil.c b/test/battle/ability/water_veil.c new file mode 100644 index 0000000000..428243fc10 --- /dev/null +++ b/test/battle/ability/water_veil.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Water Veil (Ability) test titles") diff --git a/test/battle/ability/well_baked_body.c b/test/battle/ability/well_baked_body.c new file mode 100644 index 0000000000..ae555b47cf --- /dev/null +++ b/test/battle/ability/well_baked_body.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Well-Baked Body (Ability) test titles") diff --git a/test/battle/ability/wimp_out.c b/test/battle/ability/wimp_out.c new file mode 100644 index 0000000000..3ceea91788 --- /dev/null +++ b/test/battle/ability/wimp_out.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wimp Out (Ability) test titles") diff --git a/test/battle/ability/wonder_guard.c b/test/battle/ability/wonder_guard.c new file mode 100644 index 0000000000..673b6c113a --- /dev/null +++ b/test/battle/ability/wonder_guard.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wonder Guard (Ability) test titles") diff --git a/test/battle/ability/wonder_skin.c b/test/battle/ability/wonder_skin.c new file mode 100644 index 0000000000..6501894f1c --- /dev/null +++ b/test/battle/ability/wonder_skin.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wonder Skin (Ability) test titles") diff --git a/test/battle/move_effect/facade.c b/test/battle/move_effect/facade.c new file mode 100644 index 0000000000..cc1e21e34f --- /dev/null +++ b/test/battle/move_effect/facade.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Facade (Move Effect) test titles") diff --git a/test/battle/move_effect/fairy_lock.c b/test/battle/move_effect/fairy_lock.c new file mode 100644 index 0000000000..a42aa6aa48 --- /dev/null +++ b/test/battle/move_effect/fairy_lock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fairy Lock (Move Effect) test titles") diff --git a/test/battle/move_effect/false_swipe.c b/test/battle/move_effect/false_swipe.c new file mode 100644 index 0000000000..da2cbf6a21 --- /dev/null +++ b/test/battle/move_effect/false_swipe.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write False Swipe (Move Effect) test titles") diff --git a/test/battle/move_effect/fell_stinger.c b/test/battle/move_effect/fell_stinger.c new file mode 100644 index 0000000000..2613dc2d9d --- /dev/null +++ b/test/battle/move_effect/fell_stinger.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fell Stinger (Move Effect) test titles") diff --git a/test/battle/move_effect/final_gambit.c b/test/battle/move_effect/final_gambit.c new file mode 100644 index 0000000000..be815abf5a --- /dev/null +++ b/test/battle/move_effect/final_gambit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Final Gambit (Move Effect) test titles") diff --git a/test/battle/move_effect/first_turn_only.c b/test/battle/move_effect/first_turn_only.c new file mode 100644 index 0000000000..b26245a3d9 --- /dev/null +++ b/test/battle/move_effect/first_turn_only.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fake Out/First Impression (Move Effect) test titles") diff --git a/test/battle/move_effect/flail.c b/test/battle/move_effect/flail.c new file mode 100644 index 0000000000..af5544d9b4 --- /dev/null +++ b/test/battle/move_effect/flail.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flail (Move Effect) test titles") diff --git a/test/battle/move_effect/flatter.c b/test/battle/move_effect/flatter.c new file mode 100644 index 0000000000..7effb09329 --- /dev/null +++ b/test/battle/move_effect/flatter.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flatter (Move Effect) test titles") diff --git a/test/battle/move_effect/foresight.c b/test/battle/move_effect/foresight.c new file mode 100644 index 0000000000..082e2d6fa4 --- /dev/null +++ b/test/battle/move_effect/foresight.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Foresight (Move Effect) test titles") diff --git a/test/battle/move_effect/frustration.c b/test/battle/move_effect/frustration.c new file mode 100644 index 0000000000..eb994c5076 --- /dev/null +++ b/test/battle/move_effect/frustration.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Frustration (Move Effect) test titles") diff --git a/test/battle/move_effect/fusion_combo.c b/test/battle/move_effect/fusion_combo.c new file mode 100644 index 0000000000..7561536b11 --- /dev/null +++ b/test/battle/move_effect/fusion_combo.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fusion Flare/Bolt (Move Effect) test titles") diff --git a/test/battle/move_effect/gear_up.c b/test/battle/move_effect/gear_up.c new file mode 100644 index 0000000000..03aba9a395 --- /dev/null +++ b/test/battle/move_effect/gear_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Gear Up (Move Effect) test titles") diff --git a/test/battle/move_effect/geomancy.c b/test/battle/move_effect/geomancy.c new file mode 100644 index 0000000000..f5b113a452 --- /dev/null +++ b/test/battle/move_effect/geomancy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Geomancy (Move Effect) test titles") diff --git a/test/battle/move_effect/grassy_glide.c b/test/battle/move_effect/grassy_glide.c new file mode 100644 index 0000000000..00219fb1dd --- /dev/null +++ b/test/battle/move_effect/grassy_glide.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grassy Glide (Move Effect) test titles") diff --git a/test/battle/move_effect/grav_apple.c b/test/battle/move_effect/grav_apple.c new file mode 100644 index 0000000000..7ce2dd26c7 --- /dev/null +++ b/test/battle/move_effect/grav_apple.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grav Apple (Move Effect) test titles") diff --git a/test/battle/move_effect/growth.c b/test/battle/move_effect/growth.c new file mode 100644 index 0000000000..7b53f56cfc --- /dev/null +++ b/test/battle/move_effect/growth.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Growth (Move Effect) test titles") diff --git a/test/battle/move_effect/grudge.c b/test/battle/move_effect/grudge.c new file mode 100644 index 0000000000..f0e0e53b6a --- /dev/null +++ b/test/battle/move_effect/grudge.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") diff --git a/test/battle/move_effect/guard_swap.c b/test/battle/move_effect/guard_swap.c new file mode 100644 index 0000000000..f0e0e53b6a --- /dev/null +++ b/test/battle/move_effect/guard_swap.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Grudge (Move Effect) test titles") diff --git a/test/battle/move_effect/guardian_of_alola.c b/test/battle/move_effect/guardian_of_alola.c new file mode 100644 index 0000000000..fe33236363 --- /dev/null +++ b/test/battle/move_effect/guardian_of_alola.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Guardian of Alola (Move Effect) test titles") diff --git a/test/battle/move_effect/gyro_ball.c b/test/battle/move_effect/gyro_ball.c new file mode 100644 index 0000000000..e6cbfa46c9 --- /dev/null +++ b/test/battle/move_effect/gyro_ball.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Gyro Ball (Move Effect) test titles") diff --git a/test/battle/move_effect/hail.c b/test/battle/move_effect/hail.c new file mode 100644 index 0000000000..9fdbe0ab37 --- /dev/null +++ b/test/battle/move_effect/hail.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Hail (Move Effect) test titles") diff --git a/test/battle/move_effect/happy_hour.c b/test/battle/move_effect/happy_hour.c new file mode 100644 index 0000000000..4e271068e2 --- /dev/null +++ b/test/battle/move_effect/happy_hour.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Happy Hour (Move Effect) test titles") diff --git a/test/battle/move_effect/heal_block.c b/test/battle/move_effect/heal_block.c new file mode 100644 index 0000000000..2bb4367dd4 --- /dev/null +++ b/test/battle/move_effect/heal_block.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heal Block (Move Effect) test titles") diff --git a/test/battle/move_effect/heart_swap.c b/test/battle/move_effect/heart_swap.c new file mode 100644 index 0000000000..1c4d22e204 --- /dev/null +++ b/test/battle/move_effect/heart_swap.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heart Swap (Move Effect) test titles") diff --git a/test/battle/move_effect/heat_crash.c b/test/battle/move_effect/heat_crash.c new file mode 100644 index 0000000000..8b2d0a0433 --- /dev/null +++ b/test/battle/move_effect/heat_crash.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Heat Crash (Move Effect) test titles") diff --git a/test/battle/move_effect/helping_hand.c b/test/battle/move_effect/helping_hand.c new file mode 100644 index 0000000000..81d64e113d --- /dev/null +++ b/test/battle/move_effect/helping_hand.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Helping Hand (Move Effect) test titles") diff --git a/test/battle/move_effect/hit_enemy_heal_ally.c b/test/battle/move_effect/hit_enemy_heal_ally.c new file mode 100644 index 0000000000..018672cd6c --- /dev/null +++ b/test/battle/move_effect/hit_enemy_heal_ally.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Pollen Puff (Move Effect) test titles") diff --git a/test/battle/move_effect/hyperspace_fury.c b/test/battle/move_effect/hyperspace_fury.c new file mode 100644 index 0000000000..080758c94b --- /dev/null +++ b/test/battle/move_effect/hyperspace_fury.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Hyperspace Fury (Move Effect) test titles") diff --git a/test/battle/move_effect/imprison.c b/test/battle/move_effect/imprison.c new file mode 100644 index 0000000000..dd4e496692 --- /dev/null +++ b/test/battle/move_effect/imprison.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Imprison (Move Effect) test titles") diff --git a/test/battle/move_effect/ingrain.c b/test/battle/move_effect/ingrain.c new file mode 100644 index 0000000000..19213f10d9 --- /dev/null +++ b/test/battle/move_effect/ingrain.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Ingrain (Move Effect) test titles") diff --git a/test/battle/move_effect/jungle_healing.c b/test/battle/move_effect/jungle_healing.c new file mode 100644 index 0000000000..12b964a049 --- /dev/null +++ b/test/battle/move_effect/jungle_healing.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Jungle Healing (Move Effect) test titles") diff --git a/test/battle/move_effect/lash_out.c b/test/battle/move_effect/lash_out.c new file mode 100644 index 0000000000..dd8e9eb0e9 --- /dev/null +++ b/test/battle/move_effect/lash_out.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lash Out (Move Effect) test titles") diff --git a/test/battle/move_effect/level_damage.c b/test/battle/move_effect/level_damage.c new file mode 100644 index 0000000000..63bd121577 --- /dev/null +++ b/test/battle/move_effect/level_damage.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Seismic Toss/Night Shade (Move Effect) test titles") diff --git a/test/battle/move_effect/light_screen.c b/test/battle/move_effect/light_screen.c new file mode 100644 index 0000000000..56eedebbd4 --- /dev/null +++ b/test/battle/move_effect/light_screen.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Light Screen (Move Effect) test titles") diff --git a/test/battle/move_effect/lock_on.c b/test/battle/move_effect/lock_on.c new file mode 100644 index 0000000000..9e7b93cff4 --- /dev/null +++ b/test/battle/move_effect/lock_on.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Lock-On/Mind Reader (Move Effect) test titles") diff --git a/test/battle/move_effect/low_kick.c b/test/battle/move_effect/low_kick.c new file mode 100644 index 0000000000..c68b152e2d --- /dev/null +++ b/test/battle/move_effect/low_kick.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Low Kick (Move Effect) test titles") diff --git a/test/battle/move_effect/magic_room.c b/test/battle/move_effect/magic_room.c new file mode 100644 index 0000000000..9fde0046fd --- /dev/null +++ b/test/battle/move_effect/magic_room.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magic Room (Move Effect) test titles") diff --git a/test/battle/move_effect/magnet_rise.c b/test/battle/move_effect/magnet_rise.c new file mode 100644 index 0000000000..9fde0046fd --- /dev/null +++ b/test/battle/move_effect/magnet_rise.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magic Room (Move Effect) test titles") diff --git a/test/battle/move_effect/magnetic_flux.c b/test/battle/move_effect/magnetic_flux.c new file mode 100644 index 0000000000..f574db0089 --- /dev/null +++ b/test/battle/move_effect/magnetic_flux.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magnetic Flux (Move Effect) test titles") diff --git a/test/battle/move_effect/magnitude.c b/test/battle/move_effect/magnitude.c new file mode 100644 index 0000000000..75799a4dcb --- /dev/null +++ b/test/battle/move_effect/magnitude.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Magnitude (Move Effect) test titles") diff --git a/test/battle/move_effect/mat_block.c b/test/battle/move_effect/mat_block.c new file mode 100644 index 0000000000..78921a7329 --- /dev/null +++ b/test/battle/move_effect/mat_block.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mat Block (Move Effect) test titles") diff --git a/test/battle/move_effect/max_move.c b/test/battle/move_effect/max_move.c new file mode 100644 index 0000000000..41c2a4e32c --- /dev/null +++ b/test/battle/move_effect/max_move.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Max Moves (Move Effect) test titles") diff --git a/test/battle/move_effect/me_first.c b/test/battle/move_effect/me_first.c new file mode 100644 index 0000000000..e5fbd2a7fb --- /dev/null +++ b/test/battle/move_effect/me_first.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Me First (Move Effect) test titles") diff --git a/test/battle/move_effect/mean_look.c b/test/battle/move_effect/mean_look.c new file mode 100644 index 0000000000..a5fa8ff0c1 --- /dev/null +++ b/test/battle/move_effect/mean_look.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mean Look (Move Effect) test titles") diff --git a/test/battle/move_effect/memento.c b/test/battle/move_effect/memento.c new file mode 100644 index 0000000000..c83ffc1ab1 --- /dev/null +++ b/test/battle/move_effect/memento.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Memento (Move Effect) test titles") diff --git a/test/battle/move_effect/metal_burst.c b/test/battle/move_effect/metal_burst.c new file mode 100644 index 0000000000..4fec370e85 --- /dev/null +++ b/test/battle/move_effect/metal_burst.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Metal Burst (Move Effect) test titles") diff --git a/test/battle/move_effect/mimic.c b/test/battle/move_effect/mimic.c new file mode 100644 index 0000000000..4a51a4b79e --- /dev/null +++ b/test/battle/move_effect/mimic.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mimic (Move Effect) test titles") diff --git a/test/battle/move_effect/minimize.c b/test/battle/move_effect/minimize.c new file mode 100644 index 0000000000..f0196936a5 --- /dev/null +++ b/test/battle/move_effect/minimize.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Minimize (Move Effect) test titles") diff --git a/test/battle/move_effect/miracle_eye.c b/test/battle/move_effect/miracle_eye.c new file mode 100644 index 0000000000..784323f1cc --- /dev/null +++ b/test/battle/move_effect/miracle_eye.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Miracle Eye (Move Effect) test titles") diff --git a/test/battle/move_effect/mirror_coat.c b/test/battle/move_effect/mirror_coat.c new file mode 100644 index 0000000000..2a3d6ef250 --- /dev/null +++ b/test/battle/move_effect/mirror_coat.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mirror Coat (Move Effect) test titles") diff --git a/test/battle/move_effect/mist.c b/test/battle/move_effect/mist.c new file mode 100644 index 0000000000..332d82a6f9 --- /dev/null +++ b/test/battle/move_effect/mist.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mist (Move Effect) test titles") diff --git a/test/battle/move_effect/mud_sport.c b/test/battle/move_effect/mud_sport.c new file mode 100644 index 0000000000..143bbe1447 --- /dev/null +++ b/test/battle/move_effect/mud_sport.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Mud Sport (Move Effect) test titles") diff --git a/test/battle/move_effect/natural_gift.c b/test/battle/move_effect/natural_gift.c new file mode 100644 index 0000000000..dd9b0bd466 --- /dev/null +++ b/test/battle/move_effect/natural_gift.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Natural Gift (Move Effect) test titles") diff --git a/test/battle/move_effect/nature_power.c b/test/battle/move_effect/nature_power.c new file mode 100644 index 0000000000..1e9692f88d --- /dev/null +++ b/test/battle/move_effect/nature_power.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Nature Power (Move Effect) test titles") diff --git a/test/battle/move_effect/nightmare.c b/test/battle/move_effect/nightmare.c new file mode 100644 index 0000000000..c243664f2d --- /dev/null +++ b/test/battle/move_effect/nightmare.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Nightmare (Move Effect) test titles") diff --git a/test/battle/move_effect/no_retreat.c b/test/battle/move_effect/no_retreat.c new file mode 100644 index 0000000000..bf2a15dfbf --- /dev/null +++ b/test/battle/move_effect/no_retreat.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write No Retreat (Move Effect) test titles") diff --git a/test/battle/move_effect/noble_roar.c b/test/battle/move_effect/noble_roar.c new file mode 100644 index 0000000000..4fd182b84d --- /dev/null +++ b/test/battle/move_effect/noble_roar.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Noble Roar (Move Effect) test titles") diff --git a/test/battle/move_effect/order_up.c b/test/battle/move_effect/order_up.c new file mode 100644 index 0000000000..fffd773403 --- /dev/null +++ b/test/battle/move_effect/order_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Order Up (Move Effect) test titles") diff --git a/test/battle/move_effect/pain_split.c b/test/battle/move_effect/pain_split.c new file mode 100644 index 0000000000..be92aecc7d --- /dev/null +++ b/test/battle/move_effect/pain_split.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Pain Split (Move Effect) test titles") diff --git a/test/battle/move_effect/paralyze.c b/test/battle/move_effect/paralyze.c new file mode 100644 index 0000000000..a3f1a5574a --- /dev/null +++ b/test/battle/move_effect/paralyze.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Paralyze (Move Effect) test titles") diff --git a/test/battle/move_effect/parting_shot.c b/test/battle/move_effect/parting_shot.c new file mode 100644 index 0000000000..4d55d09315 --- /dev/null +++ b/test/battle/move_effect/parting_shot.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Parting Shot (Move Effect) test titles") diff --git a/test/battle/move_effect/payback.c b/test/battle/move_effect/payback.c new file mode 100644 index 0000000000..1f078987a1 --- /dev/null +++ b/test/battle/move_effect/payback.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Payback (Move Effect) test titles") diff --git a/test/battle/move_effect/perish_song.c b/test/battle/move_effect/perish_song.c new file mode 100644 index 0000000000..bfbe7eedc8 --- /dev/null +++ b/test/battle/move_effect/perish_song.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Perish Song (Move Effect) test titles") diff --git a/test/battle/move_effect/placeholder.c b/test/battle/move_effect/placeholder.c new file mode 100644 index 0000000000..1b06392b9a --- /dev/null +++ b/test/battle/move_effect/placeholder.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Placeholder (Move Effect) test titles") diff --git a/test/battle/move_effect/poison.c b/test/battle/move_effect/poison.c new file mode 100644 index 0000000000..5b26ccf62d --- /dev/null +++ b/test/battle/move_effect/poison.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Poison (Move Effect) test titles") diff --git a/test/battle/move_effect/poltergeist.c b/test/battle/move_effect/poltergeist.c new file mode 100644 index 0000000000..f90031d8a8 --- /dev/null +++ b/test/battle/move_effect/poltergeist.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Poltergeist (Move Effect) test titles") diff --git a/test/battle/move_effect/power_swap.c b/test/battle/move_effect/power_swap.c new file mode 100644 index 0000000000..214a8488cc --- /dev/null +++ b/test/battle/move_effect/power_swap.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Swap (Move Effect) test titles") diff --git a/test/battle/move_effect/power_trick.c b/test/battle/move_effect/power_trick.c new file mode 100644 index 0000000000..a8f89051e7 --- /dev/null +++ b/test/battle/move_effect/power_trick.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Power Trick (Move Effect) test titles") diff --git a/test/battle/move_effect/present.c b/test/battle/move_effect/present.c new file mode 100644 index 0000000000..bd21f13de4 --- /dev/null +++ b/test/battle/move_effect/present.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Present (Move Effect) test titles") diff --git a/test/battle/move_effect/psyblade.c b/test/battle/move_effect/psyblade.c new file mode 100644 index 0000000000..3a5778d1f4 --- /dev/null +++ b/test/battle/move_effect/psyblade.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Psyblade (Move Effect) test titles") diff --git a/test/battle/move_effect/psych_up.c b/test/battle/move_effect/psych_up.c new file mode 100644 index 0000000000..36241a4ed7 --- /dev/null +++ b/test/battle/move_effect/psych_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Psych Up (Move Effect) test titles") diff --git a/test/battle/move_effect/psycho_shift.c b/test/battle/move_effect/psycho_shift.c new file mode 100644 index 0000000000..4382ca4575 --- /dev/null +++ b/test/battle/move_effect/psycho_shift.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Psycho Shift (Move Effect) test titles") diff --git a/test/battle/move_effect/psyshock.c b/test/battle/move_effect/psyshock.c new file mode 100644 index 0000000000..6b3ee54c5c --- /dev/null +++ b/test/battle/move_effect/psyshock.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Psyshock (Move Effect) test titles") diff --git a/test/battle/move_effect/psywave.c b/test/battle/move_effect/psywave.c new file mode 100644 index 0000000000..627e45ea3e --- /dev/null +++ b/test/battle/move_effect/psywave.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Psywave (Move Effect) test titles") diff --git a/test/battle/move_effect/punishment.c b/test/battle/move_effect/punishment.c new file mode 100644 index 0000000000..45f0b899af --- /dev/null +++ b/test/battle/move_effect/punishment.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Punishment (Move Effect) test titles") diff --git a/test/battle/move_effect/purify.c b/test/battle/move_effect/purify.c new file mode 100644 index 0000000000..134c96119f --- /dev/null +++ b/test/battle/move_effect/purify.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Purify (Move Effect) test titles") diff --git a/test/battle/move_effect/quiver_dance.c b/test/battle/move_effect/quiver_dance.c new file mode 100644 index 0000000000..5a7ff5b944 --- /dev/null +++ b/test/battle/move_effect/quiver_dance.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Quiver Dance (Move Effect) test titles") diff --git a/test/battle/move_effect/rage.c b/test/battle/move_effect/rage.c new file mode 100644 index 0000000000..33025a6b0e --- /dev/null +++ b/test/battle/move_effect/rage.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rage (Move Effect) test titles") diff --git a/test/battle/move_effect/rain_always_hit.c b/test/battle/move_effect/rain_always_hit.c new file mode 100644 index 0000000000..3bed952a37 --- /dev/null +++ b/test/battle/move_effect/rain_always_hit.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Bleakwind/Wildbolt/Sandsear Storm (Move Effect) test titles") diff --git a/test/battle/move_effect/rain_dance.c b/test/battle/move_effect/rain_dance.c new file mode 100644 index 0000000000..f9c3786b71 --- /dev/null +++ b/test/battle/move_effect/rain_dance.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rain Dance (Move Effect) test titles") diff --git a/test/battle/move_effect/recoil_hp_25.c b/test/battle/move_effect/recoil_hp_25.c new file mode 100644 index 0000000000..9abb1bcfd0 --- /dev/null +++ b/test/battle/move_effect/recoil_hp_25.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Struggle (Move Effect) test titles") diff --git a/test/battle/move_effect/recycle.c b/test/battle/move_effect/recycle.c new file mode 100644 index 0000000000..53f2e5c2ff --- /dev/null +++ b/test/battle/move_effect/recycle.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Recycle (Move Effect) test titles") diff --git a/test/battle/move_effect/rest.c b/test/battle/move_effect/rest.c new file mode 100644 index 0000000000..4d0d85b560 --- /dev/null +++ b/test/battle/move_effect/rest.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rest (Move Effect) test titles") diff --git a/test/battle/move_effect/restore_hp.c b/test/battle/move_effect/restore_hp.c new file mode 100644 index 0000000000..57f756115e --- /dev/null +++ b/test/battle/move_effect/restore_hp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Recover/Slack Off/Heal Order (Move Effect) test titles") diff --git a/test/battle/move_effect/return.c b/test/battle/move_effect/return.c new file mode 100644 index 0000000000..50945ca556 --- /dev/null +++ b/test/battle/move_effect/return.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Return (Move Effect) test titles") diff --git a/test/battle/move_effect/revenge.c b/test/battle/move_effect/revenge.c new file mode 100644 index 0000000000..980bca9e33 --- /dev/null +++ b/test/battle/move_effect/revenge.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Revenge (Move Effect) test titles") diff --git a/test/battle/move_effect/rising_voltage.c b/test/battle/move_effect/rising_voltage.c new file mode 100644 index 0000000000..de6ca67c04 --- /dev/null +++ b/test/battle/move_effect/rising_voltage.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rising Voltage (Move Effect) test titles") diff --git a/test/battle/move_effect/rollout.c b/test/battle/move_effect/rollout.c new file mode 100644 index 0000000000..c137ca4fc8 --- /dev/null +++ b/test/battle/move_effect/rollout.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Rollout (Move Effect) test titles") diff --git a/test/battle/move_effect/safeguard.c b/test/battle/move_effect/safeguard.c new file mode 100644 index 0000000000..44dee766ee --- /dev/null +++ b/test/battle/move_effect/safeguard.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Safeguard (Move Effect) test titles") diff --git a/test/battle/move_effect/sandstorm.c b/test/battle/move_effect/sandstorm.c new file mode 100644 index 0000000000..7a70a2f3ff --- /dev/null +++ b/test/battle/move_effect/sandstorm.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sandstorm (Move Effect) test titles") diff --git a/test/battle/move_effect/shell_smash.c b/test/battle/move_effect/shell_smash.c new file mode 100644 index 0000000000..af31e771ad --- /dev/null +++ b/test/battle/move_effect/shell_smash.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Shell Smash (Move Effect) test titles") diff --git a/test/battle/move_effect/shift_gear.c b/test/battle/move_effect/shift_gear.c new file mode 100644 index 0000000000..990e815cb3 --- /dev/null +++ b/test/battle/move_effect/shift_gear.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Shift Gear (Move Effect) test titles") diff --git a/test/battle/move_effect/shore_up.c b/test/battle/move_effect/shore_up.c new file mode 100644 index 0000000000..91ee4f05b6 --- /dev/null +++ b/test/battle/move_effect/shore_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Shore Up (Move Effect) test titles") diff --git a/test/battle/move_effect/sky_drop.c b/test/battle/move_effect/sky_drop.c new file mode 100644 index 0000000000..f0482788dd --- /dev/null +++ b/test/battle/move_effect/sky_drop.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sky Drop (Move Effect) test titles") diff --git a/test/battle/move_effect/smack_down.c b/test/battle/move_effect/smack_down.c deleted file mode 100644 index eb924ea1ac..0000000000 --- a/test/battle/move_effect/smack_down.c +++ /dev/null @@ -1,19 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN) == TRUE); -} - -SINGLE_BATTLE_TEST("Smack Down does not ground mons behind substitutes") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SKARMORY); - } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SMACK_DOWN); } - } SCENE { - NOT MESSAGE("The opposing Skarmory fell straight down!"); - } -} diff --git a/test/battle/move_effect/smelling_salts.c b/test/battle/move_effect/smelling_salts.c deleted file mode 100644 index 6b1d0b2d7e..0000000000 --- a/test/battle/move_effect/smelling_salts.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_SMELLING_SALTS, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(GetMoveEffectArg_Status(MOVE_SMELLING_SALTS) == STATUS1_PARALYSIS); -} - -SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind substitutes or get increased power") -{ - u32 ability; - PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } - PARAMETRIZE { ability = ABILITY_INFILTRATOR; } - GIVEN { - PLAYER(SPECIES_CROBAT) { Ability(ability); } - OPPONENT(SPECIES_SEISMITOAD) { Status1(STATUS1_PARALYSIS); } - } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_CELEBRATE); } - TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SMELLING_SALTS); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SMELLING_SALTS, player); - if (ability == ABILITY_INNER_FOCUS) - { - MESSAGE("The substitute took damage for the opposing Seismitoad!"); - NONE_OF - { - MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. - MESSAGE("The opposing Seismitoad was cured of paralysis!"); - STATUS_ICON(opponent, none: TRUE); - } - } - else - { - MESSAGE("The opposing Seismitoad was cured of paralysis!"); - STATUS_ICON(opponent, none: TRUE); - } - } -} - -SINGLE_BATTLE_TEST("Smelling Salts get incread power vs. paralyzed targets") -{ - u32 status1; - PARAMETRIZE { status1 = STATUS1_PARALYSIS; } - PARAMETRIZE { status1 = STATUS1_NONE; } - GIVEN { - PLAYER(SPECIES_CROBAT); - OPPONENT(SPECIES_LOTAD) { Status1(status1); } - } WHEN { - TURN { MOVE(player, MOVE_SMELLING_SALTS); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_SMELLING_SALTS, player); - if (status1 == STATUS1_PARALYSIS) - { - MESSAGE("The opposing Lotad fainted!"); - } - else - { - NOT MESSAGE("The opposing Lotad fainted!"); - MESSAGE("The opposing Lotad used Celebrate!"); - } - } -} diff --git a/test/battle/move_effect/snatch.c b/test/battle/move_effect/snatch.c new file mode 100644 index 0000000000..f8e2891837 --- /dev/null +++ b/test/battle/move_effect/snatch.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Snatch (Move Effect) test titles") diff --git a/test/battle/move_effect/snipe_shot.c b/test/battle/move_effect/snipe_shot.c new file mode 100644 index 0000000000..7ef7cbeb28 --- /dev/null +++ b/test/battle/move_effect/snipe_shot.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Snipe Shot (Move Effect) test titles") diff --git a/test/battle/move_effect/snowscape.c b/test/battle/move_effect/snowscape.c new file mode 100644 index 0000000000..a0d1275f66 --- /dev/null +++ b/test/battle/move_effect/snowscape.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Snowscape (Move Effect) test titles") diff --git a/test/battle/move_effect/soak.c b/test/battle/move_effect/soak.c new file mode 100644 index 0000000000..156e1f9558 --- /dev/null +++ b/test/battle/move_effect/soak.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Soak (Move Effect) test titles") diff --git a/test/battle/move_effect/softboiled.c b/test/battle/move_effect/softboiled.c new file mode 100644 index 0000000000..a4cbce5b93 --- /dev/null +++ b/test/battle/move_effect/softboiled.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Softboiled (Move Effect) test titles") diff --git a/test/battle/move_effect/sparkling_aria.c b/test/battle/move_effect/sparkling_aria.c deleted file mode 100644 index 86b906228b..0000000000 --- a/test/battle/move_effect/sparkling_aria.c +++ /dev/null @@ -1,25 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLING_ARIA, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(GetMoveEffectArg_Status(MOVE_SPARKLING_ARIA) == STATUS1_BURN); - ASSUME(IsSoundMove(MOVE_SPARKLING_ARIA)); -} - -DOUBLE_BATTLE_TEST("Sparkling Aria cures burns from all Pokemon on the field and behind substitutes") -{ - GIVEN { - PLAYER(SPECIES_PRIMARINA); - PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } - OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } - OPPONENT(SPECIES_WYNAUT) { Status1(STATUS1_BURN); } - } WHEN { - TURN { MOVE(opponentLeft, MOVE_SUBSTITUTE); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_SPARKLING_ARIA); } - } SCENE { - MESSAGE("The opposing Wobbuffet's burn was cured!"); - MESSAGE("Wobbuffet's burn was cured!"); - MESSAGE("The opposing Wynaut's burn was cured!"); - } -} diff --git a/test/battle/move_effect/special_attack_down_2.c b/test/battle/move_effect/special_attack_down_2.c new file mode 100644 index 0000000000..b62d4b52ac --- /dev/null +++ b/test/battle/move_effect/special_attack_down_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Eerie Impulse (Move Effect) test titles") diff --git a/test/battle/move_effect/special_attack_up.c b/test/battle/move_effect/special_attack_up.c new file mode 100644 index 0000000000..964566a8db --- /dev/null +++ b/test/battle/move_effect/special_attack_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sp.Atk +1 (Move Effect) test titles") // Pre-gen5 Growth diff --git a/test/battle/move_effect/special_attack_up_2.c b/test/battle/move_effect/special_attack_up_2.c new file mode 100644 index 0000000000..c4bf38d6aa --- /dev/null +++ b/test/battle/move_effect/special_attack_up_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Nasty Plot (Move Effect) test titles") diff --git a/test/battle/move_effect/special_defense_down.c b/test/battle/move_effect/special_defense_down.c new file mode 100644 index 0000000000..1769ff6975 --- /dev/null +++ b/test/battle/move_effect/special_defense_down.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sp.Def -1 (Move Effect) test titles") // No move has this effect diff --git a/test/battle/move_effect/special_defense_down_2.c b/test/battle/move_effect/special_defense_down_2.c new file mode 100644 index 0000000000..5fff5bdd7b --- /dev/null +++ b/test/battle/move_effect/special_defense_down_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Fake Tears/Metal Sound (Move Effect) test titles") diff --git a/test/battle/move_effect/special_defense_up.c b/test/battle/move_effect/special_defense_up.c new file mode 100644 index 0000000000..66bbfa4dc5 --- /dev/null +++ b/test/battle/move_effect/special_defense_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sp.Def +1 (Move Effect) test titles") // No move has this effect diff --git a/test/battle/move_effect/special_defense_up_2.c b/test/battle/move_effect/special_defense_up_2.c new file mode 100644 index 0000000000..1685663452 --- /dev/null +++ b/test/battle/move_effect/special_defense_up_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Amnesia (Move Effect) test titles") diff --git a/test/battle/move_effect/speed_down_2.c b/test/battle/move_effect/speed_down_2.c new file mode 100644 index 0000000000..e3b95e3fe9 --- /dev/null +++ b/test/battle/move_effect/speed_down_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Scary Face/Cotton Spore (Move Effect) test titles") diff --git a/test/battle/move_effect/speed_up.c b/test/battle/move_effect/speed_up.c new file mode 100644 index 0000000000..1b0d417ef6 --- /dev/null +++ b/test/battle/move_effect/speed_up.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Speed +1 (Move Effect) test titles") // No move has this effect diff --git a/test/battle/move_effect/speed_up_2.c b/test/battle/move_effect/speed_up_2.c new file mode 100644 index 0000000000..7202555498 --- /dev/null +++ b/test/battle/move_effect/speed_up_2.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Agility/Rock Polish (Move Effect) test titles") diff --git a/test/battle/move_effect/spite.c b/test/battle/move_effect/spite.c new file mode 100644 index 0000000000..6a23e16dd2 --- /dev/null +++ b/test/battle/move_effect/spite.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Spite (Move Effect) test titles") diff --git a/test/battle/move_effect/stored_power.c b/test/battle/move_effect/stored_power.c new file mode 100644 index 0000000000..55788a1ff0 --- /dev/null +++ b/test/battle/move_effect/stored_power.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Stored Power (Move Effect) test titles") diff --git a/test/battle/move_effect/sunny_day.c b/test/battle/move_effect/sunny_day.c new file mode 100644 index 0000000000..d7fed979d9 --- /dev/null +++ b/test/battle/move_effect/sunny_day.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Sunny Day (Move Effect) test titles") diff --git a/test/battle/move_effect/super_fang.c b/test/battle/move_effect/super_fang.c new file mode 100644 index 0000000000..33e162395d --- /dev/null +++ b/test/battle/move_effect/super_fang.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Super Fang (Move Effect) test titles") diff --git a/test/battle/move_effect/swagger.c b/test/battle/move_effect/swagger.c new file mode 100644 index 0000000000..5845d4292f --- /dev/null +++ b/test/battle/move_effect/swagger.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Swagger (Move Effect) test titles") diff --git a/test/battle/move_effect/synchronoise.c b/test/battle/move_effect/synchronoise.c new file mode 100644 index 0000000000..9b68ccc63a --- /dev/null +++ b/test/battle/move_effect/synchronoise.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Synchronoise (Move Effect) test titles") diff --git a/test/battle/move_effect/taunt.c b/test/battle/move_effect/taunt.c new file mode 100644 index 0000000000..91fe13364d --- /dev/null +++ b/test/battle/move_effect/taunt.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Taunt (Move Effect) test titles") diff --git a/test/battle/move_effect/terrain_pulse.c b/test/battle/move_effect/terrain_pulse.c new file mode 100644 index 0000000000..75b6802451 --- /dev/null +++ b/test/battle/move_effect/terrain_pulse.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Terrain Pulse (Move Effect) test titles") diff --git a/test/battle/move_effect/third_type.c b/test/battle/move_effect/third_type.c new file mode 100644 index 0000000000..c3bcab38d2 --- /dev/null +++ b/test/battle/move_effect/third_type.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Trick-or-Treat/Forest's Curse (Move Effect) test titles") diff --git a/test/battle/move_effect/tickle.c b/test/battle/move_effect/tickle.c new file mode 100644 index 0000000000..b5f5a56d69 --- /dev/null +++ b/test/battle/move_effect/tickle.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Tickle (Move Effect) test titles") diff --git a/test/battle/move_effect/topsy_turvy.c b/test/battle/move_effect/topsy_turvy.c new file mode 100644 index 0000000000..6e5ce38097 --- /dev/null +++ b/test/battle/move_effect/topsy_turvy.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Topsy Turvy (Move Effect) test titles") diff --git a/test/battle/move_effect/toxic_thread.c b/test/battle/move_effect/toxic_thread.c new file mode 100644 index 0000000000..9471b24bd6 --- /dev/null +++ b/test/battle/move_effect/toxic_thread.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Toxic Thread (Move Effect) test titles") diff --git a/test/battle/move_effect/transform.c b/test/battle/move_effect/transform.c new file mode 100644 index 0000000000..fd6e5f5a94 --- /dev/null +++ b/test/battle/move_effect/transform.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Transform (Move Effect) test titles") diff --git a/test/battle/move_effect/trick.c b/test/battle/move_effect/trick.c new file mode 100644 index 0000000000..3aa26af67a --- /dev/null +++ b/test/battle/move_effect/trick.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Trick (Move Effect) test titles") diff --git a/test/battle/move_effect/trick_room.c b/test/battle/move_effect/trick_room.c new file mode 100644 index 0000000000..615931ef15 --- /dev/null +++ b/test/battle/move_effect/trick_room.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Trick Room (Move Effect) test titles") diff --git a/test/battle/move_effect/trump_card.c b/test/battle/move_effect/trump_card.c new file mode 100644 index 0000000000..21b5c48ca3 --- /dev/null +++ b/test/battle/move_effect/trump_card.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Trump Card (Move Effect) test titles") diff --git a/test/battle/move_effect/two_typed_move.c b/test/battle/move_effect/two_typed_move.c new file mode 100644 index 0000000000..43c3515739 --- /dev/null +++ b/test/battle/move_effect/two_typed_move.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Flying Press (Move Effect) test titles") diff --git a/test/battle/move_effect/venom_drench.c b/test/battle/move_effect/venom_drench.c new file mode 100644 index 0000000000..00dac65858 --- /dev/null +++ b/test/battle/move_effect/venom_drench.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Venom Drench (Move Effect) test titles") diff --git a/test/battle/move_effect/victory_dance.c b/test/battle/move_effect/victory_dance.c new file mode 100644 index 0000000000..cd1d892428 --- /dev/null +++ b/test/battle/move_effect/victory_dance.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Victory Dance (Move Effect) test titles") diff --git a/test/battle/move_effect/wake_up_slap.c b/test/battle/move_effect/wake_up_slap.c deleted file mode 100644 index 0e172bf053..0000000000 --- a/test/battle/move_effect/wake_up_slap.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "global.h" -#include "test/battle.h" - -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS) == TRUE); - ASSUME(GetMoveEffectArg_Status(MOVE_WAKE_UP_SLAP) == STATUS1_SLEEP); -} - -SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substitutes or get increased power") -{ - u32 ability; - PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } - PARAMETRIZE { ability = ABILITY_INFILTRATOR; } - GIVEN { - PLAYER(SPECIES_CROBAT) { Ability(ability); } - OPPONENT(SPECIES_SEISMITOAD); - } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SING); } - TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_WAKE_UP_SLAP); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); - if (ability == ABILITY_INNER_FOCUS) { - MESSAGE("The substitute took damage for the opposing Seismitoad!"); - NONE_OF - { - MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. - MESSAGE("The opposing Seismitoad woke up!"); - STATUS_ICON(opponent, none: TRUE); - } - } else { - MESSAGE("The opposing Seismitoad woke up!"); - STATUS_ICON(opponent, none: TRUE); - } - } -} - -SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") -{ - u32 status1; - PARAMETRIZE { status1 = STATUS1_SLEEP; } - PARAMETRIZE { status1 = STATUS1_NONE; } - GIVEN { - PLAYER(SPECIES_CROBAT); - OPPONENT(SPECIES_LOTAD) { Status1(status1); } - } WHEN { - TURN { MOVE(player, MOVE_WAKE_UP_SLAP); } - } SCENE { - ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); - if (status1 == STATUS1_SLEEP) { - MESSAGE("The opposing Lotad fainted!"); - } else { - NOT MESSAGE("The opposing Lotad fainted!"); - MESSAGE("The opposing Lotad used Celebrate!"); - } - } -} diff --git a/test/battle/move_effect/water_sport.c b/test/battle/move_effect/water_sport.c new file mode 100644 index 0000000000..f7521c1fcc --- /dev/null +++ b/test/battle/move_effect/water_sport.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Water Sport (Move Effect) test titles") diff --git a/test/battle/move_effect/will_o_wisp.c b/test/battle/move_effect/will_o_wisp.c new file mode 100644 index 0000000000..08b1bd6c69 --- /dev/null +++ b/test/battle/move_effect/will_o_wisp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Will-O-Wisp (Move Effect) test titles") diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c new file mode 100644 index 0000000000..e96a3e1b11 --- /dev/null +++ b/test/battle/move_effect/wish.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wish (Move Effect) test titles") diff --git a/test/battle/move_effect/wonder_room.c b/test/battle/move_effect/wonder_room.c new file mode 100644 index 0000000000..113b7c55eb --- /dev/null +++ b/test/battle/move_effect/wonder_room.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Wonder Room (Move Effect) test titles") diff --git a/test/battle/move_effect/yawn.c b/test/battle/move_effect/yawn.c new file mode 100644 index 0000000000..ec150cc9bb --- /dev/null +++ b/test/battle/move_effect/yawn.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Yawn (Move Effect) test titles") diff --git a/test/battle/move_effect/flame_burst.c b/test/battle/move_effect_secondary/flame_burst.c similarity index 100% rename from test/battle/move_effect/flame_burst.c rename to test/battle/move_effect_secondary/flame_burst.c diff --git a/test/battle/move_effect_secondary/remove_status.c b/test/battle/move_effect_secondary/remove_status.c new file mode 100644 index 0000000000..0ff3d0f78c --- /dev/null +++ b/test/battle/move_effect_secondary/remove_status.c @@ -0,0 +1,132 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Smelling Salts does not cure paralyzed pokemons behind substitutes or get increased power") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_SMELLING_SALTS, MOVE_EFFECT_REMOVE_STATUS) == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_SMELLING_SALTS) == STATUS1_PARALYSIS); + PLAYER(SPECIES_CROBAT) { Ability(ability); } + OPPONENT(SPECIES_SEISMITOAD) { Status1(STATUS1_PARALYSIS); } + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_CELEBRATE); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_SMELLING_SALTS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SMELLING_SALTS, player); + if (ability == ABILITY_INNER_FOCUS) + { + MESSAGE("The substitute took damage for the opposing Seismitoad!"); + NONE_OF + { + MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. + MESSAGE("The opposing Seismitoad was cured of paralysis!"); + STATUS_ICON(opponent, none: TRUE); + } + } + else + { + MESSAGE("The opposing Seismitoad was cured of paralysis!"); + STATUS_ICON(opponent, none: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Smelling Salts get incread power vs. paralyzed targets") +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_PARALYSIS; } + PARAMETRIZE { status1 = STATUS1_NONE; } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_SMELLING_SALTS, MOVE_EFFECT_REMOVE_STATUS) == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_SMELLING_SALTS) == STATUS1_PARALYSIS); + PLAYER(SPECIES_CROBAT); + OPPONENT(SPECIES_LOTAD) { Status1(status1); } + } WHEN { + TURN { MOVE(player, MOVE_SMELLING_SALTS); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_SMELLING_SALTS, player); + if (status1 == STATUS1_PARALYSIS) + { + MESSAGE("The opposing Lotad fainted!"); + } + else + { + NOT MESSAGE("The opposing Lotad fainted!"); + MESSAGE("The opposing Lotad used Celebrate!"); + } + } +} + +SINGLE_BATTLE_TEST("Wake-Up Slap does not cure paralyzed pokemons behind substitutes or get increased power") +{ + u32 ability; + PARAMETRIZE { ability = ABILITY_INNER_FOCUS; } + PARAMETRIZE { ability = ABILITY_INFILTRATOR; } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS) == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_WAKE_UP_SLAP) == STATUS1_SLEEP); + PLAYER(SPECIES_CROBAT) { Ability(ability); } + OPPONENT(SPECIES_SEISMITOAD); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SING); } + TURN { MOVE(opponent, MOVE_CELEBRATE); MOVE(player, MOVE_WAKE_UP_SLAP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); + if (ability == ABILITY_INNER_FOCUS) { + MESSAGE("The substitute took damage for the opposing Seismitoad!"); + NONE_OF + { + MESSAGE("The opposing Seismitoad's substitute faded!"); // Smelling Salts does 86 damage, the sub has 122 HP, if hitting a sub it shouldn't get boosted damage. + MESSAGE("The opposing Seismitoad woke up!"); + STATUS_ICON(opponent, none: TRUE); + } + } else { + MESSAGE("The opposing Seismitoad woke up!"); + STATUS_ICON(opponent, none: TRUE); + } + } +} + +SINGLE_BATTLE_TEST("Wake-Up Slap gets increased power against sleeping targets") +{ + u32 status1; + PARAMETRIZE { status1 = STATUS1_SLEEP; } + PARAMETRIZE { status1 = STATUS1_NONE; } + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS) == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_WAKE_UP_SLAP) == STATUS1_SLEEP); + PLAYER(SPECIES_CROBAT); + OPPONENT(SPECIES_LOTAD) { Status1(status1); } + } WHEN { + TURN { MOVE(player, MOVE_WAKE_UP_SLAP); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WAKE_UP_SLAP, player); + if (status1 == STATUS1_SLEEP) { + MESSAGE("The opposing Lotad fainted!"); + } else { + NOT MESSAGE("The opposing Lotad fainted!"); + MESSAGE("The opposing Lotad used Celebrate!"); + } + } +} + +DOUBLE_BATTLE_TEST("Sparkling Aria cures burns from all Pokemon on the field and behind substitutes") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLING_ARIA, MOVE_EFFECT_REMOVE_STATUS) == TRUE); + ASSUME(GetMoveEffectArg_Status(MOVE_SPARKLING_ARIA) == STATUS1_BURN); + PLAYER(SPECIES_PRIMARINA); + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_BURN); } + OPPONENT(SPECIES_WYNAUT) { Status1(STATUS1_BURN); } + } WHEN { + TURN { MOVE(opponentLeft, MOVE_SUBSTITUTE); MOVE(opponentRight, MOVE_CELEBRATE); MOVE(playerRight, MOVE_CELEBRATE); MOVE(playerLeft, MOVE_SPARKLING_ARIA); } + } SCENE { + MESSAGE("The opposing Wobbuffet's burn was cured!"); + MESSAGE("Wobbuffet's burn was cured!"); + MESSAGE("The opposing Wynaut's burn was cured!"); + } +} diff --git a/test/battle/move_effect/salt_cure.c b/test/battle/move_effect_secondary/salt_cure.c similarity index 100% rename from test/battle/move_effect/salt_cure.c rename to test/battle/move_effect_secondary/salt_cure.c diff --git a/test/battle/move_effect_secondary/smack_down.c b/test/battle/move_effect_secondary/smack_down.c new file mode 100644 index 0000000000..64eba3889c --- /dev/null +++ b/test/battle/move_effect_secondary/smack_down.c @@ -0,0 +1,28 @@ +#include "global.h" +#include "test/battle.h" + +SINGLE_BATTLE_TEST("Smack Down does not ground mons behind substitutes") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_SMACK_DOWN, MOVE_EFFECT_SMACK_DOWN) == TRUE); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SKARMORY); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_SMACK_DOWN); } + } SCENE { + NOT MESSAGE("The opposing Skarmory fell straight down!"); + } +} + +SINGLE_BATTLE_TEST("Thousand Arrows does not ground mons behind substitutes") +{ + GIVEN { + ASSUME(MoveHasAdditionalEffect(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN)); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SKARMORY); + } WHEN { + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_THOUSAND_ARROWS); } + } SCENE { + NOT MESSAGE("The opposing Skarmory fell straight down!"); + } +} diff --git a/test/battle/move_effect_secondary/will_o_wisp.c b/test/battle/move_effect_secondary/will_o_wisp.c new file mode 100644 index 0000000000..08b1bd6c69 --- /dev/null +++ b/test/battle/move_effect_secondary/will_o_wisp.c @@ -0,0 +1,4 @@ +#include "global.h" +#include "test/battle.h" + +TO_DO_BATTLE_TEST("TODO: Write Will-O-Wisp (Move Effect) test titles") diff --git a/test/battle/move_effect/thousand_arrows.c b/test/battle/move_flags/ignore_type_if_flying_and_ungrounded.c similarity index 70% rename from test/battle/move_effect/thousand_arrows.c rename to test/battle/move_flags/ignore_type_if_flying_and_ungrounded.c index c62e71001d..8536986c6c 100644 --- a/test/battle/move_effect/thousand_arrows.c +++ b/test/battle/move_flags/ignore_type_if_flying_and_ungrounded.c @@ -1,30 +1,13 @@ #include "global.h" #include "test/battle.h" -ASSUMPTIONS -{ - ASSUME(MoveHasAdditionalEffect(MOVE_THOUSAND_ARROWS, MOVE_EFFECT_SMACK_DOWN)); - ASSUME(MoveIgnoresTypeIfFlyingAndUngrounded(MOVE_THOUSAND_ARROWS) == TRUE); -} - -SINGLE_BATTLE_TEST("Thousand Arrows does not ground mons behind substitutes") -{ - GIVEN { - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_SKARMORY); - } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_THOUSAND_ARROWS); } - } SCENE { - NOT MESSAGE("The opposing Skarmory fell straight down!"); - } -} - SINGLE_BATTLE_TEST("Thousand Arrows does neutral damage to non-grounded Flying types regardless of other typings") { u32 pokemon; PARAMETRIZE { pokemon = SPECIES_SKARMORY; } PARAMETRIZE { pokemon = SPECIES_SCYTHER; } GIVEN { + ASSUME(MoveIgnoresTypeIfFlyingAndUngrounded(MOVE_THOUSAND_ARROWS) == TRUE); PLAYER(SPECIES_WOBBUFFET); OPPONENT(pokemon); } WHEN { diff --git a/test/battle/ability/switch_in_abilities.c b/test/battle/switch_in_abilities.c similarity index 100% rename from test/battle/ability/switch_in_abilities.c rename to test/battle/switch_in_abilities.c From 16357c7e29453edbfa65d36de8904246ae4bc40e Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Fri, 16 May 2025 13:04:44 +0200 Subject: [PATCH 067/187] Streamline pointer notation (#2139) --- include/battle.h | 8 +-- include/battle_controllers.h | 2 +- include/battle_script_commands.h | 2 +- include/contest.h | 10 ++-- include/global.h | 2 +- include/item.h | 2 +- include/item_menu.h | 2 +- include/link.h | 2 +- include/list_menu.h | 4 +- include/mauville_old_man.h | 4 +- include/menu_specialized.h | 2 +- include/mini_printf.h | 4 +- include/mystery_gift_client.h | 10 ++-- include/mystery_gift_link.h | 14 ++--- include/mystery_gift_server.h | 18 +++--- include/mystery_gift_view.h | 4 +- include/pokenav.h | 2 +- include/tilesets.h | 4 +- src/agb_flash_1m.c | 4 +- src/battle_anim.c | 2 +- src/battle_anim_flying.c | 2 +- src/battle_arena.c | 2 +- src/battle_bg.c | 2 +- src/battle_controllers.c | 2 +- src/battle_dome.c | 12 ++-- src/battle_factory.c | 2 +- src/battle_factory_screen.c | 20 +++---- src/battle_gfx_sfx_util.c | 4 +- src/battle_main.c | 8 +-- src/battle_message.c | 10 ++-- src/battle_palace.c | 2 +- src/battle_pike.c | 4 +- src/battle_pyramid.c | 2 +- src/battle_pyramid_bag.c | 4 +- src/battle_script_commands.c | 2 +- src/battle_tower.c | 2 +- src/battle_transition.c | 4 +- src/berry_blender.c | 10 ++-- src/berry_crush.c | 8 +-- src/berry_fix_program.c | 2 +- src/bg.c | 4 +- src/contest.c | 6 +- src/data/battle_frontier/apprentice.h | 2 +- src/data/tilesets/headers.h | 4 +- src/dodrio_berry_picking.c | 28 ++++----- src/ereader_helpers.c | 20 +++---- src/evolution_scene.c | 8 +-- src/frontier_util.c | 2 +- src/hall_of_fame.c | 16 +++--- src/item.c | 2 +- src/libisagbprn.c | 2 +- src/load_save.c | 2 +- src/m4a_tables.c | 2 +- src/map_name_popup.c | 2 +- src/mauville_old_man.c | 58 +++++++++---------- src/menu_specialized.c | 2 +- src/mini_printf.c | 6 +- src/mystery_gift_client.c | 32 +++++------ src/mystery_gift_link.c | 16 +++--- src/mystery_gift_menu.c | 40 ++++++------- src/mystery_gift_server.c | 30 +++++----- src/mystery_gift_view.c | 18 +++--- src/pokedex.c | 2 +- src/pokedex_area_region_map.c | 2 +- src/pokedex_area_screen.c | 2 +- src/pokemon.c | 6 +- src/pokemon_animation.c | 2 +- src/pokemon_jump.c | 4 +- src/pokemon_summary_screen.c | 4 +- src/pokenav_conditions_search_results.c | 24 ++++---- src/pokenav_list.c | 6 +- src/pokenav_menu_handler_gfx.c | 66 +++++++++++----------- src/pokenav_ribbons_list.c | 28 ++++----- src/rom_header_gf.c | 36 ++++++------ src/save.c | 2 +- src/scrcmd.c | 4 +- src/script.c | 2 +- src/shop.c | 2 +- src/sound.c | 2 +- src/sprite.c | 8 +-- src/starter_choose.c | 10 ++-- src/trader.c | 6 +- src/trainer_hill.c | 2 +- src/union_room.c | 20 +++---- src/union_room_battle.c | 6 +- src/union_room_chat.c | 4 +- src/union_room_player_avatar.c | 38 ++++++------- src/window.c | 2 +- src/wireless_communication_status_screen.c | 14 ++--- 89 files changed, 406 insertions(+), 406 deletions(-) diff --git a/include/battle.h b/include/battle.h index 061768b489..855f085de0 100644 --- a/include/battle.h +++ b/include/battle.h @@ -218,11 +218,11 @@ struct StatsArray struct BattleResources { - struct SecretBase* secretBase; + struct SecretBase *secretBase; struct ResourceFlags *flags; - struct BattleScriptsStack* battleScriptsStack; - struct BattleCallbacksStack* battleCallbackStack; - struct StatsArray* beforeLvlUp; + struct BattleScriptsStack *battleScriptsStack; + struct BattleCallbacksStack *battleCallbackStack; + struct StatsArray *beforeLvlUp; struct AI_ThinkingStruct *ai; struct BattleHistory *battleHistory; struct BattleScriptsStack *AI_ScriptsStack; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 20f3e698cf..33e188f284 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -288,7 +288,7 @@ void BtlController_EmitPlayFanfareOrBGM(u8 bufferId, u16 songId, bool8 playBGM); void BtlController_EmitFaintingCry(u8 bufferId); void BtlController_EmitIntroSlide(u8 bufferId, u8 environmentId); void BtlController_EmitIntroTrainerBallThrow(u8 bufferId); -void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags); +void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus *hpAndStatus, u8 flags); void BtlController_EmitHidePartyStatusSummary(u8 bufferId); void BtlController_EmitEndBounceEffect(u8 bufferId); void BtlController_EmitSpriteInvisibility(u8 bufferId, bool8 isInvisible); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 4fed623b00..6ec99e8abc 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -21,7 +21,7 @@ void BufferMoveToLearnIntoBattleTextBuff2(void); void HandleBattleWindow(u8 xStart, u8 yStart, u8 xEnd, u8 yEnd, u8 flags); bool8 UproarWakeUpCheck(u8 battler); -extern void (* const gBattleScriptingCommandsTable[])(void); +extern void (*const gBattleScriptingCommandsTable[])(void); extern const u8 gBattlePalaceNatureToMoveGroupLikelihood[NUM_NATURES][4]; #endif // GUARD_BATTLE_SCRIPT_COMMANDS_H diff --git a/include/contest.h b/include/contest.h index 9328188b97..69b07eacc8 100644 --- a/include/contest.h +++ b/include/contest.h @@ -290,11 +290,11 @@ struct ContestResources struct ContestGraphicsState *gfxState; struct ContestMoveAnimData *moveAnim; struct ContestTV *tv; - struct ContestUnused * unused; - u8 * contestBgTilemaps[CONTESTANT_COUNT]; - void * boxBlinkTiles1; - void * boxBlinkTiles2; - void * animBgTileBuffer; + struct ContestUnused *unused; + u8 *contestBgTilemaps[CONTESTANT_COUNT]; + void *boxBlinkTiles1; + void *boxBlinkTiles2; + void *animBgTileBuffer; }; #define eContest (*gContestResources->contest) diff --git a/include/global.h b/include/global.h index 36ddbffbf2..fe2f926434 100644 --- a/include/global.h +++ b/include/global.h @@ -1070,7 +1070,7 @@ struct SaveBlock1 // sizeof: 0x3D88 }; -extern struct SaveBlock1* gSaveBlock1Ptr; +extern struct SaveBlock1 *gSaveBlock1Ptr; struct MapPosition { diff --git a/include/item.h b/include/item.h index af8ff8b9d0..a00d750deb 100644 --- a/include/item.h +++ b/include/item.h @@ -58,7 +58,7 @@ u16 BagGetItemIdByPocketPosition(u8 pocketId, u16 pocketPos); u16 BagGetQuantityByPocketPosition(u8 pocketId, u16 pocketPos); void CompactItemsInBagPocket(struct BagPocket *bagPocket); void SortBerriesOrTMHMs(struct BagPocket *bagPocket); -void MoveItemSlotInList(struct ItemSlot* itemSlots_, u32 from, u32 to_); +void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_); void ClearBag(void); u16 CountTotalItemQuantityInBag(u16 itemId); bool8 AddPyramidBagItem(u16 itemId, u16 count); diff --git a/include/item_menu.h b/include/item_menu.h index 09ddd729c4..88f6a8733b 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -102,7 +102,7 @@ void ResetBagScrollPositions(void); void ChooseBerryForMachine(void (*exitCallback)(void)); void CB2_ChooseBerry(void); void Task_FadeAndCloseBagMenu(u8 taskId); -void BagMenu_YesNo(u8 taskId, u8 windowType, const struct YesNoFuncTable* funcTable); +void BagMenu_YesNo(u8 taskId, u8 windowType, const struct YesNoFuncTable *funcTable); void UpdatePocketItemList(u8 pocketId); void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void ( *callback)(u8 taskId)); void DisplayItemMessageOnField(u8 taskId, const u8 *src, TaskFunc callback); diff --git a/include/link.h b/include/link.h index 66dd5fecd2..a1189ff1e1 100644 --- a/include/link.h +++ b/include/link.h @@ -233,7 +233,7 @@ struct Link struct BlockRequest { - void * address; + void *address; u32 size; }; diff --git a/include/list_menu.h b/include/list_menu.h index 9299ede6c8..522c6bae38 100644 --- a/include/list_menu.h +++ b/include/list_menu.h @@ -38,8 +38,8 @@ struct ListMenuItem struct ListMenuTemplate { const struct ListMenuItem *items; - void (* moveCursorFunc)(s32 itemIndex, bool8 onInit, struct ListMenu *list); - void (* itemPrintFunc)(u8 windowId, u32 itemId, u8 y); + void (*moveCursorFunc)(s32 itemIndex, bool8 onInit, struct ListMenu *list); + void (*itemPrintFunc)(u8 windowId, u32 itemId, u8 y); u16 totalItems; u16 maxShowed; u8 windowId; diff --git a/include/mauville_old_man.h b/include/mauville_old_man.h index 9e5986ee81..049a3e5c10 100644 --- a/include/mauville_old_man.h +++ b/include/mauville_old_man.h @@ -7,8 +7,8 @@ void SetMauvilleOldMan(void); u8 GetCurrentMauvilleOldMan(void); void SetMauvilleOldManObjEventGfx(void); void SanitizeMauvilleOldManForRuby(OldMan *dest); -void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language); -void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 version, u32 language); +void SanitizeReceivedRubyOldMan(union OldMan *oldMan, u32 version, u32 language); +void SanitizeReceivedEmeraldOldMan(union OldMan *oldMan, u32 version, u32 language); void ResetMauvilleOldManFlag(void); #endif // GUARD_MAUVILLE_OLD_MAN_H diff --git a/include/menu_specialized.h b/include/menu_specialized.h index 152afb59ac..a0bd406313 100644 --- a/include/menu_specialized.h +++ b/include/menu_specialized.h @@ -115,7 +115,7 @@ void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel); void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel); void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal); -void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals); +void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate *template, struct SpritePalette *pals); s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst); // Condition sparkles diff --git a/include/mini_printf.h b/include/mini_printf.h index a891327cc4..ae5c226628 100644 --- a/include/mini_printf.h +++ b/include/mini_printf.h @@ -45,8 +45,8 @@ #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); +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 diff --git a/include/mystery_gift_client.h b/include/mystery_gift_client.h index 8214d69eff..b8a0e5d72d 100644 --- a/include/mystery_gift_client.h +++ b/include/mystery_gift_client.h @@ -75,16 +75,16 @@ struct MysteryGiftClient u32 funcId; u32 funcState; u32 cmdidx; - void * sendBuffer; - void * recvBuffer; - struct MysteryGiftClientCmd * script; - void * msg; + void *sendBuffer; + void *recvBuffer; + struct MysteryGiftClientCmd *script; + void *msg; struct MysteryGiftLink link; bool32 isWonderNews; }; void MysteryGiftClient_Create(bool32 isWonderNews); -u32 MysteryGiftClient_Run(u16 * endVal); +u32 MysteryGiftClient_Run(u16 *endVal); void MysteryGiftClient_AdvanceState(void); void * MysteryGiftClient_GetMsg(void); void MysteryGiftClient_SetParam(u32 value); diff --git a/include/mystery_gift_link.h b/include/mystery_gift_link.h index 32100db5f1..8dc0f56694 100644 --- a/include/mystery_gift_link.h +++ b/include/mystery_gift_link.h @@ -34,16 +34,16 @@ struct MysteryGiftLink u16 sendCounter; u16 sendCRC; u16 sendSize; - void * recvBuffer; - const void * sendBuffer; + 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); +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 diff --git a/include/mystery_gift_server.h b/include/mystery_gift_server.h index 8e3842f73c..d70d3e7da6 100644 --- a/include/mystery_gift_server.h +++ b/include/mystery_gift_server.h @@ -71,7 +71,7 @@ struct MysteryGiftServerCmd { u32 instr; u32 parameter; - const void * ptr; + const void *ptr; }; struct MysteryGiftServer @@ -80,14 +80,14 @@ struct MysteryGiftServer u32 param; u32 funcId; u32 cmdidx; - const struct MysteryGiftServerCmd * script; - void * recvBuffer; - struct WonderCard * card; - struct WonderNews * news; - struct MysteryGiftLinkGameData * linkGameData; - const void * ramScript; + const struct MysteryGiftServerCmd *script; + void *recvBuffer; + struct WonderCard *card; + struct WonderNews *news; + struct MysteryGiftLinkGameData *linkGameData; + const void *ramScript; u32 ramScriptSize; - const void * clientScript; + const void *clientScript; u32 clientScriptSize; u32 stamp; struct MysteryGiftLink link; @@ -95,6 +95,6 @@ struct MysteryGiftServer void MysterGiftServer_CreateForCard(); void MysterGiftServer_CreateForNews(); -u32 MysterGiftServer_Run(u16 * endVal); +u32 MysterGiftServer_Run(u16 *endVal); #endif //GUARD_MYSTERY_GIFT_SERVER_H diff --git a/include/mystery_gift_view.h b/include/mystery_gift_view.h index 038093c7a1..7b94aa4d72 100644 --- a/include/mystery_gift_view.h +++ b/include/mystery_gift_view.h @@ -9,8 +9,8 @@ enum { NEWS_INPUT_NONE = 0xFF }; -bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata); -bool32 WonderNews_Init(const struct WonderNews * news); +bool32 WonderCard_Init(struct WonderCard *card, struct WonderCardMetadata *metadata); +bool32 WonderNews_Init(const struct WonderNews *news); s32 WonderCard_Enter(void); s32 WonderNews_Enter(void); s32 WonderCard_Exit(bool32 flag); diff --git a/include/pokenav.h b/include/pokenav.h index 174c338e27..f274cfcb23 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -33,7 +33,7 @@ typedef void (*PokenavListBufferItemFunc)(struct PokenavListItem *, u8 *); struct PokenavListTemplate { - struct PokenavListItem * list; + struct PokenavListItem *list; u16 count; u16 startIndex; u8 itemSize; diff --git a/include/tilesets.h b/include/tilesets.h index c7cc8edac9..e06444e446 100644 --- a/include/tilesets.h +++ b/include/tilesets.h @@ -4,7 +4,7 @@ extern const u32 gTilesetTiles_General[]; extern const u16 gTilesetPalettes_General[][16]; -extern const struct Tileset * const gTilesetPointer_SecretBase; -extern const struct Tileset * const gTilesetPointer_SecretBaseRedCave; +extern const struct Tileset *const gTilesetPointer_SecretBase; +extern const struct Tileset *const gTilesetPointer_SecretBaseRedCave; #endif //GUARD_tilesets_H diff --git a/src/agb_flash_1m.c b/src/agb_flash_1m.c index 6fc4f3d600..f5ebd83ac8 100644 --- a/src/agb_flash_1m.c +++ b/src/agb_flash_1m.c @@ -3,7 +3,7 @@ static const char AgbLibFlashVersion[] = "FLASH1M_V103"; -static const struct FlashSetupInfo * const sSetupInfos[] = +static const struct FlashSetupInfo *const sSetupInfos[] = { &MX29L010, &LE26FV10N1TS, @@ -14,7 +14,7 @@ u16 IdentifyFlash(void) { u16 result; u16 flashId; - const struct FlashSetupInfo * const *setupInfo; + const struct FlashSetupInfo *const *setupInfo; REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; diff --git a/src/battle_anim.c b/src/battle_anim.c index ea6a1b8925..fb2817af99 100644 --- a/src/battle_anim.c +++ b/src/battle_anim.c @@ -115,7 +115,7 @@ EWRAM_DATA u8 gAnimCustomPanning = 0; #include "data/battle_anim.h" -static void (* const sScriptCmdTable[])(void) = +static void (*const sScriptCmdTable[])(void) = { Cmd_loadspritegfx, // 0x00 Cmd_unloadspritegfx, // 0x01 diff --git a/src/battle_anim_flying.c b/src/battle_anim_flying.c index c5e59a65af..872e136f93 100644 --- a/src/battle_anim_flying.c +++ b/src/battle_anim_flying.c @@ -900,7 +900,7 @@ static void AnimUnusedBubbleThrow(struct Sprite *sprite) sprite->callback = TranslateAnimSpriteToTargetMonLocation; } -static void AnimWhirlwindLine(struct Sprite * sprite) +static void AnimWhirlwindLine(struct Sprite *sprite) { u16 offset; u8 mult; diff --git a/src/battle_arena.c b/src/battle_arena.c index ed3cf16dfd..f452ed4ec3 100644 --- a/src/battle_arena.c +++ b/src/battle_arena.c @@ -341,7 +341,7 @@ static const struct CompressedSpriteSheet sBattleArenaJudgmentSymbolsSpriteSheet {0} }; -static void (* const sArenaFunctions[])(void) = +static void (*const sArenaFunctions[])(void) = { [BATTLE_ARENA_FUNC_INIT] = InitArenaChallenge, [BATTLE_ARENA_FUNC_GET_DATA] = GetArenaData, diff --git a/src/battle_bg.c b/src/battle_bg.c index c32f5ec623..5d803f993c 100644 --- a/src/battle_bg.c +++ b/src/battle_bg.c @@ -593,7 +593,7 @@ static const struct WindowTemplate sBattleArenaWindowTemplates[] = DUMMY_WIN_TEMPLATE }; -const struct WindowTemplate * const gBattleWindowTemplates[] = +const struct WindowTemplate *const gBattleWindowTemplates[] = { [B_WIN_TYPE_NORMAL] = sStandardBattleWindowTemplates, [B_WIN_TYPE_ARENA] = sBattleArenaWindowTemplates, diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 9586e18457..ad5dab67b7 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1496,7 +1496,7 @@ void BtlController_EmitIntroTrainerBallThrow(u8 bufferId) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 4); } -void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus* hpAndStatus, u8 flags) +void BtlController_EmitDrawPartyStatusSummary(u8 bufferId, struct HpAndStatus *hpAndStatus, u8 flags) { s32 i; diff --git a/src/battle_dome.c b/src/battle_dome.c index 9573f67cc7..62ad04cedb 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -997,7 +997,7 @@ static const union AnimCmd sSpriteAnim_TourneyTreePokeballSelected[] = ANIMCMD_END, }; -static const union AnimCmd * const sSpriteAnimTable_TourneyTreePokeball[] = +static const union AnimCmd *const sSpriteAnimTable_TourneyTreePokeball[] = { sSpriteAnim_TourneyTreePokeballNormal, sSpriteAnim_TourneyTreePokeballSelected, @@ -1027,7 +1027,7 @@ static const union AnimCmd sSpriteAnim_TourneyTreeCancelButtonSelected[] = ANIMCMD_END, }; -static const union AnimCmd * const sSpriteAnimTable_TourneyTreeCancelButton[] = +static const union AnimCmd *const sSpriteAnimTable_TourneyTreeCancelButton[] = { sSpriteAnim_TourneyTreeCancelButtonNormal, sSpriteAnim_TourneyTreeCancelButtonSelected, @@ -1056,7 +1056,7 @@ static const union AnimCmd sSpriteAnim_TourneyTreeExitButtonSelected[] = ANIMCMD_END, }; -static const union AnimCmd * const sSpriteAnimTable_TourneyTreeExitButton[] = +static const union AnimCmd *const sSpriteAnimTable_TourneyTreeExitButton[] = { sSpriteAnim_TourneyTreeExitButtonNormal, sSpriteAnim_TourneyTreeExitButtonSelected, @@ -1097,13 +1097,13 @@ static const union AnimCmd sSpriteAnim_RightArrow[] = ANIMCMD_END, }; -static const union AnimCmd * const sSpriteAnimTable_VerticalScrollArrow[] = +static const union AnimCmd *const sSpriteAnimTable_VerticalScrollArrow[] = { sSpriteAnim_UpArrow, sSpriteAnim_DownArrow, }; -static const union AnimCmd * const sSpriteAnimTable_HorizontalScrollArrow[] = +static const union AnimCmd *const sSpriteAnimTable_HorizontalScrollArrow[] = { sSpriteAnim_LeftArrow, sSpriteAnim_RightArrow, @@ -1134,7 +1134,7 @@ static const struct SpriteTemplate sVerticalScrollArrowSpriteTemplate = // Organized by seed starting position, i.e. seed 0 battles seed 8 first static const u8 sTourneyTreeTrainerIds[DOME_TOURNAMENT_TRAINERS_COUNT] = {0, 8, 12, 4, 7, 15, 11, 3, 2, 10, 14, 6, 5, 13, 9, 1}; -static void (* const sBattleDomeFunctions[])(void) = +static void (*const sBattleDomeFunctions[])(void) = { [BATTLE_DOME_FUNC_INIT] = InitDomeChallenge, [BATTLE_DOME_FUNC_GET_DATA] = GetDomeData, diff --git a/src/battle_factory.c b/src/battle_factory.c index faed16ebb0..04961430a0 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -121,7 +121,7 @@ static const u16 *const sMoveStyles[FACTORY_NUM_STYLES - 1] = [FACTORY_STYLE_WEATHER - 1] = sMoves_DependsOnTheBattlesFlow, }; -static void (* const sBattleFactoryFunctions[])(void) = +static void (*const sBattleFactoryFunctions[])(void) = { [BATTLE_FACTORY_FUNC_INIT] = InitFactoryChallenge, [BATTLE_FACTORY_FUNC_GET_DATA] = GetBattleFactoryData, diff --git a/src/battle_factory_screen.c b/src/battle_factory_screen.c index adf241153f..eea04b99d3 100644 --- a/src/battle_factory_screen.c +++ b/src/battle_factory_screen.c @@ -299,7 +299,7 @@ static const struct SpritePalette sSelect_SpritePalettes[] = {}, }; -u8 static (* const sSelect_MenuOptionFuncs[])(void) = +u8 static (*const sSelect_MenuOptionFuncs[])(void) = { Select_OptionSummary, Select_OptionRentDeselect, @@ -517,17 +517,17 @@ static const union AnimCmd sAnim_Select_Pokeball_Moving[] = ANIMCMD_END, }; -static const union AnimCmd * const sAnims_Select_Interface[] = +static const union AnimCmd *const sAnims_Select_Interface[] = { sAnim_Select_Interface, }; -static const union AnimCmd * const sAnims_Select_MonPicBgAnim[] = +static const union AnimCmd *const sAnims_Select_MonPicBgAnim[] = { sAnim_Select_MonPicBgAnim, }; -static const union AnimCmd * const sAnims_Select_Pokeball[] = +static const union AnimCmd *const sAnims_Select_Pokeball[] = { sAnim_Select_Pokeball_Still, sAnim_Select_Pokeball_Moving, @@ -569,7 +569,7 @@ static const union AffineAnimCmd sAffineAnim_Select_MonPicBg_Open[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const sAffineAnims_Select_MonPicBgAnim[] = +static const union AffineAnimCmd *const sAffineAnims_Select_MonPicBgAnim[] = { sAffineAnim_Select_MonPicBg_Opening, sAffineAnim_Select_MonPicBg_Closing, @@ -772,17 +772,17 @@ static const union AnimCmd sAnim_Swap_Pokeball_Moving[] = ANIMCMD_END, }; -static const union AnimCmd * const sAnims_Swap_Interface[] = +static const union AnimCmd *const sAnims_Swap_Interface[] = { sAnim_Swap_Interface, }; -static const union AnimCmd * const sAnims_Swap_MonPicBgAnim[] = +static const union AnimCmd *const sAnims_Swap_MonPicBgAnim[] = { sAnim_Swap_MonPicBgAnim, }; -static const union AnimCmd * const sAnims_Swap_Pokeball[] = +static const union AnimCmd *const sAnims_Swap_Pokeball[] = { sAnim_Swap_Pokeball_Still, sAnim_Swap_Pokeball_Moving, @@ -824,7 +824,7 @@ static const union AffineAnimCmd sAffineAnim_Swap_MonPicBg_Open[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const sAffineAnims_Swap_MonPicBgAnim[] = +static const union AffineAnimCmd *const sAffineAnims_Swap_MonPicBgAnim[] = { sAffineAnim_Swap_MonPicBg_Opening, sAffineAnim_Swap_MonPicBg_Closing, @@ -886,7 +886,7 @@ static const struct SpriteTemplate sSpriteTemplate_Swap_MonPicBgAnim = .callback = SpriteCallbackDummy }; -void static (* const sSwap_MenuOptionFuncs[])(u8 taskId) = +void static (*const sSwap_MenuOptionFuncs[])(u8 taskId) = { Swap_OptionSummary, Swap_OptionSwap, diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c index 8cc2555e4d..7047aaabcc 100644 --- a/src/battle_gfx_sfx_util.c +++ b/src/battle_gfx_sfx_util.c @@ -27,8 +27,8 @@ #include "constants/battle_palace.h" extern const u8 gBattlePalaceNatureToMoveTarget[]; -extern const u8 * const gBattleAnims_General[]; -extern const u8 * const gBattleAnims_Special[]; +extern const u8 *const gBattleAnims_General[]; +extern const u8 *const gBattleAnims_Special[]; extern const struct CompressedSpriteSheet gSpriteSheet_EnemyShadow; extern const struct SpriteTemplate gSpriteTemplate_EnemyShadow; diff --git a/src/battle_main.c b/src/battle_main.c index c6fbe1c9a4..4c810a5a66 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -147,7 +147,7 @@ EWRAM_DATA u32 gBattleTypeFlags = 0; EWRAM_DATA u8 gBattleEnvironment = 0; EWRAM_DATA u32 gUnusedFirstBattleVar1 = 0; // Never read EWRAM_DATA struct MultiPartnerMenuPokemon gMultiPartnerParty[MULTI_PARTY_SIZE] = {0}; -EWRAM_DATA static struct MultiPartnerMenuPokemon* sMultiPartnerPartyBuffer = NULL; +EWRAM_DATA static struct MultiPartnerMenuPokemon *sMultiPartnerPartyBuffer = NULL; EWRAM_DATA u8 *gBattleAnimBgTileBuffer = NULL; EWRAM_DATA u8 *gBattleAnimBgTilemapBuffer = NULL; EWRAM_DATA u8 gBattleBufferA[MAX_BATTLERS_COUNT][0x200] = {0}; @@ -533,7 +533,7 @@ const struct TrainerMoney gTrainerMoneyTable[] = #include "data/text/abilities.h" -static void (* const sTurnActionsFuncsTable[])(void) = +static void (*const sTurnActionsFuncsTable[])(void) = { [B_ACTION_USE_MOVE] = HandleAction_UseMove, [B_ACTION_USE_ITEM] = HandleAction_UseItem, @@ -551,7 +551,7 @@ static void (* const sTurnActionsFuncsTable[])(void) = [B_ACTION_NOTHING_FAINTED] = HandleAction_NothingIsFainted, }; -static void (* const sEndTurnFuncsTable[])(void) = +static void (*const sEndTurnFuncsTable[])(void) = { [0] = HandleEndTurn_ContinueBattle, [B_OUTCOME_WON] = HandleEndTurn_BattleWon, @@ -574,7 +574,7 @@ const u8 gStatusConditionString_IceJpn[] = _("γ“γŠγ‚Š$$$$"); const u8 gStatusConditionString_ConfusionJpn[] = _("こんらん$$$"); const u8 gStatusConditionString_LoveJpn[] = _("パロパロ$$$"); -const u8 * const gStatusConditionStringsTable[][2] = +const u8 *const gStatusConditionStringsTable[][2] = { {gStatusConditionString_PoisonJpn, gText_Poison}, {gStatusConditionString_SleepJpn, gText_Sleep}, diff --git a/src/battle_message.c b/src/battle_message.c index 9cc26698e5..265859b02d 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -431,7 +431,7 @@ static const u8 sText_SpDef2[] = _("SP. DEF"); static const u8 sText_Accuracy[] = _("accuracy"); static const u8 sText_Evasiveness[] = _("evasiveness"); -const u8 * const gStatNamesTable[NUM_BATTLE_STATS] = +const u8 *const gStatNamesTable[NUM_BATTLE_STATS] = { [STAT_HP] = sText_HP2, [STAT_ATK] = sText_Attack2, @@ -449,7 +449,7 @@ 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[FLAVOR_COUNT] = +const u8 *const gPokeblockWasTooXStringTable[FLAVOR_COUNT] = { [FLAVOR_SPICY] = sText_PokeblockWasTooSpicy, [FLAVOR_DRY] = sText_PokeblockWasTooDry, @@ -514,7 +514,7 @@ static const u8 sText_Trainer2WinText[]; static const u8 sText_TwoInGameTrainersDefeated[]; static const u8 sText_Trainer2LoseText[]; -const u8 * const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = +const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT - BATTLESTRINGS_TABLE_START] = { [STRINGID_TRAINER1LOSETEXT - BATTLESTRINGS_TABLE_START] = sText_Trainer1LoseText, [STRINGID_PKMNGAINEDEXP - BATTLESTRINGS_TABLE_START] = sText_PkmnGainedEXP, @@ -1293,7 +1293,7 @@ static const u8 sText_SpAtk[] = _("SP. ATK"); static const u8 sText_SpDef[] = _("SP. DEF"); // Unused -static const u8 * const sStatNamesTable2[] = +static const u8 *const sStatNamesTable2[] = { sText_HP, sText_SpAtk, sText_Attack, sText_SpDef, sText_Defense, sText_Speed @@ -1406,7 +1406,7 @@ static const u8 sText_LostToOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} lost t static const u8 sText_TiedOpponentByReferee[] = _("{B_PLAYER_MON1_NAME} tied the opponent\n{B_OPPONENT_MON1_NAME} in a REFEREE's decision!"); static const u8 sText_RefCommenceBattle[] = _("REFEREE: {B_PLAYER_MON1_NAME} VS {B_OPPONENT_MON1_NAME}!\nCommence battling!"); -const u8 * const gRefereeStringsTable[] = +const u8 *const gRefereeStringsTable[] = { [B_MSG_REF_NOTHING_IS_DECIDED] = sText_RefIfNothingIsDecided, [B_MSG_REF_THATS_IT] = sText_RefThatsIt, diff --git a/src/battle_palace.c b/src/battle_palace.c index a521acea2b..e7f8432d7e 100644 --- a/src/battle_palace.c +++ b/src/battle_palace.c @@ -26,7 +26,7 @@ static void SetRandomPalacePrize(void); static void GivePalacePrize(void); // Const rom data. -static void (* const sBattlePalaceFunctions[])(void) = +static void (*const sBattlePalaceFunctions[])(void) = { [BATTLE_PALACE_FUNC_INIT] = InitPalaceChallenge, [BATTLE_PALACE_FUNC_GET_DATA] = GetPalaceData, diff --git a/src/battle_pike.c b/src/battle_pike.c index ba24e58ae7..790c4088c1 100644 --- a/src/battle_pike.c +++ b/src/battle_pike.c @@ -476,7 +476,7 @@ static const u8 sFrontierBrainStreakAppearances[NUM_FRONTIER_FACILITIES][4] = [FRONTIER_FACILITY_PYRAMID] = {21, 70, 35, 0}, }; -static void (* const sBattlePikeFunctions[])(void) = +static void (*const sBattlePikeFunctions[])(void) = { [BATTLE_PIKE_FUNC_SET_ROOM_TYPE] = SetRoomType, [BATTLE_PIKE_FUNC_GET_DATA] = GetBattlePikeData, @@ -531,7 +531,7 @@ static const u8 sNumMonsToHealBeforePikeQueen[][3] = {0, 1, 2}, }; -static bool8 (* const sStatusInflictionScreenFlashFuncs[])(struct Task *) = +static bool8 (*const sStatusInflictionScreenFlashFuncs[])(struct Task *) = { StatusInflictionFadeOut, StatusInflictionFadeIn }; diff --git a/src/battle_pyramid.c b/src/battle_pyramid.c index b4bb3cacca..cfec08083b 100644 --- a/src/battle_pyramid.c +++ b/src/battle_pyramid.c @@ -784,7 +784,7 @@ static const u8 sHintTextTypes[] = HINT_EXIT_SHORT_REMAINING_ITEMS, }; -static void (* const sBattlePyramidFunctions[])(void) = +static void (*const sBattlePyramidFunctions[])(void) = { [BATTLE_PYRAMID_FUNC_INIT] = InitPyramidChallenge, [BATTLE_PYRAMID_FUNC_GET_DATA] = GetBattlePyramidData, diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index bf9a7704b1..a9cbfd6821 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -327,7 +327,7 @@ static const union AnimCmd sAnim_PyramidBag[] = ANIMCMD_END, }; -static const union AnimCmd * const sAnims_PyramidBag[] = +static const union AnimCmd *const sAnims_PyramidBag[] = { sAnim_PyramidBag, }; @@ -352,7 +352,7 @@ enum { ANIM_BAG_SHAKE, }; -static const union AffineAnimCmd * const sAffineAnims_PyramidBag[] = +static const union AffineAnimCmd *const sAffineAnims_PyramidBag[] = { [ANIM_BAG_STILL] = sAffineAnim_PyramidBag_Still, [ANIM_BAG_SHAKE] = sAffineAnim_PyramidBag_Shake, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index a79851acc0..3bca12eb51 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -326,7 +326,7 @@ static void Cmd_finishaction(void); static void Cmd_finishturn(void); static void Cmd_trainerslideout(void); -void (* const gBattleScriptingCommandsTable[])(void) = +void (*const gBattleScriptingCommandsTable[])(void) = { Cmd_attackcanceler, //0x0 Cmd_accuracycheck, //0x1 diff --git a/src/battle_tower.c b/src/battle_tower.c index 0190d3c922..35852a1f00 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -799,7 +799,7 @@ struct #include "data/battle_frontier/battle_tent.h" -static void (* const sBattleTowerFuncs[])(void) = +static void (*const sBattleTowerFuncs[])(void) = { [BATTLE_TOWER_FUNC_INIT] = InitTowerChallenge, [BATTLE_TOWER_FUNC_GET_DATA] = GetTowerData, diff --git a/src/battle_transition.c b/src/battle_transition.c index 174602471b..03ed10c5f4 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -278,7 +278,7 @@ static s16 IsTrainerPicSlideDone(s16); static bool8 TransitionIntro_FadeToGray(struct Task *); static bool8 TransitionIntro_FadeFromGray(struct Task *); static bool8 IsIntroTaskDone(void); -static bool16 UpdateRectangularSpiralLine(const s16 * const *, struct RectangularSpiralLine *); +static bool16 UpdateRectangularSpiralLine(const s16 *const *, struct RectangularSpiralLine *); static void SpriteCB_FldEffPokeballTrail(struct Sprite *); static void SpriteCB_MugshotTrainerPic(struct Sprite *); static void SpriteCB_WhiteBarFade(struct Sprite *); @@ -3281,7 +3281,7 @@ static bool8 RectangularSpiral_End(struct Task *task) } // Returns TRUE if a tile should be drawn, FALSE otherwise -static bool16 UpdateRectangularSpiralLine(const s16 * const *moveDataTable, struct RectangularSpiralLine *line) +static bool16 UpdateRectangularSpiralLine(const s16 *const *moveDataTable, struct RectangularSpiralLine *line) { const s16 *moveData = moveDataTable[line->state]; diff --git a/src/berry_blender.c b/src/berry_blender.c index 5f0e170607..6a9b196440 100644 --- a/src/berry_blender.c +++ b/src/berry_blender.c @@ -1207,7 +1207,7 @@ static void CreateBerrySprite(u16 itemId, u8 playerId) sBerrySpriteData[playerId][4]); } -static void ConvertItemToBlenderBerry(struct BlenderBerry* berry, u16 itemId) +static void ConvertItemToBlenderBerry(struct BlenderBerry *berry, u16 itemId) { const struct Berry *berryInfo = GetBerryInfo(ITEM_TO_BERRY(itemId)); @@ -1539,7 +1539,7 @@ static u8 GetArrowProximity(u16 arrowPos, u8 playerId) return PROXIMITY_MISS; } -static void SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry* playerBerry) +static void SetOpponentsBerryData(u16 playerBerryItemId, u8 playersNum, struct BlenderBerry *playerBerry) { u16 opponentSetId = 0; u16 opponentBerryId; @@ -2243,7 +2243,7 @@ static void Blender_DummiedOutFunc(s16 bgX, s16 bgY) } -static bool8 AreBlenderBerriesSame(struct BlenderBerry* berries, u8 a, u8 b) +static bool8 AreBlenderBerriesSame(struct BlenderBerry *berries, u8 a, u8 b) { // First check to itemId is pointless (and wrong anyway?), always false when this is called // Only used to determine if two enigma berries are equivalent @@ -2260,7 +2260,7 @@ static bool8 AreBlenderBerriesSame(struct BlenderBerry* berries, u8 a, u8 b) return FALSE; } -static u32 CalculatePokeblockColor(struct BlenderBerry* berries, s16 *_flavors, u8 numPlayers, u8 negativeFlavors) +static u32 CalculatePokeblockColor(struct BlenderBerry *berries, s16 *_flavors, u8 numPlayers, u8 negativeFlavors) { s16 flavors[FLAVOR_COUNT + 1]; s32 i, j; @@ -2491,7 +2491,7 @@ static void CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *p flavors[i] = sPokeblockFlavors[i]; } -static void UNUSED Debug_CalculatePokeblock(struct BlenderBerry* berries, struct Pokeblock* pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) +static void UNUSED Debug_CalculatePokeblock(struct BlenderBerry *berries, struct Pokeblock *pokeblock, u8 numPlayers, u8 *flavors, u16 maxRPM) { CalculatePokeblock(berries, pokeblock, numPlayers, flavors, maxRPM); } diff --git a/src/berry_crush.c b/src/berry_crush.c index c7bff2abcd..b116fc21f2 100644 --- a/src/berry_crush.c +++ b/src/berry_crush.c @@ -914,7 +914,7 @@ static const u8 *const sResultsTexts[] = [RESULTS_PAGE_POWER + NUM_RESULTS_PAGES] = gText_PressingPowerRankings, }; -static u32 (*const sBerryCrushCommands[])(struct BerryCrushGame * game, u8 * data) = +static u32 (*const sBerryCrushCommands[])(struct BerryCrushGame *game, u8 *data) = { [CMD_NONE] = NULL, [CMD_FADE] = Cmd_BeginNormalPaletteFade, @@ -1590,14 +1590,14 @@ static void PrintTextCentered(u8 windowId, u8 left, u8 colorId, const u8 *string AddTextPrinterParameterized3(windowId, FONT_SHORT, left, 0, sTextColorTable[colorId], 0, string); } -static void PrintResultsText(struct BerryCrushGame * game, u8 page, u8 sp14, u8 baseY) +static void PrintResultsText(struct BerryCrushGame *game, u8 page, u8 sp14, u8 baseY) { u8 i, j; u8 playerId = 0; u8 ranking = 0; s32 x; u8 stat; - struct BerryCrushGame_Results * results = &game->results; + struct BerryCrushGame_Results *results = &game->results; u32 xOffset; s32 y; @@ -1942,7 +1942,7 @@ static void DrawPlayerNameWindows(struct BerryCrushGame *game) static void CopyPlayerNameWindowGfxToBg(struct BerryCrushGame *game) { u8 i = 0; - u8 * windowGfx; + u8 *windowGfx; LZ77UnCompWram(gBerryCrush_TextWindows_Tilemap, gDecompressionBuffer); diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c index 5900cb298a..98938c78b5 100644 --- a/src/berry_fix_program.c +++ b/src/berry_fix_program.c @@ -26,7 +26,7 @@ struct { u8 curScene; u16 timer; struct MultiBootParam mb; -} static * sBerryFix; +} static *sBerryFix; static void BerryFix_Main(void); static void BerryFix_GpuSet(void); diff --git a/src/bg.c b/src/bg.c index 166c59df0c..6264a1e426 100644 --- a/src/bg.c +++ b/src/bg.c @@ -916,7 +916,7 @@ void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 wi { case BG_TYPE_NORMAL: { - const u16 * srcCopy = src; + const u16 *srcCopy = src; for (destY16 = destY; destY16 < (destY + height); destY16++) { for (destX16 = destX; destX16 < (destX + width); destX16++) @@ -928,7 +928,7 @@ void CopyToBgTilemapBufferRect(u8 bg, const void *src, u8 destX, u8 destY, u8 wi } case BG_TYPE_AFFINE: { - const u8 * srcCopy = src; + const u8 *srcCopy = src; mode = GetBgMetricAffineMode(bg, 0x1); for (destY16 = destY; destY16 < (destY + height); destY16++) { diff --git a/src/contest.c b/src/contest.c index 85a8179f4d..b73e23122e 100644 --- a/src/contest.c +++ b/src/contest.c @@ -420,7 +420,7 @@ static const union AffineAnimCmd sAffineAnim_SliderHeart_SpinAppear[] = AFFINEANIMCMD_END }; -static const union AffineAnimCmd* const sAffineAnims_SliderHeart[] = +static const union AffineAnimCmd *const sAffineAnims_SliderHeart[] = { [SLIDER_HEART_ANIM_NORMAL] = sAffineAnim_SliderHeart_Normal, [SLIDER_HEART_ANIM_DISAPPEAR] = sAffineAnim_SliderHeart_SpinDisappear, @@ -2855,7 +2855,7 @@ void SetContestants(u8 contestType, u8 rank) u8 opponentsCount = 0; u8 opponents[100]; bool8 allowPostgameContestants = FALSE; - const u8 * filter; + const u8 *filter; TryPutPlayerLast(); @@ -3011,7 +3011,7 @@ static void DrawContestantWindowText(void) static u8 *Contest_CopyStringWithColor(const u8 *string, u8 color) { - u8 * ptr = StringCopy(gDisplayedStringBattle, gText_ColorTransparent); + u8 *ptr = StringCopy(gDisplayedStringBattle, gText_ColorTransparent); ptr[-1] = color; // Overwrites the "{COLOR TRANSPARENT}" part of the string. ptr = StringCopy(ptr, string); diff --git a/src/data/battle_frontier/apprentice.h b/src/data/battle_frontier/apprentice.h index 6a378b2464..bae966cffd 100644 --- a/src/data/battle_frontier/apprentice.h +++ b/src/data/battle_frontier/apprentice.h @@ -948,7 +948,7 @@ static const u8 sQuestionPossibilities[MAX_APPRENTICE_QUESTIONS] = QUESTION_ID_WIN_SPEECH }; -static void (* const sApprenticeFunctions[])(void) = +static void (*const sApprenticeFunctions[])(void) = { [APPRENTICE_FUNC_GAVE_LVLMODE] = Script_GivenApprenticeLvlMode, [APPRENTICE_FUNC_SET_LVLMODE] = Script_SetApprenticeLvlMode, diff --git a/src/data/tilesets/headers.h b/src/data/tilesets/headers.h index 2eae1be1ea..f6cac20c05 100644 --- a/src/data/tilesets/headers.h +++ b/src/data/tilesets/headers.h @@ -636,8 +636,8 @@ const struct Tileset gTileset_SecretBase = .callback = NULL, }; -const struct Tileset * const gTilesetPointer_SecretBase = &gTileset_SecretBase; -const struct Tileset * const gTilesetPointer_SecretBaseRedCave = &gTileset_SecretBaseRedCave; +const struct Tileset *const gTilesetPointer_SecretBase = &gTileset_SecretBase; +const struct Tileset *const gTilesetPointer_SecretBaseRedCave = &gTileset_SecretBaseRedCave; const struct Tileset gTileset_EliteFour = { diff --git a/src/dodrio_berry_picking.c b/src/dodrio_berry_picking.c index ce1877c6cd..16ea035c7c 100644 --- a/src/dodrio_berry_picking.c +++ b/src/dodrio_berry_picking.c @@ -275,13 +275,13 @@ struct DodrioGame /*0x3308*/ struct DodrioGame_ScoreResults scoreResults[MAX_RFU_PLAYERS]; }; // size = 0x3330 -EWRAM_DATA static struct DodrioGame * sGame = NULL; -EWRAM_DATA static u16 * sDodrioSpriteIds[MAX_RFU_PLAYERS] = {NULL}; -EWRAM_DATA static u16 * sCloudSpriteIds[NUM_CLOUDS] = {NULL}; -EWRAM_DATA static u16 * sBerrySpriteIds[NUM_BERRY_COLUMNS] = {NULL}; -EWRAM_DATA static u16 * sBerryIconSpriteIds[NUM_BERRY_TYPES] = {NULL}; -EWRAM_DATA static struct StatusBar * sStatusBar = NULL; -EWRAM_DATA static struct DodrioGame_Gfx * sGfx = NULL; +EWRAM_DATA static struct DodrioGame *sGame = NULL; +EWRAM_DATA static u16 *sDodrioSpriteIds[MAX_RFU_PLAYERS] = {NULL}; +EWRAM_DATA static u16 *sCloudSpriteIds[NUM_CLOUDS] = {NULL}; +EWRAM_DATA static u16 *sBerrySpriteIds[NUM_BERRY_COLUMNS] = {NULL}; +EWRAM_DATA static u16 *sBerryIconSpriteIds[NUM_BERRY_TYPES] = {NULL}; +EWRAM_DATA static struct StatusBar *sStatusBar = NULL; +EWRAM_DATA static struct DodrioGame_Gfx *sGfx = NULL; static bool32 sExitingGame; @@ -695,7 +695,7 @@ static void ResetTasksAndSprites(void) FreeAllSpritePalettes(); } -static void InitDodrioGame(struct DodrioGame * game) +static void InitDodrioGame(struct DodrioGame *game) { u8 i; @@ -1433,7 +1433,7 @@ static void Task_NewGameIntro(u8 taskId) static void Task_CommunicateMonInfo(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; u8 i; switch (tState) @@ -1759,7 +1759,7 @@ static void HandleSound_Member(void) } for (i = berryStart; i < berryEnd; i++) { - struct DodrioGame_Berries * berries = &sGame->players[sGame->multiplayerId].berries; + struct DodrioGame_Berries *berries = &sGame->players[sGame->multiplayerId].berries; if (berries->fallDist[i] >= MAX_FALL_DIST) { if (!sGame->playingSquishSound[i]) @@ -1802,7 +1802,7 @@ static void VBlankCB_DodrioGame(void) ProcessSpriteCopyRequests(); } -static void InitMonInfo(struct DodrioGame_MonInfo * monInfo, struct Pokemon *mon) +static void InitMonInfo(struct DodrioGame_MonInfo *monInfo, struct Pokemon *mon) { monInfo->isShiny = IsMonShiny(mon); } @@ -1861,7 +1861,7 @@ static void InitFirstWaveOfBerries(void) for (i = berryStart; i < berryEnd; i++) { - struct DodrioGame_Berries * berries = &sGame->player.berries; + struct DodrioGame_Berries *berries = &sGame->player.berries; berries->fallDist[i] = (i % 2 == 0) ? 1 : 0; berries->ids[i] = BERRY_BLUE; } @@ -1995,7 +1995,7 @@ static bool32 TryPickBerry(u8 playerId, u8 pickState, u8 column) { s32 pick = 0; u8 numPlayersIdx = sGame->numPlayers - 1; - struct DodrioGame_Berries * berries = &sGame->player.berries; + struct DodrioGame_Berries *berries = &sGame->player.berries; switch (pickState) { @@ -3841,7 +3841,7 @@ static void LoadDodrioGfx(void) LoadSpritePalette(&shiny); } -static void CreateDodrioSprite(struct DodrioGame_MonInfo * monInfo, u8 playerId, u8 id, u8 numPlayers) +static void CreateDodrioSprite(struct DodrioGame_MonInfo *monInfo, u8 playerId, u8 id, u8 numPlayers) { struct SpriteTemplate template = { diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index c5b8712b5c..0e49967049 100755 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -378,7 +378,7 @@ static u8 GetTrainerHillUnkVal(void) return (gSaveBlock1Ptr->trainerHill.unused + 1) % 256; } -static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer * hillTrainer) +static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer *hillTrainer) { int checksum = CalcByteArraySum((u8 *)hillTrainer, offsetof(typeof(*hillTrainer), checksum)); if (checksum != hillTrainer->checksum) @@ -387,7 +387,7 @@ static bool32 ValidateTrainerChecksum(struct EReaderTrainerHillTrainer * hillTra return TRUE; } -bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet * hillSet) +bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet *hillSet) { u32 i; u32 checksum; @@ -426,7 +426,7 @@ static bool32 ValidateTrainerHillChecksum(struct EReaderTrainerHillSet *hillSet) return TRUE; } -static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSet, struct TrainerHillChallenge * challenge) +static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet *hillSet, struct TrainerHillChallenge *challenge) { int i; @@ -465,7 +465,7 @@ static bool32 TryWriteTrainerHill_Internal(struct EReaderTrainerHillSet * hillSe return TRUE; } -bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet) +bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *hillSet) { void *buffer = AllocZeroed(SECTOR_SIZE); bool32 result = TryWriteTrainerHill_Internal(hillSet, buffer); @@ -473,7 +473,7 @@ bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet * hillSet) return result; } -static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u8 * buffer) +static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet *dest, u8 *buffer) { if (TryReadSpecialSaveSector(SECTOR_ID_TRAINER_HILL, buffer) != SAVE_STATUS_OK) return FALSE; @@ -485,7 +485,7 @@ static bool32 TryReadTrainerHill_Internal(struct EReaderTrainerHillSet * dest, u return TRUE; } -static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet * hillSet) +static bool32 TryReadTrainerHill(struct EReaderTrainerHillSet *hillSet) { u8 *buffer = AllocZeroed(SECTOR_SIZE); bool32 result = TryReadTrainerHill_Internal(hillSet, buffer); @@ -501,7 +501,7 @@ bool32 ReadTrainerHillAndValidate(void) return result; } -int EReader_Send(int size, const void * src) +int EReader_Send(int size, const void *src) { int result; int sendStatus; @@ -542,7 +542,7 @@ int EReader_Send(int size, const void * src) return result; } -int EReader_Recv(void * dest) +int EReader_Recv(void *dest) { int result; int recvStatus; @@ -619,7 +619,7 @@ static void OpenSerial32(void) sCounter2 = 0; } -int EReaderHandleTransfer(u8 mode, size_t size, const void * data, void * recvBuffer) +int EReaderHandleTransfer(u8 mode, size_t size, const void *data, void *recvBuffer) { switch (sSendRecvMgr.state) { @@ -712,7 +712,7 @@ static u16 DetermineSendRecvState(u8 mode) return resp; } -static void SetUpTransferManager(size_t size, const void * data, void * recvBuffer) +static void SetUpTransferManager(size_t size, const void *data, void *recvBuffer) { if (sSendRecvMgr.isParent) { diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 520c8eb551..f09425720a 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -211,7 +211,7 @@ void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u u8 name[POKEMON_NAME_BUFFER_SIZE]; u16 currSpecies; u32 trainerId, personality; - const struct CompressedSpritePalette* pokePal; + const struct CompressedSpritePalette *pokePal; u8 id; SetHBlankCallback(NULL); @@ -311,7 +311,7 @@ void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u static void CB2_EvolutionSceneLoadGraphics(void) { u8 id; - const struct CompressedSpritePalette* pokePal; + const struct CompressedSpritePalette *pokePal; u16 postEvoSpecies; u32 trainerId, personality; struct Pokemon *mon = &gPlayerParty[gTasks[sEvoStructPtr->evoTaskId].tPartyId]; @@ -420,7 +420,7 @@ static void CB2_TradeEvolutionSceneLoadGraphics(void) break; case 4: { - const struct CompressedSpritePalette* pokePal; + const struct CompressedSpritePalette *pokePal; u32 trainerId = GetMonData(mon, MON_DATA_OT_ID); u32 personality = GetMonData(mon, MON_DATA_PERSONALITY); DecompressPicFromTable_2(&gMonFrontPicTable[postEvoSpecies], @@ -470,7 +470,7 @@ void TradeEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, u8 preEvoSprit u8 name[POKEMON_NAME_BUFFER_SIZE]; u16 currSpecies; u32 trainerId, personality; - const struct CompressedSpritePalette* pokePal; + const struct CompressedSpritePalette *pokePal; u8 id; GetMonData(mon, MON_DATA_NICKNAME, name); diff --git a/src/frontier_util.c b/src/frontier_util.c index 1858792b4e..66fb74da03 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -604,7 +604,7 @@ static const u16 sBattledBrainBitFlags[NUM_FRONTIER_FACILITIES][2] = [FRONTIER_FACILITY_PYRAMID] = {1 << 12, 1 << 13}, }; -static void (* const sFrontierUtilFuncs[])(void) = +static void (*const sFrontierUtilFuncs[])(void) = { [FRONTIER_UTIL_FUNC_GET_STATUS] = GetChallengeStatus, [FRONTIER_UTIL_FUNC_GET_DATA] = GetFrontierData, diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index 91850ec72e..c9038ecf64 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -97,7 +97,7 @@ static void Task_HofPC_HandlePaletteOnExit(u8 taskId); static void Task_HofPC_HandleExit(u8 taskId); static void Task_HofPC_ExitOnButtonPress(u8 taskId); static void SpriteCB_GetOnScreenAndAnimate(struct Sprite *sprite); -static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2); +static void HallOfFame_PrintMonInfo(struct HallofFameMon *currMon, u8 unused1, u8 unused2); static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2); static void HallOfFame_PrintPlayerInfo(u8 unused1, u8 unused2); static void Task_DoDomeConfetti(u8 taskId); @@ -296,7 +296,7 @@ static const union AnimCmd sAnim_WhiteConfettiC[] = ANIMCMD_END }; -static const union AnimCmd * const sAnims_Confetti[] = +static const union AnimCmd *const sAnims_Confetti[] = { sAnim_PinkConfettiA, sAnim_RedConfettiA, @@ -563,7 +563,7 @@ static void Task_Hof_DisplayMon(u8 taskId) s16 startX, startY, destX, destY; u16 currMonId = gTasks[taskId].tDisplayedMonId; - struct HallofFameMon* currMon = &sHofMonPtr->mon[currMonId]; + struct HallofFameMon *currMon = &sHofMonPtr->mon[currMonId]; if (gTasks[taskId].tMonNumber > PARTY_SIZE / 2) { @@ -597,7 +597,7 @@ static void Task_Hof_DisplayMon(u8 taskId) static void Task_Hof_PrintMonInfoAfterAnimating(u8 taskId) { u16 currMonId = gTasks[taskId].tDisplayedMonId; - struct HallofFameMon* currMon = &sHofMonPtr->mon[currMonId]; + struct HallofFameMon *currMon = &sHofMonPtr->mon[currMonId]; struct Sprite *monSprite = &gSprites[gTasks[taskId].tMonSpriteId(currMonId)]; if (monSprite->callback == SpriteCallbackDummy) @@ -612,7 +612,7 @@ static void Task_Hof_PrintMonInfoAfterAnimating(u8 taskId) static void Task_Hof_TryDisplayAnotherMon(u8 taskId) { u16 currPokeID = gTasks[taskId].tDisplayedMonId; - struct HallofFameMon* currMon = &sHofMonPtr->mon[currPokeID]; + struct HallofFameMon *currMon = &sHofMonPtr->mon[currPokeID]; if (gTasks[taskId].tFrameCount != 0) { @@ -889,7 +889,7 @@ static void Task_HofPC_CopySaveData(u8 taskId) static void Task_HofPC_DrawSpritesPrintText(u8 taskId) { struct HallofFameTeam *savedTeams = sHofMonPtr; - struct HallofFameMon* currMon; + struct HallofFameMon *currMon; u16 i; for (i = 0; i < gTasks[taskId].tCurrTeamNo; i++) @@ -955,7 +955,7 @@ static void Task_HofPC_DrawSpritesPrintText(u8 taskId) static void Task_HofPC_PrintMonInfo(u8 taskId) { struct HallofFameTeam *savedTeams = sHofMonPtr; - struct HallofFameMon* currMon; + struct HallofFameMon *currMon; u16 i; u16 currMonID; @@ -1111,7 +1111,7 @@ static void HallOfFame_PrintWelcomeText(u8 unusedPossiblyWindowId, u8 unused2) CopyWindowToVram(0, COPYWIN_FULL); } -static void HallOfFame_PrintMonInfo(struct HallofFameMon* currMon, u8 unused1, u8 unused2) +static void HallOfFame_PrintMonInfo(struct HallofFameMon *currMon, u8 unused1, u8 unused2) { u8 text[max(32, POKEMON_NAME_LENGTH + 1)]; u8 *stringPtr; diff --git a/src/item.c b/src/item.c index b67cf5f218..d4a544f11f 100644 --- a/src/item.c +++ b/src/item.c @@ -632,7 +632,7 @@ void SortBerriesOrTMHMs(struct BagPocket *bagPocket) } } -void MoveItemSlotInList(struct ItemSlot* itemSlots_, u32 from, u32 to_) +void MoveItemSlotInList(struct ItemSlot *itemSlots_, u32 from, u32 to_) { // dumb assignments needed to match struct ItemSlot *itemSlots = itemSlots_; diff --git a/src/libisagbprn.c b/src/libisagbprn.c index fab9b5990b..a7de7df088 100644 --- a/src/libisagbprn.c +++ b/src/libisagbprn.c @@ -224,7 +224,7 @@ void MgbaClose(void) *REG_DEBUG_ENABLE = 0; } -void MgbaPrintf(s32 level, const char* ptr, ...) +void MgbaPrintf(s32 level, const char *ptr, ...) { va_list args; diff --git a/src/load_save.c b/src/load_save.c index a6284ffebd..117ba3e27c 100644 --- a/src/load_save.c +++ b/src/load_save.c @@ -69,7 +69,7 @@ void ClearSav1(void) // Offset is the sum of the trainer id bytes void SetSaveBlocksPointers(u16 offset) { - struct SaveBlock1** sav1_LocalVar = &gSaveBlock1Ptr; + struct SaveBlock1 **sav1_LocalVar = &gSaveBlock1Ptr; offset = (offset + Random()) & (SAVEBLOCK_MOVE_RANGE - 4); diff --git a/src/m4a_tables.c b/src/m4a_tables.c index 4d012cea28..6fb3b273a3 100644 --- a/src/m4a_tables.c +++ b/src/m4a_tables.c @@ -3,7 +3,7 @@ // 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[] = +void *const gMPlayJumpTableTemplate[] = { ply_fine, ply_goto, diff --git a/src/map_name_popup.c b/src/map_name_popup.c index d004b18d56..725bb80838 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -186,7 +186,7 @@ static const u8 sText_PyramidFloor6[] = _("PYRAMID FLOOR 6"); static const u8 sText_PyramidFloor7[] = _("PYRAMID FLOOR 7"); static const u8 sText_Pyramid[] = _("PYRAMID"); -static const u8 * const sBattlePyramid_MapHeaderStrings[FRONTIER_STAGES_PER_CHALLENGE + 1] = +static const u8 *const sBattlePyramid_MapHeaderStrings[FRONTIER_STAGES_PER_CHALLENGE + 1] = { sText_PyramidFloor1, sText_PyramidFloor2, diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c index db25df253b..03b4b6663a 100644 --- a/src/mauville_old_man.c +++ b/src/mauville_old_man.c @@ -34,7 +34,7 @@ static u8 sSelectedStory; COMMON_DATA struct BardSong gBardSong = {0}; static EWRAM_DATA u16 sUnusedPitchTableIndex = 0; -static EWRAM_DATA struct MauvilleManStoryteller * sStorytellerPtr = NULL; +static EWRAM_DATA struct MauvilleManStoryteller *sStorytellerPtr = NULL; static EWRAM_DATA u8 sStorytellerWindowId = 0; static const u16 sDefaultBardSongLyrics[NUM_BARD_SONG_WORDS] = { @@ -46,7 +46,7 @@ static const u16 sDefaultBardSongLyrics[NUM_BARD_SONG_WORDS] = { EC_WORD_DANCE }; -static const u8 * const sGiddyAdjectives[] = { +static const u8 *const sGiddyAdjectives[] = { GiddyText_SoPretty, GiddyText_SoDarling, GiddyText_SoRelaxed, @@ -60,7 +60,7 @@ static const u8 * const sGiddyAdjectives[] = { // Non-random lines Giddy can say. Not all are strictly // questions, but most are, and the player will receive // a Yes/No prompt afterwards regardless. -static const u8 * const sGiddyQuestions[GIDDY_MAX_QUESTIONS] = { +static const u8 *const sGiddyQuestions[GIDDY_MAX_QUESTIONS] = { GiddyText_ISoWantToGoOnAVacation, GiddyText_IBoughtCrayonsWith120Colors, GiddyText_WouldntItBeNiceIfWeCouldFloat, @@ -176,9 +176,9 @@ void SaveBardSongLyrics(void) static void PrepareSongText(void) { struct MauvilleManBard *bard = &gSaveBlock1Ptr->oldMan.bard; - u16 * lyrics = !gSpecialVar_0x8004 ? bard->songLyrics : bard->newSongLyrics; - u8 * wordEnd = gStringVar4; - u8 * str = wordEnd; + u16 *lyrics = !gSpecialVar_0x8004 ? bard->songLyrics : bard->newSongLyrics; + u8 *wordEnd = gStringVar4; + u8 *str = wordEnd; u16 paragraphNum; // Easy chat "words" aren't strictly single words, e.g. EC_WORD_MATCH_UP is the string "MATCH UP". @@ -454,12 +454,12 @@ static void EnableTextPrinters(void) gDisableTextPrinters = FALSE; } -static void DisableTextPrinters(struct TextPrinterTemplate * printer, u16 renderCmd) +static void DisableTextPrinters(struct TextPrinterTemplate *printer, u16 renderCmd) { gDisableTextPrinters = TRUE; } -static void DrawSongTextWindow(const u8 * str) +static void DrawSongTextWindow(const u8 *str) { DrawDialogueFrame(0, FALSE); AddTextPrinterParameterized(0, FONT_NORMAL, str, 0, 1, 1, DisableTextPrinters); @@ -750,7 +750,7 @@ void SetMauvilleOldManObjEventGfx(void) // Language fixers? -void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) +void SanitizeMauvilleOldManForRuby(union OldMan *oldMan) { s32 i; u8 playerName[PLAYER_NAME_LENGTH + 1]; @@ -759,7 +759,7 @@ void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) { case MAUVILLE_MAN_TRADER: { - struct MauvilleOldManTrader * trader = &oldMan->trader; + struct MauvilleOldManTrader *trader = &oldMan->trader; for (i = 0; i < NUM_TRADER_ITEMS; i++) { if (trader->language[i] == LANGUAGE_JAPANESE) @@ -769,7 +769,7 @@ void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) } case MAUVILLE_MAN_STORYTELLER: { - struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + struct MauvilleManStoryteller *storyteller = &oldMan->storyteller; for (i = 0; i < NUM_STORYTELLER_TALES; i++) { if (storyteller->gameStatIDs[i] != 0) @@ -790,7 +790,7 @@ void SanitizeMauvilleOldManForRuby(union OldMan * oldMan) } } -static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language1, u32 language2, u32 language3) +static void UNUSED SetMauvilleOldManLanguage(union OldMan *oldMan, u32 language1, u32 language2, u32 language3) { s32 i; @@ -798,7 +798,7 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language { case MAUVILLE_MAN_TRADER: { - struct MauvilleOldManTrader * trader = &oldMan->trader; + struct MauvilleOldManTrader *trader = &oldMan->trader; for (i = 0; i < NUM_TRADER_ITEMS; i++) { @@ -811,7 +811,7 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language break; case MAUVILLE_MAN_STORYTELLER: { - struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + struct MauvilleManStoryteller *storyteller = &oldMan->storyteller; for (i = 0; i < NUM_STORYTELLER_TALES; i++) { @@ -824,7 +824,7 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language break; case MAUVILLE_MAN_BARD: { - struct MauvilleManBard * bard = &oldMan->bard; + struct MauvilleManBard *bard = &oldMan->bard; if (language3 == LANGUAGE_JAPANESE) bard->language = language1; @@ -834,7 +834,7 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language break; case MAUVILLE_MAN_HIPSTER: { - struct MauvilleManHipster * hipster = &oldMan->hipster; + struct MauvilleManHipster *hipster = &oldMan->hipster; if (language3 == LANGUAGE_JAPANESE) hipster->language = language1; @@ -844,7 +844,7 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language break; case MAUVILLE_MAN_GIDDY: { - struct MauvilleManGiddy * giddy = &oldMan->giddy; + struct MauvilleManGiddy *giddy = &oldMan->giddy; if (language3 == LANGUAGE_JAPANESE) giddy->language = language1; @@ -855,13 +855,13 @@ static void UNUSED SetMauvilleOldManLanguage(union OldMan * oldMan, u32 language } } -void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 version, u32 language) +void SanitizeReceivedEmeraldOldMan(union OldMan *oldMan, u32 version, u32 language) { u8 playerName[PLAYER_NAME_LENGTH + 1]; s32 i; if (oldMan->common.id == MAUVILLE_MAN_STORYTELLER && language == LANGUAGE_JAPANESE) { - struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + struct MauvilleManStoryteller *storyteller = &oldMan->storyteller; for (i = 0; i < NUM_STORYTELLER_TALES; i++) { @@ -878,7 +878,7 @@ void SanitizeReceivedEmeraldOldMan(union OldMan * oldMan, u32 version, u32 langu } } -void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language) +void SanitizeReceivedRubyOldMan(union OldMan *oldMan, u32 version, u32 language) { bool32 isRuby = (version == VERSION_SAPPHIRE || version == VERSION_RUBY); @@ -886,14 +886,14 @@ void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language { case MAUVILLE_MAN_TRADER: { - struct MauvilleOldManTrader * trader = &oldMan->trader; + struct MauvilleOldManTrader *trader = &oldMan->trader; s32 i; if (isRuby) { for (i = 0; i < NUM_TRADER_ITEMS; i++) { - u8 * str = trader->playerNames[i]; + u8 *str = trader->playerNames[i]; if (str[0] == EXT_CTRL_CODE_BEGIN && str[1] == EXT_CTRL_CODE_JPN) { StripExtCtrlCodes(str); @@ -920,7 +920,7 @@ void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language case MAUVILLE_MAN_STORYTELLER: { - struct MauvilleManStoryteller * storyteller = &oldMan->storyteller; + struct MauvilleManStoryteller *storyteller = &oldMan->storyteller; s32 i; if (isRuby) @@ -935,7 +935,7 @@ void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language break; case MAUVILLE_MAN_BARD: { - struct MauvilleManBard * bard = &oldMan->bard; + struct MauvilleManBard *bard = &oldMan->bard; if (isRuby) { @@ -945,7 +945,7 @@ void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language break; case MAUVILLE_MAN_HIPSTER: { - struct MauvilleManHipster * hipster = &oldMan->hipster; + struct MauvilleManHipster *hipster = &oldMan->hipster; if (isRuby) { @@ -955,7 +955,7 @@ void SanitizeReceivedRubyOldMan(union OldMan * oldMan, u32 version, u32 language break; case MAUVILLE_MAN_GIDDY: { - struct MauvilleManGiddy * giddy = &oldMan->giddy; + struct MauvilleManGiddy *giddy = &oldMan->giddy; if (isRuby) { @@ -1299,9 +1299,9 @@ static void GetStoryByStattellerPlayerName(u32 player, void *dst) memcpy(dst, name, PLAYER_NAME_LENGTH); } -static void StorytellerSetPlayerName(u32 player, const u8 * src) +static void StorytellerSetPlayerName(u32 player, const u8 *src) { - u8 * name = sStorytellerPtr->trainerNames[player]; + u8 *name = sStorytellerPtr->trainerNames[player]; memset(name, EOS, PLAYER_NAME_LENGTH); memcpy(name, src, PLAYER_NAME_LENGTH); } @@ -1317,7 +1317,7 @@ static void StorytellerRecordNewStat(u32 player, u32 stat) sStorytellerPtr->language[player] = gGameLanguage; } -static void ScrambleStatList(u8 * arr, s32 count) +static void ScrambleStatList(u8 *arr, s32 count) { s32 i; diff --git a/src/menu_specialized.c b/src/menu_specialized.c index 1272277aa5..6f04a4febc 100644 --- a/src/menu_specialized.c +++ b/src/menu_specialized.c @@ -1194,7 +1194,7 @@ void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplat *pal = dataPal; } -void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate * template, struct SpritePalette *pals) +void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate *template, struct SpritePalette *pals) { u8 i; diff --git a/src/mini_printf.c b/src/mini_printf.c index 17665cdf06..3caf246048 100644 --- a/src/mini_printf.c +++ b/src/mini_printf.c @@ -214,11 +214,11 @@ static s32 mini_itoa(s32 value, u32 radix, s32 uppercase, bool32 unsig, char *bu return len; } -static s32 mini_pad(char* ptr, s32 len, char pad_char, s32 pad_to, char *buffer) +static s32 mini_pad(char *ptr, s32 len, char pad_char, s32 pad_to, char *buffer) { s32 i; bool32 overflow = FALSE; - char * pbuffer = buffer; + char *pbuffer = buffer; if(pad_to == 0) pad_to = len; if (len > pad_to) @@ -260,7 +260,7 @@ s32 mini_vsnprintf(char *buffer, u32 buffer_len, const char *fmt, va_list va) return b.pbuffer - b.buffer; } -s32 mini_vpprintf(void* buf, const char *fmt, va_list va) +s32 mini_vpprintf(void *buf, const char *fmt, va_list va) { char bf[24]; char bf2[24]; diff --git a/src/mystery_gift_client.c b/src/mystery_gift_client.c index 567751bad3..78937d6c9b 100644 --- a/src/mystery_gift_client.c +++ b/src/mystery_gift_client.c @@ -19,7 +19,7 @@ enum { FUNC_RUN_BUFFER, }; -EWRAM_DATA static struct MysteryGiftClient * sClient = NULL; +EWRAM_DATA static struct MysteryGiftClient *sClient = NULL; static void MysteryGiftClient_Init(struct MysteryGiftClient *, u32, u32); static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient *); @@ -34,7 +34,7 @@ void MysteryGiftClient_Create(bool32 isWonderNews) sClient->isWonderNews = isWonderNews; } -u32 MysteryGiftClient_Run(u16 * endVal) +u32 MysteryGiftClient_Run(u16 *endVal) { u32 result; if (sClient == NULL) @@ -64,7 +64,7 @@ void MysteryGiftClient_SetParam(u32 val) sClient->param = val; } -static void MysteryGiftClient_Init(struct MysteryGiftClient * client, u32 sendPlayerId, u32 recvPlayerId) +static void MysteryGiftClient_Init(struct MysteryGiftClient *client, u32 sendPlayerId, u32 recvPlayerId) { client->unused = 0; client->funcId = FUNC_INIT; @@ -76,7 +76,7 @@ static void MysteryGiftClient_Init(struct MysteryGiftClient * client, u32 sendPl MysteryGiftLink_Init(&client->link, sendPlayerId, recvPlayerId); } -static void MysteryGiftClient_Free(struct MysteryGiftClient * client) +static void MysteryGiftClient_Free(struct MysteryGiftClient *client) { Free(client->sendBuffer); Free(client->recvBuffer); @@ -84,20 +84,20 @@ static void MysteryGiftClient_Free(struct MysteryGiftClient * client) Free(client->msg); } -static void MysteryGiftClient_CopyRecvScript(struct MysteryGiftClient * client) +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) +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) +static u32 Client_Init(struct MysteryGiftClient *client) { memcpy(client->script, gMysteryGiftClientScript_Init, MG_LINK_BUFFER_SIZE); client->cmdidx = 0; @@ -106,13 +106,13 @@ static u32 Client_Init(struct MysteryGiftClient * client) return CLI_RET_INIT; } -static u32 Client_Done(struct MysteryGiftClient * client) +static u32 Client_Done(struct MysteryGiftClient *client) { return CLI_RET_END; } -static u32 Client_Recv(struct MysteryGiftClient * client) +static u32 Client_Recv(struct MysteryGiftClient *client) { if (MysteryGiftLink_Recv(&client->link)) { @@ -122,7 +122,7 @@ static u32 Client_Recv(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 Client_Send(struct MysteryGiftClient * client) +static u32 Client_Send(struct MysteryGiftClient *client) { if (MysteryGiftLink_Send(&client->link)) { @@ -132,10 +132,10 @@ static u32 Client_Send(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 Client_Run(struct MysteryGiftClient * client) +static u32 Client_Run(struct MysteryGiftClient *client) { // process command - struct MysteryGiftClientCmd * cmd = &client->script[client->cmdidx]; + struct MysteryGiftClientCmd *cmd = &client->script[client->cmdidx]; client->cmdidx++; switch (cmd->instr) { @@ -245,7 +245,7 @@ static u32 Client_Run(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 Client_Wait(struct MysteryGiftClient * client) +static u32 Client_Wait(struct MysteryGiftClient *client) { if (client->funcState) { @@ -255,7 +255,7 @@ static u32 Client_Wait(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 Client_RunMysteryEventScript(struct MysteryGiftClient * client) +static u32 Client_RunMysteryEventScript(struct MysteryGiftClient *client) { switch (client->funcState) { @@ -274,7 +274,7 @@ static u32 Client_RunMysteryEventScript(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 Client_RunBufferScript(struct MysteryGiftClient * client) +static u32 Client_RunBufferScript(struct MysteryGiftClient *client) { // exec arbitrary code u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer; @@ -286,7 +286,7 @@ static u32 Client_RunBufferScript(struct MysteryGiftClient * client) return CLI_RET_ACTIVE; } -static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient * client) +static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient *client) { u32 (*funcs[])(struct MysteryGiftClient *) = { [FUNC_INIT] = Client_Init, diff --git a/src/mystery_gift_link.c b/src/mystery_gift_link.c index 55f4b78527..2e0031722d 100644 --- a/src/mystery_gift_link.c +++ b/src/mystery_gift_link.c @@ -26,17 +26,17 @@ struct SendRecvHeader static u32 MGL_Receive(struct MysteryGiftLink *); static u32 MGL_Send(struct MysteryGiftLink *); -u32 MysteryGiftLink_Recv(struct MysteryGiftLink * link) +u32 MysteryGiftLink_Recv(struct MysteryGiftLink *link) { return link->recvFunc(link); } -u32 MysteryGiftLink_Send(struct MysteryGiftLink * link) +u32 MysteryGiftLink_Send(struct MysteryGiftLink *link) { return link->sendFunc(link); } -void MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 recvPlayerId) +void MysteryGiftLink_Init(struct MysteryGiftLink *link, u32 sendPlayerId, u32 recvPlayerId) { link->sendPlayerId = sendPlayerId; link->recvPlayerId = recvPlayerId; @@ -53,7 +53,7 @@ void MysteryGiftLink_Init(struct MysteryGiftLink * link, u32 sendPlayerId, u32 r link->recvFunc = MGL_Receive; } -void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const void * src, u32 size) +void MysteryGiftLink_InitSend(struct MysteryGiftLink *link, u32 ident, const void *src, u32 size) { link->state = 0; link->sendIdent = ident; @@ -66,7 +66,7 @@ void MysteryGiftLink_InitSend(struct MysteryGiftLink * link, u32 ident, const vo link->sendBuffer = src; } -void MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void * dest) +void MysteryGiftLink_InitRecv(struct MysteryGiftLink *link, u32 ident, void *dest) { link->state = 0; link->recvIdent = ident; @@ -76,7 +76,7 @@ void MysteryGiftLink_InitRecv(struct MysteryGiftLink * link, u32 ident, void * d link->recvBuffer = dest; } -static void MGL_ReceiveBlock(u32 playerId, void * dest, size_t size) +static void MGL_ReceiveBlock(u32 playerId, void *dest, size_t size) { memcpy(dest, gBlockRecvBuffer[playerId], size); } @@ -94,7 +94,7 @@ static void MGL_ResetReceived(u32 playerId) ResetBlockReceivedFlag(playerId); } -static bool32 MGL_Receive(struct MysteryGiftLink * link) +static bool32 MGL_Receive(struct MysteryGiftLink *link) { struct SendRecvHeader header; @@ -159,7 +159,7 @@ static bool32 MGL_Receive(struct MysteryGiftLink * link) return FALSE; } -static bool32 MGL_Send(struct MysteryGiftLink * link) +static bool32 MGL_Send(struct MysteryGiftLink *link) { struct SendRecvHeader header; diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c index 78e4a45715..7bf6152c61 100644 --- a/src/mystery_gift_menu.c +++ b/src/mystery_gift_menu.c @@ -64,7 +64,7 @@ struct MysteryGiftTaskData bool8 isWonderNews; bool8 sourceIsFriend; u8 msgId; - u8 * clientMsg; + u8 *clientMsg; }; static const struct BgTemplate sBGTemplates[] = { @@ -485,8 +485,8 @@ void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void) // Print the text window at the top of the screen with the title and control instructions void PrintMysteryGiftOrEReaderHeader(bool8 isEReader, bool32 useCancel) { - const u8 * title; - const u8 * options; + const u8 *title; + const u8 *options; FillWindowPixelBuffer(WIN_HEADER, 0); if (!isEReader) { @@ -597,7 +597,7 @@ static void ShowDownArrow(void) DrawDownArrow(WIN_MSG, DOWN_ARROW_X, DOWN_ARROW_Y, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); } -static bool32 UNUSED HideDownArrowAndWaitButton(u8 * textState) +static bool32 UNUSED HideDownArrowAndWaitButton(u8 *textState) { switch (*textState) { @@ -614,7 +614,7 @@ static bool32 UNUSED HideDownArrowAndWaitButton(u8 * textState) return FALSE; } -static bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str) +static bool32 PrintStringAndWait2Seconds(u8 *counter, const u8 *str) { if (*counter == 0) MG_AddMessageTextPrinter(str); @@ -631,7 +631,7 @@ static bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str) } } -static u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu) +static u32 MysteryGift_HandleThreeOptionMenu(u8 *unused0, u16 *unused1, u8 whichMenu) { struct ListMenuTemplate listMenuTemplate = sListMenuTemplate_ThreeOptions; struct WindowTemplate windowTemplate = sWindowTemplate_ThreeOptions; @@ -662,7 +662,7 @@ static u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whi return response; } -s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str) +s8 DoMysteryGiftYesNo(u8 *textState, u16 *windowId, bool8 yesNoBoxPlacement, const u8 *str) { struct WindowTemplate windowTemplate; s8 input; @@ -719,7 +719,7 @@ s8 DoMysteryGiftYesNo(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, c } // Handle the "Receive/Send/Toss" menu that appears when selecting Wonder Card/News -static s32 HandleGiftSelectMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend) +static s32 HandleGiftSelectMenu(u8 *textState, u16 *windowId, bool32 cannotToss, bool32 cannotSend) { struct WindowTemplate UNUSED windowTemplate; s32 input; @@ -786,7 +786,7 @@ static bool32 ValidateCardOrNews(bool32 isWonderNews) return ValidateSavedWonderNews(); } -static bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 isWonderNews) +static bool32 HandleLoadWonderCardOrNews(u8 *state, bool32 isWonderNews) { switch (*state) { @@ -852,7 +852,7 @@ static bool32 ExitWonderCardOrNews(bool32 isWonderNews, bool32 useCancel) } } -static s32 AskDiscardGift(u8 * textState, u16 * windowId, bool32 isWonderNews) +static s32 AskDiscardGift(u8 *textState, u16 *windowId, bool32 isWonderNews) { if (!isWonderNews) return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_IfThrowAwayCardEventWontHappen); @@ -860,7 +860,7 @@ static s32 AskDiscardGift(u8 * textState, u16 * windowId, bool32 isWonderNews) return DoMysteryGiftYesNo(textState, windowId, TRUE, gText_OkayToDiscardNews); } -static bool32 PrintThrownAway(u8 * textState, bool32 isWonderNews) +static bool32 PrintThrownAway(u8 *textState, bool32 isWonderNews) { if (!isWonderNews) return PrintMysteryGiftMenuMessage(textState, gText_WonderCardThrownAway); @@ -868,7 +868,7 @@ static bool32 PrintThrownAway(u8 * textState, bool32 isWonderNews) return PrintMysteryGiftMenuMessage(textState, gText_WonderNewsThrownAway); } -static bool32 SaveOnMysteryGiftMenu(u8 * state) +static bool32 SaveOnMysteryGiftMenu(u8 *state) { switch (*state) { @@ -897,9 +897,9 @@ static bool32 SaveOnMysteryGiftMenu(u8 * state) return FALSE; } -static const u8 * GetClientResultMessage(bool32 * successMsg, bool8 isWonderNews, bool8 sourceIsFriend, u32 msgId) +static const u8 * GetClientResultMessage(bool32 *successMsg, bool8 isWonderNews, bool8 sourceIsFriend, u32 msgId) { - const u8 * msg = NULL; + const u8 *msg = NULL; *successMsg = FALSE; switch (msgId) @@ -969,7 +969,7 @@ static const u8 * GetClientResultMessage(bool32 * successMsg, bool8 isWonderNews return msg; } -static bool32 PrintSuccessMessage(u8 * state, const u8 * msg, u16 * timer) +static bool32 PrintSuccessMessage(u8 *state, const u8 *msg, u16 *timer) { switch (*state) { @@ -996,9 +996,9 @@ static bool32 PrintSuccessMessage(u8 * state, const u8 * msg, u16 * timer) return FALSE; } -static const u8 * GetServerResultMessage(bool32 * wonderSuccess, bool8 sourceIsFriend, u32 msgId) +static const u8 * GetServerResultMessage(bool32 *wonderSuccess, bool8 sourceIsFriend, u32 msgId) { - const u8 * result = gText_CommunicationError; + const u8 *result = gText_CommunicationError; *wonderSuccess = FALSE; switch (msgId) { @@ -1053,10 +1053,10 @@ static const u8 * GetServerResultMessage(bool32 * wonderSuccess, bool8 sourceIsF return result; } -static bool32 PrintServerResultMessage(u8 * state, u16 * timer, bool8 sourceIsFriend, u32 msgId) +static bool32 PrintServerResultMessage(u8 *state, u16 *timer, bool8 sourceIsFriend, u32 msgId) { bool32 wonderSuccess; - const u8 * str = GetServerResultMessage(&wonderSuccess, sourceIsFriend, msgId); + const u8 *str = GetServerResultMessage(&wonderSuccess, sourceIsFriend, msgId); if (wonderSuccess) return PrintSuccessMessage(state, str, timer); else @@ -1111,7 +1111,7 @@ enum { static void CreateMysteryGiftTask(void) { u8 taskId = CreateTask(Task_MysteryGift, 0); - struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data; + struct MysteryGiftTaskData *data = (void *)gTasks[taskId].data; data->state = MG_STATE_TO_MAIN_MENU; data->textState = 0; data->unused4 = 0; diff --git a/src/mystery_gift_server.c b/src/mystery_gift_server.c index 891870659d..c90e43dee0 100644 --- a/src/mystery_gift_server.c +++ b/src/mystery_gift_server.c @@ -13,7 +13,7 @@ enum { FUNC_RUN, }; -EWRAM_DATA static struct MysteryGiftServer * sServer = NULL; +EWRAM_DATA static struct MysteryGiftServer *sServer = NULL; static void MysteryGiftServer_Init(struct MysteryGiftServer *, const void *, u32, u32); static void MysteryGiftServer_Free(struct MysteryGiftServer *); @@ -34,7 +34,7 @@ void MysterGiftServer_CreateForCard(void) MysteryGiftServer_Init(sServer, gMysteryGiftServerScript_SendWonderCard, 0, 1); } -u32 MysterGiftServer_Run(u16 * endVal) +u32 MysterGiftServer_Run(u16 *endVal) { u32 result; if (sServer == NULL) @@ -49,7 +49,7 @@ u32 MysterGiftServer_Run(u16 * endVal) return result; } -static void MysteryGiftServer_Init(struct MysteryGiftServer * svr, const void * script, u32 sendPlayerId, u32 recvPlayerId) +static void MysteryGiftServer_Init(struct MysteryGiftServer *svr, const void *script, u32 sendPlayerId, u32 recvPlayerId) { svr->unused = 0; svr->funcId = FUNC_INIT; @@ -62,7 +62,7 @@ static void MysteryGiftServer_Init(struct MysteryGiftServer * svr, const void * MysteryGiftLink_Init(&svr->link, sendPlayerId, recvPlayerId); } -static void MysteryGiftServer_Free(struct MysteryGiftServer * svr) +static void MysteryGiftServer_Free(struct MysteryGiftServer *svr) { Free(svr->card); Free(svr->news); @@ -70,7 +70,7 @@ static void MysteryGiftServer_Free(struct MysteryGiftServer * svr) Free(svr->linkGameData); } -static void MysteryGiftServer_InitSend(struct MysteryGiftServer * svr, u32 ident, const void * src, u32 size) +static void MysteryGiftServer_InitSend(struct MysteryGiftServer *svr, u32 ident, const void *src, u32 size) { AGB_ASSERT(size <= MG_LINK_BUFFER_SIZE); MysteryGiftLink_InitSend(&svr->link, ident, src, size); @@ -78,7 +78,7 @@ static void MysteryGiftServer_InitSend(struct MysteryGiftServer * svr, u32 ident // 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) +static const void * MysteryGiftServer_GetSendData(const void *dynamicData, const void *defaultData) { if (dynamicData != NULL) return dynamicData; @@ -86,7 +86,7 @@ static const void * MysteryGiftServer_GetSendData(const void * dynamicData, cons return defaultData; } -static u32 MysteryGiftServer_Compare(const void * a, const void * b) +static u32 MysteryGiftServer_Compare(const void *a, const void *b) { if (b < a) return 0; @@ -96,36 +96,36 @@ static u32 MysteryGiftServer_Compare(const void * a, const void * b) return 2; } -static u32 Server_Init(struct MysteryGiftServer * svr) +static u32 Server_Init(struct MysteryGiftServer *svr) { svr->funcId = FUNC_RUN; return SVR_RET_INIT; } -static u32 Server_Done(struct MysteryGiftServer * svr) +static u32 Server_Done(struct MysteryGiftServer *svr) { return SVR_RET_END; } -static u32 Server_Recv(struct MysteryGiftServer * svr) +static u32 Server_Recv(struct MysteryGiftServer *svr) { if (MysteryGiftLink_Recv(&svr->link)) svr->funcId = FUNC_RUN; return SVR_RET_ACTIVE; } -static u32 Server_Send(struct MysteryGiftServer * svr) +static u32 Server_Send(struct MysteryGiftServer *svr) { if (MysteryGiftLink_Send(&svr->link)) svr->funcId = FUNC_RUN; return SVR_RET_ACTIVE; } -static u32 Server_Run(struct MysteryGiftServer * svr) +static u32 Server_Run(struct MysteryGiftServer *svr) { // process command - const struct MysteryGiftServerCmd * cmd = &svr->script[svr->cmdidx]; - const void * ptr; + const struct MysteryGiftServerCmd *cmd = &svr->script[svr->cmdidx]; + const void *ptr; svr->cmdidx++; switch (cmd->instr) @@ -280,7 +280,7 @@ static u32 (*const sFuncTable[])(struct MysteryGiftServer *) = { [FUNC_RUN] = Server_Run }; -static u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer * svr) +static u32 MysteryGiftServer_CallFunc(struct MysteryGiftServer *svr) { u32 response; AGB_ASSERT(svr->funcId < ARRAY_COUNT(sFuncTable)); diff --git a/src/mystery_gift_view.c b/src/mystery_gift_view.c index ac62c80bfa..357d0ae13e 100644 --- a/src/mystery_gift_view.c +++ b/src/mystery_gift_view.c @@ -23,9 +23,9 @@ struct WonderGraphics u8 bodyTextPal:4; u8 footerTextPal:4; // Card only u8 stampShadowPal:4; // Card only - const u32 * tiles; - const u32 * map; - const u16 * pal; + const u32 *tiles; + const u32 *map; + const u16 *pal; }; //====================== @@ -52,7 +52,7 @@ struct WonderCardData { /*0000*/ struct WonderCard card; /*014c*/ struct WonderCardMetadata cardMetadata; - /*0170*/ const struct WonderGraphics * gfx; + /*0170*/ const struct WonderGraphics *gfx; /*0174*/ u8 enterExitState; /*0175*/ u8 statFooterWidth; /*0176*/ u16 windowIds[CARD_WIN_COUNT]; @@ -68,7 +68,7 @@ struct WonderCardData /*045C*/ u8 bgTilemapBuffer[0x1000]; }; -EWRAM_DATA static struct WonderCardData * sWonderCardData = NULL; +EWRAM_DATA static struct WonderCardData *sWonderCardData = NULL; static void BufferCardText(void); static void DrawCardWindow(u8 whichWindow); @@ -184,7 +184,7 @@ static const struct WonderGraphics sCardGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .footerTextPal = 0, .stampShadowPal = 7, .tiles = sWonderCardBgGfx8, .map = sWonderCardBgTilemap8, .pal = sWonderCardBgPal8} }; -bool32 WonderCard_Init(struct WonderCard * card, struct WonderCardMetadata * metadata) +bool32 WonderCard_Init(struct WonderCard *card, struct WonderCardMetadata *metadata) { if (card == NULL || metadata == NULL) return FALSE; @@ -551,7 +551,7 @@ enum { struct WonderNewsData { /*0000*/ struct WonderNews news; - /*01bc*/ const struct WonderGraphics * gfx; + /*01bc*/ const struct WonderGraphics *gfx; /*01c0*/ u8 arrowsRemoved:1; u8 enterExitState:7; /*01c1*/ u8 arrowTaskId; @@ -569,7 +569,7 @@ struct WonderNewsData /*03a4*/ u8 bgTilemapBuffer[0x1000]; }; -EWRAM_DATA static struct WonderNewsData * sWonderNewsData = NULL; +EWRAM_DATA static struct WonderNewsData *sWonderNewsData = NULL; static void BufferNewsText(void); static void DrawNewsWindows(void); @@ -640,7 +640,7 @@ static const struct WonderGraphics sNewsGraphics[NUM_WONDER_BGS] = { {.titleTextPal = 1, .bodyTextPal = 0, .tiles = sWonderNewsGfx8, .map = sWonderNewsTilemap8, .pal = sWonderNewsPal8} }; -bool32 WonderNews_Init(const struct WonderNews * news) +bool32 WonderNews_Init(const struct WonderNews *news) { if (news == NULL) return FALSE; diff --git a/src/pokedex.c b/src/pokedex.c index 030020df89..96eedafad5 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4587,7 +4587,7 @@ static void UNUSED PrintDecimalNum(u8 windowId, u16 num, u8 left, u8 top) static void DrawFootprint(u8 windowId, u16 dexNum) { u8 footprint4bpp[TILE_SIZE_4BPP * NUM_FOOTPRINT_TILES]; - const u8 * footprintGfx = gMonFootprintTable[NationalPokedexNumToSpecies(dexNum)]; + const u8 *footprintGfx = gMonFootprintTable[NationalPokedexNumToSpecies(dexNum)]; u16 tileIdx = 0; u16 i, j; diff --git a/src/pokedex_area_region_map.c b/src/pokedex_area_region_map.c index cd2975473a..06bd05a87b 100644 --- a/src/pokedex_area_region_map.c +++ b/src/pokedex_area_region_map.c @@ -17,7 +17,7 @@ static const u32 sPokedexAreaMapAffine_Tilemap[] = INCBIN_U32("graphics/pokedex/ void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template) { u8 mode; - void * tilemap; + void *tilemap; sPokedexAreaMapBgNum = Alloc(sizeof(sPokedexAreaMapBgNum)); mode = template->mode; diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index f9181a985b..a447b6d758 100755 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -87,7 +87,7 @@ struct /*0x6E8*/ u8 *screenSwitchState; /*0x6EC*/ struct RegionMap regionMap; /*0xF70*/ u8 charBuffer[64]; - /*0xFB0*/ struct Sprite * areaUnknownSprites[3]; + /*0xFB0*/ struct Sprite *areaUnknownSprites[3]; /*0xFBC*/ u8 areaUnknownGraphicsBuffer[0x600]; } static EWRAM_DATA *sPokedexAreaScreen = NULL; diff --git a/src/pokemon.c b/src/pokemon.c index d0b6c3302e..7fe9f58de4 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4429,7 +4429,7 @@ static u8 CopyMonToPC(struct Pokemon *mon) { for (boxPos = 0; boxPos < IN_BOX_COUNT; boxPos++) { - struct BoxPokemon* checkingMon = GetBoxedMonPtr(boxNo, boxPos); + struct BoxPokemon *checkingMon = GetBoxedMonPtr(boxNo, boxPos); if (GetBoxMonData(checkingMon, MON_DATA_SPECIES, NULL) == SPECIES_NONE) { MonRestorePP(mon); @@ -6992,7 +6992,7 @@ static bool8 ShouldSkipFriendshipChange(void) #define ALLOC_FAIL_STRUCT (1 << 1) #define GFX_MANAGER_ACTIVE 0xA3 // Arbitrary value -static void InitMonSpritesGfx_Battle(struct MonSpritesGfxManager* gfx) +static void InitMonSpritesGfx_Battle(struct MonSpritesGfxManager *gfx) { u16 i, j; for (i = 0; i < gfx->numSprites; i++) @@ -7005,7 +7005,7 @@ static void InitMonSpritesGfx_Battle(struct MonSpritesGfxManager* gfx) } } -static void InitMonSpritesGfx_FullParty(struct MonSpritesGfxManager* gfx) +static void InitMonSpritesGfx_FullParty(struct MonSpritesGfxManager *gfx) { u16 i, j; for (i = 0; i < gfx->numSprites; i++) diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c index 837e6675c9..8058074ef4 100644 --- a/src/pokemon_animation.c +++ b/src/pokemon_animation.c @@ -627,7 +627,7 @@ static const u8 sVerticalShakeData[][2] = {-1, 0} }; -static void (* const sMonAnimFunctions[])(struct Sprite *sprite) = +static void (*const sMonAnimFunctions[])(struct Sprite *sprite) = { [ANIM_V_SQUISH_AND_BOUNCE] = Anim_VerticalSquishBounce, [ANIM_CIRCULAR_STRETCH_TWICE] = Anim_CircularStretchTwice, diff --git a/src/pokemon_jump.c b/src/pokemon_jump.c index a1c401c6df..326512acf0 100755 --- a/src/pokemon_jump.c +++ b/src/pokemon_jump.c @@ -799,7 +799,7 @@ static void RecvLinkData_Leader(void) sPokemonJump->allPlayersReady = TRUE; } -static bool32 (* const sPokeJumpLeaderFuncs[])(void) = +static bool32 (*const sPokeJumpLeaderFuncs[])(void) = { [FUNC_GAME_INTRO] = GameIntro_Leader, [FUNC_WAIT_ROUND] = WaitRound_Leader, @@ -898,7 +898,7 @@ static void RecvLinkData_Member(void) } } -static bool32 (* const sPokeJumpMemberFuncs[])(void) = +static bool32 (*const sPokeJumpMemberFuncs[])(void) = { [FUNC_GAME_INTRO] = GameIntro_Member, [FUNC_WAIT_ROUND] = WaitRound_Member, diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 642b176d6b..0c23643e49 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -2094,7 +2094,7 @@ static void ExitMovePositionSwitchMode(u8 taskId, bool8 swapMoves) static void SwapMonMoves(struct Pokemon *mon, u8 moveIndex1, u8 moveIndex2) { - struct PokeSummary* summary = &sMonSummaryScreen->summary; + struct PokeSummary *summary = &sMonSummaryScreen->summary; u16 move1 = summary->moves[moveIndex1]; u16 move2 = summary->moves[moveIndex2]; @@ -2129,7 +2129,7 @@ static void SwapMonMoves(struct Pokemon *mon, u8 moveIndex1, u8 moveIndex2) static void SwapBoxMonMoves(struct BoxPokemon *mon, u8 moveIndex1, u8 moveIndex2) { - struct PokeSummary* summary = &sMonSummaryScreen->summary; + struct PokeSummary *summary = &sMonSummaryScreen->summary; u16 move1 = summary->moves[moveIndex1]; u16 move2 = summary->moves[moveIndex2]; diff --git a/src/pokenav_conditions_search_results.c b/src/pokenav_conditions_search_results.c index e42f35481b..fcda1aa7cd 100644 --- a/src/pokenav_conditions_search_results.c +++ b/src/pokenav_conditions_search_results.c @@ -238,27 +238,27 @@ static u32 GetReturningFromGraph(void) static struct PokenavMonListItem * GetSearchResultsMonDataList(void) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); return menu->monList->monData; } static u16 GetSearchResultsMonListCount(void) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); return menu->monList->listCount; } // data below has been set by ConvertConditionsToListRanks static s32 GetSearchResultsSelectedMonRank(void) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); s32 i = PokenavList_GetSelectedIndex(); return menu->monList->monData[i].data; } static u16 GetSearchResultsCurrentListIndex(void) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); return menu->monList->currIndex; } @@ -271,7 +271,7 @@ static u32 BuildPartyMonSearchResults(s32 state) { s32 i; struct PokenavMonListItem item; - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); menu->monList->listCount = 0; menu->monList->currIndex = 0; @@ -294,7 +294,7 @@ static u32 BuildPartyMonSearchResults(s32 state) static u32 InitBoxMonSearchResults(s32 state) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); menu->monId = 0; menu->boxId = 0; return LT_INC_AND_CONTINUE; @@ -302,7 +302,7 @@ static u32 InitBoxMonSearchResults(s32 state) static u32 BuildBoxMonSearchResults(s32 state) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); s32 boxId = menu->boxId; s32 monId = menu->monId; s32 boxCount = 0; @@ -340,7 +340,7 @@ static u32 BuildBoxMonSearchResults(s32 state) // The condition value in data is then overwritten with their ranking. static u32 ConvertConditionsToListRanks(s32 state) { - struct Pokenav_SearchResults * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); + struct Pokenav_SearchResults *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_CONDITION_SEARCH_RESULTS); s32 listCount = menu->monList->listCount; s32 prevCondition = menu->monList->monData[0].data; s32 i; @@ -698,12 +698,12 @@ static void CreateSearchResultsList(void) CreatePokenavList(&sConditionSearchResultBgTemplates[1], &template, 0); } -static void BufferSearchMonListItem(struct PokenavMonListItem * item, u8 * dest) +static void BufferSearchMonListItem(struct PokenavMonListItem *item, u8 *dest) { u8 gender; u8 level; - u8 * s; - const u8 * genderStr; + u8 *s; + const u8 *genderStr; // Mon is in party if (item->boxId == TOTAL_BOXES_COUNT) @@ -716,7 +716,7 @@ static void BufferSearchMonListItem(struct PokenavMonListItem * item, u8 * dest) // Mon is in PC else { - struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); + struct BoxPokemon *mon = GetBoxedMonPtr(item->boxId, item->monId); gender = GetBoxMonGender(mon); level = GetLevelFromBoxMonExp(mon); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); diff --git a/src/pokenav_list.c b/src/pokenav_list.c index ed3d40dee2..9d1c561d1f 100644 --- a/src/pokenav_list.c +++ b/src/pokenav_list.c @@ -34,7 +34,7 @@ struct PokenavListWindowState { u16 selectedIndexOffset; u16 entriesOnscreen; u32 listItemSize; - void * listPtr; + void *listPtr; }; struct PokenavListSub @@ -43,7 +43,7 @@ struct PokenavListSub u32 printStart; u32 printIndex; u32 itemSize; - void * listPtr; + void *listPtr; s32 startBgY; s32 endBgY; u32 loopedTaskId; @@ -192,7 +192,7 @@ static void InitListItems(struct PokenavListWindowState *windowState, struct Pok PrintListItems(windowState->listPtr, windowState->windowTopIndex, numToPrint, windowState->listItemSize, 0, subPtr); } -static void PrintListItems(void * listPtr, u32 topIndex, u32 numItems, u32 itemSize, u32 printStart, struct PokenavListSub *list) +static void PrintListItems(void *listPtr, u32 topIndex, u32 numItems, u32 itemSize, u32 printStart, struct PokenavListSub *list) { if (numItems == 0) return; diff --git a/src/pokenav_menu_handler_gfx.c b/src/pokenav_menu_handler_gfx.c index e223b7caba..ce17f33cfc 100644 --- a/src/pokenav_menu_handler_gfx.c +++ b/src/pokenav_menu_handler_gfx.c @@ -45,8 +45,8 @@ struct Pokenav_MenuGfx u8 numIconsBlending; bool8 pokenavAlreadyOpen; bool32 iconVisible[MAX_POKENAV_MENUITEMS]; - struct Sprite * blueLightSprite; - struct Sprite * iconSprites[MAX_POKENAV_MENUITEMS][NUM_OPTION_SUBSPRITES]; + struct Sprite *blueLightSprite; + struct Sprite *iconSprites[MAX_POKENAV_MENUITEMS][NUM_OPTION_SUBSPRITES]; u8 bg1TilemapBuffer[BG_SCREEN_SIZE]; }; @@ -380,7 +380,7 @@ static bool32 AreAnyTrainerRematchesNearby(void) bool32 OpenPokenavMenuInitial(void) { - struct Pokenav_MenuGfx * gfx = OpenPokenavMenu(); + struct Pokenav_MenuGfx *gfx = OpenPokenavMenu(); if (gfx == NULL) return FALSE; @@ -391,7 +391,7 @@ bool32 OpenPokenavMenuInitial(void) bool32 OpenPokenavMenuNotInitial(void) { - struct Pokenav_MenuGfx * gfx = OpenPokenavMenu(); + struct Pokenav_MenuGfx *gfx = OpenPokenavMenu(); if (gfx == NULL) return FALSE; @@ -402,7 +402,7 @@ bool32 OpenPokenavMenuNotInitial(void) static struct Pokenav_MenuGfx * OpenPokenavMenu(void) { - struct Pokenav_MenuGfx * gfx = AllocSubstruct(POKENAV_SUBSTRUCT_MENU_GFX, sizeof(struct Pokenav_MenuGfx)); + struct Pokenav_MenuGfx *gfx = AllocSubstruct(POKENAV_SUBSTRUCT_MENU_GFX, sizeof(struct Pokenav_MenuGfx)); if (gfx != NULL) { @@ -416,20 +416,20 @@ static struct Pokenav_MenuGfx * OpenPokenavMenu(void) void CreateMenuHandlerLoopedTask(s32 ltIdx) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); gfx->loopedTaskId = CreateLoopedTask(sMenuHandlerLoopTaskFuncs[ltIdx], 1); gfx->isTaskActiveCB = GetCurrentLoopedTaskActive; } bool32 IsMenuHandlerLoopedTaskActive(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); return gfx->isTaskActiveCB(); } void FreeMenuHandlerSubstruct2(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); DestroyMovingDotsBgTask(); RemoveWindow(gfx->optionDescWindowId); @@ -440,14 +440,14 @@ void FreeMenuHandlerSubstruct2(void) static bool32 GetCurrentLoopedTaskActive(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); return IsLoopedTaskActive(gfx->loopedTaskId); } static u32 LoopedTask_OpenMenu(s32 state) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); switch (state) { @@ -817,7 +817,7 @@ static void FreeAndDestroyMainMenuSprites(void) static void CreateMenuOptionSprites(void) { s32 i, j; - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) { @@ -833,7 +833,7 @@ static void CreateMenuOptionSprites(void) static void DestroyMenuOptionSprites(void) { s32 i, j; - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) { @@ -854,7 +854,7 @@ static void DrawCurrentMenuOptionLabels(void) static void DrawOptionLabelGfx(const u16 *const *optionGfx, s32 yPos, s32 deltaY) { s32 i, j; - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); s32 baseTile = GetSpriteTileStartByTag(GFXTAG_OPTIONS); for (i = 0; i < MAX_POKENAV_MENUITEMS; i++) @@ -987,7 +987,7 @@ static bool32 AreMenuOptionSpritesMoving(void) #define sSlideSpeed data[2] #define sSlideEndX data[7] -static void StartOptionSlide(struct Sprite ** sprites, s32 startX, s32 endX, s32 time) +static void StartOptionSlide(struct Sprite **sprites, s32 startX, s32 endX, s32 time) { s32 i; @@ -1016,10 +1016,10 @@ static void StartOptionSlide(struct Sprite ** sprites, s32 startX, s32 endX, s32 // When an option is selected it zooms in and blends away as part // of the transition to the next screen. -static void StartOptionZoom(struct Sprite ** sprites) +static void StartOptionZoom(struct Sprite **sprites) { s32 i; - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); u8 taskId; for (i = 0; i < NUM_OPTION_SUBSPRITES; i++) @@ -1041,7 +1041,7 @@ static void StartOptionZoom(struct Sprite ** sprites) gfx->numIconsBlending++; } -static void SetOptionInvisibility(struct Sprite ** sprites, bool32 invisible) +static void SetOptionInvisibility(struct Sprite **sprites, bool32 invisible) { s32 i; @@ -1052,7 +1052,7 @@ static void SetOptionInvisibility(struct Sprite ** sprites, bool32 invisible) } } -static void SpriteCB_OptionSlide(struct Sprite * sprite) +static void SpriteCB_OptionSlide(struct Sprite *sprite) { sprite->sSlideTime--; if (sprite->sSlideTime != -1) @@ -1072,7 +1072,7 @@ static void SpriteCB_OptionSlide(struct Sprite * sprite) #undef sSlideSpeed #undef sSlideEndX -static void SpriteCB_OptionZoom(struct Sprite * sprite) +static void SpriteCB_OptionZoom(struct Sprite *sprite) { s32 temp; s32 x; @@ -1133,7 +1133,7 @@ static void SpriteCB_OptionZoom(struct Sprite * sprite) static void Task_OptionBlend(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (tBlendDelay == 0) { @@ -1185,7 +1185,7 @@ static void Task_OptionBlend(u8 taskId) // Blue light that blinks if there are available rematches nearby static void CreateMatchCallBlueLightSprite(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); u8 spriteId = CreateSprite(&sMatchCallBlueLightSpriteTemplate, 0x10, 0x60, 4); gfx->blueLightSprite = &gSprites[spriteId]; if (AreAnyTrainerRematchesNearby()) @@ -1200,7 +1200,7 @@ static void DestroyRematchBlueLightSprite(void) DestroySprite(gfx->blueLightSprite); } -static void SpriteCB_BlinkingBlueLight(struct Sprite * sprite) +static void SpriteCB_BlinkingBlueLight(struct Sprite *sprite) { sprite->data[0]++; if (sprite->data[0] > 8) @@ -1212,7 +1212,7 @@ static void SpriteCB_BlinkingBlueLight(struct Sprite * sprite) static void AddOptionDescriptionWindow(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); gfx->optionDescWindowId = AddWindow(&sOptionDescWindowTemplate); PutWindowTilemap(gfx->optionDescWindowId); @@ -1222,9 +1222,9 @@ static void AddOptionDescriptionWindow(void) static void PrintCurrentOptionDescription(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); int menuItem = GetCurrentMenuItemId(); - const u8 * desc = sPageDescriptions[menuItem]; + const u8 *desc = sPageDescriptions[menuItem]; u32 width = GetStringWidth(FONT_NORMAL, desc, -1); FillWindowPixelBuffer(gfx->optionDescWindowId, PIXEL_FILL(6)); AddTextPrinterParameterized3(gfx->optionDescWindowId, FONT_NORMAL, (192 - width) / 2, 1, sOptionDescTextColors, 0, desc); @@ -1234,8 +1234,8 @@ static void PrintCurrentOptionDescription(void) // Can occur by obtaining a mon with a ribbon and then releasing all ribbon winners static void PrintNoRibbonWinners(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); - const u8 * s = gText_NoRibbonWinners; + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + const u8 *s = gText_NoRibbonWinners; u32 width = GetStringWidth(FONT_NORMAL, s, -1); FillWindowPixelBuffer(gfx->optionDescWindowId, PIXEL_FILL(6)); AddTextPrinterParameterized3(gfx->optionDescWindowId, FONT_NORMAL, (192 - width) / 2, 1, sOptionDescTextColors2, 0, s); @@ -1248,13 +1248,13 @@ static bool32 IsDma3ManagerBusyWithBgCopy_(void) static void CreateMovingBgDotsTask(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); gfx->bg3ScrollTaskId = CreateTask(Task_MoveBgDots, 2); } static void DestroyMovingDotsBgTask(void) { - struct Pokenav_MenuGfx * gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); + struct Pokenav_MenuGfx *gfx = GetSubstructPtr(POKENAV_SUBSTRUCT_MENU_GFX); DestroyTask(gfx->bg3ScrollTaskId); } @@ -1290,9 +1290,9 @@ static bool32 IsTaskActive_UpdateBgDotsPalette(void) static void Task_UpdateBgDotsPalette(u8 taskId) { u16 sp8[2]; - s16 * data = gTasks[taskId].data; - const u16 * pal1 = (const u16 *)GetWordTaskArg(taskId, 1); - const u16 * pal2 = (const u16 *)GetWordTaskArg(taskId, 3); + s16 *data = gTasks[taskId].data; + const u16 *pal1 = (const u16 *)GetWordTaskArg(taskId, 1); + const u16 *pal2 = (const u16 *)GetWordTaskArg(taskId, 3); PokenavCopyPalette(pal1, pal2, 2, 12, ++data[0], sp8); LoadPalette(sp8, BG_PLTT_ID(3) + 1, PLTT_SIZEOF(2)); @@ -1345,7 +1345,7 @@ static void InitMenuOptionGlow(void) static void Task_CurrentMenuOptionGlow(u8 taskId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; data[0]++; if (data[0] > 0) { diff --git a/src/pokenav_ribbons_list.c b/src/pokenav_ribbons_list.c index 05eded6240..44fd309c38 100644 --- a/src/pokenav_ribbons_list.c +++ b/src/pokenav_ribbons_list.c @@ -217,26 +217,26 @@ static u32 UpdateMonListBgs(void) static struct PokenavMonListItem *GetMonRibbonMonListData(void) { - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); return list->monList->monData; } static s32 GetRibbonsMonListCount(void) { - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); return list->monList->listCount; } static s32 UNUSED GetMonRibbonSelectedMonData(void) { - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); s32 idx = PokenavList_GetSelectedIndex(); return list->monList->monData[idx].data; } static s32 GetRibbonListMenuCurrIndex(void) { - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); return list->monList->currIndex; } @@ -249,7 +249,7 @@ static u32 BuildPartyMonRibbonList(s32 state) { s32 i; struct PokenavMonListItem item; - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); list->monList->listCount = 0; list->monList->currIndex = 0; @@ -284,7 +284,7 @@ static u32 InitBoxMonRibbonList(s32 state) static u32 BuildBoxMonRibbonList(s32 state) { - struct Pokenav_RibbonsMonList * list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); + struct Pokenav_RibbonsMonList *list = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_LIST); s32 boxId = list->boxId; s32 monId = list->monId; s32 boxCount = 0; @@ -408,13 +408,13 @@ bool32 IsRibbonsMonListLoopedTaskActive(void) bool32 GetRibbonsMonCurrentLoopedTaskActive(void) { - struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); + struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); return IsLoopedTaskActive(menu->loopedTaskId); } void FreeRibbonsMonMenu(void) { - struct Pokenav_RibbonsMonMenu * menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); + struct Pokenav_RibbonsMonMenu *menu = GetSubstructPtr(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); DestroyPokenavList(); RemoveWindow(menu->winid); FreePokenavSubstruct(POKENAV_SUBSTRUCT_RIBBONS_MON_MENU); @@ -668,7 +668,7 @@ static void DrawListIndexNumber(s32 windowId, s32 index, s32 max) u8 strbuf[16]; u32 x; - u8 * ptr = strbuf; + u8 *ptr = strbuf; ptr = ConvertIntToDecimalStringN(ptr, index, STR_CONV_MODE_RIGHT_ALIGN, 3); *ptr++ = CHAR_SLASH; ConvertIntToDecimalStringN(ptr, max, STR_CONV_MODE_RIGHT_ALIGN, 3); @@ -695,13 +695,13 @@ static void CreateRibbonMonsList(void) } // Buffers the "Nickname gender/level" text for the ribbon mon list -static void BufferRibbonMonInfoText(struct PokenavListItem * listItem, u8 * dest) +static void BufferRibbonMonInfoText(struct PokenavListItem *listItem, u8 *dest) { u8 gender; u8 level; - u8 * s; - const u8 * genderStr; - struct PokenavMonListItem * item = (struct PokenavMonListItem *)listItem; + u8 *s; + const u8 *genderStr; + struct PokenavMonListItem *item = (struct PokenavMonListItem *)listItem; // Mon is in party if (item->boxId == TOTAL_BOXES_COUNT) @@ -714,7 +714,7 @@ static void BufferRibbonMonInfoText(struct PokenavListItem * listItem, u8 * dest // Mon is in PC else { - struct BoxPokemon * mon = GetBoxedMonPtr(item->boxId, item->monId); + struct BoxPokemon *mon = GetBoxedMonPtr(item->boxId, item->monId); gender = GetBoxMonGender(mon); level = GetLevelFromBoxMonExp(mon); GetBoxMonData(mon, MON_DATA_NICKNAME, gStringVar3); diff --git a/src/rom_header_gf.c b/src/rom_header_gf.c index d5f7d7eefc..4f219d15b6 100644 --- a/src/rom_header_gf.c +++ b/src/rom_header_gf.c @@ -20,16 +20,16 @@ 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; + 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; @@ -69,13 +69,13 @@ struct GFRomHeader 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; + 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; @@ -89,7 +89,7 @@ struct GFRomHeader u32 giftRibbonsOffset; u32 enigmaBerryOffset; u32 enigmaBerrySize; - const u8 * moveDescriptions; + const u8 *moveDescriptions; u32 unk20; }; diff --git a/src/save.c b/src/save.c index 31230bacb5..d5eb6c3fc6 100644 --- a/src/save.c +++ b/src/save.c @@ -902,7 +902,7 @@ u8 LoadGameSave(u8 saveType) u16 GetSaveBlocksPointersBaseOffset(void) { u16 i, slotOffset; - struct SaveSector* sector; + struct SaveSector *sector; sector = gReadWriteSector = &gSaveDataBuffer; if (gFlashMemoryPresent != TRUE) diff --git a/src/scrcmd.c b/src/scrcmd.c index 916cea02d1..1ae3bdaa2f 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -71,7 +71,7 @@ static void CloseBrailleWindow(void); // This is defined in here so the optimizer can't see its value when compiling // script.c. -void * const gNullScriptPtr = NULL; +void *const gNullScriptPtr = NULL; static const u8 sScriptConditionTable[6][3] = { @@ -84,7 +84,7 @@ static const u8 sScriptConditionTable[6][3] = {1, 0, 1}, // != }; -static u8 * const sScriptStringVars[] = +static u8 *const sScriptStringVars[] = { gStringVar1, gStringVar2, diff --git a/src/script.c b/src/script.c index 6594809813..c2954ecdc0 100644 --- a/src/script.c +++ b/src/script.c @@ -29,7 +29,7 @@ static bool8 sLockFieldControls; extern ScrCmdFunc gScriptCmdTable[]; extern ScrCmdFunc gScriptCmdTableEnd[]; -extern void * const gNullScriptPtr; +extern void *const gNullScriptPtr; void InitScriptContext(struct ScriptContext *ctx, void *cmdTable, void *cmdTableEnd) { diff --git a/src/shop.c b/src/shop.c index 8fea1e1178..123a21d639 100644 --- a/src/shop.c +++ b/src/shop.c @@ -369,7 +369,7 @@ static u8 CreateShopMenu(u8 martType) return CreateTask(Task_ShopMenu, 8); } -static void SetShopMenuCallback(void (* callback)(void)) +static void SetShopMenuCallback(void (*callback)(void)) { sMartInfo.callback = callback; } diff --git a/src/sound.c b/src/sound.c index c41d6f2c4e..d35e07d273 100644 --- a/src/sound.c +++ b/src/sound.c @@ -14,7 +14,7 @@ struct Fanfare u16 duration; }; -EWRAM_DATA struct MusicPlayerInfo* gMPlay_PokemonCry = NULL; +EWRAM_DATA struct MusicPlayerInfo *gMPlay_PokemonCry = NULL; EWRAM_DATA u8 gPokemonCryBGMDuckingCounter = 0; static u16 sCurrentMapMusic; diff --git a/src/sprite.c b/src/sprite.c index e8abc430e6..708a3e7fdf 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -119,8 +119,8 @@ typedef void (*AffineAnimCmdFunc)(u8 matrixNum, struct Sprite *); #define AFFINE_ANIM_END 0x7FFF // forward declarations -const union AnimCmd * const gDummySpriteAnimTable[]; -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[]; +const union AnimCmd *const gDummySpriteAnimTable[]; +const union AffineAnimCmd *const gDummySpriteAffineAnimTable[]; const struct SpriteTemplate gDummySpriteTemplate; // Unreferenced data. Also unreferenced in R/S. @@ -172,11 +172,11 @@ const struct OamData gDummyOamData = DUMMY_OAM_DATA; static const union AnimCmd sDummyAnim = { ANIM_END }; -const union AnimCmd * const gDummySpriteAnimTable[] = { &sDummyAnim }; +const union AnimCmd *const gDummySpriteAnimTable[] = { &sDummyAnim }; static const union AffineAnimCmd sDummyAffineAnim = { AFFINE_ANIM_END }; -const union AffineAnimCmd * const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; +const union AffineAnimCmd *const gDummySpriteAffineAnimTable[] = { &sDummyAffineAnim }; const struct SpriteTemplate gDummySpriteTemplate = { diff --git a/src/starter_choose.c b/src/starter_choose.c index cbbd163b03..aaf2fd7b7f 100644 --- a/src/starter_choose.c +++ b/src/starter_choose.c @@ -248,18 +248,18 @@ static const union AnimCmd sAnim_StarterCircle[] = ANIMCMD_END, }; -static const union AnimCmd * const sAnims_Hand[] = +static const union AnimCmd *const sAnims_Hand[] = { sAnim_Hand, }; -static const union AnimCmd * const sAnims_Pokeball[] = +static const union AnimCmd *const sAnims_Pokeball[] = { sAnim_Pokeball_Still, sAnim_Pokeball_Moving, }; -static const union AnimCmd * const sAnims_StarterCircle[] = +static const union AnimCmd *const sAnims_StarterCircle[] = { sAnim_StarterCircle, }; @@ -278,8 +278,8 @@ static const union AffineAnimCmd sAffineAnim_StarterCircle[] = AFFINEANIMCMD_END, }; -static const union AffineAnimCmd * const sAffineAnims_StarterPokemon = {sAffineAnim_StarterPokemon}; -static const union AffineAnimCmd * const sAffineAnims_StarterCircle[] = {sAffineAnim_StarterCircle}; +static const union AffineAnimCmd *const sAffineAnims_StarterPokemon = {sAffineAnim_StarterPokemon}; +static const union AffineAnimCmd *const sAffineAnims_StarterCircle[] = {sAffineAnim_StarterCircle}; static const struct CompressedSpriteSheet sSpriteSheet_PokeballSelect[] = { diff --git a/src/trader.c b/src/trader.c index 254d809458..2e427e6f04 100644 --- a/src/trader.c +++ b/src/trader.c @@ -15,7 +15,7 @@ #include "task.h" #include "script_menu.h" -static const u8 * const sDefaultTraderNames[NUM_TRADER_ITEMS] = +static const u8 *const sDefaultTraderNames[NUM_TRADER_ITEMS] = { gText_Tristan, gText_Philip, @@ -58,7 +58,7 @@ void Trader_ResetFlag(void) void CreateAvailableDecorationsMenu(u8 taskId) { u8 i; - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; struct MauvilleOldManTrader *trader = &gSaveBlock1Ptr->oldMan.trader; struct WindowTemplate windowTemplate = { .bg = 0, @@ -98,7 +98,7 @@ void CreateAvailableDecorationsMenu(u8 taskId) void Task_BufferDecorSelectionAndCloseWindow(u8 taskId, u8 decorationId) { - s16 * data = gTasks[taskId].data; + s16 *data = gTasks[taskId].data; if (decorationId > NUM_DECORATIONS) gSpecialVar_0x8004 = 0xFFFF; else diff --git a/src/trainer_hill.c b/src/trainer_hill.c index 018b9f14ba..89bd48e4ed 100644 --- a/src/trainer_hill.c +++ b/src/trainer_hill.c @@ -217,7 +217,7 @@ static const u8 *const sFloorStrings[] = gText_TrainerHill4F, }; -static void (* const sHillFunctions[])(void) = +static void (*const sHillFunctions[])(void) = { [TRAINER_HILL_FUNC_START] = TrainerHillStartChallenge, [TRAINER_HILL_FUNC_GET_OWNER_STATE] = GetOwnerState, diff --git a/src/union_room.c b/src/union_room.c index 36bc5ee4c6..0712801d26 100644 --- a/src/union_room.c +++ b/src/union_room.c @@ -1630,7 +1630,7 @@ static void CB2_TransitionToCableClub(void) static void CreateTrainerCardInBuffer(void *dest, bool32 setWonderCard) { - struct TrainerCard * card = (struct TrainerCard *)dest; + struct TrainerCard *card = (struct TrainerCard *)dest; TrainerCard_GenerateCardForLinkPlayer(card); // Below field is re-used, to be read by Task_ExchangeCards @@ -3496,10 +3496,10 @@ static void Task_SearchForChildOrParent(u8 taskId) } } -static u8 CreateTask_SearchForChildOrParent(struct RfuIncomingPlayerList * parentList, struct RfuIncomingPlayerList * childList, u32 linkGroup) +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; + struct RfuIncomingPlayerList **data = (void *)gTasks[taskId].data; data[0] = parentList; data[1] = childList; gTasks[taskId].data[4] = linkGroup; @@ -3563,7 +3563,7 @@ static void Task_ListenForWonderDistributor(u8 taskId) } } -static u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList * list, u32 linkGroup) +static u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList *list, u32 linkGroup) { u8 taskId = CreateTask(Task_ListenForCompatiblePartners, 0); struct RfuIncomingPlayerList **oldList = (void *) gTasks[taskId].data; @@ -3572,7 +3572,7 @@ static u8 CreateTask_ListenForCompatiblePartners(struct RfuIncomingPlayerList * return taskId; } -static u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList * list, u32 linkGroup) +static u8 CreateTask_ListenForWonderDistributor(struct RfuIncomingPlayerList *list, u32 linkGroup) { u8 taskId = CreateTask(Task_ListenForWonderDistributor, 0); struct RfuIncomingPlayerList **oldList = (void *) gTasks[taskId].data; @@ -3650,7 +3650,7 @@ static s8 UnionRoomHandleYesNo(u8 *state, bool32 noDraw) return MENU_NOTHING_CHOSEN; } -static u8 CreateTradeBoardWindow(const struct WindowTemplate * template) +static u8 CreateTradeBoardWindow(const struct WindowTemplate *template) { u8 windowId = AddWindow(template); DrawStdWindowFrame(windowId, FALSE); @@ -3880,7 +3880,7 @@ static void ClearIncomingPlayerList(struct RfuIncomingPlayerList *list, u8 count } // Checks player name and trainer id, returns TRUE if they are not the same -static bool8 ArePlayersDifferent(struct RfuPlayerData* player1, const struct RfuPlayerData* player2) +static bool8 ArePlayersDifferent(struct RfuPlayerData *player1, const struct RfuPlayerData *player2) { s32 i; @@ -4044,7 +4044,7 @@ static s32 UnionRoomGetPlayerInteractionResponse(struct RfuPlayerList *list, boo { bool32 metBefore; - struct RfuPlayer * player = &list->players[playerIdx]; + struct RfuPlayer *player = &list->players[playerIdx]; if (!player->rfu.data.startedActivity && !overrideGender) { @@ -4094,7 +4094,7 @@ static void ItemPrintFunc_EmptyList(u8 windowId, u32 itemId, u8 y) { } -static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData * data, const u8 * playerName, u8 colorIdx) +static void TradeBoardPrintItemInfo(u8 windowId, u8 y, struct RfuGameData *data, const u8 *playerName, u8 colorIdx) { u8 levelStr[4]; u16 species = data->tradeSpecies; @@ -4146,7 +4146,7 @@ static void TradeBoardListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y) } } -static s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer * players, s32 n) +static s32 GetIndexOfNthTradeBoardOffer(struct RfuPlayer *players, s32 n) { s32 i; s32 j = 0; diff --git a/src/union_room_battle.c b/src/union_room_battle.c index c3ace12505..856f91bb78 100644 --- a/src/union_room_battle.c +++ b/src/union_room_battle.c @@ -26,7 +26,7 @@ struct UnionRoomBattle s16 textState; }; -static EWRAM_DATA struct UnionRoomBattle * sBattle = NULL; +static EWRAM_DATA struct UnionRoomBattle *sBattle = NULL; static const struct BgTemplate sBgTemplates[] = { { @@ -73,7 +73,7 @@ static void CB2_SetUpPartiesAndStartBattle(void) SetMainCallback2(CB2_InitBattle); } -static void AddTextPrinterForUnionRoomBattle(u8 windowId, const u8 * str, u8 x, u8 y, s32 speed) +static void AddTextPrinterForUnionRoomBattle(u8 windowId, const u8 *str, u8 x, u8 y, s32 speed) { s32 letterSpacing = 0; s32 lineSpacing = 1; @@ -81,7 +81,7 @@ static void AddTextPrinterForUnionRoomBattle(u8 windowId, const u8 * str, u8 x, AddTextPrinterParameterized4(windowId, FONT_NORMAL, x, y, letterSpacing, lineSpacing, sTextColors, speed, str); } -static bool32 PrintUnionRoomBattleMessage(s16 * state, const u8 * str, s32 speed) +static bool32 PrintUnionRoomBattleMessage(s16 *state, const u8 *str, s32 speed) { switch (*state) { diff --git a/src/union_room_chat.c b/src/union_room_chat.c index 993e36de52..8cdd4bb144 100644 --- a/src/union_room_chat.c +++ b/src/union_room_chat.c @@ -155,7 +155,7 @@ struct UnionRoomChat struct UnionRoomChatDisplay_Subtask { - bool32 (* callback)(u8 *); + bool32 (*callback)(u8 *); bool8 active; u8 state; }; @@ -189,7 +189,7 @@ struct UnionRoomChatSprites struct SubtaskInfo { u16 idx; - bool32 (* callback)(u8 *); + bool32 (*callback)(u8 *); }; struct MessageWindowInfo diff --git a/src/union_room_player_avatar.c b/src/union_room_player_avatar.c index 1bb7968359..1f06828986 100644 --- a/src/union_room_player_avatar.c +++ b/src/union_room_player_avatar.c @@ -16,7 +16,7 @@ // get the sprite index of that player. #define UR_PLAYER_SPRITE_ID(leaderId, memberId) (MAX_RFU_PLAYERS * leaderId + memberId) -static EWRAM_DATA struct UnionRoomObject * sUnionObjWork = NULL; +static EWRAM_DATA struct UnionRoomObject *sUnionObjWork = NULL; static EWRAM_DATA u32 sUnionObjRefreshTimer = 0; static u8 CreateTask_AnimateUnionRoomPlayers(void); @@ -136,7 +136,7 @@ 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) +static void GetUnionRoomPlayerCoords(u32 leaderId, u32 memberId, s32 *x, s32 *y) { *x = sUnionRoomPlayerCoords[leaderId][0] + sUnionRoomGroupOffsets[memberId][0] + MAP_OFFSET; *y = sUnionRoomPlayerCoords[leaderId][1] + sUnionRoomGroupOffsets[memberId][1] + MAP_OFFSET; @@ -181,10 +181,10 @@ static void RemoveUnionRoomPlayerObjectEvent(u32 leaderId) RemoveObjectEventByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup); } -static bool32 SetUnionRoomPlayerEnterExitMovement(u32 leaderId, const u8 * movement) +static bool32 SetUnionRoomPlayerEnterExitMovement(u32 leaderId, const u8 *movement) { u8 objectId; - struct ObjectEvent * object; + struct ObjectEvent *object; if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId)) return FALSE; object = &gObjectEvents[objectId]; @@ -198,7 +198,7 @@ static bool32 SetUnionRoomPlayerEnterExitMovement(u32 leaderId, const u8 * movem static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 leaderId) { u8 objectId; - struct ObjectEvent * object; + struct ObjectEvent *object; if (TryGetObjectEventIdByLocalIdAndMap(sUnionRoomLocalIds[leaderId], gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &objectId)) return TRUE; @@ -213,7 +213,7 @@ static bool32 TryReleaseUnionRoomPlayerObjectEvent(u32 leaderId) return TRUE; } -u8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players) +u8 InitUnionRoomPlayerObjects(struct UnionRoomObject *players) { s32 i; @@ -229,7 +229,7 @@ u8 InitUnionRoomPlayerObjects(struct UnionRoomObject * players) return CreateTask_AnimateUnionRoomPlayers(); } -static bool32 AnimateUnionRoomPlayerDespawn(s8 * state, u32 leaderId, struct UnionRoomObject * object) +static bool32 AnimateUnionRoomPlayerDespawn(s8 *state, u32 leaderId, struct UnionRoomObject *object) { switch (*state) { @@ -253,7 +253,7 @@ static bool32 AnimateUnionRoomPlayerDespawn(s8 * state, u32 leaderId, struct Uni return FALSE; } -static bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 leaderId, struct UnionRoomObject * object) +static bool32 AnimateUnionRoomPlayerSpawn(s8 *state, u32 leaderId, struct UnionRoomObject *object) { s16 x, y; @@ -290,7 +290,7 @@ static bool32 AnimateUnionRoomPlayerSpawn(s8 * state, u32 leaderId, struct Union static bool32 SpawnGroupLeader(u32 leaderId, u32 gender, u32 id) { - struct UnionRoomObject * object = &sUnionObjWork[leaderId]; + struct UnionRoomObject *object = &sUnionObjWork[leaderId]; object->schedAnim = UNION_ROOM_SPAWN_IN; object->gfxId = GetUnionRoomPlayerGraphicsId(gender, id); @@ -302,7 +302,7 @@ static bool32 SpawnGroupLeader(u32 leaderId, u32 gender, u32 id) static bool32 DespawnGroupLeader(u32 leaderId) { - struct UnionRoomObject * object = &sUnionObjWork[leaderId]; + struct UnionRoomObject *object = &sUnionObjWork[leaderId]; object->schedAnim = UNION_ROOM_SPAWN_OUT; if (object->state == 1) @@ -311,7 +311,7 @@ static bool32 DespawnGroupLeader(u32 leaderId) return FALSE; } -static void AnimateUnionRoomPlayer(u32 leaderId, struct UnionRoomObject * object) +static void AnimateUnionRoomPlayer(u32 leaderId, struct UnionRoomObject *object) { switch (object->state) { @@ -390,7 +390,7 @@ void DestroyUnionRoomPlayerObjects(void) DestroyTask_AnimateUnionRoomPlayers(); } -void CreateUnionRoomPlayerSprites(u8 * spriteIds, s32 leaderId) +void CreateUnionRoomPlayerSprites(u8 *spriteIds, s32 leaderId) { s32 memberId; for (memberId = 0; memberId < MAX_RFU_PLAYERS; memberId++) @@ -405,7 +405,7 @@ void CreateUnionRoomPlayerSprites(u8 * spriteIds, s32 leaderId) } } -void DestroyUnionRoomPlayerSprites(u8 * spriteIds) +void DestroyUnionRoomPlayerSprites(u8 *spriteIds) { s32 i; for (i = 0; i < NUM_UNION_ROOM_SPRITES; i++) @@ -427,7 +427,7 @@ void SetTilesAroundUnionRoomPlayersPassable(void) } } -static u8 GetNewFacingDirectionForUnionRoomPlayer(u32 memberId, u32 leaderId, struct RfuGameData * gameData) +static u8 GetNewFacingDirectionForUnionRoomPlayer(u32 memberId, u32 leaderId, struct RfuGameData *gameData) { if (memberId) // If not leader return sMemberFacingDirections[memberId]; @@ -442,7 +442,7 @@ static bool32 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) +static void SpawnGroupMember(u32 leaderId, u32 memberId, u8 graphicsId, struct RfuGameData *gameData) { s32 x, y; s32 id = UR_PLAYER_SPRITE_ID(leaderId, memberId); @@ -465,7 +465,7 @@ static void DespawnGroupMember(u32 leaderId, u32 memberId) MapGridSetMetatileImpassabilityAt(x, y, FALSE); } -static void AssembleGroup(u32 leaderId, struct RfuGameData * gameData) +static void AssembleGroup(u32 leaderId, struct RfuGameData *gameData) { s16 x, y, x2, y2; s32 i; @@ -493,7 +493,7 @@ static void AssembleGroup(u32 leaderId, struct RfuGameData * gameData) } } -static void SpawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData * gameData) +static void SpawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData *gameData) { u32 i; switch (gameData->activity) @@ -528,7 +528,7 @@ static void DespawnGroupLeaderAndMembers(u32 leaderId, struct RfuGameData *gameD static void UpdateUnionRoomPlayerSprites(struct WirelessLink_URoom *uroom) { s32 i; - struct RfuPlayer * leaders; + struct RfuPlayer *leaders; sUnionObjRefreshTimer = 0; for (i = 0, leaders = uroom->playerList->players; i < MAX_UNION_ROOM_LEADERS; i++) { @@ -554,7 +554,7 @@ bool32 TryInteractWithUnionRoomMember(struct RfuPlayerList *list, s16 *memberIdP { s16 x, y; s32 i, memberId; - struct RfuPlayer * leaders; + struct RfuPlayer *leaders; if (!IsPlayerStandingStill()) return FALSE; diff --git a/src/window.c b/src/window.c index ab61610b82..644048fad7 100644 --- a/src/window.c +++ b/src/window.c @@ -10,7 +10,7 @@ COMMON_DATA void *gWindowBgTilemapBuffers[NUM_BACKGROUNDS] = {0}; extern u32 gWindowTileAutoAllocEnabled; EWRAM_DATA struct Window gWindows[WINDOWS_MAX] = {0}; -EWRAM_DATA static struct Window* sWindowPtr = NULL; +EWRAM_DATA static struct Window *sWindowPtr = NULL; EWRAM_DATA static u16 sWindowSize = 0; static u8 GetNumActiveWindowsOnBg(u8 bgId); diff --git a/src/wireless_communication_status_screen.c b/src/wireless_communication_status_screen.c index 9a562cf7f7..7734c39d24 100644 --- a/src/wireless_communication_status_screen.c +++ b/src/wireless_communication_status_screen.c @@ -54,7 +54,7 @@ struct WirelessCommunicationStatusScreen u8 filler[10]; }; -static struct WirelessCommunicationStatusScreen * sStatusScreen; +static struct WirelessCommunicationStatusScreen *sStatusScreen; static void CB2_InitWirelessCommunicationScreen(void); static void Task_WirelessCommunicationScreen(u8); @@ -247,7 +247,7 @@ static void CB2_ExitWirelessCommunicationStatusScreen(void) } // 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) +static void CyclePalette(s16 *counter, s16 *palIdx) { s32 idx; if (++(*counter) > 5) @@ -345,7 +345,7 @@ static void Task_WirelessCommunicationScreen(u8 taskId) #undef tState -static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 mode) +static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 *str, u8 x, u8 y, u8 mode) { u8 color[3]; @@ -381,7 +381,7 @@ static void WCSS_AddTextPrinterParameterized(u8 windowId, u8 fontId, const u8 * AddTextPrinterParameterized4(windowId, fontId, x, y, 0, 0, color, TEXT_SKIP_DRAW, str); } -static u32 CountPlayersInGroupAndGetActivity(struct RfuPlayer * player, u32 * groupCounts) +static u32 CountPlayersInGroupAndGetActivity(struct RfuPlayer *player, u32 *groupCounts) { int i, j, k; u32 activity = player->rfu.data.activity; @@ -422,7 +422,7 @@ static u32 CountPlayersInGroupAndGetActivity(struct RfuPlayer * player, u32 * gr #undef group_players } -static bool32 HaveCountsChanged(u32 * currCounts, u32 * prevCounts) +static bool32 HaveCountsChanged(u32 *currCounts, u32 *prevCounts) { s32 i; for (i = 0; i < NUM_GROUPTYPES; i++) @@ -433,11 +433,11 @@ static bool32 HaveCountsChanged(u32 * currCounts, u32 * prevCounts) return FALSE; } -static bool32 UpdateCommunicationCounts(u32 * groupCounts, u32 * prevGroupCounts, u32 * activities, u8 taskId) +static bool32 UpdateCommunicationCounts(u32 *groupCounts, u32 *prevGroupCounts, u32 *activities, u8 taskId) { bool32 activitiesChanged = FALSE; u32 groupCountBuffer[NUM_GROUPTYPES] = {0, 0, 0, 0}; - struct RfuPlayer ** players = (void *)gTasks[taskId].data; + struct RfuPlayer **players = (void *)gTasks[taskId].data; s32 i; for (i = 0; i < NUM_TASK_DATA; i++) From 1a707e8735f070ebf333a968ecacf9586a7ef790 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Fri, 16 May 2025 14:29:48 +0100 Subject: [PATCH 068/187] Fixes Magic Guard causing Wrap to end immediately (#6876) --- src/battle_end_turn.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 319db26012..a8b294c024 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -746,8 +746,11 @@ static bool32 HandleEndTurnWrap(u32 battler) if (gBattleMons[battler].status2 & STATUS2_WRAPPED && IsBattlerAlive(battler)) { - if (--gDisableStructs[battler].wrapTurns != 0 && !IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + if (--gDisableStructs[battler].wrapTurns != 0) { + if (IsBattlerProtectedByMagicGuard(battler, GetBattlerAbility(battler))) + return effect; + gBattleScripting.animArg1 = gBattleStruct->wrappedMove[battler]; gBattleScripting.animArg2 = gBattleStruct->wrappedMove[battler] >> 8; PREPARE_MOVE_BUFFER(gBattleTextBuff1, gBattleStruct->wrappedMove[battler]); From d57dcd2e358e6e947bd5c57c0fce9c56a58fff9a Mon Sep 17 00:00:00 2001 From: jfb1337 <184441704+jfb1337@users.noreply.github.com> Date: Fri, 16 May 2025 16:23:56 +0100 Subject: [PATCH 069/187] Reword move and ability descriptions to improve clarity (#6861) Co-authored-by: jfb1337 <> --- src/data/abilities.h | 4 +- src/data/moves_info.h | 300 ++++++++++++++++++++++++++---------------- 2 files changed, 187 insertions(+), 117 deletions(-) diff --git a/src/data/abilities.h b/src/data/abilities.h index 9e60122d2c..f9a3adc96c 100644 --- a/src/data/abilities.h +++ b/src/data/abilities.h @@ -194,7 +194,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = [ABILITY_WONDER_GUARD] = { .name = _("Wonder Guard"), - .description = COMPOUND_STRING("β€œSupereffective” hits."), + .description = COMPOUND_STRING("Only β€œSupereffective” hits."), .aiRating = 10, .cantBeCopied = TRUE, .cantBeSwapped = TRUE, @@ -2176,7 +2176,7 @@ const struct Ability gAbilitiesInfo[ABILITIES_COUNT] = [ABILITY_GOOD_AS_GOLD] = { .name = _("Good as Gold"), - .description = COMPOUND_STRING("Avoids status problems."), + .description = COMPOUND_STRING("Avoids status moves."), .aiRating = 8, .breakable = TRUE, }, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 45d7607023..3ed1de6df2 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -40,8 +40,8 @@ static const u8 sHyperBeamDescription[] = _( #endif static const u8 sRevengeDescription[] = _( - "An attack that gains power\n" - "if injured by the foe."); + "An attack that moves last\n" + "and gains power if hit."); static const u8 sPluckDescription[] = _( "Eats the foe's held Berry\n" @@ -64,8 +64,8 @@ static const u8 sStormThrowDescription[] = _( "in a critical hit."); static const u8 sCircleThrowDescription[] = _( - "Knocks the foe away to end\n" - "the battle."); + "Knocks foe away to switch\n" + "it out or end wild battle."); static const u8 sChipAwayDescription[] = _( "Strikes through the foe's\n" @@ -418,7 +418,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Guillotine"), .description = COMPOUND_STRING( "A powerful pincer attack\n" - "that may cause fainting."), + "that KOs if it hits."), .effect = EFFECT_OHKO, .power = 1, .type = TYPE_NORMAL, @@ -440,8 +440,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Razor Wind"), .description = COMPOUND_STRING( - "A 2-turn move that strikes\n" - "the foe on the 2nd turn."), + "A 2-turn move with a high\n" + "critical-hit ratio."), .effect = EFFECT_TWO_TURNS_ATTACK, .power = 80, .type = TYPE_NORMAL, @@ -560,8 +560,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Whirlwind"), .description = COMPOUND_STRING( - "Blows away the foe with\n" - "wind and ends the battle."), + "Blows away the foe, switches\n" + "it out or ends wild battle."), .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, @@ -803,7 +803,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Rolling Kick"), .description = COMPOUND_STRING( "A fast kick delivered from\n" - "a rapid spin."), + "a rapid spin. May flinch."), .effect = EFFECT_HIT, .power = 60, .type = TYPE_FIGHTING, @@ -1155,8 +1155,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Twineedle"), .description = COMPOUND_STRING( - "Stingers on the forelegs\n" - "jab the foe twice."), + "Foreleg stingers jab foe\n" + "twice. May poison."), .effect = EFFECT_HIT, .power = 25, .type = TYPE_BUG, @@ -1204,7 +1204,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Leer"), .description = COMPOUND_STRING( - "Frightens the foe with a\n" + "Frightens the foes with a\n" "leer to lower Defense."), .effect = EFFECT_DEFENSE_DOWN, .power = 0, @@ -1280,8 +1280,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Roar"), .description = COMPOUND_STRING( - "Makes the foe flee to end\n" - "the battle."), + "Switches the foe out\n" + "or ends wild battle."), .effect = EFFECT_ROAR, .power = 0, .type = TYPE_NORMAL, @@ -1385,8 +1385,14 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Disable"), .description = COMPOUND_STRING( - "Psychically disables one of\n" - "the foe's moves."), + #if B_DISABLE_TURNS >= GEN_5 + "For 4 turns, prevents foe\n" + #elif B_DISABLE_TURNS == GEN_4 + "For 4-7 turns, prevents foe\n" + #else + "For 2-5 turns, prevents foe\n" + #endif + "from using last used move."), #if B_UPDATED_MOVE_DATA >= GEN_5 .accuracy = 100, #elif B_UPDATED_MOVE_DATA == GEN_4 @@ -1497,7 +1503,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Mist"), .description = COMPOUND_STRING( "Creates a mist that stops\n" - "reduction of abilities."), + "reduction of stats."), .effect = EFFECT_MIST, .power = 0, .type = TYPE_ICE, @@ -1566,7 +1572,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Surf"), .description = COMPOUND_STRING( "Creates a huge wave, then\n" - "crashes it down on the foe."), + #if B_UPDATED_MOVE_DATA >= GEN_4 + "crashes it down on the field."), + #else + "crashes it down on the foes."), + #endif .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 90 : 95, .type = TYPE_WATER, @@ -1621,7 +1631,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Blizzard"), .description = COMPOUND_STRING( - "Hits the foe with an icy\n" + "Hits the foes with an icy\n" #if B_USE_FROSTBITE == TRUE "storm. May cause frostbite."), #else @@ -2023,7 +2033,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Razor Leaf"), .description = COMPOUND_STRING( - "Cuts the enemy with leaves.\n" + "Cuts enemies with leaves.\n" "High critical-hit ratio."), .effect = EFFECT_HIT, .power = 55, @@ -2384,8 +2394,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Earthquake"), .description = COMPOUND_STRING( - "A powerful quake, but has\n" - "no effect on flying foes."), + "A powerful quake that\n" + "hits all other POKΓ©MON."), .effect = EFFECT_EARTHQUAKE, .power = 100, .type = TYPE_GROUND, @@ -2658,9 +2668,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_TELEPORT] = { .name = COMPOUND_STRING("Teleport"), + #if B_TELEPORT_BEHAVIOUR >= GEN_8 + .description = COMPOUND_STRING( + "Switches the user out last.\n" + "Flees when used by wild {PKMN}.") + #else .description = COMPOUND_STRING( "A psychic move for fleeing\n" "from battle instantly."), + #endif .effect = EFFECT_TELEPORT, .power = 0, .type = TYPE_PSYCHIC, @@ -2705,7 +2721,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Mimic"), .description = COMPOUND_STRING( - "Copies a move used by the\n" + "Copies last move used by the\n" "foe during one battle."), .effect = EFFECT_MIMIC, .power = 0, @@ -2847,8 +2863,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Minimize"), .description = COMPOUND_STRING( - "Minimizes the user's size\n" - "to raise evasiveness."), + "Minimizes the user's size to\n" + #if B_MINIMIZE_EVASION >= GEN_5 + "sharply raise evasiveness."), + #else + "raise evasiveness."), + #endif .effect = EFFECT_MINIMIZE, .power = 0, .type = TYPE_NORMAL, @@ -2999,8 +3019,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Light Screen"), .description = COMPOUND_STRING( - "Creates a wall of light that\n" - "lowers Sp. Atk damage."), + "Wall of light cuts special\n" + "damage for 5 turns."), .effect = EFFECT_LIGHT_SCREEN, .power = 0, .type = TYPE_PSYCHIC, @@ -3051,8 +3071,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Reflect"), .description = COMPOUND_STRING( - "Creates a wall of light that\n" - "weakens physical attacks."), + "Wall of light cuts physical\n" + "damage for 5 turns."), .effect = EFFECT_REFLECT, .power = 0, .type = TYPE_PSYCHIC, @@ -3364,8 +3384,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Waterfall"), .description = COMPOUND_STRING( - "Charges the foe with speed\n" - "to climb waterfalls."), + "Charges with speed to climb\n" + "waterfalls. May flinch."), .effect = EFFECT_HIT, .power = 80, .type = TYPE_WATER, @@ -3682,7 +3702,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Poison Gas"), .description = COMPOUND_STRING( + #if B_UPDATED_MOVE_DATA >= GEN_5 + "Envelops the foes in a toxic\n" + #else "Envelops the foe in a toxic\n" + #endif "gas that may poison."), #if B_UPDATED_MOVE_DATA >= GEN_6 .accuracy = 90, @@ -3784,8 +3808,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Sky Attack"), .description = COMPOUND_STRING( - "Searches out weak spots,\n" - "then strikes the next turn."), + "2-turn attack. High critical\n" + "hit ratio, and may flinch."), .effect = EFFECT_TWO_TURNS_ATTACK, .power = 140, .type = TYPE_FLYING, @@ -4223,7 +4247,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Conversion"), .description = COMPOUND_STRING( "Changes the user's type\n" + #if B_UPDATED_CONVERSION >= GEN_6 + "into first known move's type."), + #else "into a known move's type."), + #endif .effect = EFFECT_CONVERSION, .power = 0, .type = TYPE_NORMAL, @@ -4248,8 +4276,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Tri Attack"), .description = COMPOUND_STRING( - "Fires three types of beams\n" - "at the same time."), + "Fires three types of beams.\n" + #if B_USE_FROSTBITE == TRUE + "May burn/para/frostbite."), + #else + "May burn/paralyze/freeze."), + #endif .effect = EFFECT_HIT, .power = 80, .type = TYPE_NORMAL, @@ -4577,8 +4609,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Snore"), .description = COMPOUND_STRING( - "A loud attack that can be\n" - "used only while asleep."), + "A loud attack that can only\n" + "be used asleep. May flinch."), .effect = EFFECT_SNORE, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 50 : 40, .type = TYPE_NORMAL, @@ -4705,7 +4737,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Cotton Spore"), .description = COMPOUND_STRING( + #if B_UPDATED_MOVE_DATA >= GEN_6 + "Spores cling to the foes,\n" + #else "Spores cling to the foe,\n" + #endif "sharply reducing Speed."), .effect = EFFECT_SPEED_DOWN_2, .power = 0, @@ -4754,7 +4790,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Spite"), .description = COMPOUND_STRING( "Spitefully cuts the PP\n" - "of the foe's last move."), + #if B_PP_REDUCED_BY_SPITE >= GEN_4 + "of the foe's last move by 4."), + #else + "of foe's last move by 2-5."), + #endif .effect = EFFECT_SPITE, .power = 0, .type = TYPE_GHOST, @@ -4778,7 +4818,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Powder Snow"), .description = COMPOUND_STRING( - "Blasts the foe with a snowy\n" + "Blasts the foes with a snowy\n" #if B_USE_FROSTBITE == TRUE "gust. May cause frostbite."), #else @@ -4928,7 +4968,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Belly Drum"), .description = COMPOUND_STRING( "Maximizes Attack while\n" - "sacrificing HP."), + "sacrificing half of max HP."), .effect = EFFECT_BELLY_DRUM, .power = 0, .type = TYPE_NORMAL, @@ -5445,7 +5485,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Swagger"), .description = COMPOUND_STRING( "Confuses the foe, but also\n" - "sharply raises Attack."), + "sharply raises its Attack."), .effect = EFFECT_SWAGGER, .power = 0, .type = TYPE_NORMAL, @@ -5758,8 +5798,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Safeguard"), .description = COMPOUND_STRING( - "A mystical force prevents\n" - "all status problems."), + "Protects allies from status\n" + "problems for 5 turns."), .effect = EFFECT_SAFEGUARD, .power = 0, .type = TYPE_NORMAL, @@ -5908,8 +5948,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Dragon Breath"), .description = COMPOUND_STRING( - "Strikes the foe with an\n" - "incredible blast of breath."), + "Strikes the foe with a blast\n" + "of breath. May paralyze."), .effect = EFFECT_HIT, .power = 60, .type = TYPE_DRAGON, @@ -5961,7 +6001,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Encore"), .description = COMPOUND_STRING( "Makes the foe repeat its\n" - "last move over 2 to 6 turns."), + "last move over 3 turns."), .effect = EFFECT_ENCORE, .power = 0, .type = TYPE_NORMAL, @@ -6010,8 +6050,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Rapid Spin"), .description = COMPOUND_STRING( - "Spins the body at high\n" - "speed to strike the foe."), + "Spins attack that removes\n" + #if B_SPEED_BUFFING_RAPID_SPIN >= GEN_8 + "some effects and ups speed."), + #else + "certain effects."), + #endif .effect = EFFECT_RAPID_SPIN, .power = B_UPDATED_MOVE_DATA >= GEN_8 ? 50 : 20, .type = TYPE_NORMAL, @@ -6042,8 +6086,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Sweet Scent"), .description = COMPOUND_STRING( - "Allures the foe to reduce\n" + #if B_UPDATED_MOVE_DATA >= GEN_6 + "Allures the foes to harshly\n" + "reduce evasiveness."), + #else + "Allures the foes to reduce\n" "evasiveness."), + #endif .effect = B_UPDATED_MOVE_DATA >= GEN_6 ? EFFECT_EVASION_DOWN_2 : EFFECT_EVASION_DOWN, .power = 0, .type = TYPE_NORMAL, @@ -6225,8 +6274,13 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Hidden Power"), .description = COMPOUND_STRING( - "The effectiveness varies\n" + #if B_HIDDEN_POWER_DMG >= GEN_6 + "The type varies\n" "with the user."), + #else + "The type and effectiveness\n" + "vary with the user."), + #endif .power = B_HIDDEN_POWER_DMG >= GEN_6 ? 60 : 1, .effect = EFFECT_HIDDEN_POWER, .type = TYPE_NORMAL, @@ -6272,7 +6326,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Twister"), .description = COMPOUND_STRING( "Whips up a vicious twister\n" - "to tear at the foe."), + "to tear at foes. May flinch."), .effect = EFFECT_HIT, .power = 40, .type = TYPE_DRAGON, @@ -6410,7 +6464,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Psych Up"), .description = COMPOUND_STRING( - "Copies the foe's effect(s)\n" + "Copies foe's stat changes\n" "and gives to the user."), .effect = EFFECT_PSYCH_UP, .power = 0, @@ -6620,8 +6674,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Fake Out"), .description = COMPOUND_STRING( - "A 1st-turn, 1st-strike move\n" - "that causes flinching."), + "Moves 1st and flinches. Only\n" + "works on user's 1st turn."), .priority = B_UPDATED_MOVE_DATA >= GEN_5 ? 3 : 1, .makesContact = B_UPDATED_MOVE_DATA >= GEN_4, .effect = EFFECT_FIRST_TURN_ONLY, @@ -6758,7 +6812,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Heat Wave"), .description = COMPOUND_STRING( "Exhales a hot breath on the\n" - "foe. May inflict a burn."), + "foes. May inflict a burn."), .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 95 : 100, .type = TYPE_FIRE, @@ -6889,8 +6943,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Memento"), .description = COMPOUND_STRING( - "The user faints and lowers\n" - "the foe's abilities."), + "The user faints and harshly\n" + "lowers foes Atk and Sp.Atk."), .effect = EFFECT_MEMENTO, .power = 0, .type = TYPE_DARK, @@ -6912,7 +6966,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Facade"), .description = COMPOUND_STRING( - "Boosts Attack when burned,\n" + "Boosts power when burned,\n" "paralyzed, or poisoned."), .effect = EFFECT_FACADE, .power = 70, @@ -6935,7 +6989,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Focus Punch"), .description = COMPOUND_STRING( - "A powerful loyalty attack.\n" + "Powerful attack, moves last.\n" "The user flinches if hit."), .effect = EFFECT_FOCUS_PUNCH, .power = 150, @@ -7051,7 +7105,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Charge"), .description = COMPOUND_STRING( "Charges power to boost the\n" - "electric move used next."), + "Electric move used next."), .effect = EFFECT_CHARGE, .power = 0, .type = TYPE_ELECTRIC, @@ -7101,7 +7155,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Helping Hand"), .description = COMPOUND_STRING( - "Boosts the power of the\n" + "Boosts the power of ally\n" "recipient's moves."), .effect = EFFECT_HELPING_HAND, .power = 0, @@ -7157,7 +7211,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Role Play"), .description = COMPOUND_STRING( "Mimics the target and\n" - "copies its special ability."), + "copies its Ability."), .effect = EFFECT_ROLE_PLAY, .power = 0, .type = TYPE_PSYCHIC, @@ -7437,8 +7491,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Endeavor"), .description = COMPOUND_STRING( - "Gains power if the user's HP\n" - "is lower than the foe's HP."), + "Cuts foe's HP to equal\n" + "user's HP."), .effect = EFFECT_ENDEAVOR, .power = 1, .type = TYPE_NORMAL, @@ -7717,7 +7771,11 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Tail Glow"), .description = COMPOUND_STRING( + #if B_UPDATED_MOVE_DATA >= GEN_5 + "Flash light that drastically\n" + #else "Flashes a light that sharply\n" + #endif "raises Sp. Atk."), .effect = B_UPDATED_MOVE_DATA >= GEN_5 ? EFFECT_SPECIAL_ATTACK_UP_3 : EFFECT_SPECIAL_ATTACK_UP_2, .power = 0, @@ -7875,7 +7933,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Mud Sport"), .description = COMPOUND_STRING( "Covers the user in mud to\n" - "raise electrical resistance."), + "weaken all Electric moves."), + // in theory this should mention 5 turns (gen 6+) .effect = EFFECT_MUD_SPORT, .power = 0, .type = TYPE_GROUND, @@ -8293,8 +8352,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Odor Sleuth"), .description = COMPOUND_STRING( - "Negates the foe's efforts\n" - "to heighten evasiveness."), + "Negate evasiveness and\n" + "Ghost type's immunities."), .effect = EFFECT_FORESIGHT, .power = 0, .type = TYPE_NORMAL, @@ -8766,8 +8825,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Block"), .description = COMPOUND_STRING( - "Blocks the foe's way to\n" - "prevent escape."), + "Blocks the foe's way and\n" + "prevents escape."), .effect = EFFECT_MEAN_LOOK, .power = 0, .type = TYPE_NORMAL, @@ -9008,9 +9067,15 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = [MOVE_VOLT_TACKLE] = { .name = COMPOUND_STRING("Volt Tackle"), + #if B_UPDATED_MOVE_DATA >= GEN_4 + .description = COMPOUND_STRING( + "A life-risking tackle that\n" + "hurts the user. May paralyze."), + #else .description = COMPOUND_STRING( "A life-risking tackle that\n" "slightly hurts the user."), + #endif .effect = EFFECT_HIT, .power = 120, .type = TYPE_ELECTRIC, @@ -9062,7 +9127,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Water Sport"), .description = COMPOUND_STRING( "The user becomes soaked to\n" - "raise resistance to fire."), + "weaken all Fire moves."), + // in theory this should mention 5 turns (gen6+) .effect = EFFECT_WATER_SPORT, .power = 0, .type = TYPE_WATER, @@ -9236,7 +9302,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Doom Desire"), .description = COMPOUND_STRING( - "Summons strong sunlight to\n" + "Summons strong light to\n" "attack 2 turns later."), .effect = EFFECT_FUTURE_SIGHT, .power = B_UPDATED_MOVE_DATA >= GEN_5 ? 140 : 120, @@ -9338,7 +9404,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Miracle Eye"), .description = COMPOUND_STRING( "Negate evasiveness and\n" - "Dark-type's immunities."), + "Dark type's immunities."), .effect = EFFECT_MIRACLE_EYE, .power = 0, .type = TYPE_PSYCHIC, @@ -9362,7 +9428,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Wake-Up Slap"), .description = COMPOUND_STRING( "Powerful against sleeping\n" - "foes, but also heals them."), + "foes, but also wakes them."), .effect = EFFECT_DOUBLE_POWER_ON_ARG_STATUS, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 70 : 60, .type = TYPE_FIGHTING, @@ -9461,7 +9527,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Brine"), .description = COMPOUND_STRING( "Does double damage to foes\n" - "with half HP."), + "with half HP or less."), .effect = EFFECT_BRINE, .power = 65, .type = TYPE_WATER, @@ -9552,8 +9618,12 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Tailwind"), .description = COMPOUND_STRING( - "Whips up a turbulent breeze\n" - "that raises Speed."), + "Whips up a breeze, doubling\n" + #if B_TAILWIND_TURNS >= GEN_5 + "ally Speed for 4 turns."), + #else + "ally Speed for 3 turns."), + #endif .effect = EFFECT_TAILWIND, .power = 0, .type = TYPE_FLYING, @@ -9802,8 +9872,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Heal Block"), .description = COMPOUND_STRING( - "Prevents the foe from\n" - "recovering any HP."), + "Prevents the foes from\n" + "recovering HP for 5 turns."), .effect = EFFECT_HEAL_BLOCK, .power = 0, .type = TYPE_PSYCHIC, @@ -9871,7 +9941,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Gastro Acid"), .description = COMPOUND_STRING( "Stomach acid suppresses\n" - "the foe's ability."), + "the foe's Ability."), .effect = EFFECT_GASTRO_ACID, .power = 0, .type = TYPE_POISON, @@ -10027,8 +10097,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Punishment"), .description = COMPOUND_STRING( - "Does more damage if the\n" - "foe has powered up."), + "Does more damage the more\n" + "the foe has powered up."), .effect = EFFECT_PUNISHMENT, .power = 60, .type = TYPE_DARK, @@ -10846,7 +10916,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Ice Shard"), .description = COMPOUND_STRING( "Hurls a chunk of ice that\n" - "always strike first."), + "always strikes first."), .effect = EFFECT_HIT, .power = 40, .type = TYPE_ICE, @@ -11231,8 +11301,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Discharge"), .description = COMPOUND_STRING( - "Zaps the foes with electri-\n" - "city. May paralyze them."), + "Zaps all other {PKMN} with\n" + "electricity. May paralyze."), .effect = EFFECT_HIT, .power = 80, .type = TYPE_ELECTRIC, @@ -11935,7 +12005,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Dark Void"), .description = COMPOUND_STRING( - "Drags the foe into total\n" + "Drags the foes into total\n" "darkness, inducing Sleep."), .effect = EFFECT_DARK_VOID, .power = 0, @@ -12372,7 +12442,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Sludge Wave"), .description = COMPOUND_STRING( - "Swamps the foe with a wave\n" + "Swamps all others with a wave\n" "of sludge. May also poison."), .effect = EFFECT_HIT, .power = 95, @@ -12446,7 +12516,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Synchronoise"), .description = COMPOUND_STRING( "An odd shock wave that only\n" - "damages same-type foes."), + "damages same-type {PKMN}."), .effect = EFFECT_SYNCHRONOISE, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 120 : 70, .type = TYPE_PSYCHIC, @@ -12488,8 +12558,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Soak"), .description = COMPOUND_STRING( - "Sprays water at the foe\n" - "making it Water-type."), + "Sprays water at the foe,\n" + "changing it to Water type."), .effect = EFFECT_SOAK, .power = 0, .type = TYPE_WATER, @@ -12638,7 +12708,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Simple Beam"), .description = COMPOUND_STRING( "A beam that changes the\n" - "foe's ability to Simple."), + "foe's Ability to Simple."), .effect = EFFECT_SIMPLE_BEAM, .power = 0, .type = TYPE_NORMAL, @@ -12661,7 +12731,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Entrainment"), .description = COMPOUND_STRING( "Makes the foe mimic the\n" - "user, gaining its ability."), + "user, gaining its Ability."), .effect = EFFECT_ENTRAINMENT, .power = 0, .type = TYPE_NORMAL, @@ -12683,7 +12753,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("After You"), .description = COMPOUND_STRING( - "Helps out the foe, letting\n" + "Helps out the target, letting\n" "it move next."), .effect = EFFECT_AFTER_YOU, .power = 0, @@ -12901,8 +12971,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Shell Smash"), .description = COMPOUND_STRING( - "Raises offensive stats, but\n" - "lowers defensive stats."), + "Sharply raises Atk/Sp.Atk/\n" + "Speed, but drops Def/Sp.Def."), .effect = EFFECT_SHELL_SMASH, .power = 0, .type = TYPE_NORMAL, @@ -13325,7 +13395,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Struggle Bug"), .description = COMPOUND_STRING( "Resisting, the user attacks\n" - "the foe. Lowers Sp. Atk."), + "the foes. Lowers Sp. Atk."), .effect = EFFECT_HIT, .power = B_UPDATED_MOVE_DATA >= GEN_6 ? 50 : 30, .type = TYPE_BUG, @@ -13350,7 +13420,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Bulldoze"), .description = COMPOUND_STRING( "Stomps down on the ground.\n" - "Lowers Speed."), + "Hits all and lowers Speed."), .effect = EFFECT_EARTHQUAKE, .power = 60, .type = TYPE_GROUND, @@ -13442,7 +13512,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Electroweb"), .description = COMPOUND_STRING( - "Snares the foe with an\n" + "Snares the foes with an\n" "electric net. Lowers Speed."), .effect = EFFECT_HIT, .power = 55, @@ -13973,7 +14043,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Glaciate"), .description = COMPOUND_STRING( "Blows very cold air at the\n" - "foe. It lowers their Speed."), + "foes. It lowers their Speed."), .effect = EFFECT_HIT, .power = 65, .type = TYPE_ICE, @@ -14284,8 +14354,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Mat Block"), .description = COMPOUND_STRING( - "Evades damaging moves\n" - "for one turn."), + "Evades damaging moves.\n" + "Only works on 1st turn."), .effect = EFFECT_MAT_BLOCK, .power = 0, .type = TYPE_FIGHTING, @@ -14445,8 +14515,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Trick-or-Treat"), .description = COMPOUND_STRING( - "Goes trick-or-treating\n" - "making the foe Ghost-type."), + "Goes trick-or-treating,\n" + "adding Ghost type to foe."), .effect = EFFECT_THIRD_TYPE, .power = 0, .type = TYPE_GHOST, @@ -14541,8 +14611,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Forest's Curse"), .description = COMPOUND_STRING( - "Puts a curse on the foe\n" - "making the foe Grass-type."), + "Puts a curse on the foe,\n" + "adding the Grass type."), .effect = EFFECT_THIRD_TYPE, .power = 0, .type = TYPE_GRASS, @@ -14566,7 +14636,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Petal Blizzard"), .description = COMPOUND_STRING( "Stirs up a violent storm\n" - "of petals to attack."), + "of petals to attack all."), .effect = EFFECT_HIT, .power = 90, .type = TYPE_GRASS, @@ -15234,7 +15304,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Venom Drench"), .description = COMPOUND_STRING( "Lowers the Attack, Sp. Atk\n" - "and Speed of a poisoned foe."), + "and Speed of poisoned foes."), .effect = EFFECT_VENOM_DRENCH, .power = 0, .type = TYPE_POISON, @@ -16196,7 +16266,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Throat Chop"), .description = COMPOUND_STRING( "Chops the throat to disable\n" - "sound moves for a while."), + "sound moves for 2 turns."), .effect = EFFECT_HIT, .power = 80, .type = TYPE_DARK, @@ -16487,7 +16557,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Core Enforcer"), .description = COMPOUND_STRING( "Hits with a ray that\n" - "nullifies the foe's ability."), + "nullifies the foe's Ability."), .effect = EFFECT_HIT, .power = 100, .type = TYPE_DRAGON, @@ -16563,7 +16633,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Beak Blast"), .description = COMPOUND_STRING( - "Heats up beak to attack.\n" + "Heats beak to attack last.\n" "Burns foe on contact."), .effect = EFFECT_BEAK_BLAST, .power = 100, @@ -17165,7 +17235,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Splishy Splash"), .description = COMPOUND_STRING( "A huge electrified wave that\n" - "may paralyze the foe."), + "may paralyze the foes."), .effect = EFFECT_HIT, .power = 90, .type = TYPE_WATER, @@ -17627,7 +17697,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Magic Powder"), .description = COMPOUND_STRING( "Magic powder changes the\n" - "target into a Psychic-type."), + "target into a Psychic type."), .effect = EFFECT_SOAK, .power = 0, .type = TYPE_PSYCHIC, @@ -19597,7 +19667,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .name = COMPOUND_STRING("Tera Blast"), .description = COMPOUND_STRING( "If the user's Terastallized,\n" - "it hits with its Tera-type."), + "it hits with its Tera type."), .effect = EFFECT_TERA_BLAST, .power = 80, .type = TYPE_NORMAL, @@ -21006,8 +21076,8 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = { .name = COMPOUND_STRING("Psychic Noise"), .description = COMPOUND_STRING( - "Unpleasant sound waves that\n" - "damage and prevent healing."), + "Sound waves that damage and\n" + "prevent healing for 2 turns."), .effect = EFFECT_HIT, .power = 75, .type = TYPE_PSYCHIC, From e44d0326be7ffcad364aaec3d56a69c14611f9d4 Mon Sep 17 00:00:00 2001 From: surskitty Date: Fri, 16 May 2025 11:41:03 -0400 Subject: [PATCH 070/187] AI double battle friendly fire logic improvements (#6766) --- include/battle_ai_util.h | 6 + include/config/ai.h | 5 + src/battle_ai_main.c | 371 +++++++++++++++++++++---- src/battle_ai_util.c | 117 ++++++++ test/battle/ai/ai.c | 171 ------------ test/battle/ai/ai_check_viability.c | 15 - test/battle/ai/ai_doubles.c | 412 ++++++++++++++++++++++++++++ 7 files changed, 856 insertions(+), 241 deletions(-) create mode 100644 test/battle/ai/ai_doubles.c diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 03e6b9e21f..70ff0e976c 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -197,6 +197,10 @@ bool32 ShouldTrap(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsWakeupTurn(u32 battler); bool32 AI_IsBattlerAsleepOrComatose(u32 battlerId); +// ability logic +bool32 IsMoxieTypeAbility(u32 ability); +bool32 ShouldTriggerAbility(u32 battler, u32 ability); + // partner logic #define IS_TARGETING_PARTNER(battlerAtk, battlerDef)((battlerAtk) == (battlerDef ^ BIT_FLANK)) u32 GetAllyChosenMove(u32 battlerId); @@ -212,6 +216,8 @@ bool32 PartnerMoveIsSameAsAttacker(u32 battlerAtkPartner, u32 battlerDef, u32 mo bool32 PartnerMoveIsSameNoTarget(u32 battlerAtkPartner, u32 move, u32 partnerMove); bool32 PartnerMoveActivatesSleepClause(u32 move); bool32 ShouldUseWishAromatherapy(u32 battlerAtk, u32 battlerDef, u32 move); +u32 GetFriendlyFireKOThreshold(u32 battler); +bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove); // party logic struct BattlePokemon *AllocSaveBattleMons(void); diff --git a/include/config/ai.h b/include/config/ai.h index c734eb2c1d..db98f72ee9 100644 --- a/include/config/ai.h +++ b/include/config/ai.h @@ -69,4 +69,9 @@ // Score reduction if any roll for PP stall detection passes #define PP_STALL_SCORE_REDUCTION 20 +// AI's acceptable number of hits to KO the partner via friendly fire in a double battle. +#define FRIENDLY_FIRE_RISKY_THRESHOLD 2 +#define FRIENDLY_FIRE_NORMAL_THRESHOLD 3 +#define FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD 4 + #endif // GUARD_CONFIG_AI_H diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 9fea906cff..7ac5065643 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1110,7 +1110,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); break; case ABILITY_JUSTIFIED: - if (moveType == TYPE_DARK && !IsBattleMoveStatus(move)) + if (moveType == TYPE_DARK && !IsBattleMoveStatus(move) && !IS_TARGETING_PARTNER(battlerAtk, battlerDef)) RETURN_SCORE_MINUS(10); break; case ABILITY_RATTLED: @@ -2221,8 +2221,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) && move != MOVE_CRAFTY_SHIELD) //These moves have infinite usage { if (GetBattlerSecondaryDamage(battlerAtk) >= gBattleMons[battlerAtk].hp - && aiData->abilities[battlerDef] != ABILITY_MOXIE - && aiData->abilities[battlerDef] != ABILITY_BEAST_BOOST) + && !(IsMoxieTypeAbility(aiData->abilities[battlerDef]))) { ADJUST_SCORE(-10); //Don't protect if you're going to faint after protecting } @@ -2929,7 +2928,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 atkPartnerAbility = aiData->abilities[BATTLE_PARTNER(battlerAtk)]; u32 atkPartnerHoldEffect = aiData->holdEffects[BATTLE_PARTNER(battlerAtk)]; enum BattleMoveEffects partnerEffect = GetMoveEffect(aiData->partnerMove); - bool32 partnerProtecting = (partnerEffect == EFFECT_PROTECT); + bool32 partnerProtecting = IsAllyProtectingFromMove(battlerAtk, move, aiData->partnerMove) && !MoveIgnoresProtect(move); bool32 attackerHasBadAbility = (gAbilitiesInfo[aiData->abilities[battlerAtk]].aiRating < 0); bool32 partnerHasBadAbility = (gAbilitiesInfo[atkPartnerAbility].aiRating < 0); u32 predictedMove = GetIncomingMove(battlerAtk, battlerDef, gAiLogicData); @@ -2937,6 +2936,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) SetTypeBeforeUsingMove(move, battlerAtk); moveType = GetBattleMoveType(move); + u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); + u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); + bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) + && !partnerProtecting && IsBattlerAlive(battlerAtkPartner); + bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); + // check what effect partner is using if (aiData->partnerMove != 0) { @@ -2987,7 +2992,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { case EFFECT_HELPING_HAND: if (!IsBattlerAlive(battlerAtkPartner) || !HasDamagingMove(battlerAtkPartner)) - ADJUST_SCORE(-5); + ADJUST_SCORE(-20); break; case EFFECT_PERISH_SONG: if (aiData->partnerMove != 0 && HasTrappingMoveEffect(battlerAtkPartner)) @@ -3054,9 +3059,103 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; } // global move effect check + // Specific logic for spread moves. + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + // Don't kill your partner for no reason. + if (wouldPartnerFaint) + { + // If it kills both opponents, that's a good reason. + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + && CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + { + switch (effect) + { + case EFFECT_EXPLOSION: + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) + { + RETURN_SCORE_PLUS(10); + } + break; + default: + RETURN_SCORE_PLUS(10); + break; + } + } + // Both opponents can kill the partner + else if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtkPartner) + && (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtkPartner))) + { + // The spread move should kill an opponent. + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + { + ADJUST_SCORE(WEAK_EFFECT); + } + + // Alternatively, it benefits from the ally's death, and it will probably die anyway. + if (IsMoxieTypeAbility(aiData->abilities[battlerAtk])) + { + ADJUST_SCORE(GOOD_EFFECT); + } + if ((aiData->abilities[battlerAtk] == ABILITY_RECEIVER) && !partnerHasBadAbility) + { + ADJUST_SCORE(GOOD_EFFECT); + } + if (HasMove(battlerAtk, MOVE_LAST_RESPECTS)) + { + ADJUST_SCORE(GOOD_EFFECT); + } + } + // It can kill one opponent when killing its ally, and its ally is not in extreme danger. + // This is easy for the player to cheese. + else if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + { + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + { + RETURN_SCORE_PLUS(10); + } + else + { + ADJUST_SCORE(-DECENT_EFFECT); + } + } + // No reason to kill partner has been found. + else + { + RETURN_SCORE_MINUS(10); + } + } + + // Partner will not faint. + else { + + // Triggering your ally's hold item should only be done deliberately with a spread move. + switch (atkPartnerHoldEffect) + { + case HOLD_EFFECT_WEAKNESS_POLICY: + if (aiData->effectiveness[battlerAtk][battlerAtkPartner][gAiThinkingStruct->movesetIndex] >= UQ_4_12(2.0) && isFriendlyFireOK) + { + ADJUST_SCORE(GOOD_EFFECT); + } + break; + default: + break; + } + } + } + // check specific target if (IS_TARGETING_PARTNER(battlerAtk, battlerDef)) { + bool32 isMoveAffectedByPartnerAbility = TRUE; + + if (wouldPartnerFaint) + { + RETURN_SCORE_MINUS(30); + } + // partner ability checks if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { @@ -3066,95 +3165,241 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (MoveAlwaysCrits(move) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) && AI_IsFaster(battlerAtk, battlerAtkPartner, move) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + && isFriendlyFireOK) { - RETURN_SCORE_PLUS(GOOD_EFFECT); + if (MoveAlwaysCrits(move)) + { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + RETURN_SCORE_PLUS(GOOD_EFFECT); + } + // todo: figuring out a non-guaranteed crit roll that's useful } - break; - case ABILITY_VOLT_ABSORB: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + else { - RETURN_SCORE_MINUS(10); + isMoveAffectedByPartnerAbility = FALSE; } - break; // handled in AI_HPAware + break; + case ABILITY_LIGHTNING_ROD: case ABILITY_MOTOR_DRIVE: - if (moveType == TYPE_ELECTRIC && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPEED)) + case ABILITY_VOLT_ABSORB: + if (moveType == TYPE_ELECTRIC) { - RETURN_SCORE_PLUS(WEAK_EFFECT); + if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_LIGHTNING_ROD) + { + RETURN_SCORE_MINUS(10); + } + + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + { + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + else + { + RETURN_SCORE_MINUS(10); + } } - break; - case ABILITY_LIGHTNING_ROD: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 - && moveType == TYPE_ELECTRIC - && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_SPECIAL) - && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPATK)) + else { - RETURN_SCORE_PLUS(WEAK_EFFECT); + isMoveAffectedByPartnerAbility = FALSE; } break; - case ABILITY_WATER_ABSORB: - case ABILITY_DRY_SKIN: case ABILITY_EARTH_EATER: - if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + case ABILITY_LEVITATE: + if (moveType == TYPE_GROUND) { - RETURN_SCORE_MINUS(10); + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + else if (atkPartnerAbility == ABILITY_EARTH_EATER && !(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_HP_AWARE)) + { + RETURN_SCORE_MINUS(10); + } + } + else + { + isMoveAffectedByPartnerAbility = FALSE; } break; // handled in AI_HPAware + case ABILITY_DRY_SKIN: + case ABILITY_WATER_ABSORB: case ABILITY_STORM_DRAIN: - if (B_REDIRECT_ABILITY_IMMUNITY >= GEN_5 - && moveType == TYPE_WATER - && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_SPECIAL) - && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPATK)) + if (moveType == TYPE_WATER) { - RETURN_SCORE_PLUS(WEAK_EFFECT); + if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5 && atkPartnerAbility == ABILITY_STORM_DRAIN) + { + RETURN_SCORE_MINUS(10); + } + + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + else if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + { + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + else + { + RETURN_SCORE_MINUS(10); + } + } + else + { + isMoveAffectedByPartnerAbility = FALSE; } break; case ABILITY_WATER_COMPACTION: - if (moveType == TYPE_WATER && GetNoOfHitsToKOBattler(battlerAtk, battlerDef, gAiThinkingStruct->movesetIndex, AI_ATTACKING) >= 4) + if (moveType == TYPE_WATER && isFriendlyFireOK + && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { - RETURN_SCORE_PLUS(WEAK_EFFECT); // only mon with this ability is weak to water so only make it okay if we do very little damage + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + { + ADJUST_SCORE(DECENT_EFFECT); + } + } + else + { + isMoveAffectedByPartnerAbility = FALSE; } - RETURN_SCORE_MINUS(10); break; - case ABILITY_FLASH_FIRE: - if (moveType == TYPE_FIRE - && HasMoveWithType(battlerAtkPartner, TYPE_FIRE) - && !gDisableStructs[battlerAtkPartner].flashFireBoosted) + case ABILITY_STEAM_ENGINE: + if (isFriendlyFireOK && (moveType == TYPE_WATER || moveType == TYPE_FIRE) + && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } RETURN_SCORE_PLUS(WEAK_EFFECT); } + else + { + isMoveAffectedByPartnerAbility = FALSE; + } break; - case ABILITY_SAP_SIPPER: - if (moveType == TYPE_GRASS - && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) - && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK)) + case ABILITY_THERMAL_EXCHANGE: + if (moveType == TYPE_FIRE && isFriendlyFireOK + && !IsBattleMoveStatus(move) + && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + { + ADJUST_SCORE(WEAK_EFFECT); + } + RETURN_SCORE_PLUS(WEAK_EFFECT); } + else + { + isMoveAffectedByPartnerAbility = FALSE; + } + break; + case ABILITY_FLASH_FIRE: + case ABILITY_WELL_BAKED_BODY: + if (moveType == TYPE_FIRE) + { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + { + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + } + else + { + isMoveAffectedByPartnerAbility = FALSE; + } + break; + case ABILITY_SAP_SIPPER: + if (moveType == TYPE_GRASS) + { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } + + if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) + { + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + } + else + { + isMoveAffectedByPartnerAbility = FALSE; + } break; case ABILITY_JUSTIFIED: - if (moveType == TYPE_DARK + if (moveType == TYPE_DARK && isFriendlyFireOK && !IsBattleMoveStatus(move) - && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) - && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { - RETURN_SCORE_PLUS(WEAK_EFFECT); + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(GOOD_EFFECT); + } + + if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) + { + ADJUST_SCORE(WEAK_EFFECT); + } + + ADJUST_SCORE(WEAK_EFFECT); // Beat Up is handled later + } + else + { + isMoveAffectedByPartnerAbility = FALSE; } break; case ABILITY_RATTLED: - if (!IsBattleMoveStatus(move) + if (!IsBattleMoveStatus(move) && isFriendlyFireOK && (moveType == TYPE_DARK || moveType == TYPE_GHOST || moveType == TYPE_BUG) - && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_SPEED) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(DECENT_EFFECT); + } RETURN_SCORE_PLUS(WEAK_EFFECT); } + else + { + isMoveAffectedByPartnerAbility = FALSE; + } break; case ABILITY_CONTRARY: - if (IsStatLoweringEffect(effect)) + case ABILITY_DEFIANT: + case ABILITY_COMPETITIVE: + if (IsStatLoweringEffect(effect) && isFriendlyFireOK && ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { - RETURN_SCORE_PLUS(DECENT_EFFECT); + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) + { + ADJUST_SCORE(GOOD_EFFECT); + } + RETURN_SCORE_PLUS(WEAK_EFFECT); + } + else + { + isMoveAffectedByPartnerAbility = FALSE; } break; } @@ -3163,6 +3408,11 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // attacker move effects specifically targeting partner if (!partnerProtecting) { + if (wouldPartnerFaint) + { + RETURN_SCORE_MINUS(30); + } + switch (effect) { case EFFECT_SPICY_EXTRACT: @@ -3200,11 +3450,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_BEAT_UP: if (atkPartnerAbility == ABILITY_JUSTIFIED && moveType == TYPE_DARK + && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move) && !IsBattleMoveStatus(move) && HasMoveWithCategory(battlerAtkPartner, DAMAGE_CATEGORY_PHYSICAL) && BattlerStatCanRise(battlerAtkPartner, atkPartnerAbility, STAT_ATK) - && !CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING)) + && !wouldPartnerFaint) { + if (isFriendlyFireOK) + { + ADJUST_SCORE(DECENT_EFFECT); + } RETURN_SCORE_PLUS(WEAK_EFFECT); } break; @@ -3298,7 +3553,12 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // attacker move effects } // check partner protecting - ADJUST_SCORE(-30); // otherwise, don't target partner + if ((isMoveAffectedByPartnerAbility && (score <= AI_SCORE_DEFAULT)) || !isMoveAffectedByPartnerAbility) + { + RETURN_SCORE_MINUS(10); + } + + } else // checking opponent { @@ -3356,12 +3616,13 @@ static inline bool32 ShouldUseSpreadDamageMove(u32 battlerAtk, u32 move, u32 mov { u32 partnerBattler = BATTLE_PARTNER(battlerAtk); u32 noOfHitsToFaintPartner = GetNoOfHitsToKOBattler(battlerAtk, partnerBattler, moveIndex, AI_ATTACKING); + u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); return (IsDoubleBattle() && noOfHitsToFaintPartner != 0 // Immunity check && IsBattlerAlive(partnerBattler) && GetBattlerMoveTargetType(battlerAtk, move) == MOVE_TARGET_FOES_AND_ALLY - && !(noOfHitsToFaintPartner < 4 && hitsToFaintOpposingBattler == 1) - && noOfHitsToFaintPartner < 7); + && !(noOfHitsToFaintPartner < friendlyFireThreshold && hitsToFaintOpposingBattler == 1) + && noOfHitsToFaintPartner < (friendlyFireThreshold * 2)); } static s32 AI_CompareDamagingMoves(u32 battlerAtk, u32 battlerDef, u32 currId) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 3c08f108dc..6a1e6ea681 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1588,6 +1588,51 @@ bool32 IsHazardClearingMove(u32 move) return FALSE; } +bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) +{ + enum BattleMoveEffects effect = GetMoveEffect(allyMove); + + if (effect != EFFECT_PROTECT) + { + return FALSE; + } + else + { + enum ProtectMethod protectMethod = GetMoveProtectMethod(allyMove); + + if (protectMethod == PROTECT_QUICK_GUARD) + { + u32 priority = GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], attackerMove); + return (priority > 0); + } + + if (IsBattleMoveStatus(attackerMove)) + { + switch (protectMethod) + { + case PROTECT_NORMAL: + case PROTECT_CRAFTY_SHIELD: + case PROTECT_MAX_GUARD: + case PROTECT_WIDE_GUARD: + return TRUE; + + default: + return FALSE; + } + } + else + { + switch (protectMethod) + { + case PROTECT_CRAFTY_SHIELD: + return FALSE; + default: + return TRUE; + } + } + } +} + bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility) { if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_NEGATE_UNAWARE) @@ -4566,6 +4611,78 @@ bool32 HasBattlerSideAbility(u32 battler, u32 ability, struct AiLogicData *aiDat return FALSE; } +u32 GetFriendlyFireKOThreshold(u32 battler) +{ + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_RISKY) + return FRIENDLY_FIRE_RISKY_THRESHOLD; + if (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_CONSERVATIVE) + return FRIENDLY_FIRE_CONSERVATIVE_THRESHOLD; + + return FRIENDLY_FIRE_NORMAL_THRESHOLD; +} + +bool32 IsMoxieTypeAbility(u32 ability) +{ + switch (ability) + { + case ABILITY_MOXIE: + case ABILITY_BEAST_BOOST: + case ABILITY_CHILLING_NEIGH: + case ABILITY_AS_ONE_ICE_RIDER: + case ABILITY_GRIM_NEIGH: + case ABILITY_AS_ONE_SHADOW_RIDER: + return TRUE; + default: + return FALSE; + } +} + +// Should the AI use a spread move to deliberately activate its partner's ability? +bool32 ShouldTriggerAbility(u32 battler, u32 ability) +{ + switch (ability) + { + case ABILITY_LIGHTNING_ROD: + case ABILITY_STORM_DRAIN: + if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) + return FALSE; + else + return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + + case ABILITY_DEFIANT: + case ABILITY_JUSTIFIED: + case ABILITY_MOXIE: + case ABILITY_SAP_SIPPER: + case ABILITY_THERMAL_EXCHANGE: + return (BattlerStatCanRise(battler, ability, STAT_ATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)); + + case ABILITY_COMPETITIVE: + return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); + + case ABILITY_CONTRARY: + return TRUE; + + case ABILITY_DRY_SKIN: + case ABILITY_VOLT_ABSORB: + case ABILITY_WATER_ABSORB: + return (gAiThinkingStruct->aiFlags[battler] & AI_FLAG_HP_AWARE); + + case ABILITY_RATTLED: + case ABILITY_STEAM_ENGINE: + return BattlerStatCanRise(battler, ability, STAT_SPEED); + + case ABILITY_FLASH_FIRE: + return (HasMoveWithType(battler, TYPE_FIRE) && !gDisableStructs[battler].flashFireBoosted); + + case ABILITY_WATER_COMPACTION: + case ABILITY_WELL_BAKED_BODY: + return (BattlerStatCanRise(battler, ability, STAT_DEF)); + + default: + return FALSE; + } +} + u32 GetThinkingBattler(u32 battler) { if (gAiLogicData->aiPredictionInProgress) diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 3f799d09ab..55942c2834 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -369,88 +369,6 @@ AI_SINGLE_BATTLE_TEST("AI won't use ground type attacks against flying type Poke } } -AI_DOUBLE_BATTLE_TEST("AI won't use a Weather changing move if partner already chose such move") -{ - u32 j, k; - static const u16 weatherMoves[] = {MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_RAIN_DANCE, MOVE_SANDSTORM, MOVE_SNOWSCAPE}; - u16 weatherMoveLeft = MOVE_NONE, weatherMoveRight = MOVE_NONE; - - for (j = 0; j < ARRAY_COUNT(weatherMoves); j++) - { - for (k = 0; k < ARRAY_COUNT(weatherMoves); k++) - { - PARAMETRIZE { weatherMoveLeft = weatherMoves[j]; weatherMoveRight = weatherMoves[k]; } - } - } - - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherMoveLeft); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, weatherMoveRight); } - } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, weatherMoveRight); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:opponentLeft); - } - } -} - -AI_DOUBLE_BATTLE_TEST("AI will not use Helping Hand if partner does not have any damage moves") -{ - u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; - - PARAMETRIZE { move1 = MOVE_LEER; move2 = MOVE_TOXIC; } - PARAMETRIZE { move1 = MOVE_HELPING_HAND; move2 = MOVE_PROTECT; } - PARAMETRIZE { move1 = MOVE_ACUPRESSURE; move2 = MOVE_DOUBLE_TEAM; move3 = MOVE_TOXIC; move4 = MOVE_PROTECT; } - - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_SCRATCH); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(move1, move2, move3, move4); } - } WHEN { - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:opponentLeft); - } - } SCENE { - NOT MESSAGE("The opposing Wobbuffet used Helping Hand!"); - } -} - -AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose Helping Hand") -{ - s32 j; - u32 statusMove = MOVE_NONE; - - for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++) - { - if (GetMoveCategory(j) == DAMAGE_CATEGORY_STATUS) { - PARAMETRIZE { statusMove = j; } - } - } - - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove); } - } WHEN { - TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); - SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); - } - } SCENE { - MESSAGE("The opposing Wobbuffet used Helping Hand!"); - } -} AI_SINGLE_BATTLE_TEST("AI without any flags chooses moves at random - singles") { @@ -641,79 +559,6 @@ AI_SINGLE_BATTLE_TEST("AI will choose Superpower over Outrage with Contrary") } } -AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner") -{ - u32 species; - - PARAMETRIZE { species = SPECIES_CHARIZARD; } - PARAMETRIZE { species = SPECIES_CHARMANDER; } - PARAMETRIZE { species = SPECIES_CHIKORITA; } - - GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_PHANPY) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } - OPPONENT(species) { Moves(MOVE_CELEBRATE); } - } WHEN { - if (species == SPECIES_CHARIZARD) - TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } - else - TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } - } -} - -AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") -{ - GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } - OPPONENT(SPECIES_PIKACHU) { HP(1); Moves(MOVE_CELEBRATE); } - } WHEN { - TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentRight); } - TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } - } -} - -AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kill an opposing mon and does 1/3 of damage to AI") -{ - GIVEN { - ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET) { HP(1); } - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } - OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); } - } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } - } -} - -AI_DOUBLE_BATTLE_TEST("AI will the see a corresponding absorbing ability on partner to one of its moves") -{ - u32 ability; - PARAMETRIZE { ability = ABILITY_LIGHTNING_ROD; } - PARAMETRIZE { ability = ABILITY_STATIC; } - - GIVEN { - ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_WOBBUFFET); - PLAYER(SPECIES_WOBBUFFET); - OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_DISCHARGE, MOVE_SCRATCH); } - OPPONENT(SPECIES_PIKACHU) { HP(1); Ability(ability); Moves(MOVE_CELEBRATE); } - } WHEN { - if (ability == ABILITY_LIGHTNING_ROD) - TURN { EXPECT_MOVE(opponentLeft, MOVE_DISCHARGE); } - else - TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } - } -} - AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical immunity") { u32 ability; @@ -737,22 +582,6 @@ AI_SINGLE_BATTLE_TEST("AI calculates guaranteed criticals and detects critical i } } -AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") -{ - KNOWN_FAILING; // MGriffin's PR that switched two turn charging moves in AI tests broke this test, waiting on a fix - GIVEN { - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); - PLAYER(SPECIES_MAGNETON); - PLAYER(SPECIES_GARDEVOIR) { Ability(ABILITY_TRACE); } - OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } - OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } - } WHEN { - TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } - } THEN { - EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); - } -} - AI_SINGLE_BATTLE_TEST("AI avoids contact moves against rocky helmet") { u32 item; diff --git a/test/battle/ai/ai_check_viability.c b/test/battle/ai/ai_check_viability.c index 2f30c3df3a..f80597f476 100644 --- a/test/battle/ai/ai_check_viability.c +++ b/test/battle/ai/ai_check_viability.c @@ -241,21 +241,6 @@ AI_SINGLE_BATTLE_TEST("AI chooses moves that cure inactive party members") } } -AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons that would benefit from it") -{ - GIVEN { - ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); - ASSUME(GetMoveAdditionalEffectById(MOVE_OVERHEAT, 0)->moveEffect == MOVE_EFFECT_SP_ATK_MINUS_2); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); - PLAYER(SPECIES_WOBBUFFET) { Speed(3); } - PLAYER(SPECIES_WOBBUFFET) { Speed(3); } - OPPONENT(SPECIES_SPINDA) { Ability(ABILITY_CONTRARY); Speed(5); Moves(MOVE_SKILL_SWAP, MOVE_ENCORE, MOVE_FAKE_TEARS, MOVE_SWAGGER); } - OPPONENT(SPECIES_ARCANINE) { Ability(ABILITY_INTIMIDATE); Speed(4); Moves (MOVE_OVERHEAT); } - } WHEN { - TURN { EXPECT_MOVE(opponentLeft, MOVE_SKILL_SWAP, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_OVERHEAT); } - } -} - AI_SINGLE_BATTLE_TEST("AI prioritizes Pursuit if it would KO opponent") { GIVEN { diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c new file mode 100644 index 0000000000..b162c8c67f --- /dev/null +++ b/test/battle/ai/ai_doubles.c @@ -0,0 +1,412 @@ +#include "global.h" +#include "test/battle.h" +#include "battle_ai_util.h" + +AI_DOUBLE_BATTLE_TEST("AI won't use a Weather changing move if partner already chose such move") +{ + u32 j, k; + static const u16 weatherMoves[] = {MOVE_SUNNY_DAY, MOVE_HAIL, MOVE_RAIN_DANCE, MOVE_SANDSTORM, MOVE_SNOWSCAPE}; + u16 weatherMoveLeft = MOVE_NONE, weatherMoveRight = MOVE_NONE; + + for (j = 0; j < ARRAY_COUNT(weatherMoves); j++) + { + for (k = 0; k < ARRAY_COUNT(weatherMoves); k++) + { + PARAMETRIZE { weatherMoveLeft = weatherMoves[j]; weatherMoveRight = weatherMoves[k]; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(weatherMoveLeft); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, weatherMoveRight); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentRight, weatherMoveRight); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentRight, weatherMoveRight, AI_SCORE_DEFAULT, target:opponentLeft); + } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will not use Helping Hand if partner does not have any damage moves") +{ + u16 move1 = MOVE_NONE, move2 = MOVE_NONE, move3 = MOVE_NONE, move4 = MOVE_NONE; + + PARAMETRIZE { move1 = MOVE_LEER; move2 = MOVE_TOXIC; } + PARAMETRIZE { move1 = MOVE_HELPING_HAND; move2 = MOVE_PROTECT; } + PARAMETRIZE { move1 = MOVE_ACUPRESSURE; move2 = MOVE_DOUBLE_TEAM; move3 = MOVE_TOXIC; move4 = MOVE_PROTECT; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(move1, move2, move3, move4); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_HELPING_HAND); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentLeft, MOVE_HELPING_HAND, AI_SCORE_DEFAULT, target:opponentLeft); + } + } SCENE { + NOT MESSAGE("The opposing Wobbuffet used Helping Hand!"); + } +} + +AI_DOUBLE_BATTLE_TEST("AI will not use a status move if partner already chose Helping Hand") +{ + s32 j; + u32 statusMove = MOVE_NONE; + + for (j = MOVE_NONE + 1; j < MOVES_COUNT; j++) + { + if (GetMoveCategory(j) == DAMAGE_CATEGORY_STATUS) { + PARAMETRIZE { statusMove = j; } + } + } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_HELPING_HAND); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, statusMove); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentRight, statusMove); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerLeft); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:playerRight); + SCORE_LT_VAL(opponentRight, statusMove, AI_SCORE_DEFAULT, target:opponentLeft); + } + } SCENE { + MESSAGE("The opposing Wobbuffet used Helping Hand!"); + } +} + +AI_DOUBLE_BATTLE_TEST("AI will not choose Earthquake if it damages the partner without a positive effect") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + + u32 species; + + PARAMETRIZE { species = SPECIES_CHARIZARD; } + PARAMETRIZE { species = SPECIES_CHARMANDER; } + PARAMETRIZE { species = SPECIES_CHIKORITA; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PHANPY) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(species) { Moves(MOVE_CELEBRATE); } + } WHEN { + if (species == SPECIES_CHARIZARD) + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH, target: playerLeft); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI recognizes its ally's Telepathy") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PHANPY) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(SPECIES_ELGYEM) { Level(1); Ability(ABILITY_TELEPATHY); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability but will not KO the ally needlessly") +{ + ASSUME(GetMoveTarget(MOVE_BULLDOZE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); + ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1)); + + u32 species, ability, currentHP; + + PARAMETRIZE { species = SPECIES_KINGAMBIT; ability = ABILITY_DEFIANT; currentHP = 400; } + PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 400; } + PARAMETRIZE { species = SPECIES_PAWNIARD; ability = ABILITY_PRESSURE; currentHP = 1; } + PARAMETRIZE { species = SPECIES_PAWNIARD; ability = ABILITY_DEFIANT; currentHP = 1; } + PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 1; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_PHANPY) { Moves(MOVE_BULLDOZE, MOVE_HIGH_HORSEPOWER); } + OPPONENT(species) { Moves(MOVE_CELEBRATE, MOVE_POUND); HP(currentHP); Ability(ability); } + } WHEN { + if (currentHP != 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_BULLDOZE); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_HIGH_HORSEPOWER); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Beat Up on an ally with Justified if it will benefit the ally") +{ + ASSUME(GetMoveEffect(MOVE_BEAT_UP) == EFFECT_BEAT_UP); + ASSUME(GetMoveType(MOVE_BEAT_UP) == TYPE_DARK); + + u32 defAbility, atkAbility, currentHP; + + PARAMETRIZE { defAbility = ABILITY_FLASH_FIRE; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } + PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_SCRAPPY; currentHP = 400; } + PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_MOLD_BREAKER; currentHP = 400; } + PARAMETRIZE { defAbility = ABILITY_JUSTIFIED; atkAbility = ABILITY_SCRAPPY; currentHP = 1; } + + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_CLEFABLE); + OPPONENT(SPECIES_PANGORO) { Ability(atkAbility); Moves(MOVE_BEAT_UP); } + OPPONENT(SPECIES_GROWLITHE) { Moves(MOVE_CELEBRATE, MOVE_TACKLE); HP(currentHP); Ability(defAbility); } + } WHEN { + if (!(currentHP == 1) && (defAbility == ABILITY_JUSTIFIED) && (atkAbility != ABILITY_MOLD_BREAKER)) + TURN { EXPECT_MOVE(opponentLeft, MOVE_BEAT_UP, target: opponentRight); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_BEAT_UP, target: playerLeft); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if partner is not alive") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(SPECIES_PIKACHU) { HP(1); Moves(MOVE_CELEBRATE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH, target: opponentRight); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon and does not kill the partner needlessly") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + u32 currentHP; + PARAMETRIZE { currentHP = 1; } + PARAMETRIZE { currentHP = 200; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); HP(currentHP); } + } WHEN { + if (currentHP == 1) + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon and a partner it believes is about to die") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); Moves(MOVE_CELEBRATE, MOVE_SCRATCH); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); HP(1); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_SCRATCH); } + TURN { MOVE(playerRight, MOVE_SCRATCH); } + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills both opposing mons") +{ + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_SCRATCH); } + OPPONENT(SPECIES_PARAS) { Moves(MOVE_CELEBRATE); HP(1); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will trigger its ally's Weakness Policy") +{ + ASSUME(gItemsInfo[ITEM_WEAKNESS_POLICY].holdEffect == HOLD_EFFECT_WEAKNESS_POLICY); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + u32 species; + PARAMETRIZE { species = SPECIES_INCINEROAR; } + PARAMETRIZE { species = SPECIES_CLEFFA; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_EARTHQUAKE, MOVE_STOMPING_TANTRUM); } + OPPONENT(species) { Moves(MOVE_CELEBRATE); Item(ITEM_WEAKNESS_POLICY); } + } WHEN { + if (species == SPECIES_INCINEROAR) + TURN { EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + else + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_EARTHQUAKE); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field with Risky or Will Suicide") +{ + ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); + + u32 aiFlags; + + PARAMETRIZE { aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } + PARAMETRIZE { aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_RISKY; } + PARAMETRIZE { aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_WILL_SUICIDE; } + + GIVEN { + AI_FLAGS(aiFlags); + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + PLAYER(SPECIES_WOBBUFFET) { HP(1); } + OPPONENT(SPECIES_ELECTRODE) { Moves(MOVE_EXPLOSION, MOVE_ELECTRO_BALL); } + OPPONENT(SPECIES_ELECTRODE) { Moves(MOVE_CELEBRATE); HP(1); } + } WHEN { + if (aiFlags == (AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT)) + TURN { EXPECT_MOVE(opponentLeft, MOVE_ELECTRO_BALL); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_EXPLOSION); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") +{ + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveTarget(MOVE_LAVA_PLUME) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_LAVA_PLUME) == TYPE_FIRE); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); + ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); + + u32 ability, move, species; + + PARAMETRIZE { species = SPECIES_PSYDUCK; ability = ABILITY_CLOUD_NINE; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_PIKACHU; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_LANTURN; ability = ABILITY_VOLT_ABSORB; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_EMOLGA; ability = ABILITY_MOTOR_DRIVE; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; } + PARAMETRIZE { species = SPECIES_GROWLITHE; ability = ABILITY_FLASH_FIRE; move = MOVE_LAVA_PLUME; } + PARAMETRIZE { species = SPECIES_DACHSBUN; ability = ABILITY_WELL_BAKED_BODY; move = MOVE_LAVA_PLUME; } + PARAMETRIZE { species = SPECIES_QUAGSIRE; ability = ABILITY_WATER_ABSORB; move = MOVE_SURF; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } + PARAMETRIZE { species = SPECIES_UNOWN; ability = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE; } + PARAMETRIZE { species = SPECIES_ORTHWORM; ability = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_SLAKING) { Moves(move, MOVE_SCRATCH); } + OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_POUND, MOVE_EMBER, MOVE_ROUND); } + } WHEN { + if (ability != ABILITY_CLOUD_NINE) + TURN { EXPECT_MOVE(opponentLeft, move); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI knows if redirection abilities provide immunity to allies") +{ + KNOWN_FAILING; + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_DISCHARGE) == TYPE_ELECTRIC); + ASSUME(GetMoveTarget(MOVE_SURF) == MOVE_TARGET_FOES_AND_ALLY); + ASSUME(GetMoveType(MOVE_SURF) == TYPE_WATER); + + u32 ability, move, species, config; + + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_4; } + PARAMETRIZE { species = SPECIES_SEAKING; ability = ABILITY_LIGHTNING_ROD; move = MOVE_DISCHARGE; config = GEN_5; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_4; } + PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; config = GEN_5; } + + GIVEN { + ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); + WITH_CONFIG(B_REDIRECT_ABILITY_IMMUNITY, config); + PLAYER(SPECIES_ZIGZAGOON); + PLAYER(SPECIES_ZIGZAGOON); + OPPONENT(SPECIES_SLAKING) { Moves(move, MOVE_SCRATCH); } + OPPONENT(species) { HP(1); Ability(ability); Moves(MOVE_ROUND); } + } WHEN { + if (config == GEN_5) + TURN { EXPECT_MOVE(opponentLeft, move); } + else + TURN { EXPECT_MOVE(opponentLeft, MOVE_SCRATCH); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI recognizes Volt Absorb received from Trace") +{ + KNOWN_FAILING; // MGriffin's PR that switched two turn charging moves in AI tests broke this test, waiting on a fix + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); + PLAYER(SPECIES_MAGNETON); + PLAYER(SPECIES_GARDEVOIR) { Ability(ABILITY_TRACE); } + OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } + OPPONENT(SPECIES_JOLTEON) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_THUNDER_WAVE, MOVE_THUNDERSHOCK, MOVE_WATER_GUN); } + } WHEN { + TURN { NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERSHOCK); NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDER_WAVE); NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDER_WAVE); } + } THEN { + EXPECT(gAiLogicData->abilities[B_POSITION_PLAYER_RIGHT] == ABILITY_VOLT_ABSORB); + } +} + +AI_DOUBLE_BATTLE_TEST("AI prioritizes Skill Swapping Contrary to allied mons that would benefit from it") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); + ASSUME(GetMoveAdditionalEffectById(MOVE_OVERHEAT, 0)->moveEffect == MOVE_EFFECT_SP_ATK_MINUS_2); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_DOUBLE_BATTLE); + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + PLAYER(SPECIES_WOBBUFFET) { Speed(3); } + OPPONENT(SPECIES_SPINDA) { Ability(ABILITY_CONTRARY); Speed(5); Moves(MOVE_SKILL_SWAP, MOVE_ENCORE, MOVE_FAKE_TEARS, MOVE_SWAGGER); } + OPPONENT(SPECIES_ARCANINE) { Ability(ABILITY_INTIMIDATE); Speed(4); Moves (MOVE_OVERHEAT); } + } WHEN { + TURN { EXPECT_MOVE(opponentLeft, MOVE_SKILL_SWAP, target:opponentRight); EXPECT_MOVE(opponentRight, MOVE_OVERHEAT); } + } +} + From 73e65b76c4c569e5e38558a21d024122deb176a8 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 16 May 2025 20:50:45 +0200 Subject: [PATCH 071/187] Consolidated HasMoveFlagX functions (#6874) --- include/battle_ai_util.h | 10 ++--- src/battle_ai_main.c | 18 ++++---- src/battle_ai_util.c | 88 ++++------------------------------------ 3 files changed, 21 insertions(+), 95 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 70ff0e976c..1e35dbf532 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -37,6 +37,8 @@ static inline bool32 IsMoveUnusable(u32 moveIndex, u32 move, u32 moveLimitations || moveLimitations & 1u << moveIndex; } +typedef bool32 (*MoveFlag)(u32 move); + bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_RandLessThan(u32 val); @@ -167,13 +169,7 @@ bool32 IsChaseEffect(enum BattleMoveEffects effect); bool32 IsAttackBoostMoveEffect(enum BattleMoveEffects effect); bool32 IsUngroundingEffect(enum BattleMoveEffects effect); bool32 IsSemiInvulnerable(u32 battlerDef, u32 move); -bool32 HasSubstituteIgnoringMove(u32 battler); -bool32 HasHighCritRatioMove(u32 battler); -bool32 HasMagicCoatAffectedMove(u32 battler); -bool32 HasSnatchAffectedMove(u32 battler); -bool32 HasMoveThatAlwaysHitsInRain(u32 battler); -bool32 HasMoveThatHas50AccuracyInSun(u32 battler); -bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler); +bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag); bool32 IsHazardClearingMove(u32 move); bool32 IsSubstituteEffect(enum BattleMoveEffects effect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index 7ac5065643..f62ff4376d 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1691,7 +1691,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 25) ADJUST_SCORE(-10); - else if (HasSubstituteIgnoringMove(battlerDef)) + else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute)) ADJUST_SCORE(-8); break; case EFFECT_SHED_TAIL: @@ -1701,7 +1701,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-8); else if (aiData->hpPercents[battlerAtk] <= 50) ADJUST_SCORE(-10); - else if (HasSubstituteIgnoringMove(battlerDef)) + else if (HasMoveWithFlag(battlerDef, MoveIgnoresSubstitute)) ADJUST_SCORE(-8); break; case EFFECT_LEECH_SEED: @@ -2366,7 +2366,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); // no teammates to assist from break; case EFFECT_MAGIC_COAT: - if (!HasMagicCoatAffectedMove(battlerDef)) + if (!HasMoveWithFlag(battlerDef, MoveCanBeBouncedBack)) ADJUST_SCORE(-10); break; case EFFECT_YAWN: @@ -2413,8 +2413,8 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); break; case EFFECT_SNATCH: - if (!HasSnatchAffectedMove(battlerDef) - || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + if (!HasMoveWithFlag(battlerDef, MoveCanBeSnatched) + || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; case EFFECT_POWER_TRICK: @@ -4073,9 +4073,9 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_FOCUS_ENERGY: case EFFECT_LASER_FOCUS: if (aiData->abilities[battlerAtk] == ABILITY_SUPER_LUCK - || aiData->abilities[battlerAtk] == ABILITY_SNIPER - || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS - || HasHighCritRatioMove(battlerAtk)) + || aiData->abilities[battlerAtk] == ABILITY_SNIPER + || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SCOPE_LENS + || HasMoveWithFlag(battlerAtk, GetMoveCriticalHitStage)) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_CONFUSE: @@ -4362,7 +4362,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithType(battlerDef, TYPE_WATER) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_WATER)) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveThatHas50AccuracyInSun(battlerDef) || HasMoveThatHas50AccuracyInSun(BATTLE_PARTNER(battlerDef))) + if (HasMoveWithFlag(battlerDef, MoveHas50AccuracyInSun) || HasMoveWithFlag(BATTLE_PARTNER(battlerDef), MoveHas50AccuracyInSun)) ADJUST_SCORE(WEAK_EFFECT); } break; diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6a1e6ea681..7e74f2532d 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1766,7 +1766,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_OVERCOAT || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveThatAlwaysHitsInHailSnow(battler) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -1787,7 +1787,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff || atkAbility == ABILITY_HYDRATION || atkAbility == ABILITY_RAIN_DISH || atkAbility == ABILITY_DRY_SKIN - || HasMoveThatAlwaysHitsInRain(battlerAtk) + || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) || HasMoveWithType(battlerAtk, TYPE_WATER))) { @@ -1833,7 +1833,7 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_FORECAST || ability == ABILITY_SLUSH_RUSH || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveThatAlwaysHitsInHailSnow(battler) + || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) || HasMoveEffect(battler, EFFECT_AURORA_VEIL) || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { @@ -2647,87 +2647,17 @@ bool32 HasDamagingMoveOfType(u32 battlerId, u32 type) return FALSE; } -bool32 HasSubstituteIgnoringMove(u32 battler) +bool32 HasMoveWithFlag(u32 battler, MoveFlag getFlag) { - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveIgnoresSubstitute(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasHighCritRatioMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && GetMoveCriticalHitStage(moves[i]) > 0) - return TRUE; - } - - return FALSE; -} - -bool32 HasMagicCoatAffectedMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeBouncedBack(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasSnatchAffectedMove(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveCanBeSnatched(moves[i])) - return TRUE; - } - return FALSE; -} - -bool32 HasMoveThatAlwaysHitsInRain(u32 battler) -{ - s32 i; u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInRain(moves[i])) - return TRUE; - } - return FALSE; -} + u32 moveLimitations = gAiLogicData->moveLimitations[battler]; -bool32 HasMoveThatHas50AccuracyInSun(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) + for (s32 moveIndex = 0; moveIndex < MAX_MON_MOVES; moveIndex++) { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveHas50AccuracyInSun(moves[i])) - return TRUE; - } - return FALSE; -} + if (IsMoveUnusable(moveIndex, moves[moveIndex], moveLimitations)) + continue; -bool32 HasMoveThatAlwaysHitsInHailSnow(u32 battler) -{ - s32 i; - u16 *moves = GetMovesArray(battler); - for (i = 0; i < MAX_MON_MOVES; i++) - { - if (moves[i] != MOVE_NONE && moves[i] != MOVE_UNAVAILABLE && MoveAlwaysHitsInHailSnow(moves[i])) + if (getFlag(moves[moveIndex])) return TRUE; } return FALSE; From c133da2437349de86497f0d607a5070b302c90f4 Mon Sep 17 00:00:00 2001 From: Jonathan Lin <35115312+LinathanZel@users.noreply.github.com> Date: Fri, 16 May 2025 15:26:28 -0400 Subject: [PATCH 072/187] Fix to warnings pertaining to Mega Evolution and Ultra Burst RGB values (#6883) --- data/battle_anim_scripts.s | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 8ced318ac7..4338d70ce1 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -28673,7 +28673,7 @@ gBattleAnimGeneral_MegaEvolution:: loadspritegfx ANIM_TAG_MEGA_PARTICLES loadspritegfx ANIM_TAG_MEGA_SYMBOL loadspritegfx ANIM_TAG_ELECTRICITY - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(228, 0, 120) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_ELECTRICITY, 0, 12, 12, RGB(29, 0, 29) monbg ANIM_ATTACKER setalpha 12, 8 loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER, 13, 3 @@ -29012,7 +29012,7 @@ gBattleAnimGeneral_UltraBurst:: loadspritegfx ANIM_TAG_HYDRO_PUMP monbg ANIM_ATTACKER setalpha 12, 8 - createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB(250, 240, 230) + createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_HYDRO_PUMP, 0, 12, 12, RGB2GBA(250, 240, 230) createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_ADJACENT), 0x2, 0x0, 0xF, 0x0000 waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 60, 2, 12 @ charge particles to attacker From edf7c677750e1924e8db5d31f16a040ef0233806 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 16 May 2025 16:52:51 -0400 Subject: [PATCH 073/187] Remove non-volatile status EFFECTs (#6772) --- include/battle_ai_util.h | 3 +- include/battle_scripts.h | 1 - include/constants/battle_move_effects.h | 6 +- include/move.h | 14 +- src/battle_ai_main.c | 152 ++++++++++------ src/battle_ai_switch_items.c | 7 +- src/battle_ai_util.c | 64 ++++--- src/battle_dome.c | 27 ++- src/battle_script_commands.c | 7 +- src/battle_tv.c | 16 ++ .../battle_pyramid_wild_requirements.h | 6 +- src/data/battle_move_effects.h | 32 +--- src/data/moves_info.h | 26 +-- test/battle/ability/corrosion.c | 36 ++-- test/battle/ability/flower_veil.c | 10 +- test/battle/ability/hyper_cutter.c | 3 +- test/battle/ability/immunity.c | 3 +- test/battle/ability/insomnia.c | 3 +- test/battle/ability/leaf_guard.c | 12 +- test/battle/ability/limber.c | 2 +- test/battle/ability/liquid_ooze.c | 3 +- test/battle/ability/magic_bounce.c | 9 +- test/battle/ability/pastel_veil.c | 2 +- test/battle/ability/purifying_salt.c | 12 +- test/battle/ability/sweet_veil.c | 2 +- test/battle/ability/synchronize.c | 3 +- test/battle/ability/thermal_exchange.c | 9 +- test/battle/ability/water_bubble.c | 2 +- test/battle/ai/ai.c | 9 +- test/battle/ai/ai_switching.c | 6 +- test/battle/move_effect/defog.c | 3 +- test/battle/move_effect/instruct.c | 3 +- test/battle/move_effect/magic_coat.c | 3 +- test/battle/move_effect/metronome.c | 3 +- test/battle/move_effect/mirror_move.c | 3 +- test/battle/move_effect/refresh.c | 3 +- test/battle/move_effect/retaliate.c | 9 +- test/battle/move_effect/sleep.c | 3 +- test/battle/move_effect/take_heart.c | 3 +- test/battle/move_effect/toxic.c | 2 +- test/battle/sleep_clause.c | 165 ++++++++++++------ test/battle/status1/burn.c | 2 +- test/battle/status1/poison.c | 3 +- 43 files changed, 427 insertions(+), 265 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 1e35dbf532..791e49cddd 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -135,6 +135,7 @@ bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensiv bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); bool32 HasMoveWithCriticalHitChance(u32 battlerId); @@ -143,7 +144,7 @@ bool32 HasMoveThatLowersOwnStats(u32 battlerId); bool32 HasMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef, u32 accCheck, bool32 ignoreStatus, u32 atkAbility, u32 defAbility, u32 atkHoldEffect, u32 defHoldEffect); bool32 HasAnyKnownMove(u32 battlerId); bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect); -bool32 IsNonVolatileStatusMoveEffect(enum BattleMoveEffects moveEffect); +bool32 IsNonVolatileStatusMove(u32 moveEffect); bool32 IsMoveRedirectionPrevented(u32 battlerAtk, u32 move, u32 atkAbility); bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move); bool32 IsHazardMove(u32 move); diff --git a/include/battle_scripts.h b/include/battle_scripts.h index dfa78de15d..0b12113cdb 100644 --- a/include/battle_scripts.h +++ b/include/battle_scripts.h @@ -867,7 +867,6 @@ extern const u8 BattleScript_EffectFickleBeam[]; extern const u8 BattleScript_FickleBeamDoubled[]; extern const u8 BattleScript_QuestionForfeitBattle[]; extern const u8 BattleScript_ForfeitBattleGaveMoney[]; -extern const u8 BattleScript_EffectNonVolatileStatus[]; extern const u8 BattleScript_AbilityPopUp[]; #endif // GUARD_BATTLE_SCRIPTS_H diff --git a/include/constants/battle_move_effects.h b/include/constants/battle_move_effects.h index 5d82157a15..eb0756bd40 100644 --- a/include/constants/battle_move_effects.h +++ b/include/constants/battle_move_effects.h @@ -5,7 +5,7 @@ enum BattleMoveEffects { EFFECT_PLACEHOLDER, EFFECT_HIT, - EFFECT_SLEEP, + EFFECT_NON_VOLATILE_STATUS, EFFECT_ABSORB, EFFECT_EXPLOSION, EFFECT_DREAM_EATER, @@ -31,7 +31,6 @@ enum BattleMoveEffects EFFECT_MULTI_HIT, EFFECT_CONVERSION, EFFECT_RESTORE_HP, - EFFECT_TOXIC, EFFECT_LIGHT_SCREEN, EFFECT_REST, EFFECT_OHKO, @@ -59,8 +58,6 @@ enum BattleMoveEffects EFFECT_ACCURACY_DOWN_2, EFFECT_EVASION_DOWN_2, EFFECT_REFLECT, - EFFECT_POISON, - EFFECT_PARALYZE, EFFECT_TWO_TURNS_ATTACK, EFFECT_SUBSTITUTE, EFFECT_RAGE, @@ -138,7 +135,6 @@ enum BattleMoveEffects EFFECT_HAIL, EFFECT_TORMENT, EFFECT_FLATTER, - EFFECT_WILL_O_WISP, EFFECT_MEMENTO, EFFECT_FACADE, EFFECT_FOCUS_PUNCH, diff --git a/include/move.h b/include/move.h index 1a70a81460..16ede9d809 100644 --- a/include/move.h +++ b/include/move.h @@ -2,6 +2,7 @@ #define GUARD_MOVES_H #include "contest_effect.h" +#include "constants/battle.h" #include "constants/battle_move_effects.h" #include "constants/moves.h" @@ -535,9 +536,18 @@ static inline u32 GetMoveRecoil(u32 moveId) return gMovesInfo[SanitizeMoveId(moveId)].argument.recoilPercentage; } -static inline u32 GetMoveNonVolatileStatus(u32 moveId) +static inline u32 GetMoveNonVolatileStatus(u32 move) { - return gMovesInfo[SanitizeMoveId(moveId)].argument.nonVolatileStatus; + move = SanitizeMoveId(move); + switch(GetMoveEffect(move)) + { + case EFFECT_NON_VOLATILE_STATUS: + case EFFECT_YAWN: + case EFFECT_DARK_VOID: + return gMovesInfo[move].argument.nonVolatileStatus; + default: + return MOVE_EFFECT_NONE; + } } static inline const struct AdditionalEffect *GetMoveAdditionalEffectById(u32 moveId, u32 effect) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index f62ff4376d..dc2e36adc0 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -996,6 +996,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { // move data enum BattleMoveEffects moveEffect = GetMoveEffect(move); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); s32 moveType; u32 moveTarget = GetBattlerMoveTargetType(battlerAtk, move); struct AiLogicData *aiData = gAiLogicData; @@ -1027,8 +1028,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); // Don't setup into expected Focus Punch. - if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS && moveEffect != EFFECT_SLEEP && GetMoveEffect(predictedMove) != EFFECT_FOCUS_PUNCH - && GetMoveEffect(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == EFFECT_FOCUS_PUNCH && RandomPercentage(RNG_AI_STATUS_FOCUS_PUNCH, STATUS_MOVE_FOCUS_PUNCH_CHANCE)) + if (GetMoveCategory(move) == DAMAGE_CATEGORY_STATUS + && nonVolatileStatus != MOVE_EFFECT_SLEEP + && GetMoveEffect(predictedMove) != EFFECT_FOCUS_PUNCH + && GetMoveEffect(GetBestDmgMoveFromBattler(battlerDef, battlerAtk, AI_DEFENDING)) == EFFECT_FOCUS_PUNCH + && RandomPercentage(RNG_AI_STATUS_FOCUS_PUNCH, STATUS_MOVE_FOCUS_PUNCH_CHANCE)) { RETURN_SCORE_MINUS(20); } @@ -1091,9 +1095,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case ABILITY_MAGIC_GUARD: switch (moveEffect) { - case EFFECT_POISON: - case EFFECT_WILL_O_WISP: - case EFFECT_TOXIC: case EFFECT_LEECH_SEED: ADJUST_SCORE(-5); break; @@ -1104,6 +1105,16 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } + + switch(nonVolatileStatus) + { + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_TOXIC: + case MOVE_EFFECT_BURN: + ADJUST_SCORE(-5); + break; + } + break; break; case ABILITY_WONDER_GUARD: if (effectiveness < UQ_4_12(2.0)) @@ -1123,11 +1134,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); break; case ABILITY_SWEET_VEIL: - if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) + if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(10); break; case ABILITY_FLOWER_VEIL: - if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) && (IsNonVolatileStatusMoveEffect(moveEffect))) + if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) && (IsNonVolatileStatusMove(move))) RETURN_SCORE_MINUS(10); break; case ABILITY_MAGIC_BOUNCE: @@ -1139,17 +1150,17 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); break; case ABILITY_COMATOSE: - if (IsNonVolatileStatusMoveEffect(moveEffect)) + if (IsNonVolatileStatusMove(move)) RETURN_SCORE_MINUS(10); break; case ABILITY_SHIELDS_DOWN: - if (IsShieldsDownProtected(battlerAtk, aiData->abilities[battlerAtk]) && IsNonVolatileStatusMoveEffect(moveEffect)) + if (IsShieldsDownProtected(battlerAtk, aiData->abilities[battlerAtk]) && IsNonVolatileStatusMove(move)) RETURN_SCORE_MINUS(10); break; case ABILITY_LEAF_GUARD: if ((AI_GetWeather() & B_WEATHER_SUN) && aiData->holdEffects[battlerDef] != HOLD_EFFECT_UTILITY_UMBRELLA - && IsNonVolatileStatusMoveEffect(moveEffect)) + && IsNonVolatileStatusMove(move)) RETURN_SCORE_MINUS(10); break; } // def ability checks @@ -1172,11 +1183,11 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(20); break; case ABILITY_SWEET_VEIL: - if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) + if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(20); break; case ABILITY_FLOWER_VEIL: - if ((IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS)) && (IsNonVolatileStatusMoveEffect(moveEffect) || IsStatLoweringEffect(moveEffect))) + if ((IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS)) && (IsNonVolatileStatusMove(move) || IsStatLoweringEffect(moveEffect))) RETURN_SCORE_MINUS(10); break; case ABILITY_AROMA_VEIL: @@ -1195,13 +1206,13 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) // terrain & effect checks if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_ELECTRIC_TERRAIN)) { - if (moveEffect == EFFECT_SLEEP || moveEffect == EFFECT_YAWN) + if (nonVolatileStatus == MOVE_EFFECT_SLEEP) RETURN_SCORE_MINUS(20); } if (IsBattlerTerrainAffected(battlerDef, STATUS_FIELD_MISTY_TERRAIN)) { - if (IsNonVolatileStatusMoveEffect(moveEffect) || IsConfusionMoveEffect(moveEffect)) + if (IsNonVolatileStatusMove(move) || IsConfusionMoveEffect(moveEffect)) RETURN_SCORE_MINUS(20); } @@ -1261,12 +1272,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) break; default: break; // check move damage - case EFFECT_SLEEP: - if (!AI_CanPutToSleep(battlerAtk, battlerDef, abilityDef, move, aiData->partnerMove)) - ADJUST_SCORE(-10); - if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) - ADJUST_SCORE(-20); - break; case EFFECT_EXPLOSION: if (!(gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE)) ADJUST_SCORE(-2); @@ -1609,7 +1614,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) ADJUST_SCORE(-10); if (HasMoveEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) ADJUST_SCORE(-10); - if (HasMoveEffect(battlerAtk, EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) + if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); break; case EFFECT_COUNTER: @@ -1634,13 +1639,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!ShouldLowerStat(battlerAtk, battlerDef, abilityDef, STAT_SPEED)) ADJUST_SCORE(-1); // may still want to just poison //fallthrough - case EFFECT_POISON: - case EFFECT_TOXIC: - if (!AI_CanPoison(battlerAtk, battlerDef, abilityDef, move, aiData->partnerMove)) - ADJUST_SCORE(-10); - if (!ShouldPoison(battlerAtk, battlerDef)) - ADJUST_SCORE(-5); - break; case EFFECT_LIGHT_SCREEN: if (gSideStatuses[GetBattlerSide(battlerAtk)] & SIDE_STATUS_LIGHTSCREEN || PartnerHasSameMoveEffectWithoutTarget(BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) @@ -1680,12 +1678,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (!AI_CanConfuse(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) ADJUST_SCORE(-10); break; - case EFFECT_PARALYZE: - if (!AI_CanParalyze(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) - ADJUST_SCORE(-10); - if (!ShouldParalyze(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-5); - break; case EFFECT_SUBSTITUTE: if (gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE || aiData->abilities[battlerDef] == ABILITY_INFILTRATOR) ADJUST_SCORE(-8); @@ -1974,12 +1966,6 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (B_MENTAL_HERB >= GEN_5 && aiData->holdEffects[battlerDef] == HOLD_EFFECT_MENTAL_HERB) ADJUST_SCORE(-6); break; - case EFFECT_WILL_O_WISP: - if (!AI_CanBurn(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) - ADJUST_SCORE(-10); - if (!ShouldBurn(battlerAtk, battlerDef, aiData->abilities[battlerDef])) - ADJUST_SCORE(-5); - break; case EFFECT_MEMENTO: if (CountUsablePartyMons(battlerAtk) == 0 || DoesPartnerHaveSameMoveEffect(BATTLE_PARTNER(battlerAtk), battlerDef, move, aiData->partnerMove)) ADJUST_SCORE(-10); @@ -2864,6 +2850,36 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) return 0; // cannot even select } // move effect checks + // check non-volatile effects + switch(nonVolatileStatus) + { + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_TOXIC: + if (!AI_CanPoison(battlerAtk, battlerDef, abilityDef, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + if (!ShouldPoison(battlerAtk, battlerDef)) + ADJUST_SCORE(-5); + break; + case MOVE_EFFECT_SLEEP: + if (!AI_CanPutToSleep(battlerAtk, battlerDef, abilityDef, move, aiData->partnerMove)) + ADJUST_SCORE(-10); + if (PartnerMoveActivatesSleepClause(aiData->partnerMove)) + ADJUST_SCORE(-20); + break; + case MOVE_EFFECT_PARALYSIS: + if (!AI_CanParalyze(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, aiData->partnerMove)) + ADJUST_SCORE(-10); + if (!ShouldParalyze(battlerAtk, battlerDef, aiData->abilities[battlerDef])) + ADJUST_SCORE(-5); + break; + case MOVE_EFFECT_BURN: + if (!AI_CanBurn(battlerAtk, battlerDef, aiData->abilities[battlerDef], BATTLE_PARTNER(battlerAtk), move, aiData->partnerMove)) + ADJUST_SCORE(-10); + if (!ShouldBurn(battlerAtk, battlerDef, aiData->abilities[battlerDef])) + ADJUST_SCORE(-5); + break; + } + // Choice items if (HOLD_EFFECT_CHOICE(aiData->holdEffects[battlerAtk]) && IsBattlerItemEnabled(battlerAtk)) { @@ -3790,10 +3806,26 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(-20); // Force switch if all your attacking moves are physical and you have Natural Cure. } + // Non-volatile statuses + switch(GetMoveNonVolatileStatus(move)) + { + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_TOXIC: + IncreasePoisonScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_SLEEP: + IncreaseSleepScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_PARALYSIS: + IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score); + break; + case MOVE_EFFECT_BURN: + IncreaseBurnScore(battlerAtk, battlerDef, move, &score); + break; + } // move effect checks switch (moveEffect) { - case EFFECT_SLEEP: case EFFECT_YAWN: IncreaseSleepScore(battlerAtk, battlerDef, move, &score); break; @@ -4029,10 +4061,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) if (ShouldRecover(battlerAtk, battlerDef, move, 50, AI_DEFENDING)) ADJUST_SCORE(GOOD_EFFECT); break; - case EFFECT_TOXIC: - case EFFECT_POISON: - IncreasePoisonScore(battlerAtk, battlerDef, move, &score); - break; case EFFECT_LIGHT_SCREEN: case EFFECT_REFLECT: case EFFECT_AURORA_VEIL: @@ -4081,9 +4109,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_CONFUSE: IncreaseConfusionScore(battlerAtk, battlerDef, move, &score); break; - case EFFECT_PARALYZE: - IncreaseParalyzeScore(battlerAtk, battlerDef, move, &score); - break; case EFFECT_SUBSTITUTE: case EFFECT_SHED_TAIL: ADJUST_SCORE(IncreaseSubstituteMoveScore(battlerAtk, battlerDef, move)); @@ -4164,13 +4189,25 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_ENCORE: + { if (GetActiveGimmick(battlerDef) == GIMMICK_DYNAMAX) break; - else if (gDisableStructs[battlerDef].encoreTimer == 0 + + bool32 encourage = gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore; + + switch(GetMoveNonVolatileStatus(gLastMoves[battlerDef])) + { + case MOVE_EFFECT_POISON: + case MOVE_EFFECT_PARALYSIS: + encourage = TRUE; + break; + } + if (gDisableStructs[battlerDef].encoreTimer == 0 && (B_MENTAL_HERB < GEN_5 || aiData->holdEffects[battlerDef] != HOLD_EFFECT_MENTAL_HERB) - && (gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore)) + && (encourage)) ADJUST_SCORE(BEST_EFFECT); break; + } case EFFECT_SLEEP_TALK: case EFFECT_SNORE: if (!IsWakeupTurn(battlerAtk) && gBattleMons[battlerAtk].status1 & STATUS1_SLEEP) @@ -4464,9 +4501,6 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; case EFFECT_TORMENT: break; - case EFFECT_WILL_O_WISP: - IncreaseBurnScore(battlerAtk, battlerDef, move, &score); - break; case EFFECT_FOLLOW_ME: if (isDoubleBattle && GetMoveTarget(move) == MOVE_TARGET_USER @@ -5360,8 +5394,7 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 case EFFECT_ACCURACY_DOWN_2: case EFFECT_EVASION_DOWN_2: case EFFECT_REFLECT: - case EFFECT_POISON: - case EFFECT_PARALYZE: + case EFFECT_NON_VOLATILE_STATUS: case EFFECT_SUBSTITUTE: case EFFECT_LEECH_SEED: case EFFECT_MINIMIZE: @@ -5372,7 +5405,6 @@ static s32 AI_ForceSetupFirstTurn(u32 battlerAtk, u32 battlerDef, u32 move, s32 case EFFECT_DEFENSE_CURL: case EFFECT_TORMENT: case EFFECT_FLATTER: - case EFFECT_WILL_O_WISP: case EFFECT_INGRAIN: case EFFECT_IMPRISON: case EFFECT_TICKLE: @@ -5741,7 +5773,6 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) case EFFECT_SPECIAL_DEFENSE_DOWN_2: case EFFECT_ACCURACY_DOWN_2: case EFFECT_EVASION_DOWN_2: - case EFFECT_POISON: case EFFECT_PAIN_SPLIT: case EFFECT_PERISH_SONG: case EFFECT_SAFEGUARD: @@ -5757,6 +5788,13 @@ static s32 AI_HPAware(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } + + switch(GetMoveNonVolatileStatus(move)) + { + case MOVE_EFFECT_POISON: + ADJUST_SCORE(-2); + break; + } } else { diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 9f2691f7a7..76b7cc0565 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -204,11 +204,16 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) aiMoveEffect = GetMoveEffect(aiMove); if (aiMove != MOVE_NONE) { + u32 nonVolatileStatus = GetMoveNonVolatileStatus(aiMove); // Check if mon has an "important" status move if (aiMoveEffect == EFFECT_REFLECT || aiMoveEffect == EFFECT_LIGHT_SCREEN || aiMoveEffect == EFFECT_SPIKES || aiMoveEffect == EFFECT_TOXIC_SPIKES || aiMoveEffect == EFFECT_STEALTH_ROCK || aiMoveEffect == EFFECT_STICKY_WEB || aiMoveEffect == EFFECT_LEECH_SEED || aiMoveEffect == EFFECT_EXPLOSION - || aiMoveEffect == EFFECT_SLEEP || aiMoveEffect == EFFECT_YAWN || aiMoveEffect == EFFECT_TOXIC || aiMoveEffect == EFFECT_WILL_O_WISP || aiMoveEffect == EFFECT_PARALYZE + || nonVolatileStatus == MOVE_EFFECT_SLEEP + || nonVolatileStatus == MOVE_EFFECT_TOXIC + || nonVolatileStatus == MOVE_EFFECT_PARALYSIS + || nonVolatileStatus == MOVE_EFFECT_BURN + || aiMoveEffect == EFFECT_YAWN || aiMoveEffect == EFFECT_TRICK || aiMoveEffect == EFFECT_TRICK_ROOM || aiMoveEffect== EFFECT_WONDER_ROOM || aiMoveEffect == EFFECT_PSYCHO_SHIFT || aiMoveEffect == EFFECT_FIRST_TURN_ONLY ) { diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 7e74f2532d..d6f3a5b533 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1504,20 +1504,9 @@ bool32 IsAromaVeilProtectedEffect(enum BattleMoveEffects moveEffect) } } -bool32 IsNonVolatileStatusMoveEffect(enum BattleMoveEffects moveEffect) +bool32 IsNonVolatileStatusMove(u32 move) { - switch (moveEffect) - { - case EFFECT_SLEEP: - case EFFECT_TOXIC: - case EFFECT_POISON: - case EFFECT_PARALYZE: - case EFFECT_WILL_O_WISP: - case EFFECT_YAWN: - return TRUE; - default: - return FALSE; - } + return GetMoveNonVolatileStatus(move) != MOVE_EFFECT_NONE; } bool32 IsConfusionMoveEffect(enum BattleMoveEffects moveEffect) @@ -1678,8 +1667,10 @@ bool32 IsMoveEncouragedToHit(u32 battlerAtk, u32 battlerDef, u32 move) if (gAiLogicData->abilities[battlerDef] == ABILITY_NO_GUARD || gAiLogicData->abilities[battlerAtk] == ABILITY_NO_GUARD) return TRUE; - enum BattleMoveEffects effect = GetMoveEffect(move); - if (B_TOXIC_NEVER_MISS >= GEN_6 && effect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) + u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); + if (B_TOXIC_NEVER_MISS >= GEN_6 + && nonVolatileStatus == MOVE_EFFECT_TOXIC + && IS_BATTLER_OF_TYPE(battlerAtk, TYPE_POISON)) return TRUE; // discouraged from hitting @@ -2201,6 +2192,20 @@ bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects effect) return FALSE; } +bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect) +{ + s32 i; + u16 *moves = GetMovesArray(battlerId); + + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (GetMoveNonVolatileStatus(moves[i]) == effect) + return TRUE; + } + + return FALSE; +} + bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument) { s32 i; @@ -2348,7 +2353,8 @@ bool32 HasSleepMoveWithLowAccuracy(u32 battlerAtk, u32 battlerDef) if (IsMoveUnusable(i, moves[i], moveLimitations)) continue; - if (GetMoveEffect(moves[i]) == EFFECT_SLEEP && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] < 85) + if (GetMoveNonVolatileStatus(moves[i]) == MOVE_EFFECT_SLEEP + && gAiLogicData->moveAccuracy[battlerAtk][battlerDef][i] < 85) return TRUE; } return FALSE; @@ -2594,13 +2600,17 @@ static inline bool32 IsMoveSleepClauseTrigger(u32 move) // Sleeping effects like Sleep Powder, Yawn, Dark Void, etc. switch (effect) { - case EFFECT_SLEEP: case EFFECT_YAWN: case EFFECT_DARK_VOID: return TRUE; default: break; } + switch(GetMoveNonVolatileStatus(move)) + { + case MOVE_EFFECT_SLEEP: + return TRUE; + } // Sleeping effects like G-Max Befuddle, G-Max Snooze, etc. u32 additionalEffectCount = GetMoveAdditionalEffectCount(move); @@ -3614,13 +3624,14 @@ bool32 PartnerMoveEffectIsStatusSameTarget(u32 battlerAtkPartner, u32 battlerDef return FALSE; enum BattleMoveEffects partnerEffect = GetMoveEffect(partnerMove); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(partnerMove); if (partnerMove != MOVE_NONE && gBattleStruct->moveTarget[battlerAtkPartner] == battlerDef - && (partnerEffect == EFFECT_SLEEP - || partnerEffect == EFFECT_POISON - || partnerEffect == EFFECT_TOXIC - || partnerEffect == EFFECT_PARALYZE - || partnerEffect == EFFECT_WILL_O_WISP + && (nonVolatileStatus == MOVE_EFFECT_POISON + || nonVolatileStatus == MOVE_EFFECT_TOXIC + || nonVolatileStatus == MOVE_EFFECT_SLEEP + || nonVolatileStatus == MOVE_EFFECT_PARALYSIS + || nonVolatileStatus == MOVE_EFFECT_BURN || partnerEffect == EFFECT_YAWN)) return TRUE; return FALSE; @@ -4494,11 +4505,10 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) if (IsBattlerPredictedToSwitch(battlerDef)) scoreIncrease += DECENT_EFFECT; - if (HasMoveEffect(battlerDef, EFFECT_SLEEP) - || HasMoveEffect(battlerDef, EFFECT_TOXIC) - || HasMoveEffect(battlerDef, EFFECT_POISON) - || HasMoveEffect(battlerDef, EFFECT_PARALYZE) - || HasMoveEffect(battlerDef, EFFECT_WILL_O_WISP) + if (HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_SLEEP) + || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_TOXIC) + || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_PARALYSIS) + || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_BURN) || HasMoveEffect(battlerDef, EFFECT_CONFUSE) || HasMoveEffect(battlerDef, EFFECT_LEECH_SEED)) scoreIncrease += GOOD_EFFECT; diff --git a/src/battle_dome.c b/src/battle_dome.c index 420394d929..ce1c693adf 100644 --- a/src/battle_dome.c +++ b/src/battle_dome.c @@ -4002,25 +4002,26 @@ static bool32 IsDomeStatusMoveEffect(u32 move) { switch(GetMoveEffect(move)) { - case EFFECT_SLEEP: case EFFECT_CONFUSE: case EFFECT_DISABLE: - case EFFECT_POISON: - case EFFECT_PARALYZE: - case EFFECT_TOXIC: case EFFECT_LEECH_SEED: case EFFECT_TAUNT: case EFFECT_TORMENT: - case EFFECT_WILL_O_WISP: case EFFECT_ENCORE: case EFFECT_ATTRACT: case EFFECT_NIGHTMARE: - case EFFECT_YAWN: case EFFECT_CURSE: return TRUE; default: - return MoveHasAdditionalEffect(move, MOVE_EFFECT_WRAP); + break; } + + if (GetMoveNonVolatileStatus(move) != MOVE_EFFECT_NONE) + return TRUE; + if (MoveHasAdditionalEffect(move, MOVE_EFFECT_WRAP)) + return TRUE; + + return FALSE; } static bool32 IsDomeRareMove(u32 move) @@ -4085,8 +4086,6 @@ static bool32 IsDomeComboMove(u32 move) case EFFECT_TOXIC_SPIKES: case EFFECT_STEALTH_ROCK: case EFFECT_STICKY_WEB: - // Inflicting sleep & related effects - case EFFECT_SLEEP: case EFFECT_YAWN: case EFFECT_DREAM_EATER: case EFFECT_NIGHTMARE: @@ -4121,11 +4120,21 @@ static bool32 IsDomeComboMove(u32 move) break; } + // Move flags if (MoveAlwaysHitsInRain(move)) return TRUE; else if (MoveAlwaysHitsInHailSnow(move)) return TRUE; + // Inflicting sleep & related effects + switch(GetMoveNonVolatileStatus(move)) + { + case MOVE_EFFECT_SLEEP: + return TRUE; + default: + return FALSE; + } + return FALSE; } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 55125f4926..cd71a35e8c 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1280,7 +1280,7 @@ static void Cmd_attackcanceler(void) ABILITY_RUN_SCRIPT)) return; - if (effect == EFFECT_PARALYZE) + if (GetMoveNonVolatileStatus(gCurrentMove) == MOVE_EFFECT_PARALYSIS) { if (CanAbilityAbsorbMove(gBattlerAttacker, gBattlerTarget, @@ -1493,9 +1493,12 @@ static bool32 AccuracyCalcHelper(u32 move, u32 battler) bool32 effect = FALSE; u32 ability = ABILITY_NONE; enum BattleMoveEffects moveEffect = GetMoveEffect(move); + u32 nonVolatileStatus = GetMoveNonVolatileStatus(move); if ((gStatuses3[battler] & STATUS3_ALWAYS_HITS && gDisableStructs[battler].battlerWithSureHit == gBattlerAttacker) - || (B_TOXIC_NEVER_MISS >= GEN_6 && moveEffect == EFFECT_TOXIC && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) + || (B_TOXIC_NEVER_MISS >= GEN_6 + && nonVolatileStatus == MOVE_EFFECT_TOXIC + && IS_BATTLER_OF_TYPE(gBattlerAttacker, TYPE_POISON)) || gStatuses4[battler] & STATUS4_GLAIVE_RUSH) { effect = TRUE; diff --git a/src/battle_tv.c b/src/battle_tv.c index 953932cfed..96ce633440 100644 --- a/src/battle_tv.c +++ b/src/battle_tv.c @@ -809,6 +809,22 @@ static void AddMovePoints(u8 caseId, u16 arg1, u8 arg2, u8 arg3) default: break; } + switch(GetMoveNonVolatileStatus(arg2)) + { + case MOVE_EFFECT_SLEEP: + baseFromEffect++; + break; + case MOVE_EFFECT_PARALYSIS: + baseFromEffect += 3; + break; + case MOVE_EFFECT_BURN: + case MOVE_EFFECT_POISON: + baseFromEffect += 4; + break; + case MOVE_EFFECT_TOXIC: + baseFromEffect += 5; + break; + } // Guaranteed hit but without negative priority if (GetMoveAccuracy(move) == 0 && GetMovePriority(move) >= 0) diff --git a/src/data/battle_frontier/battle_pyramid_wild_requirements.h b/src/data/battle_frontier/battle_pyramid_wild_requirements.h index b559daf037..fd5695344a 100644 --- a/src/data/battle_frontier/battle_pyramid_wild_requirements.h +++ b/src/data/battle_frontier/battle_pyramid_wild_requirements.h @@ -13,7 +13,7 @@ struct BattlePyramidRequirement { u8 nEvoItems; }; -// EFFECT_PARALYZE, MOVE_EFFECT_PARALYZE (30% or more) +// MOVE_EFFECT_PARALYZE (30% or more) static const u16 sParalyzingMoves[] = { //MOVE_THUNDER_PUNCH, MOVE_BODY_SLAM, @@ -35,7 +35,7 @@ static const u16 sParalyzingMoves[] = { MOVE_COMBAT_TORQUE, }; -// MOVE_EFFECT_POISON (30% or more), EFFECT_POISON, MOVE_EFFECT_TOXIC, EFFECT_TOXIC, EFFECT_TOXIC_THREAD +// MOVE_EFFECT_POISON (30% or more), MOVE_EFFECT_TOXIC, EFFECT_TOXIC_THREAD static const u16 sPoisoningMoves[] = { MOVE_POISON_STING, //MOVE_TWINEEDLE, @@ -57,7 +57,7 @@ static const u16 sPoisoningMoves[] = { MOVE_TOXIC_THREAD, }; -// MOVE_EFFECT_BURN, EFFECT_WILL_O_WISP +// MOVE_EFFECT_BURN static const u16 sBurningMoves[] = { MOVE_WILL_O_WISP, //MOVE_EMBER, diff --git a/src/data/battle_move_effects.h b/src/data/battle_move_effects.h index 0ab2364ced..06b1fb3fd6 100644 --- a/src/data/battle_move_effects.h +++ b/src/data/battle_move_effects.h @@ -16,10 +16,10 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 1, }, - [EFFECT_SLEEP] = + [EFFECT_NON_VOLATILE_STATUS] = { .battleScript = BattleScript_EffectNonVolatileStatus, - .battleTvScore = 1, + .battleTvScore = 0, // Handled within the battle TV functions }, [EFFECT_ABSORB] = @@ -183,13 +183,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_TOXIC] = - { - .battleScript = BattleScript_EffectNonVolatileStatus, - .battleTvScore = 5, - .encourageEncore = TRUE, - }, - [EFFECT_LIGHT_SCREEN] = { .battleScript = BattleScript_EffectLightScreen, @@ -366,20 +359,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .encourageEncore = TRUE, }, - [EFFECT_POISON] = - { - .battleScript = BattleScript_EffectNonVolatileStatus, - .battleTvScore = 4, - .encourageEncore = TRUE, - }, - - [EFFECT_PARALYZE] = - { - .battleScript = BattleScript_EffectNonVolatileStatus, - .battleTvScore = 4, - .encourageEncore = TRUE, - }, - [EFFECT_TWO_TURNS_ATTACK] = { .battleScript = BattleScript_EffectTwoTurnsAttack, @@ -887,13 +866,6 @@ const struct BattleMoveEffect gBattleMoveEffects[NUM_BATTLE_MOVE_EFFECTS] = .battleTvScore = 7, }, - [EFFECT_WILL_O_WISP] = - { - .battleScript = BattleScript_EffectNonVolatileStatus, - .battleTvScore = 5, - .encourageEncore = TRUE, - }, - [EFFECT_MEMENTO] = { .battleScript = BattleScript_EffectMemento, diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 3ed1de6df2..1409943a54 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -1311,7 +1311,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A soothing song lulls the\n" "foe into a deep slumber."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_NORMAL, .accuracy = 55, @@ -2084,7 +2084,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters a toxic powder\n" "that may poison the foe."), - .effect = EFFECT_POISON, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_POISON, .accuracy = 75, @@ -2110,7 +2110,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters a powder that may\n" "paralyze the foe."), - .effect = EFFECT_PARALYZE, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_GRASS, .accuracy = 75, @@ -2136,7 +2136,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters a powder that may\n" "cause the foe to sleep."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_GRASS, .accuracy = 75, @@ -2321,7 +2321,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A weak jolt of electricity\n" "that paralyzes the foe."), - .effect = EFFECT_PARALYZE, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_ELECTRIC, .accuracy = B_UPDATED_MOVE_DATA >= GEN_7 ? 90 : 100, @@ -2473,7 +2473,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Poisons the foe with an\n" "intensifying toxin."), - .effect = EFFECT_TOXIC, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_POISON, .accuracy = B_UPDATED_MOVE_DATA >= GEN_5 ? 90 : 85, @@ -2549,7 +2549,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "A hypnotizing move that\n" "may induce sleep."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_PSYCHIC, .accuracy = 60, @@ -3656,7 +3656,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #else .accuracy = 75, #endif - .effect = EFFECT_PARALYZE, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_NORMAL, .pp = 30, @@ -3715,7 +3715,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = #else .accuracy = 55, #endif - .effect = EFFECT_POISON, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_POISON, .pp = 40, @@ -3785,7 +3785,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Demands a kiss with a scary\n" "face that induces sleep."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_NORMAL, .accuracy = 75, @@ -3926,7 +3926,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Scatters a cloud of spores\n" "that always induce sleep."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_GRASS, .accuracy = 100, @@ -6920,7 +6920,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Inflicts a burn on the foe\n" "with intense fire."), - .effect = EFFECT_WILL_O_WISP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_FIRE, .accuracy = B_UPDATED_MOVE_DATA >= GEN_6 ? 85 : 75, @@ -8459,7 +8459,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .description = COMPOUND_STRING( "Lulls the foe into sleep\n" "with a pleasant melody."), - .effect = EFFECT_SLEEP, + .effect = EFFECT_NON_VOLATILE_STATUS, .power = 0, .type = TYPE_GRASS, .accuracy = 55, diff --git a/test/battle/ability/corrosion.c b/test/battle/ability/corrosion.c index ffac25e54e..1e589967db 100644 --- a/test/battle/ability/corrosion.c +++ b/test/battle/ability/corrosion.c @@ -30,8 +30,10 @@ SINGLE_BATTLE_TEST("Corrosion can poison or badly poison a Steel type with a sta PARAMETRIZE { move = MOVE_TOXIC; } GIVEN { - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_BELDUM); } WHEN { @@ -111,8 +113,10 @@ SINGLE_BATTLE_TEST("If a Poison- or Steel-type PokΓ©mon with Corrosion poisons a PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } } WHEN { @@ -138,8 +142,10 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass moves that prevent poisoning such as PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -160,8 +166,10 @@ SINGLE_BATTLE_TEST("Corrosion cannot bypass abilities that prevent poisoning suc PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } } WHEN { @@ -182,8 +190,10 @@ SINGLE_BATTLE_TEST("Corrosion allows the PokΓ©mon with the ability to poison a S PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_BELDUM); @@ -206,8 +216,10 @@ SINGLE_BATTLE_TEST("Corrosion's effect is lost if the move used by the PokΓ©mon PARAMETRIZE { move = MOVE_TOXIC; } PARAMETRIZE { move = MOVE_POISON_POWDER; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_SALANDIT) { Ability(ABILITY_CORROSION); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/flower_veil.c b/test/battle/ability/flower_veil.c index 97349b6ba3..2b36d08d60 100644 --- a/test/battle/ability/flower_veil.c +++ b/test/battle/ability/flower_veil.c @@ -3,15 +3,15 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_GAS) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_POISON_GAS) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_GAS) == MOVE_EFFECT_POISON); - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); - ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); - ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); } diff --git a/test/battle/ability/hyper_cutter.c b/test/battle/ability/hyper_cutter.c index 696c2e136b..7b1070e613 100644 --- a/test/battle/ability/hyper_cutter.c +++ b/test/battle/ability/hyper_cutter.c @@ -43,7 +43,8 @@ SINGLE_BATTLE_TEST("Hyper Cutter prevents Attack stage reduction from moves") SINGLE_BATTLE_TEST("Hyper Cutter doesn't prevent Attack reduction from burn") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_KRABBY) { Ability(ABILITY_HYPER_CUTTER); } } WHEN { diff --git a/test/battle/ability/immunity.c b/test/battle/ability/immunity.c index 365b5d0d50..81fbe1b8c1 100644 --- a/test/battle/ability/immunity.c +++ b/test/battle/ability/immunity.c @@ -18,7 +18,8 @@ SINGLE_BATTLE_TEST("Immunity prevents Poison Sting poison") SINGLE_BATTLE_TEST("Immunity prevents Toxic bad poison") { GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_SNORLAX) { Ability(ABILITY_IMMUNITY); } } WHEN { diff --git a/test/battle/ability/insomnia.c b/test/battle/ability/insomnia.c index 533ca9ce85..61bb1931fa 100644 --- a/test/battle/ability/insomnia.c +++ b/test/battle/ability/insomnia.c @@ -4,7 +4,8 @@ SINGLE_BATTLE_TEST("Insomnia prevents sleep") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_DROWZEE) { Ability(ABILITY_INSOMNIA); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/leaf_guard.c b/test/battle/ability/leaf_guard.c index e04881ecb4..94785bd29b 100644 --- a/test/battle/ability/leaf_guard.c +++ b/test/battle/ability/leaf_guard.c @@ -11,10 +11,14 @@ SINGLE_BATTLE_TEST("Leaf Guard prevents non-volatile status conditions in sun") PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; } // PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } // Pointless since you can't freeze in sunlight anyway GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); - ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); - ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_LEAFEON) { Ability(ABILITY_LEAF_GUARD); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/ability/limber.c b/test/battle/ability/limber.c index fa18069946..f89f9a1e74 100644 --- a/test/battle/ability/limber.c +++ b/test/battle/ability/limber.c @@ -22,7 +22,7 @@ SINGLE_BATTLE_TEST("Limber prevents paralysis") SINGLE_BATTLE_TEST("Limber prevents paralysis from Thunder Wave") { GIVEN { - ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_PERSIAN) { Ability(ABILITY_LIMBER); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/liquid_ooze.c b/test/battle/ability/liquid_ooze.c index bb2fc81afa..0e5a0c6cf7 100644 --- a/test/battle/ability/liquid_ooze.c +++ b/test/battle/ability/liquid_ooze.c @@ -142,7 +142,8 @@ SINGLE_BATTLE_TEST("Liquid Ooze causes Dream Eater users to lose HP instead of h { s16 damage; GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_DREAM_EATER) == EFFECT_DREAM_EATER); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TENTACRUEL) { Ability(ABILITY_LIQUID_OOZE); } diff --git a/test/battle/ability/magic_bounce.c b/test/battle/ability/magic_bounce.c index 2731a21fed..e04c018a33 100644 --- a/test/battle/ability/magic_bounce.c +++ b/test/battle/ability/magic_bounce.c @@ -5,7 +5,8 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back status moves") { GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { @@ -23,7 +24,8 @@ SINGLE_BATTLE_TEST("Magic Bounce bounces back powder moves") { GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); - ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_STUN_SPORE) == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_WYNAUT); OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { @@ -118,7 +120,8 @@ DOUBLE_BATTLE_TEST("Magic Bounce bounces back moves hitting foes field") SINGLE_BATTLE_TEST("Magic Bounce bounced back status moves can not be bounced back by Magic Bounce") { GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } OPPONENT(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } } WHEN { diff --git a/test/battle/ability/pastel_veil.c b/test/battle/ability/pastel_veil.c index e7cd83426e..1c0926ac80 100644 --- a/test/battle/ability/pastel_veil.c +++ b/test/battle/ability/pastel_veil.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); } diff --git a/test/battle/ability/purifying_salt.c b/test/battle/ability/purifying_salt.c index 1c98466aef..49060e6596 100644 --- a/test/battle/ability/purifying_salt.c +++ b/test/battle/ability/purifying_salt.c @@ -61,10 +61,14 @@ SINGLE_BATTLE_TEST("Purifying Salt grants immunity to status effects") PARAMETRIZE { move = MOVE_TOXIC; status = STATUS1_TOXIC_POISON; } PARAMETRIZE { move = MOVE_POWDER_SNOW; status = STATUS1_FREEZE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); - ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); - ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); ASSUME(MoveHasAdditionalEffect(MOVE_POWDER_SNOW, MOVE_EFFECT_FREEZE_OR_FROSTBITE) == TRUE); PLAYER(SPECIES_WOBBUFFET) { Ability(ABILITY_PURIFYING_SALT); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ability/sweet_veil.c b/test/battle/ability/sweet_veil.c index 0e1322925f..56431055c6 100644 --- a/test/battle/ability/sweet_veil.c +++ b/test/battle/ability/sweet_veil.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); } diff --git a/test/battle/ability/synchronize.c b/test/battle/ability/synchronize.c index 83f960973c..e150e2950e 100644 --- a/test/battle/ability/synchronize.c +++ b/test/battle/ability/synchronize.c @@ -5,7 +5,8 @@ SINGLE_BATTLE_TEST("Synchronize will mirror back non volatile status back at opp { GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_ABRA) { Ability(ABILITY_SYNCHRONIZE); } diff --git a/test/battle/ability/thermal_exchange.c b/test/battle/ability/thermal_exchange.c index 90cf395f30..1eb621594f 100644 --- a/test/battle/ability/thermal_exchange.c +++ b/test/battle/ability/thermal_exchange.c @@ -4,7 +4,8 @@ SINGLE_BATTLE_TEST("Thermal Exchange makes Will-O-Wisp fail") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); PLAYER(SPECIES_BAXCALIBUR) { Ability(ABILITY_THERMAL_EXCHANGE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { @@ -37,7 +38,8 @@ SINGLE_BATTLE_TEST("Thermal Exchange prevents the user from getting burned when SINGLE_BATTLE_TEST("Thermal Exchange cures burns when acquired") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); ASSUME(GetMoveEffect(MOVE_SKILL_SWAP) == EFFECT_SKILL_SWAP); PLAYER(SPECIES_BAXCALIBUR) { Ability(ABILITY_THERMAL_EXCHANGE); } OPPONENT(SPECIES_WOBBUFFET); @@ -56,7 +58,8 @@ SINGLE_BATTLE_TEST("Thermal Exchange cures burns when acquired") SINGLE_BATTLE_TEST("Thermal Exchange burn prevention can be bypassed with Mold Breaker but is cured after") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); PLAYER(SPECIES_BAXCALIBUR) { Ability(ABILITY_THERMAL_EXCHANGE); } OPPONENT(SPECIES_RAMPARDOS) { Ability(ABILITY_MOLD_BREAKER); } } WHEN { diff --git a/test/battle/ability/water_bubble.c b/test/battle/ability/water_bubble.c index f6d838ae31..d140dac040 100644 --- a/test/battle/ability/water_bubble.c +++ b/test/battle/ability/water_bubble.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Water Bubble prevents burn from Will-o-Wisp") { GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); PLAYER(SPECIES_DEWPIDER) { Ability(ABILITY_WATER_BUBBLE); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 55942c2834..2bf7e0b910 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -802,9 +802,12 @@ AI_SINGLE_BATTLE_TEST("AI won't use status moves against opponents that would be PARAMETRIZE { aiMove = MOVE_TOXIC; } PARAMETRIZE { aiMove = MOVE_THUNDER_WAVE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_THUNDER_WAVE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_THUNDER_WAVE) == MOVE_EFFECT_PARALYSIS); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_SWELLOW) { Ability(ABILITY_GUTS); Moves(MOVE_TACKLE); } OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_TACKLE, aiMove); } diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index afde8a62ab..eb889f008e 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -612,7 +612,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if it has bee PARAMETRIZE { species = SPECIES_HARIYAMA, odds = SHOULD_SWITCH_BADLY_POISONED_PERCENTAGE; } PASSES_RANDOMLY(odds, 100, RNG_AI_SWITCH_BADLY_POISONED); GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING); PLAYER(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH, MOVE_CELEBRATE, MOVE_TOXIC, MOVE_AURA_SPHERE); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SCRATCH); } @@ -1138,7 +1139,8 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if all moves { PASSES_RANDOMLY(SHOULD_SWITCH_ALL_SCORES_BAD_PERCENTAGE, 100, RNG_AI_SWITCH_ALL_SCORES_BAD); GIVEN { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); ASSUME(GetMoveEffect(MOVE_POLTERGEIST) == EFFECT_POLTERGEIST); ASSUME(GetMoveType(MOVE_SCALD) == TYPE_WATER); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); diff --git a/test/battle/move_effect/defog.c b/test/battle/move_effect/defog.c index 6f9acc7dfc..d4c6650c72 100644 --- a/test/battle/move_effect/defog.c +++ b/test/battle/move_effect/defog.c @@ -13,7 +13,8 @@ ASSUMPTIONS ASSUME(GetMoveEffect(MOVE_SPIKES) == EFFECT_SPIKES); ASSUME(GetMoveEffect(MOVE_TOXIC_SPIKES) == EFFECT_TOXIC_SPIKES); ASSUME(GetMoveEffect(MOVE_STICKY_WEB) == EFFECT_STICKY_WEB); - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); ASSUME(GetMoveEffect(MOVE_SCREECH) == EFFECT_DEFENSE_DOWN_2); ASSUME(GetMoveCategory(MOVE_SCRATCH) == DAMAGE_CATEGORY_PHYSICAL); ASSUME(GetMoveCategory(MOVE_GUST) == DAMAGE_CATEGORY_SPECIAL); diff --git a/test/battle/move_effect/instruct.c b/test/battle/move_effect/instruct.c index e79439d336..03a39fe154 100644 --- a/test/battle/move_effect/instruct.c +++ b/test/battle/move_effect/instruct.c @@ -60,7 +60,8 @@ DOUBLE_BATTLE_TEST("Instruct-called move targets the target of the move picked o DOUBLE_BATTLE_TEST("Instruct doesn't bypass sleep") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET) { Moves(MOVE_SCRATCH, MOVE_POUND, MOVE_SCRATCH, MOVE_GROWL); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/move_effect/magic_coat.c b/test/battle/move_effect/magic_coat.c index 343322408d..50ed79e194 100644 --- a/test/battle/move_effect/magic_coat.c +++ b/test/battle/move_effect/magic_coat.c @@ -9,7 +9,8 @@ ASSUMPTIONS SINGLE_BATTLE_TEST("Magic Coat prints the correct message when bouncing back a move") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); diff --git a/test/battle/move_effect/metronome.c b/test/battle/move_effect/metronome.c index 1a5d4aeb9d..3bb178e2f2 100644 --- a/test/battle/move_effect/metronome.c +++ b/test/battle/move_effect/metronome.c @@ -27,7 +27,8 @@ SINGLE_BATTLE_TEST("Metronome's called powder move fails against Grass Types") GIVEN { ASSUME(IsPowderMove(MOVE_POISON_POWDER)); ASSUME(gSpeciesInfo[SPECIES_TANGELA].types[0] == TYPE_GRASS); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_TANGELA); } WHEN { diff --git a/test/battle/move_effect/mirror_move.c b/test/battle/move_effect/mirror_move.c index 2df8c91fba..905fb32d31 100644 --- a/test/battle/move_effect/mirror_move.c +++ b/test/battle/move_effect/mirror_move.c @@ -43,7 +43,8 @@ SINGLE_BATTLE_TEST("Mirror Move's called powder move fails against Grass Types") GIVEN { ASSUME(IsPowderMove(MOVE_STUN_SPORE)); ASSUME(gSpeciesInfo[SPECIES_ODDISH].types[0] == TYPE_GRASS); - ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_PARALYZE); + ASSUME(GetMoveEffect(MOVE_STUN_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_STUN_SPORE) == MOVE_EFFECT_PARALYSIS); PLAYER(SPECIES_ODDISH); OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/refresh.c b/test/battle/move_effect/refresh.c index 7d0ba0273e..f11a8dfca1 100644 --- a/test/battle/move_effect/refresh.c +++ b/test/battle/move_effect/refresh.c @@ -45,7 +45,8 @@ SINGLE_BATTLE_TEST("Refresh does not cure the user of Freeze") SINGLE_BATTLE_TEST("Refresh does not cure sleep when used by Sleep Talk") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SLEEP_TALK, MOVE_REFRESH); } diff --git a/test/battle/move_effect/retaliate.c b/test/battle/move_effect/retaliate.c index 34843da04e..47b1c3325d 100644 --- a/test/battle/move_effect/retaliate.c +++ b/test/battle/move_effect/retaliate.c @@ -63,9 +63,12 @@ DOUBLE_BATTLE_TEST("Retaliate works with passive damage") PARAMETRIZE { move = MOVE_FLAME_BURST; moveTarget = playerRight; } PARAMETRIZE { move = MOVE_FIRE_PLEDGE; moveTarget = playerRight; move2 = MOVE_GRASS_PLEDGE; } GIVEN { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); - ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_POISON); - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_POISON_POWDER) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_POWDER) == MOVE_EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); #if B_USE_FROSTBITE == TRUE ASSUME(GetMoveAdditionalEffectById(MOVE_ICE_BEAM, 0)->moveEffect == MOVE_EFFECT_FREEZE_OR_FROSTBITE); #endif diff --git a/test/battle/move_effect/sleep.c b/test/battle/move_effect/sleep.c index 702044d331..524db0cf08 100644 --- a/test/battle/move_effect/sleep.c +++ b/test/battle/move_effect/sleep.c @@ -3,7 +3,8 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_HYPNOSIS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_HYPNOSIS) == MOVE_EFFECT_SLEEP); } SINGLE_BATTLE_TEST("Hypnosis inflicts 1-3 turns of sleep") diff --git a/test/battle/move_effect/take_heart.c b/test/battle/move_effect/take_heart.c index e029439103..69560de74d 100644 --- a/test/battle/move_effect/take_heart.c +++ b/test/battle/move_effect/take_heart.c @@ -50,7 +50,8 @@ SINGLE_BATTLE_TEST("Take Heart cures the user of all status conditions") SINGLE_BATTLE_TEST("Take Heart cures sleep when used by Sleep Talk") { GIVEN { - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_SLEEP_TALK, MOVE_TAKE_HEART); } diff --git a/test/battle/move_effect/toxic.c b/test/battle/move_effect/toxic.c index 26f54e5d57..c25b4fc640 100644 --- a/test/battle/move_effect/toxic.c +++ b/test/battle/move_effect/toxic.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_TOXIC); + ASSUME(GetMoveEffect(MOVE_TOXIC) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_TOXIC) == MOVE_EFFECT_TOXIC); } diff --git a/test/battle/sleep_clause.c b/test/battle/sleep_clause.c index b6c1224755..c2c74314e5 100644 --- a/test/battle/sleep_clause.c +++ b/test/battle/sleep_clause.c @@ -5,7 +5,8 @@ AI_SINGLE_BATTLE_TEST("Sleep Clause: AI will not use sleep moves while sleep cla { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -21,7 +22,8 @@ AI_DOUBLE_BATTLE_TEST("Sleep Clause: AI will not use sleep moves while sleep cla { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -39,7 +41,8 @@ AI_DOUBLE_BATTLE_TEST("Sleep Clause: AI will not use sleep move if partner is al { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -55,7 +58,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep moves fail when sleep clause is active") { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -82,7 +86,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves fail when sleep clause is active ( { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { HP(1); MaxHP(100); } @@ -108,7 +113,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Rest does not activate sleep clause") { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -128,7 +134,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Rest does not activate sleep clause (Doubles)" { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -150,7 +157,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Rest can still be used when sleep clause is ac { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -174,7 +182,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Rest can still be used when sleep clause is ac { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); @@ -196,7 +205,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Psycho Shift'ing sleep will fail if sleep clau { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); PLAYER(SPECIES_WOBBUFFET) @@ -222,7 +232,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Psycho Shift'ing sleep will activate sleep cla { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); PLAYER(SPECIES_ZIGZAGOON) @@ -298,7 +309,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -322,7 +334,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Effect Spore causes sleep 11% of the time with FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -349,7 +362,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -376,7 +390,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep from Effect Spore will not activate slee FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); ASSUME(MoveMakesContact(MOVE_SCRATCH)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -401,7 +416,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Moves with sleep effect chance will activate s GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -429,7 +445,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Moves with sleep effect chance will still do d GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(MoveHasAdditionalEffect(MOVE_RELIC_SONG, MOVE_EFFECT_SLEEP)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -456,7 +473,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Dire Claw cannot sleep a mon when sleep clause GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(MoveHasAdditionalEffect(MOVE_DIRE_CLAW, MOVE_EFFECT_DIRE_CLAW)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -532,7 +550,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(B_SLEEP_TURNS >= GEN_5); PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -564,7 +583,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { move = MOVE_SPARKLY_SWIRL; healingSlot = opponentLeft; sporedSlot = opponentRight; switchIndex = 1; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); @@ -622,7 +642,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(MoveHasAdditionalEffect(MOVE_WAKE_UP_SLAP, MOVE_EFFECT_REMOVE_STATUS)); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -664,7 +685,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_UPROAR) == EFFECT_UPROAR); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -705,7 +727,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { move = MOVE_AROMATHERAPY; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_SLEEP_TALK) == EFFECT_SLEEP_TALK); ASSUME(GetMoveEffect(MOVE_PSYCHO_SHIFT) == EFFECT_PSYCHO_SHIFT); ASSUME(GetMoveEffect(MOVE_JUNGLE_HEALING) == EFFECT_JUNGLE_HEALING); @@ -761,7 +784,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_PELIPPER) { Ability(ABILITY_DRIZZLE); } OPPONENT(SPECIES_LUVDISC) { Ability(ABILITY_HYDRATION); } } WHEN { @@ -785,7 +809,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_SWABLU) { Ability(ABILITY_NATURAL_CURE); } OPPONENT(SPECIES_ZIGZAGOON); @@ -815,7 +840,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PASSES_RANDOMLY(33, 100, RNG_SHED_SKIN); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_DRATINI) { Ability(ABILITY_SHED_SKIN); } } WHEN { @@ -839,7 +865,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PASSES_RANDOMLY(30, 100, RNG_HEALER); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -867,7 +894,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { heldItem = ITEM_LUM_BERRY; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); PLAYER(SPECIES_ZIGZAGOON); @@ -898,7 +926,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { heldItem = ITEM_LUM_BERRY; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_FLING) == EFFECT_FLING); ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); ASSUME(gItemsInfo[ITEM_LUM_BERRY].holdEffect == HOLD_EFFECT_CURE_STATUS); @@ -931,7 +960,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(gItemsInfo[ITEM_AWAKENING].battleUsage == EFFECT_ITEM_CURE_STATUS); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -955,7 +985,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON) { Level(5); } OPPONENT(SPECIES_ZIGZAGOON); @@ -980,7 +1011,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON) { Level(5); } @@ -1008,7 +1040,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_DELIBIRD) { Ability(ability); } OPPONENT(SPECIES_ZIGZAGOON) { Moves(MOVE_SLEEP_TALK, MOVE_SKILL_SWAP); } } WHEN { @@ -1044,7 +1077,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON) PLAYER(SPECIES_DELIBIRD) { Ability(ability); } OPPONENT(SPECIES_RALTS) { Ability(ABILITY_TRACE); } @@ -1081,7 +1115,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo KNOWN_FAILING; // Sleep Clause parts work, but Imposter seems broken with battle messages / targeting. Issue #5565 https://github.com/rh-hideout/pokeemerald-expansion/issues/5565 GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(gItemsInfo[ITEM_LAGGING_TAIL].holdEffect == HOLD_EFFECT_LAGGING_TAIL); PLAYER(SPECIES_ZIGZAGOON) PLAYER(SPECIES_DELIBIRD) { Ability(ability); } @@ -1116,7 +1151,8 @@ AI_SINGLE_BATTLE_TEST("Sleep Clause: AI will use sleep moves again when sleep cl { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(gItemsInfo[ITEM_CHESTO_BERRY].holdEffect == HOLD_EFFECT_CURE_SLP); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_CHESTO_BERRY); } @@ -1132,7 +1168,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep clause is deactivated when a sleeping mo GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(MoveHasAdditionalEffect(MOVE_G_MAX_SWEETNESS, MOVE_EFFECT_AROMATHERAPY)); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_APPLETUN) { GigantamaxFactor(TRUE); } PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET); @@ -1158,7 +1195,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Pre-existing sleep condition doesn't activate { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON) { Status1(STATUS1_SLEEP); } OPPONENT(SPECIES_ZIGZAGOON); @@ -1178,7 +1216,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Sleep caused by Effect Spore does not prevent GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_ZIGZAGOON); @@ -1214,7 +1253,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1251,7 +1291,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Effect Spore doesn't deactivat GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); ASSUME(B_ABILITY_TRIGGER_CHANCE >= GEN_5); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_AROMATHERAPY) == EFFECT_HEAL_BELL); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_ZIGZAGOON); @@ -1291,7 +1332,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_ZIGZAGOON) { HP(1); MaxHP(100); } PLAYER(SPECIES_ZIGZAGOON); @@ -1327,7 +1369,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Waking up after Rest doesn't deactivate sleep { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_REST) == EFFECT_REST); PLAYER(SPECIES_ZIGZAGOON) { HP(1); MaxHP(100); } PLAYER(SPECIES_ZIGZAGOON); @@ -1365,7 +1408,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Suppressing and then sleeping Vital Spirit / I PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_DELIBIRD) { Ability(ability); } OPPONENT(SPECIES_ZIGZAGOON); @@ -1395,7 +1439,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Mold Breaker PokΓ©mon sleeping Vital Spirit / PARAMETRIZE { ability = ABILITY_INSOMNIA; } GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_PANCHAM) { Ability(ABILITY_MOLD_BREAKER); } OPPONENT(SPECIES_DELIBIRD) { Ability(ability); } OPPONENT(SPECIES_ZIGZAGOON); @@ -1422,7 +1467,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Yawn'd PokΓ©mon slept due to Effect Spore befo PASSES_RANDOMLY(11, 100, RNG_EFFECT_SPORE); GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); ASSUME(MoveMakesContact(MOVE_SCRATCH)); PLAYER(SPECIES_BRELOOM) { Ability(ABILITY_EFFECT_SPORE); } @@ -1449,7 +1495,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Yawn'd PokΓ©mon who's partner is slept before { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1476,7 +1523,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: If both PokΓ©mon on one side are Yawn'd at the { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); PLAYER(SPECIES_ZIGZAGOON) { Speed(5); } PLAYER(SPECIES_ZIGZAGOON) { Speed(4); } @@ -1501,7 +1549,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Reflection moves (ie. Magic Coat) fail if slee { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1526,7 +1575,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Reflection moves (ie. Magic Coat) that reflect { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_MAGIC_COAT) == EFFECT_MAGIC_COAT); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1581,7 +1631,8 @@ SINGLE_BATTLE_TEST("Sleep Clause: Magic Bounce'ing a sleep move activates sleep { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ESPEON) { Ability(ABILITY_MAGIC_BOUNCE); } PLAYER(SPECIES_ZIGZAGOON); OPPONENT(SPECIES_ZIGZAGOON); @@ -1634,7 +1685,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep Clause does not prevent sleeping your pa { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1720,7 +1772,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Sleep moves used after being Encore'd are prev { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1749,7 +1802,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Spore'ing opponent after Yawn'ing partner does { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); @@ -1786,7 +1840,8 @@ DOUBLE_BATTLE_TEST("Sleep Clause: Opponent Spore'ing player's partner after part { GIVEN { FLAG_SET(B_FLAG_SLEEP_CLAUSE); - ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_SLEEP); + ASSUME(GetMoveEffect(MOVE_SPORE) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_SPORE) == MOVE_EFFECT_SLEEP); ASSUME(GetMoveEffect(MOVE_YAWN) == EFFECT_YAWN); PLAYER(SPECIES_ZIGZAGOON); PLAYER(SPECIES_ZIGZAGOON); diff --git a/test/battle/status1/burn.c b/test/battle/status1/burn.c index 3e1ac36af5..689338cce8 100644 --- a/test/battle/status1/burn.c +++ b/test/battle/status1/burn.c @@ -3,7 +3,7 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_WILL_O_WISP); + ASSUME(GetMoveEffect(MOVE_WILL_O_WISP) == EFFECT_NON_VOLATILE_STATUS); ASSUME(GetMoveNonVolatileStatus(MOVE_WILL_O_WISP) == MOVE_EFFECT_BURN); } diff --git a/test/battle/status1/poison.c b/test/battle/status1/poison.c index 90d6fa032c..0a749ea96d 100644 --- a/test/battle/status1/poison.c +++ b/test/battle/status1/poison.c @@ -25,7 +25,8 @@ SINGLE_BATTLE_TEST("Poison can't bad poison a poison or steel type") PARAMETRIZE { species = SPECIES_BULBASAUR; } GIVEN { - ASSUME(GetMoveEffect(MOVE_POISON_GAS) == EFFECT_POISON); + ASSUME(GetMoveEffect(MOVE_POISON_GAS) == EFFECT_NON_VOLATILE_STATUS); + ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_GAS) == MOVE_EFFECT_POISON); ASSUME(GetMoveNonVolatileStatus(MOVE_POISON_GAS) == MOVE_EFFECT_POISON); PLAYER(SPECIES_WOBBUFFET); OPPONENT(species); From 54806c883832f0e7d2e9884c497ce2815ebf2ca4 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sat, 17 May 2025 11:20:35 +0200 Subject: [PATCH 074/187] Add no-whiteout feature (#6795) --- asm/macros/battle_script.inc | 5 +++++ data/battle_scripts_1.s | 1 + include/config/battle.h | 1 + src/battle_script_commands.c | 10 ++++++++++ src/battle_setup.c | 2 +- src/overworld.c | 1 + 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 2c19ebb515..41b61288ac 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -2558,3 +2558,8 @@ printstring STRINGID_EMPTYSTRING3 waitmessage 1 .endm + + .macro jumpifnowhiteout jumpInstr:req + callnative BS_JumpIfNoWhiteOut + .4byte \jumpInstr + .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index a154d31715..9938299db9 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5394,6 +5394,7 @@ BattleScript_LocalBattleLost:: jumpifbattletype BATTLE_TYPE_TRAINER_HILL, BattleScript_LocalBattleLostPrintTrainersWinText jumpifbattletype BATTLE_TYPE_EREADER_TRAINER, BattleScript_LocalBattleLostEnd jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd + jumpifnowhiteout BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintWhiteOut:: .if B_WHITEOUT_MONEY >= GEN_4 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd diff --git a/include/config/battle.h b/include/config/battle.h index becf2c8c9a..b940d1dbf5 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -211,6 +211,7 @@ #define B_FLAG_TERA_ORB_CHARGED 0 // If this flag is set, the Tera Orb is charged. It is automatically set upon healing and cleared upon Terastallizing once configured. #define B_FLAG_TERA_ORB_NO_COST 0 // If this flag is set, the Tera Orb does not use up its charge upon Terastallization. In S/V, this occurs after an event with Terapagos. #define B_FLAG_SLEEP_CLAUSE 0 // If this flag is set, sleep clause is enabled; if the player / AI has already put a PokΓ©mon on the opponent's side to sleep and it is still sleeping, another one can't be put to sleep. AI requires AI_FLAG_CHECK_BAD_MOVE to understand. +#define B_FLAG_NO_WHITEOUT 0 // If this flag is set, the player can not white out against Trainers. Please note that the party is not healed automatically! // Var Settings // To use the following features, change the 0 for a var present in include/constants/vars.h, preferably an unused one. diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index cd71a35e8c..6bcf8be569 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -18690,3 +18690,13 @@ void BS_JumpIfLastUsedItemHoldEffect(void) else gBattlescriptCurrInstr = cmd->nextInstr; } + +void BS_JumpIfNoWhiteOut(void) +{ + NATIVE_ARGS(const u8 *jumpInstr); + + if (FlagGet(B_FLAG_NO_WHITEOUT)) + gBattlescriptCurrInstr = cmd->jumpInstr; + else + gBattlescriptCurrInstr = cmd->nextInstr; +} diff --git a/src/battle_setup.c b/src/battle_setup.c index f2d4ebd497..674ee2520c 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -1299,7 +1299,7 @@ static void CB2_EndTrainerBattle(void) } else if (IsPlayerDefeated(gBattleOutcome) == TRUE) { - if (InBattlePyramid() || InTrainerHillChallenge() || (!NoAliveMonsForPlayer())) + if (InBattlePyramid() || InTrainerHillChallenge() || (!NoAliveMonsForPlayer()) || FlagGet(B_FLAG_NO_WHITEOUT)) SetMainCallback2(CB2_ReturnToFieldContinueScriptPlayMapMusic); else SetMainCallback2(CB2_WhiteOut); diff --git a/src/overworld.c b/src/overworld.c index 2cdb6ddf8c..33af588e2a 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -440,6 +440,7 @@ void Overworld_ResetBattleFlagsAndVars(void) FlagClear(B_FLAG_NO_RUNNING); FlagClear(B_FLAG_DYNAMAX_BATTLE); FlagClear(B_FLAG_SKY_BATTLE); + FlagClear(B_FLAG_NO_WHITEOUT); } #endif From 4145404d22be1a559881bdfb1754b8c714af0c6c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 17 May 2025 09:08:28 -0400 Subject: [PATCH 075/187] Optimized `PokemonUseItemEffects` function (#6878) --- src/pokemon.c | 56 +++++++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/src/pokemon.c b/src/pokemon.c index 3f009371cf..c96f8f3b66 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3896,12 +3896,13 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov // PP Up if (effectFlags & ITEM4_PP_UP) { + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); effectFlags &= ~ITEM4_PP_UP; - dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + temp1 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, moveIndex); if (dataUnsigned <= 2 && temp1 > 4) { - dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL) + gPPUpAddValues[moveIndex]; + dataUnsigned = ppBonuses + gPPUpAddValues[moveIndex]; SetMonData(mon, MON_DATA_PP_BONUSES, &dataUnsigned); dataUnsigned = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), dataUnsigned, moveIndex) - temp1; @@ -3986,9 +3987,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov break; case 2: // ITEM4_HEAL_HP + { + u32 currentHP = GetMonData(mon, MON_DATA_HP, NULL); + u32 maxHP = GetMonData(mon, MON_DATA_MAX_HP, NULL); // Check use validity. - if ((effectFlags & (ITEM4_REVIVE >> 2) && GetMonData(mon, MON_DATA_HP, NULL) != 0) - || (!(effectFlags & (ITEM4_REVIVE >> 2)) && GetMonData(mon, MON_DATA_HP, NULL) == 0)) + if ((effectFlags & (ITEM4_REVIVE >> 2) && currentHP != 0) + || (!(effectFlags & (ITEM4_REVIVE >> 2)) && currentHP == 0)) { itemEffectParam++; break; @@ -3999,10 +4003,10 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov switch (dataUnsigned) { case ITEM6_HEAL_HP_FULL: - dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) - GetMonData(mon, MON_DATA_HP, NULL); + dataUnsigned = maxHP - currentHP; break; case ITEM6_HEAL_HP_HALF: - dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 2; + dataUnsigned = maxHP / 2; if (dataUnsigned == 0) dataUnsigned = 1; break; @@ -4010,39 +4014,40 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov dataUnsigned = gBattleScripting.levelUpHP; break; case ITEM6_HEAL_HP_QUARTER: - dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL) / 4; + dataUnsigned = maxHP / 4; if (dataUnsigned == 0) dataUnsigned = 1; break; } // Only restore HP if not at max health - if (GetMonData(mon, MON_DATA_MAX_HP, NULL) != GetMonData(mon, MON_DATA_HP, NULL)) + if (maxHP != currentHP) { // Restore HP - dataUnsigned = GetMonData(mon, MON_DATA_HP, NULL) + dataUnsigned; - if (dataUnsigned > GetMonData(mon, MON_DATA_MAX_HP, NULL)) - dataUnsigned = GetMonData(mon, MON_DATA_MAX_HP, NULL); + dataUnsigned = currentHP + dataUnsigned; + if (dataUnsigned > maxHP) + dataUnsigned = maxHP; SetMonData(mon, MON_DATA_HP, &dataUnsigned); retVal = FALSE; } effectFlags &= ~(ITEM4_REVIVE >> 2); break; - + } case 3: // ITEM4_HEAL_PP if (!(effectFlags & (ITEM4_HEAL_PP_ONE >> 3))) { // Heal PP for all moves for (temp2 = 0; (signed)(temp2) < (signed)(MAX_MON_MOVES); temp2++) { - u16 move; + u32 move, ppBonus; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + temp2, NULL); move = GetMonData(mon, MON_DATA_MOVE1 + temp2, NULL); - if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) + ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); + if (dataUnsigned != ppBonus) { dataUnsigned += itemEffect[itemEffectParam]; - if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2)) - dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), temp2); + if (dataUnsigned > ppBonus) + dataUnsigned = ppBonus; SetMonData(mon, MON_DATA_PP1 + temp2, &dataUnsigned); retVal = FALSE; } @@ -4055,11 +4060,12 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov u16 move; dataUnsigned = GetMonData(mon, MON_DATA_PP1 + moveIndex, NULL); move = GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL); - if (dataUnsigned != CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) + u32 ppBonus = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (dataUnsigned != ppBonus) { dataUnsigned += itemEffect[itemEffectParam++]; - if (dataUnsigned > CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex)) - dataUnsigned = CalculatePPWithBonus(move, GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + if (dataUnsigned > ppBonus) + dataUnsigned = ppBonus; SetMonData(mon, MON_DATA_PP1 + moveIndex, &dataUnsigned); retVal = FALSE; } @@ -4169,13 +4175,15 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov break; case 4: // ITEM5_PP_MAX - dataUnsigned = (GetMonData(mon, MON_DATA_PP_BONUSES, NULL) & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); - temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), GetMonData(mon, MON_DATA_PP_BONUSES, NULL), moveIndex); + { + u32 ppBonuses = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + dataUnsigned = (ppBonuses & gPPUpGetMask[moveIndex]) >> (moveIndex * 2); + temp2 = CalculatePPWithBonus(GetMonData(mon, MON_DATA_MOVE1 + moveIndex, NULL), ppBonuses, 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 (dataUnsigned < 3 && temp2 >= 5) { - dataUnsigned = GetMonData(mon, MON_DATA_PP_BONUSES, NULL); + dataUnsigned = ppBonuses; dataUnsigned &= gPPUpClearMask[moveIndex]; dataUnsigned += gPPUpAddValues[moveIndex] * 3; // Apply 3 PP Ups (max) @@ -4186,7 +4194,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov retVal = FALSE; } break; - + } case 5: // ITEM5_FRIENDSHIP_LOW // Changes to friendship are given differently depending on // how much friendship the PokΓ©mon already has. From 406fd7ce81cf3918492e11399575576c314a7b51 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 17 May 2025 09:08:44 -0400 Subject: [PATCH 076/187] Expand trainerproc to support additional battle types (#6770) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- include/data.h | 13 +- .../1.12/convert_trainer_battle_types.py | 12 + src/battle_main.c | 11 +- src/battle_setup.c | 13 +- src/data/trainers.h | 1710 ++++++++--------- src/data/trainers.party | 2 +- test/battle/trainer_control.c | 11 +- test/battle/trainer_control.h | 108 +- test/battle/trainer_control.party | 48 +- tools/trainerproc/main.c | 71 +- 10 files changed, 1091 insertions(+), 908 deletions(-) create mode 100644 migration_scripts/1.12/convert_trainer_battle_types.py diff --git a/include/data.h b/include/data.h index 07511f1d7f..3a697d573c 100644 --- a/include/data.h +++ b/include/data.h @@ -81,6 +81,12 @@ struct TrainerMon #define TRAINER_PARTY(partyArray) partyArray, .partySize = ARRAY_COUNT(partyArray) +enum TrainerBattleType +{ + TRAINER_BATTLE_TYPE_SINGLES, + TRAINER_BATTLE_TYPE_DOUBLES, +}; + struct Trainer { /*0x00*/ u64 aiFlags; @@ -90,8 +96,7 @@ struct Trainer /*0x11*/ u8 encounterMusic_gender; // last bit is gender /*0x12*/ u8 trainerPic; /*0x13*/ u8 trainerName[TRAINER_NAME_LENGTH + 1]; - /*0x1E*/ bool8 doubleBattle:1; - bool8 padding:1; + /*0x1E*/ u8 battleType:2; u8 startingStatus:6; // this trainer starts a battle with a given status. see include/constants/battle.h for values /*0x1F*/ u8 mugshotColor; /*0x20*/ u8 partySize; @@ -253,12 +258,12 @@ static inline const u8 GetTrainerStartingStatusFromId(u16 trainerId) return gTrainers[GetCurrentDifficultyLevel()][SanitizeTrainerId(trainerId)].startingStatus; } -static inline const bool32 IsTrainerDoubleBattle(u16 trainerId) +static inline const enum TrainerBattleType GetTrainerBattleType(u16 trainerId) { u32 sanitizedTrainerId = SanitizeTrainerId(trainerId); enum DifficultyLevel difficulty = GetTrainerDifficultyLevel(sanitizedTrainerId); - return gTrainers[difficulty][sanitizedTrainerId].doubleBattle; + return gTrainers[difficulty][sanitizedTrainerId].battleType; } static inline const u8 GetTrainerPartySizeFromId(u16 trainerId) diff --git a/migration_scripts/1.12/convert_trainer_battle_types.py b/migration_scripts/1.12/convert_trainer_battle_types.py new file mode 100644 index 0000000000..767644fedb --- /dev/null +++ b/migration_scripts/1.12/convert_trainer_battle_types.py @@ -0,0 +1,12 @@ +import re + +def trainer_battle_types(data): + data = re.sub(re.escape("Double Battle: No"), "Battle Type: Singles", data) + data = re.sub(re.escape("Double Battle: Yes"), "Battle Type: Doubles", data) + + return data + +with open('src/data/trainers.party', 'r') as file: + data = file.read() +with open('src/data/trainers.party', 'w') as file: + file.write(trainer_battle_types(data)) diff --git a/src/battle_main.c b/src/battle_main.c index 041875b995..7ef5f9cc44 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -533,7 +533,14 @@ static void CB2_InitBattleInternal(void) | BATTLE_TYPE_TRAINER_HILL | BATTLE_TYPE_RECORDED))) { - gBattleTypeFlags |= (IsTrainerDoubleBattle(TRAINER_BATTLE_PARAM.opponentA) ? BATTLE_TYPE_DOUBLE : 0); + switch (GetTrainerBattleType(TRAINER_BATTLE_PARAM.opponentA)) + { + case TRAINER_BATTLE_TYPE_SINGLES: + break; + case TRAINER_BATTLE_TYPE_DOUBLES: + gBattleTypeFlags |= BATTLE_TYPE_DOUBLE; + break; + } } InitBattleBgsVideo(); @@ -1910,7 +1917,7 @@ u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer u32 fixedOtId = 0; u32 abilityNum = 0; - if (trainer->doubleBattle == TRUE) + if (trainer->battleType != TRAINER_BATTLE_TYPE_SINGLES) personalityValue = 0x80; else if (trainer->encounterMusic_gender & F_TRAINER_FEMALE) personalityValue = 0x78; // Use personality more likely to result in a female PokΓ©mon diff --git a/src/battle_setup.c b/src/battle_setup.c index 674ee2520c..521aba74e6 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -772,7 +772,7 @@ u8 GetWildBattleTransition(void) u8 GetTrainerBattleTransition(void) { - u8 minPartyCount; + u8 minPartyCount = 1; u8 transitionType; u8 enemyLevel; u8 playerLevel; @@ -792,10 +792,15 @@ u8 GetTrainerBattleTransition(void) || trainerClass == TRAINER_CLASS_AQUA_ADMIN) return B_TRANSITION_AQUA; - if (IsTrainerDoubleBattle(trainerId)) - minPartyCount = 2; // double battles always at least have 2 PokΓ©mon. - else + switch (GetTrainerBattleType(trainerId)) + { + case TRAINER_BATTLE_TYPE_SINGLES: minPartyCount = 1; + break; + case TRAINER_BATTLE_TYPE_DOUBLES: + minPartyCount = 2; // double battles always at least have 2 PokΓ©mon. + break; + } transitionType = GetBattleTransitionTypeByMap(); enemyLevel = GetSumOfEnemyPartyLevel(trainerId, minPartyCount); diff --git a/src/data/trainers.h b/src/data/trainers.h index af19c90ae2..44cb25be75 100644 --- a/src/data/trainers.h +++ b/src/data/trainers.h @@ -19,7 +19,7 @@ #line 81 TRAINER_ENCOUNTER_MUSIC_MALE, #line 82 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 0, .party = (const struct TrainerMon[]) { @@ -38,7 +38,7 @@ #line 89 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 90 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 91 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -70,7 +70,7 @@ #line 102 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 103 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 104 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -102,7 +102,7 @@ #line 115 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 116 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 117 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -145,7 +145,7 @@ #line 132 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 133 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 134 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -177,7 +177,7 @@ #line 145 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 146 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 147 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -209,7 +209,7 @@ #line 158 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 159 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 160 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -241,7 +241,7 @@ #line 171 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 172 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 173 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -273,7 +273,7 @@ #line 184 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 185 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 186 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -307,7 +307,7 @@ F_TRAINER_FEMALE | #line 197 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 198 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -394,7 +394,7 @@ F_TRAINER_FEMALE | #line 230 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 231 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 232 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -428,7 +428,7 @@ F_TRAINER_FEMALE | #line 244 .items = { ITEM_HYPER_POTION }, #line 245 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 246 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -471,7 +471,7 @@ F_TRAINER_FEMALE | #line 261 TRAINER_ENCOUNTER_MUSIC_COOL, #line 262 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 263 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -514,7 +514,7 @@ F_TRAINER_FEMALE | #line 278 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 279 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 280 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -559,7 +559,7 @@ F_TRAINER_FEMALE | #line 295 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 296 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 297 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -591,7 +591,7 @@ F_TRAINER_FEMALE | #line 308 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 309 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 310 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -623,7 +623,7 @@ F_TRAINER_FEMALE | #line 321 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 322 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 323 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -655,7 +655,7 @@ F_TRAINER_FEMALE | #line 334 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 335 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 336 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -698,7 +698,7 @@ F_TRAINER_FEMALE | #line 351 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 352 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 353 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -741,7 +741,7 @@ F_TRAINER_FEMALE | #line 368 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 369 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 370 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -795,7 +795,7 @@ F_TRAINER_FEMALE | #line 389 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 390 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 391 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -827,7 +827,7 @@ F_TRAINER_FEMALE | #line 402 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 403 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 404 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -870,7 +870,7 @@ F_TRAINER_FEMALE | #line 419 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 420 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 421 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -902,7 +902,7 @@ F_TRAINER_FEMALE | #line 432 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 433 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 434 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -934,7 +934,7 @@ F_TRAINER_FEMALE | #line 445 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 446 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 447 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -966,7 +966,7 @@ F_TRAINER_FEMALE | #line 458 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 459 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 460 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -1011,7 +1011,7 @@ F_TRAINER_FEMALE | #line 475 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 476 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 477 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1045,7 +1045,7 @@ F_TRAINER_FEMALE | #line 488 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 489 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 490 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1079,7 +1079,7 @@ F_TRAINER_FEMALE | #line 501 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 502 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 503 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1111,7 +1111,7 @@ F_TRAINER_FEMALE | #line 514 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 515 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 516 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -1156,7 +1156,7 @@ F_TRAINER_FEMALE | #line 532 .items = { ITEM_SUPER_POTION }, #line 533 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 534 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -1199,7 +1199,7 @@ F_TRAINER_FEMALE | #line 549 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 550 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 551 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1233,7 +1233,7 @@ F_TRAINER_FEMALE | #line 562 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 563 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 564 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -1278,7 +1278,7 @@ F_TRAINER_FEMALE | #line 579 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 580 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 581 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -1323,7 +1323,7 @@ F_TRAINER_FEMALE | #line 597 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, #line 598 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 599 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -1379,7 +1379,7 @@ F_TRAINER_FEMALE | #line 618 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 619 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 620 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1413,7 +1413,7 @@ F_TRAINER_FEMALE | #line 631 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 632 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 633 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -1458,7 +1458,7 @@ F_TRAINER_FEMALE | #line 648 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 649 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 650 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -1514,7 +1514,7 @@ F_TRAINER_FEMALE | #line 670 .items = { ITEM_FULL_RESTORE }, #line 671 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 672 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -1568,7 +1568,7 @@ F_TRAINER_FEMALE | #line 690 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 691 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 692 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -1613,7 +1613,7 @@ F_TRAINER_FEMALE | #line 707 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 708 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 709 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -1658,7 +1658,7 @@ F_TRAINER_FEMALE | #line 724 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 725 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 726 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -1714,7 +1714,7 @@ F_TRAINER_FEMALE | #line 745 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 746 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 747 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -1770,7 +1770,7 @@ F_TRAINER_FEMALE | #line 766 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 767 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 768 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -1824,7 +1824,7 @@ F_TRAINER_FEMALE | #line 787 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 788 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 789 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -1863,7 +1863,7 @@ F_TRAINER_FEMALE | #line 804 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 805 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 806 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -1938,7 +1938,7 @@ F_TRAINER_FEMALE | #line 837 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 838 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 839 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -1995,7 +1995,7 @@ F_TRAINER_FEMALE | #line 862 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 863 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 864 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2034,7 +2034,7 @@ F_TRAINER_FEMALE | #line 879 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 880 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 881 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2073,7 +2073,7 @@ F_TRAINER_FEMALE | #line 896 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 897 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 898 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2112,7 +2112,7 @@ F_TRAINER_FEMALE | #line 913 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 914 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 915 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2151,7 +2151,7 @@ F_TRAINER_FEMALE | #line 930 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 931 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 932 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2194,7 +2194,7 @@ F_TRAINER_FEMALE | #line 947 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 948 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 949 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2237,7 +2237,7 @@ F_TRAINER_FEMALE | #line 964 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 965 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 966 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2280,7 +2280,7 @@ F_TRAINER_FEMALE | #line 981 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 982 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 983 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2323,7 +2323,7 @@ F_TRAINER_FEMALE | #line 998 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 999 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 1000 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2366,7 +2366,7 @@ F_TRAINER_FEMALE | #line 1015 TRAINER_ENCOUNTER_MUSIC_INTERVIEWER, #line 1016 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 1017 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2425,7 +2425,7 @@ F_TRAINER_FEMALE | #line 1040 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1041 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1042 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2470,7 +2470,7 @@ F_TRAINER_FEMALE | #line 1057 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1058 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1059 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2504,7 +2504,7 @@ F_TRAINER_FEMALE | #line 1070 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1071 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1072 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2538,7 +2538,7 @@ F_TRAINER_FEMALE | #line 1083 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1084 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2583,7 +2583,7 @@ F_TRAINER_FEMALE | #line 1100 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1101 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1102 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2628,7 +2628,7 @@ F_TRAINER_FEMALE | #line 1117 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1118 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1119 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2673,7 +2673,7 @@ F_TRAINER_FEMALE | #line 1134 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1135 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1136 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2716,7 +2716,7 @@ F_TRAINER_FEMALE | #line 1151 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1152 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1153 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2755,7 +2755,7 @@ F_TRAINER_FEMALE | #line 1168 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1169 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1170 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -2798,7 +2798,7 @@ F_TRAINER_FEMALE | #line 1185 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1186 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1187 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2830,7 +2830,7 @@ F_TRAINER_FEMALE | #line 1198 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1199 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1200 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2869,7 +2869,7 @@ F_TRAINER_FEMALE | #line 1215 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1216 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1217 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2908,7 +2908,7 @@ F_TRAINER_FEMALE | #line 1232 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1233 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1234 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2947,7 +2947,7 @@ F_TRAINER_FEMALE | #line 1249 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 1250 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1251 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -2988,7 +2988,7 @@ F_TRAINER_FEMALE | #line 1267 .items = { ITEM_HYPER_POTION }, #line 1268 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1269 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -3028,7 +3028,7 @@ F_TRAINER_FEMALE | #line 1284 .items = { ITEM_HYPER_POTION }, #line 1285 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1286 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -3068,7 +3068,7 @@ F_TRAINER_FEMALE | #line 1301 .items = { ITEM_HYPER_POTION }, #line 1302 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1303 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -3110,7 +3110,7 @@ F_TRAINER_FEMALE | #line 1318 .items = { ITEM_HYPER_POTION }, #line 1319 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1320 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -3149,7 +3149,7 @@ F_TRAINER_FEMALE | #line 1334 .items = { ITEM_HYPER_POTION }, #line 1335 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1336 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -3262,7 +3262,7 @@ F_TRAINER_FEMALE | #line 1384 .items = { ITEM_FULL_RESTORE }, #line 1385 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1386 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3318,7 +3318,7 @@ F_TRAINER_FEMALE | #line 1406 .items = { ITEM_FULL_RESTORE }, #line 1407 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1408 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -3363,7 +3363,7 @@ F_TRAINER_FEMALE | #line 1424 .items = { ITEM_SUPER_POTION }, #line 1425 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1426 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3419,7 +3419,7 @@ F_TRAINER_FEMALE | #line 1446 .items = { ITEM_FULL_RESTORE }, #line 1447 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1448 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -3464,7 +3464,7 @@ F_TRAINER_FEMALE | #line 1464 .items = { ITEM_FULL_RESTORE }, #line 1465 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1466 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -3509,7 +3509,7 @@ F_TRAINER_FEMALE | #line 1482 .items = { ITEM_FULL_RESTORE }, #line 1483 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1484 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3565,7 +3565,7 @@ F_TRAINER_FEMALE | #line 1504 .items = { ITEM_FULL_RESTORE }, #line 1505 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1506 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -3632,7 +3632,7 @@ F_TRAINER_FEMALE | #line 1530 .items = { ITEM_FULL_RESTORE }, #line 1531 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1532 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3688,7 +3688,7 @@ F_TRAINER_FEMALE | #line 1552 .items = { ITEM_HYPER_POTION }, #line 1553 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1554 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3744,7 +3744,7 @@ F_TRAINER_FEMALE | #line 1574 .items = { ITEM_HYPER_POTION }, #line 1575 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1576 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3800,7 +3800,7 @@ F_TRAINER_FEMALE | #line 1596 .items = { ITEM_FULL_RESTORE }, #line 1597 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1598 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3856,7 +3856,7 @@ F_TRAINER_FEMALE | #line 1618 .items = { ITEM_FULL_RESTORE }, #line 1619 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1620 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -3912,7 +3912,7 @@ F_TRAINER_FEMALE | #line 1640 .items = { ITEM_FULL_RESTORE }, #line 1641 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1642 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -3959,7 +3959,7 @@ F_TRAINER_FEMALE | #line 1658 .items = { ITEM_HYPER_POTION }, #line 1659 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1660 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -4000,7 +4000,7 @@ F_TRAINER_FEMALE | #line 1674 .items = { ITEM_HYPER_POTION }, #line 1675 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1676 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -4042,7 +4042,7 @@ F_TRAINER_FEMALE | #line 1691 .items = { ITEM_HYPER_POTION }, #line 1692 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1693 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 1, @@ -4083,7 +4083,7 @@ F_TRAINER_FEMALE | #line 1707 .items = { ITEM_FULL_RESTORE }, #line 1708 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1709 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 3, @@ -4162,7 +4162,7 @@ F_TRAINER_FEMALE | #line 1741 .items = { ITEM_FULL_RESTORE }, #line 1742 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1743 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -4209,7 +4209,7 @@ F_TRAINER_FEMALE | #line 1759 .items = { ITEM_SUPER_POTION }, #line 1760 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1761 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4267,7 +4267,7 @@ F_TRAINER_FEMALE | #line 1781 .items = { ITEM_FULL_RESTORE }, #line 1782 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1783 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -4303,7 +4303,7 @@ F_TRAINER_FEMALE | #line 1795 .items = { ITEM_FULL_RESTORE }, #line 1796 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1797 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -4339,7 +4339,7 @@ F_TRAINER_FEMALE | #line 1809 .items = { ITEM_FULL_RESTORE }, #line 1810 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1811 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -4375,7 +4375,7 @@ F_TRAINER_FEMALE | #line 1823 .items = { ITEM_FULL_RESTORE }, #line 1824 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1825 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4433,7 +4433,7 @@ F_TRAINER_FEMALE | #line 1845 .items = { ITEM_FULL_RESTORE }, #line 1846 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1847 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -4480,7 +4480,7 @@ F_TRAINER_FEMALE | #line 1863 .items = { ITEM_FULL_RESTORE }, #line 1864 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1865 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4538,7 +4538,7 @@ F_TRAINER_FEMALE | #line 1885 .items = { ITEM_HYPER_POTION }, #line 1886 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1887 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4596,7 +4596,7 @@ F_TRAINER_FEMALE | #line 1907 .items = { ITEM_HYPER_POTION }, #line 1908 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1909 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4654,7 +4654,7 @@ F_TRAINER_FEMALE | #line 1929 .items = { ITEM_FULL_RESTORE }, #line 1930 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1931 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4712,7 +4712,7 @@ F_TRAINER_FEMALE | #line 1951 .items = { ITEM_FULL_RESTORE }, #line 1952 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1953 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -4768,7 +4768,7 @@ F_TRAINER_FEMALE | #line 1972 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 1973 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1974 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -4813,7 +4813,7 @@ F_TRAINER_FEMALE | #line 1989 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 1990 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 1991 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -4858,7 +4858,7 @@ F_TRAINER_FEMALE | #line 2006 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2007 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2008 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -4903,7 +4903,7 @@ F_TRAINER_FEMALE | #line 2023 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2024 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2025 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -4937,7 +4937,7 @@ F_TRAINER_FEMALE | #line 2036 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2037 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2038 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -4971,7 +4971,7 @@ F_TRAINER_FEMALE | #line 2049 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2050 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2051 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5016,7 +5016,7 @@ F_TRAINER_FEMALE | #line 2066 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2067 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2068 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5061,7 +5061,7 @@ F_TRAINER_FEMALE | #line 2083 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2084 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5106,7 +5106,7 @@ F_TRAINER_FEMALE | #line 2100 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2101 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2102 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -5164,7 +5164,7 @@ F_TRAINER_FEMALE | #line 2122 .items = { ITEM_FULL_RESTORE }, #line 2123 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2124 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5202,7 +5202,7 @@ F_TRAINER_FEMALE | #line 2136 .items = { ITEM_FULL_RESTORE }, #line 2137 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2138 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5263,7 +5263,7 @@ F_TRAINER_FEMALE | #line 2161 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 2162 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2163 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -5321,7 +5321,7 @@ F_TRAINER_FEMALE | #line 2183 .items = { ITEM_FULL_RESTORE }, #line 2184 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2185 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5364,7 +5364,7 @@ F_TRAINER_FEMALE | #line 2199 .items = { ITEM_FULL_RESTORE }, #line 2200 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2201 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5402,7 +5402,7 @@ F_TRAINER_FEMALE | #line 2213 .items = { ITEM_FULL_RESTORE }, #line 2214 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5440,7 +5440,7 @@ F_TRAINER_FEMALE | #line 2227 .items = { ITEM_FULL_RESTORE }, #line 2228 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2229 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5478,7 +5478,7 @@ F_TRAINER_FEMALE | #line 2241 .items = { ITEM_FULL_RESTORE }, #line 2242 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2243 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5516,7 +5516,7 @@ F_TRAINER_FEMALE | #line 2255 .items = { ITEM_FULL_RESTORE }, #line 2256 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2257 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5554,7 +5554,7 @@ F_TRAINER_FEMALE | #line 2269 .items = { ITEM_FULL_RESTORE }, #line 2270 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2271 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5597,7 +5597,7 @@ F_TRAINER_FEMALE | #line 2286 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2287 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2288 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5631,7 +5631,7 @@ F_TRAINER_FEMALE | #line 2299 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2300 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2301 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5665,7 +5665,7 @@ F_TRAINER_FEMALE | #line 2312 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2313 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2314 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5699,7 +5699,7 @@ F_TRAINER_FEMALE | #line 2325 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2326 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2327 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5758,7 +5758,7 @@ F_TRAINER_FEMALE | #line 2350 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2351 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2352 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5792,7 +5792,7 @@ F_TRAINER_FEMALE | #line 2363 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2364 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2365 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -5826,7 +5826,7 @@ F_TRAINER_FEMALE | #line 2376 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2377 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2378 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -5902,7 +5902,7 @@ F_TRAINER_FEMALE | #line 2408 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2409 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2410 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -5947,7 +5947,7 @@ F_TRAINER_FEMALE | #line 2425 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2426 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2427 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6006,7 +6006,7 @@ F_TRAINER_FEMALE | #line 2450 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2451 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2452 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6065,7 +6065,7 @@ F_TRAINER_FEMALE | #line 2475 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2476 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2477 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6124,7 +6124,7 @@ F_TRAINER_FEMALE | #line 2500 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2501 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2502 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6183,7 +6183,7 @@ F_TRAINER_FEMALE | #line 2526 .items = { ITEM_FULL_RESTORE }, #line 2527 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2528 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6219,7 +6219,7 @@ F_TRAINER_FEMALE | #line 2539 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 2540 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2541 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6264,7 +6264,7 @@ F_TRAINER_FEMALE | #line 2557 .items = { ITEM_FULL_RESTORE }, #line 2558 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2559 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6300,7 +6300,7 @@ F_TRAINER_FEMALE | #line 2571 .items = { ITEM_FULL_RESTORE }, #line 2572 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2573 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6336,7 +6336,7 @@ F_TRAINER_FEMALE | #line 2585 .items = { ITEM_FULL_RESTORE }, #line 2586 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2587 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6372,7 +6372,7 @@ F_TRAINER_FEMALE | #line 2599 .items = { ITEM_FULL_RESTORE }, #line 2600 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2601 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6408,7 +6408,7 @@ F_TRAINER_FEMALE | #line 2613 .items = { ITEM_FULL_RESTORE }, #line 2614 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2615 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6449,7 +6449,7 @@ F_TRAINER_FEMALE | #line 2630 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2631 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2632 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6483,7 +6483,7 @@ F_TRAINER_FEMALE | #line 2643 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 2644 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2645 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6526,7 +6526,7 @@ F_TRAINER_FEMALE | #line 2660 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2661 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2662 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6560,7 +6560,7 @@ F_TRAINER_FEMALE | #line 2673 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 2674 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2675 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6592,7 +6592,7 @@ F_TRAINER_FEMALE | #line 2686 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2687 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2688 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6624,7 +6624,7 @@ F_TRAINER_FEMALE | #line 2699 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2700 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2701 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6667,7 +6667,7 @@ F_TRAINER_FEMALE | #line 2716 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2717 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2718 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6710,7 +6710,7 @@ F_TRAINER_FEMALE | #line 2733 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 2734 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2735 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6753,7 +6753,7 @@ F_TRAINER_FEMALE | #line 2750 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2751 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2752 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6785,7 +6785,7 @@ F_TRAINER_FEMALE | #line 2763 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2764 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2765 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6817,7 +6817,7 @@ F_TRAINER_FEMALE | #line 2776 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2777 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2778 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -6860,7 +6860,7 @@ F_TRAINER_FEMALE | #line 2793 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2794 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2795 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -6914,7 +6914,7 @@ F_TRAINER_FEMALE | #line 2814 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2815 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2816 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6946,7 +6946,7 @@ F_TRAINER_FEMALE | #line 2827 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2828 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2829 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -6978,7 +6978,7 @@ F_TRAINER_FEMALE | #line 2840 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2841 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2842 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7010,7 +7010,7 @@ F_TRAINER_FEMALE | #line 2853 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2854 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2855 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7053,7 +7053,7 @@ F_TRAINER_FEMALE | #line 2870 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2871 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2872 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7096,7 +7096,7 @@ F_TRAINER_FEMALE | #line 2887 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2888 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2889 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7128,7 +7128,7 @@ F_TRAINER_FEMALE | #line 2900 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2901 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2902 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7160,7 +7160,7 @@ F_TRAINER_FEMALE | #line 2913 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2914 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2915 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7192,7 +7192,7 @@ F_TRAINER_FEMALE | #line 2926 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2927 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2928 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7224,7 +7224,7 @@ F_TRAINER_FEMALE | #line 2939 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2940 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2941 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -7278,7 +7278,7 @@ F_TRAINER_FEMALE | #line 2960 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2961 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2962 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7310,7 +7310,7 @@ F_TRAINER_FEMALE | #line 2973 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2974 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2975 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7342,7 +7342,7 @@ F_TRAINER_FEMALE | #line 2986 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 2987 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 2988 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7385,7 +7385,7 @@ F_TRAINER_FEMALE | #line 3003 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3004 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3005 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7428,7 +7428,7 @@ F_TRAINER_FEMALE | #line 3020 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3021 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3022 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7460,7 +7460,7 @@ F_TRAINER_FEMALE | #line 3033 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3034 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3035 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7492,7 +7492,7 @@ F_TRAINER_FEMALE | #line 3046 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3047 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3048 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7524,7 +7524,7 @@ F_TRAINER_FEMALE | #line 3059 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3060 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3061 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7556,7 +7556,7 @@ F_TRAINER_FEMALE | #line 3072 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3073 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3074 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -7610,7 +7610,7 @@ F_TRAINER_FEMALE | #line 3093 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3094 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3095 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7653,7 +7653,7 @@ F_TRAINER_FEMALE | #line 3110 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3111 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3112 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7685,7 +7685,7 @@ F_TRAINER_FEMALE | #line 3123 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3124 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3125 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7717,7 +7717,7 @@ F_TRAINER_FEMALE | #line 3136 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3137 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3138 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7760,7 +7760,7 @@ F_TRAINER_FEMALE | #line 3153 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 3154 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3155 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7803,7 +7803,7 @@ F_TRAINER_FEMALE | #line 3170 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3171 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3172 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7835,7 +7835,7 @@ F_TRAINER_FEMALE | #line 3183 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3184 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3185 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7878,7 +7878,7 @@ F_TRAINER_FEMALE | #line 3200 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3201 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3202 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7910,7 +7910,7 @@ F_TRAINER_FEMALE | #line 3213 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3214 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -7953,7 +7953,7 @@ F_TRAINER_FEMALE | #line 3230 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3231 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3232 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -7985,7 +7985,7 @@ F_TRAINER_FEMALE | #line 3243 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3244 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3245 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8017,7 +8017,7 @@ F_TRAINER_FEMALE | #line 3256 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3257 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3258 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8060,7 +8060,7 @@ F_TRAINER_FEMALE | #line 3273 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3274 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3275 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -8114,7 +8114,7 @@ F_TRAINER_FEMALE | #line 3294 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3295 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3296 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -8181,7 +8181,7 @@ F_TRAINER_FEMALE | #line 3319 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3320 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3321 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8224,7 +8224,7 @@ F_TRAINER_FEMALE | #line 3336 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3337 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3338 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8256,7 +8256,7 @@ F_TRAINER_FEMALE | #line 3349 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3350 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8288,7 +8288,7 @@ F_TRAINER_FEMALE | #line 3362 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3363 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3364 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8346,7 +8346,7 @@ F_TRAINER_FEMALE | #line 3386 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 3387 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3388 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8389,7 +8389,7 @@ F_TRAINER_FEMALE | #line 3403 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 3404 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8421,7 +8421,7 @@ F_TRAINER_FEMALE | #line 3416 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3417 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3418 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8464,7 +8464,7 @@ F_TRAINER_FEMALE | #line 3433 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3434 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3435 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8507,7 +8507,7 @@ F_TRAINER_FEMALE | #line 3450 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3451 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3452 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8550,7 +8550,7 @@ F_TRAINER_FEMALE | #line 3467 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3468 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -8604,7 +8604,7 @@ F_TRAINER_FEMALE | #line 3488 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3489 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3490 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -8658,7 +8658,7 @@ F_TRAINER_FEMALE | #line 3509 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3510 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3511 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -8712,7 +8712,7 @@ F_TRAINER_FEMALE | #line 3530 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 3531 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3532 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -8766,7 +8766,7 @@ F_TRAINER_FEMALE | #line 3551 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3552 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3553 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8798,7 +8798,7 @@ F_TRAINER_FEMALE | #line 3564 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3565 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3566 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8841,7 +8841,7 @@ F_TRAINER_FEMALE | #line 3581 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3582 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8873,7 +8873,7 @@ F_TRAINER_FEMALE | #line 3594 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3595 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3596 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8905,7 +8905,7 @@ F_TRAINER_FEMALE | #line 3607 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3608 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3609 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -8937,7 +8937,7 @@ F_TRAINER_FEMALE | #line 3620 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3621 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3622 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -8980,7 +8980,7 @@ F_TRAINER_FEMALE | #line 3637 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3638 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3639 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9023,7 +9023,7 @@ F_TRAINER_FEMALE | #line 3654 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3655 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3656 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9066,7 +9066,7 @@ F_TRAINER_FEMALE | #line 3671 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3672 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3673 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9109,7 +9109,7 @@ F_TRAINER_FEMALE | #line 3688 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 3689 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3690 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9152,7 +9152,7 @@ F_TRAINER_FEMALE | #line 3705 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3706 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3707 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9191,7 +9191,7 @@ F_TRAINER_FEMALE | #line 3722 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3723 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3724 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9266,7 +9266,7 @@ F_TRAINER_FEMALE | #line 3755 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3756 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3757 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9298,7 +9298,7 @@ F_TRAINER_FEMALE | #line 3768 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3769 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9341,7 +9341,7 @@ F_TRAINER_FEMALE | #line 3785 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3786 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3787 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9373,7 +9373,7 @@ F_TRAINER_FEMALE | #line 3798 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3799 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3800 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9418,7 +9418,7 @@ F_TRAINER_FEMALE | #line 3815 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 3816 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3817 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9450,7 +9450,7 @@ F_TRAINER_FEMALE | #line 3828 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3829 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3830 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9482,7 +9482,7 @@ F_TRAINER_FEMALE | #line 3841 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3842 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3843 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9525,7 +9525,7 @@ F_TRAINER_FEMALE | #line 3858 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3859 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3860 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9568,7 +9568,7 @@ F_TRAINER_FEMALE | #line 3875 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3876 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3877 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9622,7 +9622,7 @@ F_TRAINER_FEMALE | #line 3896 TRAINER_ENCOUNTER_MUSIC_MALE, #line 3897 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3898 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9676,7 +9676,7 @@ F_TRAINER_FEMALE | #line 3917 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3918 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3919 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -9708,7 +9708,7 @@ F_TRAINER_FEMALE | #line 3930 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3931 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3932 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9762,7 +9762,7 @@ F_TRAINER_FEMALE | #line 3951 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3952 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3953 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9816,7 +9816,7 @@ F_TRAINER_FEMALE | #line 3972 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3973 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3974 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9870,7 +9870,7 @@ F_TRAINER_FEMALE | #line 3993 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 3994 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 3995 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -9913,7 +9913,7 @@ F_TRAINER_FEMALE | #line 4010 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4011 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4012 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -9967,7 +9967,7 @@ F_TRAINER_FEMALE | #line 4031 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4032 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4033 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -10021,7 +10021,7 @@ F_TRAINER_FEMALE | #line 4052 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4053 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4054 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -10086,7 +10086,7 @@ F_TRAINER_FEMALE | #line 4077 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 4078 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4079 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 5, @@ -10164,7 +10164,7 @@ F_TRAINER_FEMALE | #line 4106 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4107 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4108 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10200,7 +10200,7 @@ F_TRAINER_FEMALE | #line 4120 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4121 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4122 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10232,7 +10232,7 @@ F_TRAINER_FEMALE | #line 4133 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4134 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4135 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10264,7 +10264,7 @@ F_TRAINER_FEMALE | #line 4146 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4147 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4148 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10296,7 +10296,7 @@ F_TRAINER_FEMALE | #line 4159 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4160 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4161 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -10350,7 +10350,7 @@ F_TRAINER_FEMALE | #line 4180 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4181 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4182 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10393,7 +10393,7 @@ F_TRAINER_FEMALE | #line 4197 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4198 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10425,7 +10425,7 @@ F_TRAINER_FEMALE | #line 4210 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4211 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4212 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10468,7 +10468,7 @@ F_TRAINER_FEMALE | #line 4227 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4228 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4229 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10511,7 +10511,7 @@ F_TRAINER_FEMALE | #line 4244 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4245 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4246 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10554,7 +10554,7 @@ F_TRAINER_FEMALE | #line 4261 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4262 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4263 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10599,7 +10599,7 @@ F_TRAINER_FEMALE | #line 4278 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4279 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4280 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10637,7 +10637,7 @@ F_TRAINER_FEMALE | #line 4292 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4293 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4294 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10671,7 +10671,7 @@ F_TRAINER_FEMALE | #line 4305 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4306 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4307 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10705,7 +10705,7 @@ F_TRAINER_FEMALE | #line 4318 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4319 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4320 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -10739,7 +10739,7 @@ F_TRAINER_FEMALE | #line 4331 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4332 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4333 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -10795,7 +10795,7 @@ F_TRAINER_FEMALE | #line 4352 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4353 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4354 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10840,7 +10840,7 @@ F_TRAINER_FEMALE | #line 4369 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4370 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4371 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10885,7 +10885,7 @@ F_TRAINER_FEMALE | #line 4386 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4387 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4388 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10930,7 +10930,7 @@ F_TRAINER_FEMALE | #line 4403 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4404 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -10975,7 +10975,7 @@ F_TRAINER_FEMALE | #line 4420 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4421 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4422 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -11020,7 +11020,7 @@ F_TRAINER_FEMALE | #line 4437 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 4438 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4439 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -11063,7 +11063,7 @@ F_TRAINER_FEMALE | #line 4454 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4455 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4456 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -11095,7 +11095,7 @@ F_TRAINER_FEMALE | #line 4467 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4468 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -11138,7 +11138,7 @@ F_TRAINER_FEMALE | #line 4484 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4485 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4486 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -11170,7 +11170,7 @@ F_TRAINER_FEMALE | #line 4497 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4498 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4499 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -11202,7 +11202,7 @@ F_TRAINER_FEMALE | #line 4510 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4511 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -11259,7 +11259,7 @@ F_TRAINER_FEMALE | #line 4535 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4536 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -11315,7 +11315,7 @@ F_TRAINER_FEMALE | #line 4559 TRAINER_ENCOUNTER_MUSIC_RICH, #line 4560 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4561 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -11392,7 +11392,7 @@ F_TRAINER_FEMALE | #line 4593 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 4594 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4595 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_FORCE_SETUP_FIRST_TURN, #line 4596 @@ -11511,7 +11511,7 @@ F_TRAINER_FEMALE | #line 4644 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 4645 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4646 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4647 @@ -11630,7 +11630,7 @@ F_TRAINER_FEMALE | #line 4695 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 4696 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4697 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4698 @@ -11747,7 +11747,7 @@ F_TRAINER_FEMALE | #line 4746 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 4747 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4748 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 4749 @@ -11866,7 +11866,7 @@ F_TRAINER_FEMALE | #line 4797 .items = { ITEM_POTION, ITEM_POTION }, #line 4798 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4799 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -11945,7 +11945,7 @@ F_TRAINER_FEMALE | #line 4831 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, #line 4832 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4833 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -12024,7 +12024,7 @@ F_TRAINER_FEMALE | #line 4865 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, #line 4866 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4867 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -12123,7 +12123,7 @@ F_TRAINER_FEMALE | #line 4907 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, #line 4908 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4909 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -12220,7 +12220,7 @@ F_TRAINER_FEMALE | #line 4949 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, #line 4950 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4951 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -12319,7 +12319,7 @@ F_TRAINER_FEMALE | #line 4991 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, #line 4992 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 4993 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, .partySize = 5, @@ -12434,7 +12434,7 @@ F_TRAINER_FEMALE | #line 5041 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION, ITEM_HYPER_POTION }, #line 5042 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5043 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -12533,7 +12533,7 @@ F_TRAINER_FEMALE | #line 5083 .items = { ITEM_HYPER_POTION, ITEM_HYPER_POTION }, #line 5084 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5085 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -12646,7 +12646,7 @@ F_TRAINER_FEMALE | #line 5132 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5133 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5134 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -12678,7 +12678,7 @@ F_TRAINER_FEMALE | #line 5145 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5146 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5147 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -12710,7 +12710,7 @@ F_TRAINER_FEMALE | #line 5158 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5159 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5160 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -12764,7 +12764,7 @@ F_TRAINER_FEMALE | #line 5179 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5180 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5181 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -12807,7 +12807,7 @@ F_TRAINER_FEMALE | #line 5196 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5197 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5198 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -12850,7 +12850,7 @@ F_TRAINER_FEMALE | #line 5213 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5214 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5215 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -12893,7 +12893,7 @@ F_TRAINER_FEMALE | #line 5230 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5231 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5232 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -12949,7 +12949,7 @@ F_TRAINER_FEMALE | #line 5251 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5252 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5253 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -12983,7 +12983,7 @@ F_TRAINER_FEMALE | #line 5264 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5265 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5266 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13028,7 +13028,7 @@ F_TRAINER_FEMALE | #line 5281 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5282 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5283 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13073,7 +13073,7 @@ F_TRAINER_FEMALE | #line 5298 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5299 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5300 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13118,7 +13118,7 @@ F_TRAINER_FEMALE | #line 5315 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5316 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5317 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13163,7 +13163,7 @@ F_TRAINER_FEMALE | #line 5332 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 5333 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5334 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13206,7 +13206,7 @@ F_TRAINER_FEMALE | #line 5349 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5350 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13263,7 +13263,7 @@ F_TRAINER_FEMALE | #line 5374 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5375 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5376 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13319,7 +13319,7 @@ F_TRAINER_FEMALE | #line 5398 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5399 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5400 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13375,7 +13375,7 @@ F_TRAINER_FEMALE | #line 5422 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5423 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5424 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13431,7 +13431,7 @@ F_TRAINER_FEMALE | #line 5446 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5447 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5448 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13487,7 +13487,7 @@ F_TRAINER_FEMALE | #line 5470 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5471 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 5472 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13543,7 +13543,7 @@ F_TRAINER_FEMALE | #line 5494 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5495 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5496 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -13590,7 +13590,7 @@ F_TRAINER_FEMALE | #line 5511 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5512 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5513 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13624,7 +13624,7 @@ F_TRAINER_FEMALE | #line 5524 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5525 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5526 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -13765,7 +13765,7 @@ F_TRAINER_FEMALE | #line 5581 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5582 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13799,7 +13799,7 @@ F_TRAINER_FEMALE | #line 5594 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5595 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5596 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13833,7 +13833,7 @@ F_TRAINER_FEMALE | #line 5607 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5608 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5609 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13867,7 +13867,7 @@ F_TRAINER_FEMALE | #line 5620 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5621 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5622 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13903,7 +13903,7 @@ F_TRAINER_FEMALE | #line 5633 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5634 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5635 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 1, @@ -13939,7 +13939,7 @@ F_TRAINER_FEMALE | #line 5646 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5647 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5648 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -13975,7 +13975,7 @@ F_TRAINER_FEMALE | #line 5659 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5660 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5661 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -14037,7 +14037,7 @@ F_TRAINER_FEMALE | #line 5680 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5681 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5682 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14086,7 +14086,7 @@ F_TRAINER_FEMALE | #line 5697 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5698 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5699 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14135,7 +14135,7 @@ F_TRAINER_FEMALE | #line 5714 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5715 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5716 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14184,7 +14184,7 @@ F_TRAINER_FEMALE | #line 5731 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5732 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5733 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14233,7 +14233,7 @@ F_TRAINER_FEMALE | #line 5748 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 5749 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5750 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14280,7 +14280,7 @@ F_TRAINER_FEMALE | #line 5765 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5766 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5767 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14312,7 +14312,7 @@ F_TRAINER_FEMALE | #line 5778 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5779 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5780 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14351,7 +14351,7 @@ F_TRAINER_FEMALE | #line 5795 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5796 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5797 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14390,7 +14390,7 @@ F_TRAINER_FEMALE | #line 5812 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5813 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5814 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14429,7 +14429,7 @@ F_TRAINER_FEMALE | #line 5829 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5830 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5831 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14470,7 +14470,7 @@ F_TRAINER_FEMALE | #line 5846 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5847 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5848 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -14511,7 +14511,7 @@ F_TRAINER_FEMALE | #line 5863 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5864 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5865 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -14556,7 +14556,7 @@ F_TRAINER_FEMALE | #line 5880 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5881 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5882 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -14601,7 +14601,7 @@ F_TRAINER_FEMALE | #line 5897 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5898 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5899 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -14646,7 +14646,7 @@ F_TRAINER_FEMALE | #line 5914 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5915 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5916 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -14691,7 +14691,7 @@ F_TRAINER_FEMALE | #line 5931 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 5932 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5933 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -14734,7 +14734,7 @@ F_TRAINER_FEMALE | #line 5948 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5949 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5950 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -14766,7 +14766,7 @@ F_TRAINER_FEMALE | #line 5961 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5962 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5963 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14809,7 +14809,7 @@ F_TRAINER_FEMALE | #line 5978 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5979 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5980 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -14845,7 +14845,7 @@ F_TRAINER_FEMALE | #line 5992 TRAINER_ENCOUNTER_MUSIC_MALE, #line 5993 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 5994 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14888,7 +14888,7 @@ F_TRAINER_FEMALE | #line 6009 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6010 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -14920,7 +14920,7 @@ F_TRAINER_FEMALE | #line 6022 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6023 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6024 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -14979,7 +14979,7 @@ F_TRAINER_FEMALE | #line 6048 .items = { ITEM_FULL_RESTORE }, #line 6049 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6050 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -15040,7 +15040,7 @@ F_TRAINER_FEMALE | #line 6074 .items = { ITEM_FULL_RESTORE }, #line 6075 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6076 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -15097,7 +15097,7 @@ F_TRAINER_FEMALE | #line 6099 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6100 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6101 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -15129,7 +15129,7 @@ F_TRAINER_FEMALE | #line 6112 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6113 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6114 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -15161,7 +15161,7 @@ F_TRAINER_FEMALE | #line 6125 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6126 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6127 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -15193,7 +15193,7 @@ F_TRAINER_FEMALE | #line 6138 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6139 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6140 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -15236,7 +15236,7 @@ F_TRAINER_FEMALE | #line 6155 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6156 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6157 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15290,7 +15290,7 @@ F_TRAINER_FEMALE | #line 6176 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6177 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6178 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15344,7 +15344,7 @@ F_TRAINER_FEMALE | #line 6197 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6198 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6199 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -15387,7 +15387,7 @@ F_TRAINER_FEMALE | #line 6214 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6215 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6216 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -15430,7 +15430,7 @@ F_TRAINER_FEMALE | #line 6231 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6232 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6233 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -15475,7 +15475,7 @@ F_TRAINER_FEMALE | #line 6249 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 6250 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6251 .aiFlags = AI_FLAG_BASIC_TRAINER, #line 6252 @@ -15608,7 +15608,7 @@ F_TRAINER_FEMALE | #line 6307 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6308 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6309 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15662,7 +15662,7 @@ F_TRAINER_FEMALE | #line 6328 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6329 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6330 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15716,7 +15716,7 @@ F_TRAINER_FEMALE | #line 6349 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6350 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15770,7 +15770,7 @@ F_TRAINER_FEMALE | #line 6370 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6371 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6372 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -15824,7 +15824,7 @@ F_TRAINER_FEMALE | #line 6391 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6392 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6393 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -15856,7 +15856,7 @@ F_TRAINER_FEMALE | #line 6404 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6405 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6406 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -15921,7 +15921,7 @@ F_TRAINER_FEMALE | #line 6429 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6430 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6431 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -15953,7 +15953,7 @@ F_TRAINER_FEMALE | #line 6442 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6443 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6444 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -15996,7 +15996,7 @@ F_TRAINER_FEMALE | #line 6459 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6460 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6461 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16028,7 +16028,7 @@ F_TRAINER_FEMALE | #line 6472 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6473 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6474 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -16071,7 +16071,7 @@ F_TRAINER_FEMALE | #line 6489 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6490 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6491 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -16125,7 +16125,7 @@ F_TRAINER_FEMALE | #line 6510 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6511 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -16190,7 +16190,7 @@ F_TRAINER_FEMALE | #line 6535 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6536 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -16255,7 +16255,7 @@ F_TRAINER_FEMALE | #line 6560 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6561 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6562 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 4, @@ -16320,7 +16320,7 @@ F_TRAINER_FEMALE | #line 6585 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 6586 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6587 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -16407,7 +16407,7 @@ F_TRAINER_FEMALE | #line 6618 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6619 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6620 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -16461,7 +16461,7 @@ F_TRAINER_FEMALE | #line 6639 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6640 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6641 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -16504,7 +16504,7 @@ F_TRAINER_FEMALE | #line 6656 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6657 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6658 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16536,7 +16536,7 @@ F_TRAINER_FEMALE | #line 6669 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6670 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6671 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16568,7 +16568,7 @@ F_TRAINER_FEMALE | #line 6682 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6683 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6684 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16600,7 +16600,7 @@ F_TRAINER_FEMALE | #line 6695 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6696 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6697 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16632,7 +16632,7 @@ F_TRAINER_FEMALE | #line 6708 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6709 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6710 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16666,7 +16666,7 @@ F_TRAINER_FEMALE | #line 6721 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6722 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6723 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16700,7 +16700,7 @@ F_TRAINER_FEMALE | #line 6734 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6735 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6736 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -16756,7 +16756,7 @@ F_TRAINER_FEMALE | #line 6755 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6756 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6757 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16790,7 +16790,7 @@ F_TRAINER_FEMALE | #line 6768 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6769 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16824,7 +16824,7 @@ F_TRAINER_FEMALE | #line 6781 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6782 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6783 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16858,7 +16858,7 @@ F_TRAINER_FEMALE | #line 6794 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6795 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6796 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16890,7 +16890,7 @@ F_TRAINER_FEMALE | #line 6807 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6808 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6809 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16922,7 +16922,7 @@ F_TRAINER_FEMALE | #line 6820 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6821 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6822 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16954,7 +16954,7 @@ F_TRAINER_FEMALE | #line 6833 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6834 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6835 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -16986,7 +16986,7 @@ F_TRAINER_FEMALE | #line 6846 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6847 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6848 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17018,7 +17018,7 @@ F_TRAINER_FEMALE | #line 6859 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6860 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6861 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17052,7 +17052,7 @@ F_TRAINER_FEMALE | #line 6872 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6873 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6874 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17086,7 +17086,7 @@ F_TRAINER_FEMALE | #line 6885 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6886 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6887 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17120,7 +17120,7 @@ F_TRAINER_FEMALE | #line 6898 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6899 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6900 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17154,7 +17154,7 @@ F_TRAINER_FEMALE | #line 6911 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6912 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6913 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17188,7 +17188,7 @@ F_TRAINER_FEMALE | #line 6924 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 6925 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6926 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17220,7 +17220,7 @@ F_TRAINER_FEMALE | #line 6937 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6938 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6939 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17263,7 +17263,7 @@ F_TRAINER_FEMALE | #line 6954 TRAINER_ENCOUNTER_MUSIC_MALE, #line 6955 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6956 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17306,7 +17306,7 @@ F_TRAINER_FEMALE | #line 6971 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6972 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6973 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17338,7 +17338,7 @@ F_TRAINER_FEMALE | #line 6984 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 6985 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 6986 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17381,7 +17381,7 @@ F_TRAINER_FEMALE | #line 7001 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7002 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7003 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17424,7 +17424,7 @@ F_TRAINER_FEMALE | #line 7018 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7019 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7020 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17456,7 +17456,7 @@ F_TRAINER_FEMALE | #line 7031 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7032 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7033 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17488,7 +17488,7 @@ F_TRAINER_FEMALE | #line 7044 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7045 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7046 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17520,7 +17520,7 @@ F_TRAINER_FEMALE | #line 7057 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7058 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7059 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17554,7 +17554,7 @@ F_TRAINER_FEMALE | #line 7070 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7071 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7072 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17588,7 +17588,7 @@ F_TRAINER_FEMALE | #line 7083 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7084 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7085 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17633,7 +17633,7 @@ F_TRAINER_FEMALE | #line 7100 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7101 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7102 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17667,7 +17667,7 @@ F_TRAINER_FEMALE | #line 7113 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7114 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7115 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17701,7 +17701,7 @@ F_TRAINER_FEMALE | #line 7126 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7127 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7128 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17746,7 +17746,7 @@ F_TRAINER_FEMALE | #line 7143 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7144 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7145 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17780,7 +17780,7 @@ F_TRAINER_FEMALE | #line 7156 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7157 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7158 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17814,7 +17814,7 @@ F_TRAINER_FEMALE | #line 7169 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7170 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7171 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17848,7 +17848,7 @@ F_TRAINER_FEMALE | #line 7182 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 7183 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7184 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -17880,7 +17880,7 @@ F_TRAINER_FEMALE | #line 7195 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7196 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7197 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17923,7 +17923,7 @@ F_TRAINER_FEMALE | #line 7212 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7213 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7214 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -17966,7 +17966,7 @@ F_TRAINER_FEMALE | #line 7229 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7230 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7231 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18009,7 +18009,7 @@ F_TRAINER_FEMALE | #line 7246 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7247 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7248 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -18063,7 +18063,7 @@ F_TRAINER_FEMALE | #line 7267 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7268 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7269 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -18119,7 +18119,7 @@ F_TRAINER_FEMALE | #line 7288 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7289 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7290 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18158,7 +18158,7 @@ F_TRAINER_FEMALE | #line 7305 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7306 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7307 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18190,7 +18190,7 @@ F_TRAINER_FEMALE | #line 7318 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7319 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7320 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18233,7 +18233,7 @@ F_TRAINER_FEMALE | #line 7335 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7336 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7337 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18265,7 +18265,7 @@ F_TRAINER_FEMALE | #line 7348 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7349 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7350 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -18319,7 +18319,7 @@ F_TRAINER_FEMALE | #line 7369 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7370 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7371 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18351,7 +18351,7 @@ F_TRAINER_FEMALE | #line 7382 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7383 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7384 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18394,7 +18394,7 @@ F_TRAINER_FEMALE | #line 7399 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7400 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7401 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18437,7 +18437,7 @@ F_TRAINER_FEMALE | #line 7416 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7417 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7418 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18480,7 +18480,7 @@ F_TRAINER_FEMALE | #line 7433 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7434 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7435 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18512,7 +18512,7 @@ F_TRAINER_FEMALE | #line 7446 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7447 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7448 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -18566,7 +18566,7 @@ F_TRAINER_FEMALE | #line 7467 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7468 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18609,7 +18609,7 @@ F_TRAINER_FEMALE | #line 7484 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7485 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7486 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18652,7 +18652,7 @@ F_TRAINER_FEMALE | #line 7501 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7502 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7503 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18695,7 +18695,7 @@ F_TRAINER_FEMALE | #line 7518 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7519 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7520 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18738,7 +18738,7 @@ F_TRAINER_FEMALE | #line 7535 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7536 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7537 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18781,7 +18781,7 @@ F_TRAINER_FEMALE | #line 7552 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7553 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7554 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -18824,7 +18824,7 @@ F_TRAINER_FEMALE | #line 7569 TRAINER_ENCOUNTER_MUSIC_COOL, #line 7570 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7571 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -18856,7 +18856,7 @@ F_TRAINER_FEMALE | #line 7582 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7583 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7584 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 1, @@ -18888,7 +18888,7 @@ F_TRAINER_FEMALE | #line 7595 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7596 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7597 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, @@ -18935,7 +18935,7 @@ F_TRAINER_FEMALE | #line 7613 .items = { ITEM_FULL_RESTORE }, #line 7614 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 2, .party = (const struct TrainerMon[]) { @@ -18988,7 +18988,7 @@ F_TRAINER_FEMALE | #line 7633 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 7634 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -19018,7 +19018,7 @@ F_TRAINER_FEMALE | #line 7645 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7646 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 3, .party = (const struct TrainerMon[]) { @@ -19091,7 +19091,7 @@ F_TRAINER_FEMALE | #line 7677 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7678 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 2, .party = (const struct TrainerMon[]) { @@ -19132,7 +19132,7 @@ F_TRAINER_FEMALE | #line 7693 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7694 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 4, .party = (const struct TrainerMon[]) { @@ -19220,7 +19220,7 @@ F_TRAINER_FEMALE | #line 7730 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7731 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 4, .party = (const struct TrainerMon[]) { @@ -19308,7 +19308,7 @@ F_TRAINER_FEMALE | #line 7767 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7768 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 4, .party = (const struct TrainerMon[]) { @@ -19394,7 +19394,7 @@ F_TRAINER_FEMALE | #line 7802 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 7803 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 4, .party = (const struct TrainerMon[]) { @@ -19486,7 +19486,7 @@ F_TRAINER_FEMALE | #line 7839 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7840 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7841 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19520,7 +19520,7 @@ F_TRAINER_FEMALE | #line 7852 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7853 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7854 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19554,7 +19554,7 @@ F_TRAINER_FEMALE | #line 7865 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7866 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7867 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19599,7 +19599,7 @@ F_TRAINER_FEMALE | #line 7882 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7883 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7884 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19633,7 +19633,7 @@ F_TRAINER_FEMALE | #line 7895 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7896 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7897 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19667,7 +19667,7 @@ F_TRAINER_FEMALE | #line 7908 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7909 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7910 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19712,7 +19712,7 @@ F_TRAINER_FEMALE | #line 7925 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7926 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7927 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19757,7 +19757,7 @@ F_TRAINER_FEMALE | #line 7942 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7943 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7944 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19802,7 +19802,7 @@ F_TRAINER_FEMALE | #line 7959 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 7960 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7961 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19847,7 +19847,7 @@ F_TRAINER_FEMALE | #line 7976 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 7977 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7978 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19888,7 +19888,7 @@ F_TRAINER_FEMALE | #line 7993 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 7994 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 7995 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -19933,7 +19933,7 @@ F_TRAINER_FEMALE | #line 8010 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8011 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8012 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -19974,7 +19974,7 @@ F_TRAINER_FEMALE | #line 8027 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8028 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8029 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20015,7 +20015,7 @@ F_TRAINER_FEMALE | #line 8044 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8045 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8046 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20056,7 +20056,7 @@ F_TRAINER_FEMALE | #line 8061 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8062 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8063 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20115,7 +20115,7 @@ F_TRAINER_FEMALE | #line 8086 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 8087 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8088 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20174,7 +20174,7 @@ F_TRAINER_FEMALE | #line 8111 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8112 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8113 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20219,7 +20219,7 @@ F_TRAINER_FEMALE | #line 8128 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8129 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8130 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20253,7 +20253,7 @@ F_TRAINER_FEMALE | #line 8141 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8142 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8143 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20287,7 +20287,7 @@ F_TRAINER_FEMALE | #line 8154 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8155 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8156 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20332,7 +20332,7 @@ F_TRAINER_FEMALE | #line 8171 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8172 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8173 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20366,7 +20366,7 @@ F_TRAINER_FEMALE | #line 8184 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8185 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8186 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20411,7 +20411,7 @@ F_TRAINER_FEMALE | #line 8201 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8202 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8203 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20445,7 +20445,7 @@ F_TRAINER_FEMALE | #line 8214 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8215 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8216 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -20501,7 +20501,7 @@ F_TRAINER_FEMALE | #line 8235 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8236 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8237 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20535,7 +20535,7 @@ F_TRAINER_FEMALE | #line 8248 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8249 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8250 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20569,7 +20569,7 @@ F_TRAINER_FEMALE | #line 8261 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8262 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8263 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20603,7 +20603,7 @@ F_TRAINER_FEMALE | #line 8274 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8275 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8276 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20637,7 +20637,7 @@ F_TRAINER_FEMALE | #line 8287 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8288 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8289 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20682,7 +20682,7 @@ F_TRAINER_FEMALE | #line 8304 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8305 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8306 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20716,7 +20716,7 @@ F_TRAINER_FEMALE | #line 8317 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8318 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8319 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20761,7 +20761,7 @@ F_TRAINER_FEMALE | #line 8334 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8335 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8336 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20795,7 +20795,7 @@ F_TRAINER_FEMALE | #line 8347 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8348 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8349 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20829,7 +20829,7 @@ F_TRAINER_FEMALE | #line 8360 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8361 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8362 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20863,7 +20863,7 @@ F_TRAINER_FEMALE | #line 8373 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8374 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8375 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20908,7 +20908,7 @@ F_TRAINER_FEMALE | #line 8390 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8391 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8392 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -20942,7 +20942,7 @@ F_TRAINER_FEMALE | #line 8403 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8404 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -20987,7 +20987,7 @@ F_TRAINER_FEMALE | #line 8420 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8421 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8422 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21032,7 +21032,7 @@ F_TRAINER_FEMALE | #line 8437 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8438 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8439 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21077,7 +21077,7 @@ F_TRAINER_FEMALE | #line 8454 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8455 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8456 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -21111,7 +21111,7 @@ F_TRAINER_FEMALE | #line 8467 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8468 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8469 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -21145,7 +21145,7 @@ F_TRAINER_FEMALE | #line 8480 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8481 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8482 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -21179,7 +21179,7 @@ F_TRAINER_FEMALE | #line 8493 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8494 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8495 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21224,7 +21224,7 @@ F_TRAINER_FEMALE | #line 8510 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 8511 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21280,7 +21280,7 @@ F_TRAINER_FEMALE | #line 8531 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8532 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8533 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21339,7 +21339,7 @@ F_TRAINER_FEMALE | #line 8556 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8557 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8558 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21398,7 +21398,7 @@ F_TRAINER_FEMALE | #line 8581 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8582 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21443,7 +21443,7 @@ F_TRAINER_FEMALE | #line 8598 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8599 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8600 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21488,7 +21488,7 @@ F_TRAINER_FEMALE | #line 8615 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8616 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21533,7 +21533,7 @@ F_TRAINER_FEMALE | #line 8632 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8633 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8634 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21587,7 +21587,7 @@ F_TRAINER_FEMALE | #line 8653 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 8654 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8655 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -21628,7 +21628,7 @@ F_TRAINER_FEMALE | #line 8670 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8671 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8672 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21673,7 +21673,7 @@ F_TRAINER_FEMALE | #line 8687 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8688 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8689 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21729,7 +21729,7 @@ F_TRAINER_FEMALE | #line 8708 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8709 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8710 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21785,7 +21785,7 @@ F_TRAINER_FEMALE | #line 8729 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8730 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8731 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21841,7 +21841,7 @@ F_TRAINER_FEMALE | #line 8750 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 8751 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8752 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -21895,7 +21895,7 @@ F_TRAINER_FEMALE | #line 8771 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8772 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8773 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21938,7 +21938,7 @@ F_TRAINER_FEMALE | #line 8788 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8789 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8790 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -21981,7 +21981,7 @@ F_TRAINER_FEMALE | #line 8805 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8806 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8807 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22024,7 +22024,7 @@ F_TRAINER_FEMALE | #line 8822 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8823 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8824 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22067,7 +22067,7 @@ F_TRAINER_FEMALE | #line 8839 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8840 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8841 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22110,7 +22110,7 @@ F_TRAINER_FEMALE | #line 8856 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8857 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8858 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22163,7 +22163,7 @@ F_TRAINER_FEMALE | #line 8877 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8878 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8879 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22206,7 +22206,7 @@ F_TRAINER_FEMALE | #line 8894 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8895 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8896 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22263,7 +22263,7 @@ F_TRAINER_FEMALE | #line 8919 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 8920 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 8921 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22320,7 +22320,7 @@ F_TRAINER_FEMALE | #line 8944 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8945 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8946 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22363,7 +22363,7 @@ F_TRAINER_FEMALE | #line 8961 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8962 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8963 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -22395,7 +22395,7 @@ F_TRAINER_FEMALE | #line 8974 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8975 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8976 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22438,7 +22438,7 @@ F_TRAINER_FEMALE | #line 8991 TRAINER_ENCOUNTER_MUSIC_MALE, #line 8992 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 8993 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22492,7 +22492,7 @@ F_TRAINER_FEMALE | #line 9012 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9013 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9014 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22535,7 +22535,7 @@ F_TRAINER_FEMALE | #line 9029 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9030 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9031 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22589,7 +22589,7 @@ F_TRAINER_FEMALE | #line 9050 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9051 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9052 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22632,7 +22632,7 @@ F_TRAINER_FEMALE | #line 9067 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9068 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9069 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22686,7 +22686,7 @@ F_TRAINER_FEMALE | #line 9088 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9089 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9090 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22740,7 +22740,7 @@ F_TRAINER_FEMALE | #line 9109 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9110 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9111 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22794,7 +22794,7 @@ F_TRAINER_FEMALE | #line 9130 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9131 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9132 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -22848,7 +22848,7 @@ F_TRAINER_FEMALE | #line 9151 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 9152 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9153 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -22882,7 +22882,7 @@ F_TRAINER_FEMALE | #line 9164 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 9165 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9166 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -22947,7 +22947,7 @@ F_TRAINER_FEMALE | #line 9190 .items = { ITEM_HYPER_POTION }, #line 9191 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9192 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -22979,7 +22979,7 @@ F_TRAINER_FEMALE | #line 9203 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9204 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9205 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -23020,7 +23020,7 @@ F_TRAINER_FEMALE | #line 9220 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9221 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9222 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -23059,7 +23059,7 @@ F_TRAINER_FEMALE | #line 9237 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9238 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9239 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23102,7 +23102,7 @@ F_TRAINER_FEMALE | #line 9254 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9255 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23149,7 +23149,7 @@ F_TRAINER_FEMALE | #line 9272 .items = { ITEM_HYPER_POTION }, #line 9273 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9274 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -23190,7 +23190,7 @@ F_TRAINER_FEMALE | #line 9289 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9290 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9291 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23233,7 +23233,7 @@ F_TRAINER_FEMALE | #line 9306 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9307 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9308 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -23265,7 +23265,7 @@ F_TRAINER_FEMALE | #line 9319 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 9320 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9321 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23308,7 +23308,7 @@ F_TRAINER_FEMALE | #line 9336 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9337 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9338 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23351,7 +23351,7 @@ F_TRAINER_FEMALE | #line 9353 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9354 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9355 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23394,7 +23394,7 @@ F_TRAINER_FEMALE | #line 9370 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 9371 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9372 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -23448,7 +23448,7 @@ F_TRAINER_FEMALE | #line 9391 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9392 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9393 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23491,7 +23491,7 @@ F_TRAINER_FEMALE | #line 9408 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9409 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9410 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23534,7 +23534,7 @@ F_TRAINER_FEMALE | #line 9425 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9426 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9427 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23577,7 +23577,7 @@ F_TRAINER_FEMALE | #line 9442 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 9443 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9444 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -23622,7 +23622,7 @@ F_TRAINER_FEMALE | #line 9460 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 9461 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9462 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -23733,7 +23733,7 @@ F_TRAINER_FEMALE | #line 9509 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9510 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9511 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -23765,7 +23765,7 @@ F_TRAINER_FEMALE | #line 9522 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9523 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9524 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -23819,7 +23819,7 @@ F_TRAINER_FEMALE | #line 9543 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9544 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9545 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -23873,7 +23873,7 @@ F_TRAINER_FEMALE | #line 9564 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9565 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9566 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 1, @@ -23905,7 +23905,7 @@ F_TRAINER_FEMALE | #line 9577 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9578 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9579 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -23959,7 +23959,7 @@ F_TRAINER_FEMALE | #line 9598 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9599 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9600 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24013,7 +24013,7 @@ F_TRAINER_FEMALE | #line 9619 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9620 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9621 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -24045,7 +24045,7 @@ F_TRAINER_FEMALE | #line 9632 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9633 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9634 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24099,7 +24099,7 @@ F_TRAINER_FEMALE | #line 9653 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9654 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9655 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24155,7 +24155,7 @@ F_TRAINER_FEMALE | #line 9674 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9675 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9676 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -24189,7 +24189,7 @@ F_TRAINER_FEMALE | #line 9687 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9688 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9689 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24245,7 +24245,7 @@ F_TRAINER_FEMALE | #line 9708 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9709 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9710 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24301,7 +24301,7 @@ F_TRAINER_FEMALE | #line 9729 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9730 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9731 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -24335,7 +24335,7 @@ F_TRAINER_FEMALE | #line 9742 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9743 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9744 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24391,7 +24391,7 @@ F_TRAINER_FEMALE | #line 9763 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9764 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9765 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24447,7 +24447,7 @@ F_TRAINER_FEMALE | #line 9784 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9785 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9786 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -24481,7 +24481,7 @@ F_TRAINER_FEMALE | #line 9797 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9798 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9799 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24537,7 +24537,7 @@ F_TRAINER_FEMALE | #line 9818 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 9819 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9820 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -24591,7 +24591,7 @@ F_TRAINER_FEMALE | #line 9839 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9840 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9841 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -24678,7 +24678,7 @@ F_TRAINER_FEMALE | #line 9872 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9873 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9874 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -24710,7 +24710,7 @@ F_TRAINER_FEMALE | #line 9885 TRAINER_ENCOUNTER_MUSIC_COOL, #line 9886 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9887 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -24767,7 +24767,7 @@ F_TRAINER_FEMALE | #line 9910 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9911 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9912 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -24854,7 +24854,7 @@ F_TRAINER_FEMALE | #line 9943 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9944 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9945 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -24941,7 +24941,7 @@ F_TRAINER_FEMALE | #line 9976 TRAINER_ENCOUNTER_MUSIC_MALE, #line 9977 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 9978 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25028,7 +25028,7 @@ F_TRAINER_FEMALE | #line 10009 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10010 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25117,7 +25117,7 @@ F_TRAINER_FEMALE | #line 10042 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10043 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10044 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25208,7 +25208,7 @@ F_TRAINER_FEMALE | #line 10076 .items = { ITEM_FULL_RESTORE }, #line 10077 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10078 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -25251,7 +25251,7 @@ F_TRAINER_FEMALE | #line 10093 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 10094 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10095 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -25285,7 +25285,7 @@ F_TRAINER_FEMALE | #line 10106 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10107 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10108 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25374,7 +25374,7 @@ F_TRAINER_FEMALE | #line 10139 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10140 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10141 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25463,7 +25463,7 @@ F_TRAINER_FEMALE | #line 10172 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10173 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10174 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25552,7 +25552,7 @@ F_TRAINER_FEMALE | #line 10205 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10206 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10207 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -25641,7 +25641,7 @@ F_TRAINER_FEMALE | #line 10239 .items = { ITEM_FULL_RESTORE }, #line 10240 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10241 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -25675,7 +25675,7 @@ F_TRAINER_FEMALE | #line 10253 .items = { ITEM_FULL_RESTORE }, #line 10254 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10255 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -25731,7 +25731,7 @@ F_TRAINER_FEMALE | #line 10275 .items = { ITEM_FULL_RESTORE }, #line 10276 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10277 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -25765,7 +25765,7 @@ F_TRAINER_FEMALE | #line 10289 .items = { ITEM_FULL_RESTORE }, #line 10290 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10291 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 1, @@ -25799,7 +25799,7 @@ F_TRAINER_FEMALE | #line 10303 .items = { ITEM_FULL_RESTORE }, #line 10304 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10305 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -25833,7 +25833,7 @@ F_TRAINER_FEMALE | #line 10317 .items = { ITEM_FULL_RESTORE }, #line 10318 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10319 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 1, @@ -25867,7 +25867,7 @@ F_TRAINER_FEMALE | #line 10331 .items = { ITEM_FULL_RESTORE }, #line 10332 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10333 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -25914,7 +25914,7 @@ F_TRAINER_FEMALE | #line 10349 .items = { ITEM_FULL_RESTORE }, #line 10350 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -25961,7 +25961,7 @@ F_TRAINER_FEMALE | #line 10367 .items = { ITEM_FULL_RESTORE }, #line 10368 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10369 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 3, @@ -26019,7 +26019,7 @@ F_TRAINER_FEMALE | #line 10389 .items = { ITEM_FULL_RESTORE }, #line 10390 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10391 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -26066,7 +26066,7 @@ F_TRAINER_FEMALE | #line 10407 .items = { ITEM_FULL_RESTORE }, #line 10408 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10409 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -26113,7 +26113,7 @@ F_TRAINER_FEMALE | #line 10425 .items = { ITEM_FULL_RESTORE }, #line 10426 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10427 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -26160,7 +26160,7 @@ F_TRAINER_FEMALE | #line 10443 .items = { ITEM_FULL_RESTORE }, #line 10444 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10445 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -26207,7 +26207,7 @@ F_TRAINER_FEMALE | #line 10461 .items = { ITEM_FULL_RESTORE }, #line 10462 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10463 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -26250,7 +26250,7 @@ F_TRAINER_FEMALE | #line 10478 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10479 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10480 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26282,7 +26282,7 @@ F_TRAINER_FEMALE | #line 10491 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10492 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10493 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -26327,7 +26327,7 @@ F_TRAINER_FEMALE | #line 10508 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10509 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10510 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -26372,7 +26372,7 @@ F_TRAINER_FEMALE | #line 10525 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10526 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10527 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -26415,7 +26415,7 @@ F_TRAINER_FEMALE | #line 10542 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10543 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10544 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -26458,7 +26458,7 @@ F_TRAINER_FEMALE | #line 10559 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 10560 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10561 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -26501,7 +26501,7 @@ F_TRAINER_FEMALE | #line 10576 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10577 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10578 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26535,7 +26535,7 @@ F_TRAINER_FEMALE | #line 10589 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10590 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10591 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26567,7 +26567,7 @@ F_TRAINER_FEMALE | #line 10602 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10603 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10604 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26601,7 +26601,7 @@ F_TRAINER_FEMALE | #line 10615 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 10616 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26633,7 +26633,7 @@ F_TRAINER_FEMALE | #line 10628 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10629 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10630 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26669,7 +26669,7 @@ F_TRAINER_FEMALE | #line 10642 .items = { ITEM_HYPER_POTION }, #line 10643 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10644 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -26723,7 +26723,7 @@ F_TRAINER_FEMALE | #line 10664 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10665 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10666 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26755,7 +26755,7 @@ F_TRAINER_FEMALE | #line 10677 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10678 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10679 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26787,7 +26787,7 @@ F_TRAINER_FEMALE | #line 10690 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10691 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10692 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26821,7 +26821,7 @@ F_TRAINER_FEMALE | #line 10703 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10704 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10705 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26853,7 +26853,7 @@ F_TRAINER_FEMALE | #line 10716 TRAINER_ENCOUNTER_MUSIC_RICH, #line 10717 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10718 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26887,7 +26887,7 @@ F_TRAINER_FEMALE | #line 10729 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 10730 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10731 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26919,7 +26919,7 @@ F_TRAINER_FEMALE | #line 10742 TRAINER_ENCOUNTER_MUSIC_RICH, #line 10743 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10744 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26951,7 +26951,7 @@ F_TRAINER_FEMALE | #line 10755 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10756 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10757 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -26985,7 +26985,7 @@ F_TRAINER_FEMALE | #line 10768 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10769 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10770 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27028,7 +27028,7 @@ F_TRAINER_FEMALE | #line 10785 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10786 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10787 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27060,7 +27060,7 @@ F_TRAINER_FEMALE | #line 10798 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10799 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10800 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27092,7 +27092,7 @@ F_TRAINER_FEMALE | #line 10811 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10812 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10813 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27124,7 +27124,7 @@ F_TRAINER_FEMALE | #line 10824 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10825 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10826 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27158,7 +27158,7 @@ F_TRAINER_FEMALE | #line 10837 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10838 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10839 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27190,7 +27190,7 @@ F_TRAINER_FEMALE | #line 10850 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10851 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10852 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27233,7 +27233,7 @@ F_TRAINER_FEMALE | #line 10867 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10868 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10869 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27276,7 +27276,7 @@ F_TRAINER_FEMALE | #line 10884 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 10885 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10886 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -27321,7 +27321,7 @@ F_TRAINER_FEMALE | #line 10901 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 10902 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10903 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27355,7 +27355,7 @@ F_TRAINER_FEMALE | #line 10914 TRAINER_ENCOUNTER_MUSIC_AQUA, #line 10915 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10916 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27398,7 +27398,7 @@ F_TRAINER_FEMALE | #line 10931 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 10932 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10933 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -27465,7 +27465,7 @@ F_TRAINER_FEMALE | #line 10957 .items = { ITEM_HYPER_POTION }, #line 10958 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10959 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -27508,7 +27508,7 @@ F_TRAINER_FEMALE | #line 10974 TRAINER_ENCOUNTER_MUSIC_MALE, #line 10975 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10976 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -27553,7 +27553,7 @@ F_TRAINER_FEMALE | #line 10991 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 10992 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 10993 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -27598,7 +27598,7 @@ F_TRAINER_FEMALE | #line 11009 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, #line 11010 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11011 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -27654,7 +27654,7 @@ F_TRAINER_FEMALE | #line 11031 .items = { ITEM_SUPER_POTION, ITEM_SUPER_POTION }, #line 11032 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11033 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -27710,7 +27710,7 @@ F_TRAINER_FEMALE | #line 11052 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11053 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11054 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27755,7 +27755,7 @@ F_TRAINER_FEMALE | #line 11069 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11070 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11071 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27800,7 +27800,7 @@ F_TRAINER_FEMALE | #line 11086 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11087 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11088 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -27834,7 +27834,7 @@ F_TRAINER_FEMALE | #line 11099 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11100 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11101 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -27890,7 +27890,7 @@ F_TRAINER_FEMALE | #line 11120 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11121 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11122 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27935,7 +27935,7 @@ F_TRAINER_FEMALE | #line 11137 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11138 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11139 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -27980,7 +27980,7 @@ F_TRAINER_FEMALE | #line 11154 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11155 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11156 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28025,7 +28025,7 @@ F_TRAINER_FEMALE | #line 11171 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11172 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11173 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -28081,7 +28081,7 @@ F_TRAINER_FEMALE | #line 11192 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11193 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11194 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -28115,7 +28115,7 @@ F_TRAINER_FEMALE | #line 11205 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11206 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11207 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -28171,7 +28171,7 @@ F_TRAINER_FEMALE | #line 11226 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11227 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11228 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -28205,7 +28205,7 @@ F_TRAINER_FEMALE | #line 11239 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11240 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11241 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28248,7 +28248,7 @@ F_TRAINER_FEMALE | #line 11256 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11257 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11258 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28291,7 +28291,7 @@ F_TRAINER_FEMALE | #line 11273 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11274 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11275 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -28356,7 +28356,7 @@ F_TRAINER_FEMALE | #line 11298 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11299 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11300 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28399,7 +28399,7 @@ F_TRAINER_FEMALE | #line 11315 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11316 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11317 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28442,7 +28442,7 @@ F_TRAINER_FEMALE | #line 11332 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11333 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11334 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28485,7 +28485,7 @@ F_TRAINER_FEMALE | #line 11349 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11350 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11351 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -28517,7 +28517,7 @@ F_TRAINER_FEMALE | #line 11362 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11363 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11364 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28560,7 +28560,7 @@ F_TRAINER_FEMALE | #line 11379 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11380 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11381 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -28592,7 +28592,7 @@ F_TRAINER_FEMALE | #line 11392 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11393 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11394 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28635,7 +28635,7 @@ F_TRAINER_FEMALE | #line 11409 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11410 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11411 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -28689,7 +28689,7 @@ F_TRAINER_FEMALE | #line 11430 TRAINER_ENCOUNTER_MUSIC_MALE, #line 11431 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11432 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -28754,7 +28754,7 @@ F_TRAINER_FEMALE | #line 11455 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11456 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11457 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28797,7 +28797,7 @@ F_TRAINER_FEMALE | #line 11472 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11473 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11474 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -28851,7 +28851,7 @@ F_TRAINER_FEMALE | #line 11493 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11494 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11495 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28894,7 +28894,7 @@ F_TRAINER_FEMALE | #line 11510 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11511 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11512 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -28937,7 +28937,7 @@ F_TRAINER_FEMALE | #line 11527 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11528 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11529 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -28991,7 +28991,7 @@ F_TRAINER_FEMALE | #line 11548 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11549 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11550 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -29023,7 +29023,7 @@ F_TRAINER_FEMALE | #line 11561 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11562 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11563 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29066,7 +29066,7 @@ F_TRAINER_FEMALE | #line 11578 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11579 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11580 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -29103,7 +29103,7 @@ F_TRAINER_FEMALE | #line 11593 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11594 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11595 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29156,7 +29156,7 @@ F_TRAINER_FEMALE | #line 11614 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11615 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11616 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -29210,7 +29210,7 @@ F_TRAINER_FEMALE | #line 11635 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11636 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11637 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -29275,7 +29275,7 @@ F_TRAINER_FEMALE | #line 11660 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11661 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11662 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -29340,7 +29340,7 @@ F_TRAINER_FEMALE | #line 11685 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11686 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11687 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -29405,7 +29405,7 @@ F_TRAINER_FEMALE | #line 11710 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 11711 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11712 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -29470,7 +29470,7 @@ F_TRAINER_FEMALE | #line 11735 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11736 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11737 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29513,7 +29513,7 @@ F_TRAINER_FEMALE | #line 11752 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11753 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11754 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29556,7 +29556,7 @@ F_TRAINER_FEMALE | #line 11769 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11770 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11771 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29599,7 +29599,7 @@ F_TRAINER_FEMALE | #line 11786 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11787 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11788 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29642,7 +29642,7 @@ F_TRAINER_FEMALE | #line 11803 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11804 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11805 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29685,7 +29685,7 @@ F_TRAINER_FEMALE | #line 11820 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11821 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11822 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29728,7 +29728,7 @@ F_TRAINER_FEMALE | #line 11837 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 11838 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 11839 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29773,7 +29773,7 @@ F_TRAINER_FEMALE | #line 11854 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 11855 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11856 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -29807,7 +29807,7 @@ F_TRAINER_FEMALE | #line 11868 .items = { ITEM_HYPER_POTION }, #line 11869 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11870 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -29848,7 +29848,7 @@ F_TRAINER_FEMALE | #line 11885 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 11886 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11887 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -29907,7 +29907,7 @@ F_TRAINER_FEMALE | #line 11910 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 11911 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11912 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -29946,7 +29946,7 @@ F_TRAINER_FEMALE | #line 11927 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11928 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11929 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, @@ -30003,7 +30003,7 @@ F_TRAINER_FEMALE | #line 11952 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11953 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11954 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, @@ -30060,7 +30060,7 @@ F_TRAINER_FEMALE | #line 11977 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 11978 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 11979 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT, .partySize = 2, @@ -30117,7 +30117,7 @@ F_TRAINER_FEMALE | #line 12002 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12003 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12004 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -30162,7 +30162,7 @@ F_TRAINER_FEMALE | #line 12019 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12020 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12021 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -30216,7 +30216,7 @@ F_TRAINER_FEMALE | #line 12040 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12041 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12042 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -30250,7 +30250,7 @@ F_TRAINER_FEMALE | #line 12054 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 12055 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12056 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -30363,7 +30363,7 @@ F_TRAINER_FEMALE | #line 12104 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 12105 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12106 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -30476,7 +30476,7 @@ F_TRAINER_FEMALE | #line 12154 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 12155 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12156 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -30589,7 +30589,7 @@ F_TRAINER_FEMALE | #line 12204 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 12205 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12206 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -30700,7 +30700,7 @@ F_TRAINER_FEMALE | #line 12253 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12254 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12255 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -30765,7 +30765,7 @@ F_TRAINER_FEMALE | #line 12278 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12279 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12280 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -30830,7 +30830,7 @@ F_TRAINER_FEMALE | #line 12303 TRAINER_ENCOUNTER_MUSIC_MALE, #line 12304 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12305 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -30897,7 +30897,7 @@ F_TRAINER_FEMALE | #line 12328 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12329 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12330 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -30964,7 +30964,7 @@ F_TRAINER_FEMALE | #line 12353 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12354 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12355 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -31031,7 +31031,7 @@ F_TRAINER_FEMALE | #line 12378 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 12379 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12380 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -31096,7 +31096,7 @@ F_TRAINER_FEMALE | #line 12403 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12404 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12405 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -31150,7 +31150,7 @@ F_TRAINER_FEMALE | #line 12424 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12425 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12426 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31193,7 +31193,7 @@ F_TRAINER_FEMALE | #line 12441 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12442 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12443 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -31251,7 +31251,7 @@ F_TRAINER_FEMALE | #line 12463 .items = { ITEM_FULL_RESTORE }, #line 12464 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12465 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -31296,7 +31296,7 @@ F_TRAINER_FEMALE | #line 12481 .items = { ITEM_HYPER_POTION }, #line 12482 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12483 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -31339,7 +31339,7 @@ F_TRAINER_FEMALE | #line 12498 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12499 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12500 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -31371,7 +31371,7 @@ F_TRAINER_FEMALE | #line 12511 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12512 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12513 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -31425,7 +31425,7 @@ F_TRAINER_FEMALE | #line 12532 TRAINER_ENCOUNTER_MUSIC_COOL, #line 12533 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12534 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31468,7 +31468,7 @@ F_TRAINER_FEMALE | #line 12549 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12550 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12551 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31513,7 +31513,7 @@ F_TRAINER_FEMALE | #line 12566 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12567 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12568 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -31545,7 +31545,7 @@ F_TRAINER_FEMALE | #line 12579 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12580 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12581 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31588,7 +31588,7 @@ F_TRAINER_FEMALE | #line 12596 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12597 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12598 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31645,7 +31645,7 @@ F_TRAINER_FEMALE | #line 12621 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 12622 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12623 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31702,7 +31702,7 @@ F_TRAINER_FEMALE | #line 12646 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12647 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12648 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -31759,7 +31759,7 @@ F_TRAINER_FEMALE | #line 12671 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12672 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12673 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -31816,7 +31816,7 @@ F_TRAINER_FEMALE | #line 12696 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12697 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12698 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -31873,7 +31873,7 @@ F_TRAINER_FEMALE | #line 12721 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12722 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12723 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -31930,7 +31930,7 @@ F_TRAINER_FEMALE | #line 12746 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12747 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12748 .aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_FORCE_SETUP_FIRST_TURN, .partySize = 2, @@ -31987,7 +31987,7 @@ F_TRAINER_FEMALE | #line 12771 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 12772 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12773 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -32044,7 +32044,7 @@ F_TRAINER_FEMALE | #line 12796 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12797 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12798 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32087,7 +32087,7 @@ F_TRAINER_FEMALE | #line 12813 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12814 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12815 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32130,7 +32130,7 @@ F_TRAINER_FEMALE | #line 12830 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12831 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12832 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32173,7 +32173,7 @@ F_TRAINER_FEMALE | #line 12847 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12848 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12849 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32216,7 +32216,7 @@ F_TRAINER_FEMALE | #line 12864 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12865 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12866 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32259,7 +32259,7 @@ F_TRAINER_FEMALE | #line 12881 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12882 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12883 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32302,7 +32302,7 @@ F_TRAINER_FEMALE | #line 12898 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 12899 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 12900 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32345,7 +32345,7 @@ F_TRAINER_FEMALE | #line 12915 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12916 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12917 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -32410,7 +32410,7 @@ F_TRAINER_FEMALE | #line 12940 TRAINER_ENCOUNTER_MUSIC_RICH, #line 12941 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12942 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32459,7 +32459,7 @@ F_TRAINER_FEMALE | #line 12958 .items = { ITEM_FULL_RESTORE }, #line 12959 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12960 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32504,7 +32504,7 @@ F_TRAINER_FEMALE | #line 12975 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 12976 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12977 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32538,7 +32538,7 @@ F_TRAINER_FEMALE | #line 12988 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 12989 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 12990 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32570,7 +32570,7 @@ F_TRAINER_FEMALE | #line 13001 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13002 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13003 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32613,7 +32613,7 @@ F_TRAINER_FEMALE | #line 13018 TRAINER_ENCOUNTER_MUSIC_TWINS, #line 13019 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13020 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32660,7 +32660,7 @@ F_TRAINER_FEMALE | #line 13035 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13036 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13037 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32705,7 +32705,7 @@ F_TRAINER_FEMALE | #line 13052 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13053 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13054 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32737,7 +32737,7 @@ F_TRAINER_FEMALE | #line 13065 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13066 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13067 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32769,7 +32769,7 @@ F_TRAINER_FEMALE | #line 13078 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13079 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13080 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32801,7 +32801,7 @@ F_TRAINER_FEMALE | #line 13091 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13092 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13093 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32835,7 +32835,7 @@ F_TRAINER_FEMALE | #line 13104 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13105 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13106 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32869,7 +32869,7 @@ F_TRAINER_FEMALE | #line 13117 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13118 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13119 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32901,7 +32901,7 @@ F_TRAINER_FEMALE | #line 13130 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13131 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13132 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -32935,7 +32935,7 @@ F_TRAINER_FEMALE | #line 13143 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13144 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13145 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -32978,7 +32978,7 @@ F_TRAINER_FEMALE | #line 13160 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13161 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13162 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33021,7 +33021,7 @@ F_TRAINER_FEMALE | #line 13177 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13178 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13179 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33064,7 +33064,7 @@ F_TRAINER_FEMALE | #line 13194 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 13195 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13196 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33109,7 +33109,7 @@ F_TRAINER_FEMALE | #line 13211 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13212 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13213 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33152,7 +33152,7 @@ F_TRAINER_FEMALE | #line 13228 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13229 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13230 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33186,7 +33186,7 @@ F_TRAINER_FEMALE | #line 13241 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13242 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13243 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33218,7 +33218,7 @@ F_TRAINER_FEMALE | #line 13254 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13255 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -33272,7 +33272,7 @@ F_TRAINER_FEMALE | #line 13275 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13276 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13277 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33304,7 +33304,7 @@ F_TRAINER_FEMALE | #line 13288 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13289 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13290 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33336,7 +33336,7 @@ F_TRAINER_FEMALE | #line 13301 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13302 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13303 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33368,7 +33368,7 @@ F_TRAINER_FEMALE | #line 13314 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13315 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13316 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33411,7 +33411,7 @@ F_TRAINER_FEMALE | #line 13331 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13332 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13333 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -33454,7 +33454,7 @@ F_TRAINER_FEMALE | #line 13348 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13349 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13350 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33486,7 +33486,7 @@ F_TRAINER_FEMALE | #line 13361 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13362 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13363 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33518,7 +33518,7 @@ F_TRAINER_FEMALE | #line 13374 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13375 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13376 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33550,7 +33550,7 @@ F_TRAINER_FEMALE | #line 13387 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13388 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13389 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33582,7 +33582,7 @@ F_TRAINER_FEMALE | #line 13400 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13401 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13402 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33614,7 +33614,7 @@ F_TRAINER_FEMALE | #line 13413 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13414 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13415 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33646,7 +33646,7 @@ F_TRAINER_FEMALE | #line 13426 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13427 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13428 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33678,7 +33678,7 @@ F_TRAINER_FEMALE | #line 13439 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13440 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13441 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33712,7 +33712,7 @@ F_TRAINER_FEMALE | #line 13452 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13453 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13454 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33746,7 +33746,7 @@ F_TRAINER_FEMALE | #line 13465 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13466 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13467 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33780,7 +33780,7 @@ F_TRAINER_FEMALE | #line 13478 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13479 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13480 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -33812,7 +33812,7 @@ F_TRAINER_FEMALE | #line 13491 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13492 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13493 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 4, @@ -33881,7 +33881,7 @@ F_TRAINER_FEMALE | #line 13517 .items = { ITEM_HYPER_POTION }, #line 13518 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13519 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -33924,7 +33924,7 @@ F_TRAINER_FEMALE | #line 13534 TRAINER_ENCOUNTER_MUSIC_MAGMA, #line 13535 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13536 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -33978,7 +33978,7 @@ F_TRAINER_FEMALE | #line 13555 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13556 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13557 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34012,7 +34012,7 @@ F_TRAINER_FEMALE | #line 13568 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13569 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13570 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34044,7 +34044,7 @@ F_TRAINER_FEMALE | #line 13581 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13582 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13583 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34087,7 +34087,7 @@ F_TRAINER_FEMALE | #line 13598 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13599 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13600 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34130,7 +34130,7 @@ F_TRAINER_FEMALE | #line 13615 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 13616 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34162,7 +34162,7 @@ F_TRAINER_FEMALE | #line 13628 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13629 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13630 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -34220,7 +34220,7 @@ F_TRAINER_FEMALE | #line 13650 .items = { ITEM_HYPER_POTION }, #line 13651 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13652 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -34274,7 +34274,7 @@ F_TRAINER_FEMALE | #line 13671 TRAINER_ENCOUNTER_MUSIC_COOL, #line 13672 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13673 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34319,7 +34319,7 @@ F_TRAINER_FEMALE | #line 13688 TRAINER_ENCOUNTER_MUSIC_GIRL, #line 13689 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13690 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34362,7 +34362,7 @@ F_TRAINER_FEMALE | #line 13705 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13706 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13707 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34405,7 +34405,7 @@ F_TRAINER_FEMALE | #line 13722 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13723 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13724 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34448,7 +34448,7 @@ F_TRAINER_FEMALE | #line 13739 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13740 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13741 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34493,7 +34493,7 @@ F_TRAINER_FEMALE | #line 13756 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13757 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13758 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34538,7 +34538,7 @@ F_TRAINER_FEMALE | #line 13773 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13774 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13775 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34581,7 +34581,7 @@ F_TRAINER_FEMALE | #line 13790 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 13791 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13792 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34626,7 +34626,7 @@ F_TRAINER_FEMALE | #line 13807 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13808 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13809 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34671,7 +34671,7 @@ F_TRAINER_FEMALE | #line 13824 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13825 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13826 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34716,7 +34716,7 @@ F_TRAINER_FEMALE | #line 13841 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13842 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13843 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34759,7 +34759,7 @@ F_TRAINER_FEMALE | #line 13858 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13859 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13860 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34802,7 +34802,7 @@ F_TRAINER_FEMALE | #line 13875 TRAINER_ENCOUNTER_MUSIC_MALE, #line 13876 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13877 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -34847,7 +34847,7 @@ F_TRAINER_FEMALE | #line 13892 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13893 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13894 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34881,7 +34881,7 @@ F_TRAINER_FEMALE | #line 13905 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13906 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13907 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34915,7 +34915,7 @@ F_TRAINER_FEMALE | #line 13918 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13919 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13920 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -34951,7 +34951,7 @@ F_TRAINER_FEMALE | #line 13932 .items = { ITEM_HYPER_POTION }, #line 13933 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13934 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -34994,7 +34994,7 @@ F_TRAINER_FEMALE | #line 13949 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 13950 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13951 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -35026,7 +35026,7 @@ F_TRAINER_FEMALE | #line 13962 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 13963 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13964 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -35071,7 +35071,7 @@ F_TRAINER_FEMALE | #line 13979 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 13980 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13981 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 1, @@ -35105,7 +35105,7 @@ F_TRAINER_FEMALE | #line 13993 .items = { ITEM_HYPER_POTION }, #line 13994 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 13995 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -35145,7 +35145,7 @@ F_TRAINER_FEMALE | #line 14009 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 14010 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14011 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -35188,7 +35188,7 @@ F_TRAINER_FEMALE | #line 14026 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 14027 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14028 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -35231,7 +35231,7 @@ F_TRAINER_FEMALE | #line 14043 TRAINER_ENCOUNTER_MUSIC_MALE, #line 14044 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14045 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -35320,7 +35320,7 @@ F_TRAINER_FEMALE | #line 14076 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14077 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14078 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -35411,7 +35411,7 @@ F_TRAINER_FEMALE | #line 14110 .items = { ITEM_HYPER_POTION }, #line 14111 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14112 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -35456,7 +35456,7 @@ F_TRAINER_FEMALE | #line 14127 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14128 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14129 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -35501,7 +35501,7 @@ F_TRAINER_FEMALE | #line 14144 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 14145 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 14146 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -35548,7 +35548,7 @@ F_TRAINER_FEMALE | #line 14162 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14163 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14164 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -35649,7 +35649,7 @@ F_TRAINER_FEMALE | #line 14204 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14205 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14206 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -35768,7 +35768,7 @@ F_TRAINER_FEMALE | #line 14254 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14255 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14256 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -35887,7 +35887,7 @@ F_TRAINER_FEMALE | #line 14304 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14305 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14306 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -36022,7 +36022,7 @@ F_TRAINER_FEMALE | #line 14362 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14363 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14364 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -36121,7 +36121,7 @@ F_TRAINER_FEMALE | #line 14404 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14405 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14406 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -36220,7 +36220,7 @@ F_TRAINER_FEMALE | #line 14446 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14447 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14448 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -36337,7 +36337,7 @@ F_TRAINER_FEMALE | #line 14496 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14497 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14498 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -36472,7 +36472,7 @@ F_TRAINER_FEMALE | #line 14554 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14555 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14556 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -36571,7 +36571,7 @@ F_TRAINER_FEMALE | #line 14596 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14597 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14598 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -36688,7 +36688,7 @@ F_TRAINER_FEMALE | #line 14646 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14647 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14648 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -36805,7 +36805,7 @@ F_TRAINER_FEMALE | #line 14696 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14697 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14698 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -36942,7 +36942,7 @@ F_TRAINER_FEMALE | #line 14754 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14755 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14756 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -37045,7 +37045,7 @@ F_TRAINER_FEMALE | #line 14796 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14797 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14798 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -37166,7 +37166,7 @@ F_TRAINER_FEMALE | #line 14846 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14847 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14848 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -37305,7 +37305,7 @@ F_TRAINER_FEMALE | #line 14904 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14905 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14906 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -37442,7 +37442,7 @@ F_TRAINER_FEMALE | #line 14962 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 14963 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 14964 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 4, @@ -37541,7 +37541,7 @@ F_TRAINER_FEMALE | #line 15004 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15005 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15006 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -37658,7 +37658,7 @@ F_TRAINER_FEMALE | #line 15054 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15055 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15056 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -37775,7 +37775,7 @@ F_TRAINER_FEMALE | #line 15104 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15105 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15106 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -37912,7 +37912,7 @@ F_TRAINER_FEMALE | #line 15162 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15163 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15164 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, .partySize = 5, @@ -38031,7 +38031,7 @@ F_TRAINER_FEMALE | #line 15212 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15213 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15214 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, .partySize = 6, @@ -38168,7 +38168,7 @@ F_TRAINER_FEMALE | #line 15270 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15271 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15272 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, .partySize = 6, @@ -38305,7 +38305,7 @@ F_TRAINER_FEMALE | #line 15328 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15329 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15330 .aiFlags = AI_FLAG_BASIC_TRAINER | AI_FLAG_RISKY, .partySize = 6, @@ -38440,7 +38440,7 @@ F_TRAINER_FEMALE | #line 15386 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15387 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15388 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -38559,7 +38559,7 @@ F_TRAINER_FEMALE | #line 15436 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15437 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15438 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -38696,7 +38696,7 @@ F_TRAINER_FEMALE | #line 15494 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15495 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15496 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -38833,7 +38833,7 @@ F_TRAINER_FEMALE | #line 15552 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15553 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15554 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -38970,7 +38970,7 @@ F_TRAINER_FEMALE | #line 15610 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15611 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15612 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -39087,7 +39087,7 @@ F_TRAINER_FEMALE | #line 15660 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15661 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15662 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 5, @@ -39204,7 +39204,7 @@ F_TRAINER_FEMALE | #line 15710 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15711 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15712 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -39339,7 +39339,7 @@ F_TRAINER_FEMALE | #line 15768 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15769 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 15770 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -39472,7 +39472,7 @@ F_TRAINER_FEMALE | #line 15825 TRAINER_ENCOUNTER_MUSIC_SUSPICIOUS, #line 15826 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15827 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -39527,7 +39527,7 @@ F_TRAINER_FEMALE | #line 15848 TRAINER_ENCOUNTER_MUSIC_COOL, #line 15849 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15850 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39561,7 +39561,7 @@ F_TRAINER_FEMALE | #line 15862 .items = { ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE, ITEM_FULL_RESTORE }, #line 15863 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15864 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 6, @@ -39694,7 +39694,7 @@ F_TRAINER_FEMALE | #line 15919 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15920 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15921 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39726,7 +39726,7 @@ F_TRAINER_FEMALE | #line 15932 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15933 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15934 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39758,7 +39758,7 @@ F_TRAINER_FEMALE | #line 15945 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15946 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15947 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39792,7 +39792,7 @@ F_TRAINER_FEMALE | #line 15958 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15959 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15960 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39824,7 +39824,7 @@ F_TRAINER_FEMALE | #line 15971 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15972 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15973 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39858,7 +39858,7 @@ F_TRAINER_FEMALE | #line 15984 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15985 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15986 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39890,7 +39890,7 @@ F_TRAINER_FEMALE | #line 15997 TRAINER_ENCOUNTER_MUSIC_MALE, #line 15998 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 15999 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 1, @@ -39922,7 +39922,7 @@ F_TRAINER_FEMALE | #line 16010 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16011 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16012 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -39965,7 +39965,7 @@ F_TRAINER_FEMALE | #line 16027 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16028 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16029 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40019,7 +40019,7 @@ F_TRAINER_FEMALE | #line 16048 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16049 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16050 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40073,7 +40073,7 @@ F_TRAINER_FEMALE | #line 16069 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16070 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16071 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40127,7 +40127,7 @@ F_TRAINER_FEMALE | #line 16090 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16091 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16092 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40181,7 +40181,7 @@ F_TRAINER_FEMALE | #line 16111 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16112 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16113 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40235,7 +40235,7 @@ F_TRAINER_FEMALE | #line 16132 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16133 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16134 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40289,7 +40289,7 @@ F_TRAINER_FEMALE | #line 16153 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16154 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16155 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40343,7 +40343,7 @@ F_TRAINER_FEMALE | #line 16174 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16175 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16176 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -40386,7 +40386,7 @@ F_TRAINER_FEMALE | #line 16191 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16192 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16193 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40440,7 +40440,7 @@ F_TRAINER_FEMALE | #line 16212 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16213 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16214 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40494,7 +40494,7 @@ F_TRAINER_FEMALE | #line 16233 TRAINER_ENCOUNTER_MUSIC_SWIMMER, #line 16234 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16235 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40548,7 +40548,7 @@ F_TRAINER_FEMALE | #line 16254 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16255 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16256 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -40591,7 +40591,7 @@ F_TRAINER_FEMALE | #line 16271 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16272 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16273 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40645,7 +40645,7 @@ F_TRAINER_FEMALE | #line 16292 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16293 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16294 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40699,7 +40699,7 @@ F_TRAINER_FEMALE | #line 16313 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16314 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16315 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -40757,7 +40757,7 @@ F_TRAINER_FEMALE | #line 16335 .items = { ITEM_HYPER_POTION }, #line 16336 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16337 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -40804,7 +40804,7 @@ F_TRAINER_FEMALE | #line 16353 .items = { ITEM_HYPER_POTION }, #line 16354 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16355 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -40862,7 +40862,7 @@ F_TRAINER_FEMALE | #line 16375 .items = { ITEM_HYPER_POTION }, #line 16376 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16377 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -40920,7 +40920,7 @@ F_TRAINER_FEMALE | #line 16397 .items = { ITEM_HYPER_POTION }, #line 16398 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16399 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -40974,7 +40974,7 @@ F_TRAINER_FEMALE | #line 16418 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16419 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16420 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41028,7 +41028,7 @@ F_TRAINER_FEMALE | #line 16439 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16440 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16441 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41082,7 +41082,7 @@ F_TRAINER_FEMALE | #line 16460 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16461 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16462 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41136,7 +41136,7 @@ F_TRAINER_FEMALE | #line 16481 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16482 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16483 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41190,7 +41190,7 @@ F_TRAINER_FEMALE | #line 16502 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16503 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16504 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 2, @@ -41233,7 +41233,7 @@ F_TRAINER_FEMALE | #line 16519 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16520 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16521 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -41287,7 +41287,7 @@ F_TRAINER_FEMALE | #line 16540 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16541 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16542 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -41341,7 +41341,7 @@ F_TRAINER_FEMALE | #line 16561 TRAINER_ENCOUNTER_MUSIC_HIKER, #line 16562 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16563 .aiFlags = AI_FLAG_BASIC_TRAINER, .partySize = 3, @@ -41397,7 +41397,7 @@ F_TRAINER_FEMALE | #line 16582 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16583 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16584 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -41486,7 +41486,7 @@ F_TRAINER_FEMALE | #line 16615 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16616 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16617 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -41575,7 +41575,7 @@ F_TRAINER_FEMALE | #line 16648 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16649 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16650 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -41664,7 +41664,7 @@ F_TRAINER_FEMALE | #line 16681 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16682 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16683 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 6, @@ -41753,7 +41753,7 @@ F_TRAINER_FEMALE | #line 16714 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16715 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16716 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 2, @@ -41798,7 +41798,7 @@ F_TRAINER_FEMALE | #line 16731 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16732 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16733 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41854,7 +41854,7 @@ F_TRAINER_FEMALE | #line 16752 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16753 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16754 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41910,7 +41910,7 @@ F_TRAINER_FEMALE | #line 16773 TRAINER_ENCOUNTER_MUSIC_FEMALE, #line 16774 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 16775 .aiFlags = AI_FLAG_CHECK_BAD_MOVE, .partySize = 3, @@ -41966,7 +41966,7 @@ F_TRAINER_FEMALE | #line 16794 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16795 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -41996,7 +41996,7 @@ F_TRAINER_FEMALE | #line 16806 TRAINER_ENCOUNTER_MUSIC_INTENSE, #line 16807 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 2, .party = (const struct TrainerMon[]) { @@ -42037,7 +42037,7 @@ F_TRAINER_FEMALE | #line 16822 TRAINER_ENCOUNTER_MUSIC_RICH, #line 16823 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -42067,7 +42067,7 @@ F_TRAINER_FEMALE | #line 16834 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16835 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -42099,7 +42099,7 @@ F_TRAINER_FEMALE | #line 16846 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16847 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -42129,7 +42129,7 @@ F_TRAINER_FEMALE | #line 16858 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16859 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -42161,7 +42161,7 @@ F_TRAINER_FEMALE | #line 16870 TRAINER_ENCOUNTER_MUSIC_MALE, #line 16871 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { diff --git a/src/data/trainers.party b/src/data/trainers.party index f1a8f3e84e..5b0e7e8c97 100644 --- a/src/data/trainers.party +++ b/src/data/trainers.party @@ -20,7 +20,7 @@ Optional (but still recommended) fields for trainers: - Music - Items (Some Item / Another Item / Third Item) (Can also be specified with ITEM_SOME_ITEM) - - Double Battle (Yes/No, defaults to No) + - Battle Type (Singles / Doubles, defaults to Singles) - AI (Ai Flag / Another Flag / Third Flag / ... see "constants/battle_ai.h" for all flags) - Mugshot (enable Mugshots during battle transition diff --git a/test/battle/trainer_control.c b/test/battle/trainer_control.c index 89a5c905a9..b42c89196c 100644 --- a/test/battle/trainer_control.c +++ b/test/battle/trainer_control.c @@ -12,7 +12,7 @@ #include "constants/trainers.h" #include "constants/battle.h" -#define NUM_TEST_TRAINERS 9 +#define NUM_TEST_TRAINERS 11 static const struct Trainer sTestTrainers[DIFFICULTY_COUNT][NUM_TEST_TRAINERS] = { @@ -282,3 +282,12 @@ TEST("Trainer Party Pool can choose which functions to use for picking mons") EXPECT(GetMonData(&testParty[1], MON_DATA_SPECIES) == SPECIES_WOBBUFFET); Free(testParty); } + +TEST("trainerproc supports both Double Battle: Yes and Battle Type: Doubles") +{ + u32 currTrainer; + PARAMETRIZE { currTrainer = 9; } + PARAMETRIZE { currTrainer = 10; } + const struct Trainer trainer = sTestTrainers[GetTrainerDifficultyLevelTest(currTrainer)][currTrainer]; + EXPECT(trainer.battleType == TRAINER_BATTLE_TYPE_DOUBLES); +} diff --git a/test/battle/trainer_control.h b/test/battle/trainer_control.h index fb51e78f70..482e7a0a6e 100644 --- a/test/battle/trainer_control.h +++ b/test/battle/trainer_control.h @@ -21,7 +21,7 @@ #line 6 TRAINER_ENCOUNTER_MUSIC_MALE, #line 7 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 3, .party = (const struct TrainerMon[]) { @@ -101,7 +101,7 @@ #line 38 TRAINER_ENCOUNTER_MUSIC_MALE, #line 39 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -132,7 +132,7 @@ #line 50 TRAINER_ENCOUNTER_MUSIC_MALE, #line 51 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -163,7 +163,7 @@ #line 62 TRAINER_ENCOUNTER_MUSIC_MALE, #line 63 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -194,7 +194,7 @@ #line 74 TRAINER_ENCOUNTER_MUSIC_MALE, #line 75 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, .partySize = 1, .party = (const struct TrainerMon[]) { @@ -224,7 +224,7 @@ #line 86 TRAINER_ENCOUNTER_MUSIC_MALE, #line 87 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 88 .partySize = 1, .poolSize = 4, @@ -289,7 +289,7 @@ #line 103 TRAINER_ENCOUNTER_MUSIC_MALE, #line 104 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 105 .partySize = 3, .poolSize = 6, @@ -384,7 +384,7 @@ #line 128 TRAINER_ENCOUNTER_MUSIC_MALE, #line 129 - .doubleBattle = TRUE, + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, #line 131 .poolRuleIndex = POOL_RULESET_WEATHER_DOUBLES, #line 130 @@ -533,7 +533,7 @@ #line 166 TRAINER_ENCOUNTER_MUSIC_MALE, #line 167 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 169 .poolRuleIndex = POOL_RULESET_BASIC, #line 168 @@ -595,7 +595,7 @@ #line 185 TRAINER_ENCOUNTER_MUSIC_MALE, #line 186 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 188 .poolRuleIndex = POOL_RULESET_BASIC, #line 189 @@ -655,7 +655,7 @@ #line 203 TRAINER_ENCOUNTER_MUSIC_MALE, #line 204 - .doubleBattle = FALSE, + .battleType = TRAINER_BATTLE_TYPE_SINGLES, #line 206 .poolRuleIndex = POOL_RULESET_BASIC, #line 207 @@ -704,3 +704,89 @@ }, }, }, +#line 217 + [DIFFICULTY_NORMAL][9] = + { +#line 218 + .trainerName = _("Test9"), +#line 219 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 220 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 222 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 223 + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, +#line 224 + .partySize = 2, + .poolSize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 226 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 227 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 227 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 228 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 229 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 229 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, +#line 230 + [DIFFICULTY_NORMAL][10] = + { +#line 231 + .trainerName = _("Test10"), +#line 232 + .trainerClass = TRAINER_CLASS_PKMN_TRAINER_1, +#line 233 + .trainerPic = TRAINER_PIC_RED, + .encounterMusic_gender = +#line 235 + TRAINER_ENCOUNTER_MUSIC_MALE, +#line 236 + .battleType = TRAINER_BATTLE_TYPE_DOUBLES, +#line 237 + .partySize = 2, + .poolSize = 2, + .party = (const struct TrainerMon[]) + { + { +#line 239 + .species = SPECIES_WYNAUT, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 240 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 240 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + { +#line 241 + .species = SPECIES_WOBBUFFET, + .gender = TRAINER_MON_RANDOM_GENDER, +#line 242 + .iv = TRAINER_PARTY_IVS(31, 31, 31, 31, 31, 31), +#line 242 + .lvl = 100, + .nature = NATURE_HARDY, + .dynamaxLevel = MAX_DYNAMAX_LEVEL, + }, + }, + }, diff --git a/test/battle/trainer_control.party b/test/battle/trainer_control.party index b4ba68c6b1..dbb7ac88ab 100644 --- a/test/battle/trainer_control.party +++ b/test/battle/trainer_control.party @@ -4,7 +4,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Bubbles (Wobbuffet) (F) @ Assault Vest Hasty Nature @@ -36,7 +36,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Difficulty: Normal Mewtwo @@ -48,7 +48,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Difficulty: Normal Mewtwo @@ -60,7 +60,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Difficulty: Easy Metapod @@ -72,7 +72,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Difficulty: Hard Arceus @@ -84,7 +84,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Party Size: 1 Wynaut @@ -101,7 +101,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Party Size: 3 Wynaut @@ -126,7 +126,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: Yes +Battle Type: Doubles Party Size: 3 Pool Rules: Weather Doubles @@ -164,7 +164,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Party Size: 2 Pool Rules: Basic @@ -183,7 +183,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Party Size: 2 Pool Rules: Basic Pool Prune: Test @@ -201,7 +201,7 @@ Class: Pkmn Trainer 1 Pic: Red Gender: Male Music: Male -Double Battle: No +Battle Type: Singles Party Size: 2 Pool Rules: Basic Pool Pick Functions: Lowest @@ -213,3 +213,29 @@ Wobbuffet Eevee Tags: Lead + +=== 9 === +Name: Test9 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Double Battle: Yes +Party Size: 2 + +Wynaut + +Wobbuffet + +=== 10 === +Name: Test10 +Class: Pkmn Trainer 1 +Pic: Red +Gender: Male +Music: Male +Battle Type: Doubles +Party Size: 2 + +Wynaut + +Wobbuffet diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index 274f1f8dae..b148582a42 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -38,6 +38,12 @@ enum Gender GENDER_FEMALE, }; +enum BattleType +{ + BATTLE_TYPE_SINGLE, + BATTLE_TYPE_DOUBLE, +}; + // TODO: Support Hidden Power. struct Pokemon { @@ -117,8 +123,8 @@ struct Trainer struct String name; int name_line; - bool double_battle; - int double_battle_line; + enum BattleType battle_type; + int battle_type_line; struct Pokemon pokemon[PARTY_SIZE]; int pokemon_n; @@ -841,12 +847,7 @@ static struct String token_string(const struct Token *t) static bool token_gender(struct Parser *p, const struct Token *t, enum Gender *g) { - if (is_empty_token(t)) - { - *g = GENDER_ANY; - return true; - } - else if (is_literal_token(t, "M") || is_literal_token(t, "Male")) + if (is_literal_token(t, "M") || is_literal_token(t, "Male")) { *g = GENDER_MALE; return true; @@ -862,6 +863,24 @@ static bool token_gender(struct Parser *p, const struct Token *t, enum Gender *g } } +static bool token_battle_type(struct Parser *p, const struct Token *t, enum BattleType *g) +{ + if (is_literal_token(t, "Single") || is_literal_token(t, "Singles")) + { + *g = BATTLE_TYPE_SINGLE; + return true; + } + else if (is_literal_token(t, "Double") || is_literal_token(t, "Doubles")) + { + *g = BATTLE_TYPE_DOUBLE; + return true; + } + else + { + return set_parse_error(p, t->location, "invalid battle type"); + } +} + static bool token_stats(struct Parser *p, const struct Token *t, struct Stats *stats, bool require_all) { struct Source source = { @@ -1195,10 +1214,20 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } else if (is_literal_token(&key, "Double Battle")) { - if (trainer->double_battle_line) - any_error = !set_show_parse_error(p, key.location, "duplicate 'Double Battle'"); - trainer->double_battle_line = value.location.line; - if (!token_bool(p, &value, &trainer->double_battle)) + if (trainer->battle_type_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Double Battle' or 'Battle Type'"); + trainer->battle_type_line = value.location.line; + bool is_double_battle; + if (!token_bool(p, &value, &is_double_battle)) + any_error = !show_parse_error(p); + trainer->battle_type = is_double_battle ? BATTLE_TYPE_DOUBLE : BATTLE_TYPE_SINGLE; + } + else if (is_literal_token(&key, "Battle Type")) + { + if (trainer->battle_type_line) + any_error = !set_show_parse_error(p, key.location, "duplicate 'Double Battle' or 'Battle Type'"); + trainer->battle_type_line = value.location.line; + if (!token_battle_type(p, &value, &trainer->battle_type)) any_error = !show_parse_error(p); } else if (is_literal_token(&key, "Mugshot")) @@ -1253,7 +1282,7 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct } else { - any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Double Battle', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); + any_error = !set_show_parse_error(p, key.location, "expected one of 'Name', 'Class', 'Pic', 'Gender', 'Music', 'Items', 'Battle Type', 'Difficulty', 'Party Size', 'Pool Rules', 'Pool Pick Functions', 'Pool Prune' or 'AI'"); } } if (!trainer->pic_line) @@ -1294,7 +1323,9 @@ static bool parse_trainer(struct Parser *p, const struct Parsed *parsed, struct pokemon->nickname = token_string(&nickname); pokemon->species = token_string(&species); - if (!token_gender(p, &gender, &pokemon->gender)) + if (is_empty_token(&gender)) + pokemon->gender = GENDER_ANY; + else if (!token_gender(p, &gender, &pokemon->gender)) any_error = !show_parse_error(p); pokemon->item = token_string(&item); pokemon->header_line = species.location.line; @@ -1757,12 +1788,14 @@ static void fprint_trainers(const char *output_path, FILE *f, struct Parsed *par fprintf(f, " },\n"); } - if (trainer->double_battle_line) + if (trainer->battle_type_line) { - fprintf(f, "#line %d\n", trainer->double_battle_line); - fprintf(f, " .doubleBattle = "); - fprint_bool(f, trainer->double_battle); - fprintf(f, ",\n"); + fprintf(f, "#line %d\n", trainer->battle_type_line); + fprintf(f, " .battleType = "); + if (trainer->battle_type == BATTLE_TYPE_DOUBLE) + fprintf(f, "TRAINER_BATTLE_TYPE_DOUBLES,\n"); + else + fprintf(f, "TRAINER_BATTLE_TYPE_SINGLES,\n"); } if (trainer->ai_flags_n > 0) From f1c1906324ad8808f980c2038ec254c07d02d43a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 17 May 2025 16:23:30 +0200 Subject: [PATCH 077/187] Fix misleading name (#6865) --- include/battle_ai_util.h | 2 +- src/battle_ai_main.c | 114 +++++++++++++++++------------------ src/battle_ai_switch_items.c | 2 +- src/battle_ai_util.c | 76 +++++++++++------------ 4 files changed, 97 insertions(+), 97 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 791e49cddd..6461e181ee 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -134,7 +134,7 @@ bool32 HasMove(u32 battlerId, u32 move); bool32 HasOnlyMovesWithCategory(u32 battlerId, u32 category, bool32 onlyOffensive); bool32 HasMoveWithCategory(u32 battler, u32 category); bool32 HasMoveWithType(u32 battler, u32 type); -bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects moveEffect); +bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects moveEffect); bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect); bool32 IsPowerBasedOnStatus(u32 battlerId, enum BattleMoveEffects effect, u32 argument); bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index dc2e36adc0..111e025345 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -1105,7 +1105,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) default: break; } - + switch(nonVolatileStatus) { case MOVE_EFFECT_POISON: @@ -1612,7 +1612,7 @@ static s32 AI_CheckBadMove(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) || IsBattlerIncapacitated(battlerDef, abilityDef) || gBattleMons[battlerDef].status2 & (STATUS2_INFATUATION | STATUS2_CONFUSION))) ADJUST_SCORE(-10); - if (HasMoveEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SUBSTITUTE) && !(gBattleMons[battlerAtk].status2 & STATUS2_SUBSTITUTE)) ADJUST_SCORE(-10); if (HasNonVolatileMoveEffect(battlerAtk, MOVE_EFFECT_SLEEP) && ! (gBattleMons[battlerDef].status1 & STATUS1_SLEEP)) ADJUST_SCORE(-10); @@ -2954,7 +2954,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) u32 friendlyFireThreshold = GetFriendlyFireKOThreshold(battlerAtk); u32 noOfHitsToKOPartner = GetNoOfHitsToKOBattler(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING); - bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) + bool32 wouldPartnerFaint = CanIndexMoveFaintTarget(battlerAtk, battlerAtkPartner, gAiThinkingStruct->movesetIndex, AI_ATTACKING) && !partnerProtecting && IsBattlerAlive(battlerAtkPartner); bool32 isFriendlyFireOK = !wouldPartnerFaint && (noOfHitsToKOPartner == 0 || noOfHitsToKOPartner > friendlyFireThreshold); @@ -3082,16 +3082,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (wouldPartnerFaint) { // If it kills both opponents, that's a good reason. - if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) && CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { switch (effect) { case EFFECT_EXPLOSION: - if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & (AI_FLAG_RISKY | AI_FLAG_WILL_SUICIDE)) { RETURN_SCORE_PLUS(10); - } + } break; default: RETURN_SCORE_PLUS(10); @@ -3099,16 +3099,16 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } } // Both opponents can kill the partner - else if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtkPartner) + else if (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtk), battlerAtkPartner) && (CanTargetFaintAi(BATTLE_OPPOSITE(battlerAtkPartner), battlerAtkPartner))) { // The spread move should kill an opponent. - if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { ADJUST_SCORE(WEAK_EFFECT); } - + // Alternatively, it benefits from the ally's death, and it will probably die anyway. if (IsMoxieTypeAbility(aiData->abilities[battlerAtk])) { @@ -3125,10 +3125,10 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) } // It can kill one opponent when killing its ally, and its ally is not in extreme danger. // This is easy for the player to cheese. - else if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) + else if (CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtk), gAiThinkingStruct->movesetIndex, AI_ATTACKING) || CanIndexMoveFaintTarget(battlerAtk, BATTLE_OPPOSITE(battlerAtkPartner), gAiThinkingStruct->movesetIndex, AI_ATTACKING)) { - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_WILL_SUICIDE) { RETURN_SCORE_PLUS(10); } @@ -3143,7 +3143,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) RETURN_SCORE_MINUS(10); } } - + // Partner will not faint. else { @@ -3154,7 +3154,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) if (aiData->effectiveness[battlerAtk][battlerAtkPartner][gAiThinkingStruct->movesetIndex] >= UQ_4_12(2.0) && isFriendlyFireOK) { ADJUST_SCORE(GOOD_EFFECT); - } + } break; default: break; @@ -3171,7 +3171,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(30); } - + // partner ability checks if (!partnerProtecting && moveTarget != MOVE_TARGET_BOTH && !DoesBattlerIgnoreAbilityChecks(battlerAtk, aiData->abilities[battlerAtk], move)) { @@ -3253,7 +3253,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(10); } - + if (moveTarget == MOVE_TARGET_FOES_AND_ALLY) { ADJUST_SCORE(DECENT_EFFECT); @@ -3280,7 +3280,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - + if (GetMoveStrikeCount(move) > 1 && effect != EFFECT_DRAGON_DARTS) { ADJUST_SCORE(DECENT_EFFECT); @@ -3353,7 +3353,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { ADJUST_SCORE(DECENT_EFFECT); } - + if (ShouldTriggerAbility(battlerAtkPartner, atkPartnerAbility)) { RETURN_SCORE_PLUS(WEAK_EFFECT); @@ -3428,7 +3428,7 @@ static s32 AI_DoubleBattle(u32 battlerAtk, u32 battlerDef, u32 move, s32 score) { RETURN_SCORE_MINUS(30); } - + switch (effect) { case EFFECT_SPICY_EXTRACT: @@ -4080,8 +4080,8 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) { if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_SLP || aiData->holdEffects[battlerAtk] == HOLD_EFFECT_CURE_STATUS - || HasMoveEffect(EFFECT_SLEEP_TALK, battlerAtk) - || HasMoveEffect(EFFECT_SNORE, battlerAtk) + || HasMoveWithEffect(EFFECT_SLEEP_TALK, battlerAtk) + || HasMoveWithEffect(EFFECT_SNORE, battlerAtk) || aiData->abilities[battlerAtk] == ABILITY_SHED_SKIN || aiData->abilities[battlerAtk] == ABILITY_EARLY_BIRD || (AI_GetWeather() & B_WEATHER_RAIN && gWishFutureKnock.weatherDuration != 1 && aiData->abilities[battlerAtk] == ABILITY_HYDRATION && aiData->holdEffects[battlerAtk] != HOLD_EFFECT_UTILITY_UMBRELLA)) @@ -4123,7 +4123,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_LEECH_SEED: if (IS_BATTLER_OF_TYPE(battlerDef, TYPE_GRASS) || gStatuses3[battlerDef] & STATUS3_LEECHSEED - || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) || aiData->abilities[battlerDef] == ABILITY_LIQUID_OOZE || aiData->abilities[battlerDef] == ABILITY_MAGIC_GUARD) break; @@ -4194,7 +4194,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) break; bool32 encourage = gBattleMoveEffects[GetMoveEffect(gLastMoves[battlerDef])].encourageEncore; - + switch(GetMoveNonVolatileStatus(gLastMoves[battlerDef])) { case MOVE_EFFECT_POISON: @@ -4214,7 +4214,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(BEST_EFFECT); break; case EFFECT_LOCK_ON: - if (HasMoveEffect(battlerAtk, EFFECT_OHKO)) + if (HasMoveWithEffect(battlerAtk, EFFECT_OHKO)) ADJUST_SCORE(GOOD_EFFECT); else if (HasMoveWithLowAccuracy(battlerAtk, battlerDef, 85, TRUE, aiData->abilities[battlerAtk], aiData->abilities[battlerDef], aiData->holdEffects[battlerAtk], aiData->holdEffects[battlerDef])) ADJUST_SCORE(GOOD_EFFECT); @@ -4298,7 +4298,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && IsPinchBerryItemEffect(aiData->holdEffects[battlerAtk])) ADJUST_SCORE(GOOD_EFFECT); else if ((gBattleMons[battlerAtk].hp > 1) // Only spam endure for Flail/Reversal if you're not at Min Health - && (HasMoveEffect(battlerAtk, EFFECT_FLAIL) || HasMoveEffect(battlerAtk, EFFECT_ENDEAVOR))) + && (HasMoveWithEffect(battlerAtk, EFFECT_FLAIL) || HasMoveWithEffect(battlerAtk, EFFECT_ENDEAVOR))) ADJUST_SCORE(GOOD_EFFECT); } break; @@ -4338,41 +4338,41 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_SMOOTH_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_HAIL: if (ShouldSetHail(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) + if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; case EFFECT_SNOWSCAPE: if (ShouldSetSnow(battlerAtk, aiData->abilities[battlerAtk], aiData->holdEffects[battlerAtk])) { - if ((HasMoveEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) + if ((HasMoveWithEffect(battlerAtk, EFFECT_AURORA_VEIL) || HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_AURORA_VEIL)) && ShouldSetScreen(battlerAtk, battlerDef, EFFECT_AURORA_VEIL)) ADJUST_SCORE(GOOD_EFFECT); ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_ICY_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); } break; @@ -4382,10 +4382,10 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); if (aiData->holdEffects[battlerAtk] == HOLD_EFFECT_DAMP_ROCK) ADJUST_SCORE(WEAK_EFFECT); - if (HasMoveEffect(battlerDef, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerDef, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerDef, EFFECT_SOLAR_BEAM) - || HasMoveEffect(battlerDef, EFFECT_MOONLIGHT)) + if (HasMoveWithEffect(battlerDef, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerDef, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerDef, EFFECT_SOLAR_BEAM) + || HasMoveWithEffect(battlerDef, EFFECT_MOONLIGHT)) ADJUST_SCORE(WEAK_EFFECT); if (HasMoveWithType(battlerDef, TYPE_FIRE) || HasMoveWithType(BATTLE_PARTNER(battlerDef), TYPE_FIRE)) ADJUST_SCORE(WEAK_EFFECT); @@ -4431,7 +4431,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case EFFECT_DEFENSE_CURL: - if (HasMoveEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) + if (HasMoveWithEffect(battlerAtk, EFFECT_ROLLOUT) && !(gBattleMons[battlerAtk].status2 & STATUS2_DEFENSE_CURL)) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); break; @@ -4444,16 +4444,16 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) case EFFECT_STOCKPILE: if (aiData->abilities[battlerAtk] == ABILITY_CONTRARY) break; - if (HasMoveEffect(battlerAtk, EFFECT_SWALLOW) || HasMoveEffect(battlerAtk, EFFECT_SPIT_UP)) + if (HasMoveWithEffect(battlerAtk, EFFECT_SWALLOW) || HasMoveWithEffect(battlerAtk, EFFECT_SPIT_UP)) ADJUST_SCORE(DECENT_EFFECT); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_DEF)); ADJUST_SCORE(IncreaseStatUpScore(battlerAtk, battlerDef, STAT_CHANGE_SPDEF)); break; case EFFECT_SWAGGER: case EFFECT_FLATTER: - if (HasMoveEffect(battlerAtk, EFFECT_FOUL_PLAY) - || HasMoveEffect(battlerAtk, EFFECT_PSYCH_UP) - || HasMoveEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FOUL_PLAY) + || HasMoveWithEffect(battlerAtk, EFFECT_PSYCH_UP) + || HasMoveWithEffect(battlerAtk, EFFECT_SPECTRAL_THIEF)) ADJUST_SCORE(DECENT_EFFECT); if (aiData->abilities[battlerDef] == ABILITY_CONTRARY) ADJUST_SCORE(GOOD_EFFECT); @@ -4553,7 +4553,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (!HasMoveEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) + if (!HasMoveWithEffect(battlerDef, EFFECT_FLING) || !IsBattlerGrounded(battlerDef)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4603,7 +4603,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4622,7 +4622,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->holdEffects[battlerDef]) { case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) + if (HasMoveWithEffect(battlerDef, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -4859,7 +4859,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(GOOD_EFFECT); break; case EFFECT_PLEDGE: - if (isDoubleBattle && HasMoveEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) + if (isDoubleBattle && HasMoveWithEffect(BATTLE_PARTNER(battlerAtk), EFFECT_PLEDGE)) ADJUST_SCORE(GOOD_EFFECT); // Partner might use pledge move break; case EFFECT_TRICK_ROOM: @@ -4943,7 +4943,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case EFFECT_SOAK: - if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) + if (HasMoveWithType(battlerAtk, TYPE_ELECTRIC) || HasMoveWithType(battlerAtk, TYPE_GRASS) || (HasMoveWithEffect(battlerAtk, EFFECT_SUPER_EFFECTIVE_ON_ARG) && GetMoveArgType(move) == TYPE_WATER) ) ADJUST_SCORE(DECENT_EFFECT); // Get some super effective moves break; case EFFECT_THIRD_TYPE: @@ -5070,7 +5070,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) switch (aiData->holdEffects[battlerDef]) { case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerDef, EFFECT_FLING)) + if (HasMoveWithEffect(battlerDef, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -5234,7 +5234,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) && aiData->items[battlerDef] != ITEM_NONE && CanBattlerGetOrLoseItem(battlerDef, aiData->items[battlerDef]) && CanBattlerGetOrLoseItem(battlerAtk, aiData->items[battlerDef]) - && !HasMoveEffect(battlerAtk, EFFECT_ACROBATICS) + && !HasMoveWithEffect(battlerAtk, EFFECT_ACROBATICS) && aiData->abilities[battlerDef] != ABILITY_STICKY_HOLD) { switch (aiData->holdEffects[battlerDef]) @@ -5259,7 +5259,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_IRON_BALL: - if (HasMoveEffect(battlerAtk, EFFECT_FLING)) + if (HasMoveWithEffect(battlerAtk, EFFECT_FLING)) ADJUST_SCORE(DECENT_EFFECT); break; case HOLD_EFFECT_LAGGING_TAIL: @@ -5297,7 +5297,7 @@ static u32 AI_CalcMoveEffectScore(u32 battlerAtk, u32 battlerDef, u32 move) } break; case MOVE_EFFECT_WRAP: - if (!HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) + if (!HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) && ShouldTrap(battlerAtk, battlerDef, move)) ADJUST_SCORE(BEST_EFFECT); break; case MOVE_EFFECT_SALT_CURE: @@ -5562,7 +5562,7 @@ static s32 AI_PreferBatonPass(u32 battlerAtk, u32 battlerDef, u32 move, s32 scor if (IS_TARGETING_PARTNER(battlerAtk, battlerDef) || CountUsablePartyMons(battlerAtk) == 0 || !IsBattleMoveStatus(move) - || !HasMoveEffect(battlerAtk, EFFECT_BATON_PASS) + || !HasMoveWithEffect(battlerAtk, EFFECT_BATON_PASS) || (!AI_CanBattlerEscape(battlerAtk) && IsBattlerTrapped(battlerDef, battlerAtk))) return score; @@ -5821,15 +5821,15 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_TRICK_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !HasMoveEffect(battlerDef, EFFECT_TRICK_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_TRICK_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_TRICK_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_MAGIC_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) && !HasMoveEffect(battlerDef, EFFECT_MAGIC_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_MAGIC_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_MAGIC_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_WONDER_ROOM: - if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM) && !HasMoveEffect(battlerDef, EFFECT_WONDER_ROOM)) + if (!(gFieldStatuses & STATUS_FIELD_WONDER_ROOM) && !HasMoveWithEffect(battlerDef, EFFECT_WONDER_ROOM)) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_GRAVITY: diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 76b7cc0565..2f7f74a726 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -677,7 +677,7 @@ static bool32 ShouldSwitchIfBadlyStatused(u32 battler) || monAbility == ABILITY_EARLY_BIRD) || holdEffect == (HOLD_EFFECT_CURE_SLP | HOLD_EFFECT_CURE_STATUS) || HasMove(battler, MOVE_SLEEP_TALK) - || (HasMoveEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) + || (HasMoveWithEffect(battler, MOVE_SNORE) && AI_GetMoveEffectiveness(MOVE_SNORE, battler, opposingBattler) >= UQ_4_12(2.0)) || (IsBattlerGrounded(battler) && (HasMove(battler, MOVE_MISTY_TERRAIN) || HasMove(battler, MOVE_ELECTRIC_TERRAIN))) ) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index d6f3a5b533..6789fa58aa 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1588,7 +1588,7 @@ bool32 IsAllyProtectingFromMove(u32 battlerAtk, u32 attackerMove, u32 allyMove) else { enum ProtectMethod protectMethod = GetMoveProtectMethod(allyMove); - + if (protectMethod == PROTECT_QUICK_GUARD) { u32 priority = GetBattleMovePriority(battlerAtk, gAiLogicData->abilities[battlerAtk], attackerMove); @@ -1735,8 +1735,8 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, enum ItemHoldEffect holdEffe || ability == ABILITY_MAGIC_GUARD || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - || HasMoveEffect(battler, EFFECT_SHORE_UP) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_SHORE_UP) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1758,8 +1758,8 @@ bool32 ShouldSetHail(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1779,7 +1779,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEff || atkAbility == ABILITY_RAIN_DISH || atkAbility == ABILITY_DRY_SKIN || HasMoveWithFlag(battlerAtk, MoveAlwaysHitsInRain) - || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) + || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) || HasMoveWithType(battlerAtk, TYPE_WATER))) { return TRUE; @@ -1800,12 +1800,12 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, enum ItemHoldEffect holdEffe || atkAbility == ABILITY_LEAF_GUARD || atkAbility == ABILITY_SOLAR_POWER || atkAbility == ABILITY_HARVEST - || HasMoveEffect(battlerAtk, EFFECT_SOLAR_BEAM) - || HasMoveEffect(battlerAtk, EFFECT_MORNING_SUN) - || HasMoveEffect(battlerAtk, EFFECT_SYNTHESIS) - || HasMoveEffect(battlerAtk, EFFECT_MOONLIGHT) - || HasMoveEffect(battlerAtk, EFFECT_WEATHER_BALL) - || HasMoveEffect(battlerAtk, EFFECT_GROWTH) + || HasMoveWithEffect(battlerAtk, EFFECT_SOLAR_BEAM) + || HasMoveWithEffect(battlerAtk, EFFECT_MORNING_SUN) + || HasMoveWithEffect(battlerAtk, EFFECT_SYNTHESIS) + || HasMoveWithEffect(battlerAtk, EFFECT_MOONLIGHT) + || HasMoveWithEffect(battlerAtk, EFFECT_WEATHER_BALL) + || HasMoveWithEffect(battlerAtk, EFFECT_GROWTH) || HasMoveWithType(battlerAtk, TYPE_FIRE))) { return TRUE; @@ -1825,8 +1825,8 @@ bool32 ShouldSetSnow(u32 battler, u32 ability, enum ItemHoldEffect holdEffect) || ability == ABILITY_SLUSH_RUSH || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) || HasMoveWithFlag(battler, MoveAlwaysHitsInHailSnow) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || HasMoveWithEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveWithEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1916,7 +1916,7 @@ bool32 ShouldLowerStat(u32 battlerAtk, u32 battlerDef, u32 abilityDef, u32 stat) // If AI is faster and doesn't have any mons left, lowering speed doesn't give any return !(AI_IsFaster(battlerAtk, battlerDef, gAiThinkingStruct->moveConsidered) && CountUsablePartyMons(battlerAtk) == 0 - && !HasMoveEffect(battlerAtk, EFFECT_ELECTRO_BALL)); + && !HasMoveWithEffect(battlerAtk, EFFECT_ELECTRO_BALL)); } return TRUE; @@ -2177,7 +2177,7 @@ bool32 HasMoveWithType(u32 battler, u32 type) return FALSE; } -bool32 HasMoveEffect(u32 battlerId, enum BattleMoveEffects effect) +bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects effect) { s32 i; u16 *moves = GetMovesArray(battlerId); @@ -3131,7 +3131,7 @@ bool32 IsBattlerIncapacitated(u32 battler, u32 ability) if ((gBattleMons[battler].status1 & STATUS1_FREEZE) && !HasThawingMove(battler)) return TRUE; // if battler has thawing move we assume they will definitely use it, and thus being frozen should be neglected - if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveEffect(battler, EFFECT_SLEEP_TALK)) + if (gBattleMons[battler].status1 & STATUS1_SLEEP && !HasMoveWithEffect(battler, EFFECT_SLEEP_TALK)) return TRUE; if (gBattleMons[battler].status2 & STATUS2_RECHARGE || (ability == ABILITY_TRUANT && gDisableStructs[battler].truantCounter != 0)) @@ -3155,8 +3155,8 @@ static inline bool32 DoesBattlerBenefitFromAllVolatileStatus(u32 battler, u32 ab || ability == ABILITY_QUICK_FEET || ability == ABILITY_MAGIC_GUARD || (ability == ABILITY_GUTS && HasMoveWithCategory(battler, DAMAGE_CATEGORY_PHYSICAL)) - || HasMoveEffect(battler, EFFECT_FACADE) - || HasMoveEffect(battler, EFFECT_PSYCHO_SHIFT)) + || HasMoveWithEffect(battler, EFFECT_FACADE) + || HasMoveWithEffect(battler, EFFECT_PSYCHO_SHIFT)) return TRUE; return FALSE; } @@ -3538,8 +3538,8 @@ bool32 ShouldSetScreen(u32 battlerAtk, u32 battlerDef, enum BattleMoveEffects mo u32 atkSide = GetBattlerSide(battlerAtk); // Don't waste a turn if screens will be broken - if (HasMoveEffect(battlerDef, EFFECT_BRICK_BREAK) - || HasMoveEffect(battlerDef, EFFECT_RAGING_BULL)) + if (HasMoveWithEffect(battlerDef, EFFECT_BRICK_BREAK) + || HasMoveWithEffect(battlerDef, EFFECT_RAGING_BULL)) return FALSE; switch (moveEffect) @@ -4071,10 +4071,10 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has Encore - if (HasMoveEffect(battlerDef, EFFECT_ENCORE)) + if (HasMoveWithEffect(battlerDef, EFFECT_ENCORE)) return NO_INCREASE; - if (IsDoubleBattle() && HasMoveEffect(GetPartnerBattler(battlerDef), EFFECT_ENCORE)) + if (IsDoubleBattle() && HasMoveWithEffect(GetPartnerBattler(battlerDef), EFFECT_ENCORE)) return NO_INCREASE; // Predicting switch @@ -4193,12 +4193,12 @@ void IncreasePoisonScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) if (!HasDamagingMove(battlerDef)) ADJUST_SCORE_PTR(DECENT_EFFECT); - if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveEffect(battlerAtk, EFFECT_PROTECT)) + if (gAiThinkingStruct->aiFlags[battlerAtk] & AI_FLAG_STALL && HasMoveWithEffect(battlerAtk, EFFECT_PROTECT)) ADJUST_SCORE_PTR(WEAK_EFFECT); // stall tactic if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_PSN_ANY) - || HasMoveEffect(battlerAtk, EFFECT_VENOM_DRENCH) - || gAiLogicData->abilities[battlerAtk] == ABILITY_MERCILESS) + || HasMoveWithEffect(battlerAtk, EFFECT_VENOM_DRENCH) + || gAiLogicData->abilities[battlerAtk] == ABILITY_MERCILESS) ADJUST_SCORE_PTR(DECENT_EFFECT); else ADJUST_SCORE_PTR(WEAK_EFFECT); @@ -4262,8 +4262,8 @@ void IncreaseSleepScore(u32 battlerAtk, u32 battlerDef, u32 move, s32 *score) else return; - if ((HasMoveEffect(battlerAtk, EFFECT_DREAM_EATER) || HasMoveEffect(battlerAtk, EFFECT_NIGHTMARE)) - && !(HasMoveEffect(battlerDef, EFFECT_SNORE) || HasMoveEffect(battlerDef, EFFECT_SLEEP_TALK))) + if ((HasMoveWithEffect(battlerAtk, EFFECT_DREAM_EATER) || HasMoveWithEffect(battlerAtk, EFFECT_NIGHTMARE)) + && !(HasMoveWithEffect(battlerDef, EFFECT_SNORE) || HasMoveWithEffect(battlerDef, EFFECT_SLEEP_TALK))) ADJUST_SCORE_PTR(WEAK_EFFECT); if (IsPowerBasedOnStatus(battlerAtk, EFFECT_DOUBLE_POWER_ON_ARG_STATUS, STATUS1_SLEEP) @@ -4409,11 +4409,11 @@ bool32 AI_ShouldSetUpHazards(u32 battlerAtk, u32 battlerDef, struct AiLogicData { if (aiData->abilities[battlerDef] == ABILITY_MAGIC_BOUNCE || CountUsablePartyMons(battlerDef) == 0 - || HasMoveEffect(battlerDef, EFFECT_RAPID_SPIN) - || HasMoveEffect(battlerDef, EFFECT_TIDY_UP) - || HasMoveEffect(battlerDef, EFFECT_DEFOG) + || HasMoveWithEffect(battlerDef, EFFECT_RAPID_SPIN) + || HasMoveWithEffect(battlerDef, EFFECT_TIDY_UP) + || HasMoveWithEffect(battlerDef, EFFECT_DEFOG) || HasMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_DEFOG) - || HasMoveEffect(battlerDef, EFFECT_MAGIC_COAT)) + || HasMoveWithEffect(battlerDef, EFFECT_MAGIC_COAT)) return FALSE; return TRUE; @@ -4451,8 +4451,8 @@ bool32 AI_ShouldSpicyExtract(u32 battlerAtk, u32 battlerAtkPartner, u32 move, st if (gBattleMons[battlerAtkPartner].statStages[STAT_ATK] == MAX_STAT_STAGE || partnerAbility == ABILITY_CONTRARY || partnerAbility == ABILITY_GOOD_AS_GOLD - || HasMoveEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) - || HasMoveEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) + || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtk), EFFECT_FOUL_PLAY) + || HasMoveWithEffect(BATTLE_OPPOSITE(battlerAtkPartner), EFFECT_FOUL_PLAY)) return FALSE; preventsStatLoss = (partnerAbility == ABILITY_CLEAR_BODY @@ -4509,8 +4509,8 @@ u32 IncreaseSubstituteMoveScore(u32 battlerAtk, u32 battlerDef, u32 move) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_TOXIC) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_PARALYSIS) || HasNonVolatileMoveEffect(battlerDef, MOVE_EFFECT_BURN) - || HasMoveEffect(battlerDef, EFFECT_CONFUSE) - || HasMoveEffect(battlerDef, EFFECT_LEECH_SEED)) + || HasMoveWithEffect(battlerDef, EFFECT_CONFUSE) + || HasMoveWithEffect(battlerDef, EFFECT_LEECH_SEED)) scoreIncrease += GOOD_EFFECT; if (gAiLogicData->hpPercents[battlerAtk] > 70) @@ -4586,7 +4586,7 @@ bool32 ShouldTriggerAbility(u32 battler, u32 ability) case ABILITY_STORM_DRAIN: if (B_REDIRECT_ABILITY_IMMUNITY < GEN_5) return FALSE; - else + else return (BattlerStatCanRise(battler, ability, STAT_SPATK) && HasMoveWithCategory(battler, DAMAGE_CATEGORY_SPECIAL)); case ABILITY_DEFIANT: @@ -4601,7 +4601,7 @@ bool32 ShouldTriggerAbility(u32 battler, u32 ability) case ABILITY_CONTRARY: return TRUE; - + case ABILITY_DRY_SKIN: case ABILITY_VOLT_ABSORB: case ABILITY_WATER_ABSORB: From 29a61133182bc15a6a1332e4f4748f44e84681f9 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 17 May 2025 10:55:05 -0400 Subject: [PATCH 078/187] Debug menu cleanup (#6881) --- src/debug.c | 295 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 172 insertions(+), 123 deletions(-) diff --git a/src/debug.c b/src/debug.c index 0ec59706d2..ec713e05c1 100644 --- a/src/debug.c +++ b/src/debug.c @@ -78,10 +78,12 @@ enum DebugMenu DEBUG_MENU_ITEM_PCBAG, DEBUG_MENU_ITEM_PARTY, DEBUG_MENU_ITEM_GIVE, + DEBUG_MENU_ITEM_PLAYER, DEBUG_MENU_ITEM_SCRIPTS, DEBUG_MENU_ITEM_FLAGVAR, //DEBUG_MENU_ITEM_BATTLE, DEBUG_MENU_ITEM_SOUND, + DEBUG_MENU_ITEM_ROMINFO, DEBUG_MENU_ITEM_CANCEL, }; @@ -89,21 +91,13 @@ enum UtilDebugMenu { DEBUG_UTIL_MENU_ITEM_FLY, DEBUG_UTIL_MENU_ITEM_WARP, - DEBUG_UTIL_MENU_ITEM_SAVEBLOCK, - DEBUG_UTIL_MENU_ITEM_ROM_SPACE, DEBUG_UTIL_MENU_ITEM_WEATHER, DEBUG_UTIL_MENU_ITEM_FONT_TEST, - DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK, - DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK, + DEBUG_UTIL_MENU_ITEM_TIME_MENU, DEBUG_UTIL_MENU_ITEM_WATCHCREDITS, - DEBUG_UTIL_MENU_ITEM_PLAYER_NAME, - DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER, - DEBUG_UTIL_MENU_ITEM_PLAYER_ID, DEBUG_UTIL_MENU_ITEM_CHEAT, - DEBUG_UTIL_MENU_ITEM_EXPANSION_VER, DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS, DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS, - DEBUG_UTIL_MENU_ITEM_TIME_MENU, DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI // Please keep this at the bottom <3 }; @@ -113,6 +107,8 @@ enum TimeMenuDebugMenu DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY, DEBUG_TIME_MENU_ITEM_TIMESOFDAY, DEBUG_TIME_MENU_ITEM_WEEKDAYS, + DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK, + DEBUG_TIME_MENU_ITEM_SETWALLCLOCK, }; enum TimeMenuTimeOfDay @@ -271,6 +267,20 @@ enum BerryFunctionsMenu DEBUG_BERRY_FUNCTIONS_MENU_PESTS, }; +enum PlayerDebugMenu +{ + DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME, + DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER, + DEBUG_PLAYER_MENU_ITEM_PLAYER_ID, +}; + +enum ROMInfoDebugMenu +{ + DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK, + DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE, + DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER, +}; + // ******************************* // Constants #define DEBUG_MENU_FONT FONT_NORMAL @@ -367,6 +377,8 @@ static void DebugAction_OpenScriptsMenu(u8 taskId); static void DebugAction_OpenFlagsVarsMenu(u8 taskId); static void DebugAction_OpenGiveMenu(u8 taskId); static void DebugAction_OpenSoundMenu(u8 taskId); +static void DebugAction_OpenPlayerMenu(u8 taskId); +static void DebugAction_OpenROMInfoMenu(u8 taskId); static void DebugTask_HandleMenuInput_Main(u8 taskId); static void DebugTask_HandleMenuInput_Utilities(u8 taskId); @@ -385,19 +397,13 @@ static void DebugAction_Util_Warp_Warp(u8 taskId); static void DebugAction_Util_Warp_SelectMapGroup(u8 taskId); static void DebugAction_Util_Warp_SelectMap(u8 taskId); static void DebugAction_Util_Warp_SelectWarp(u8 taskId); -static void DebugAction_Util_CheckSaveBlock(u8 taskId); -static void DebugAction_Util_CheckROMSpace(u8 taskId); static void DebugAction_Util_Weather(u8 taskId); static void DebugAction_Util_Weather_SelectId(u8 taskId); static void DebugAction_Util_FontTest(u8 taskId); -static void DebugAction_Util_CheckWallClock(u8 taskId); -static void DebugAction_Util_SetWallClock(u8 taskId); +static void DebugAction_TimeMenu_CheckWallClock(u8 taskId); +static void DebugAction_TimeMenu_SetWallClock(u8 taskId); static void DebugAction_Util_WatchCredits(u8 taskId); -static void DebugAction_Util_Player_Name(u8 taskId); -static void DebugAction_Util_Player_Gender(u8 taskId); -static void DebugAction_Util_Player_Id(u8 taskId); static void DebugAction_Util_CheatStart(u8 taskId); -static void DebugAction_Util_ExpansionVersion(u8 taskId); static void DebugAction_Util_BerryFunctions(u8 taskId); static void DebugAction_Util_CheckEWRAMCounters(u8 taskId); static void DebugAction_Util_Steven_Multi(u8 taskId); @@ -489,6 +495,14 @@ static void DebugAction_BerryFunctions_NextStage(u8 taskId); static void DebugAction_BerryFunctions_Pests(u8 taskId); static void DebugAction_BerryFunctions_Weeds(u8 taskId); +static void DebugAction_Player_Name(u8 taskId); +static void DebugAction_Player_Gender(u8 taskId); +static void DebugAction_Player_Id(u8 taskId); + +static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId); +static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId); +static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId); + extern const u8 Debug_FlagsNotSetOverworldConfigMessage[]; extern const u8 Debug_FlagsNotSetBattleConfigMessage[]; extern const u8 Debug_FlagsAndVarNotSetBattleConfigMessage[]; @@ -576,7 +590,6 @@ static const u8 sDebugText_ItemID[] = _("Item ID: {STR_VAR_3}\ static const u8 sDebugText_PokemonID[] = _("Species: {STR_VAR_3}\n{STR_VAR_1}{CLEAR_TO 90}\n\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonLevel[] = _("Level:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonShiny[] = _("Shiny:{CLEAR_TO 90}\n {STR_VAR_2}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{CLEAR_TO 90}"); -static const u8 sDebugText_PokemonNature[] = _("Nature ID: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonAbility[] = _("Ability Num: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonTeraType[] = _("Tera Type: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); static const u8 sDebugText_PokemonDynamaxLevel[] = _("Dmax Lvl:{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}"); @@ -621,10 +634,12 @@ static const struct ListMenuItem sDebugMenu_Items_Main[] = [DEBUG_MENU_ITEM_PCBAG] = {COMPOUND_STRING("PC/Bag…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PCBAG}, [DEBUG_MENU_ITEM_PARTY] = {COMPOUND_STRING("Party…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PARTY}, [DEBUG_MENU_ITEM_GIVE] = {COMPOUND_STRING("Give X…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_GIVE}, + [DEBUG_MENU_ITEM_PLAYER] = {COMPOUND_STRING("Player…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_PLAYER}, [DEBUG_MENU_ITEM_SCRIPTS] = {COMPOUND_STRING("Scripts…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SCRIPTS}, [DEBUG_MENU_ITEM_FLAGVAR] = {COMPOUND_STRING("Flags & Vars…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_FLAGVAR}, //[DEBUG_MENU_ITEM_BATTLE] = {COMPOUND_STRING("Battle Test{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_BATTLE}, [DEBUG_MENU_ITEM_SOUND] = {COMPOUND_STRING("Sound…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_SOUND}, + [DEBUG_MENU_ITEM_ROMINFO] = {COMPOUND_STRING("ROM Info…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_MENU_ITEM_ROMINFO}, [DEBUG_MENU_ITEM_CANCEL] = {COMPOUND_STRING("Cancel"), DEBUG_MENU_ITEM_CANCEL}, }; @@ -632,30 +647,24 @@ static const struct ListMenuItem sDebugMenu_Items_Utilities[] = { [DEBUG_UTIL_MENU_ITEM_FLY] = {COMPOUND_STRING("Fly to map…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FLY}, [DEBUG_UTIL_MENU_ITEM_WARP] = {COMPOUND_STRING("Warp to map warp…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WARP}, - [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = {COMPOUND_STRING("Save Block space…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_SAVEBLOCK}, - [DEBUG_UTIL_MENU_ITEM_ROM_SPACE] = {COMPOUND_STRING("ROM space…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_ROM_SPACE}, [DEBUG_UTIL_MENU_ITEM_WEATHER] = {COMPOUND_STRING("Set weather…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WEATHER}, [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = {COMPOUND_STRING("Font Test…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_FONT_TEST}, - [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = {COMPOUND_STRING("Check wall clock…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK}, - [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = {COMPOUND_STRING("Set wall clock…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK}, + [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = {COMPOUND_STRING("Time Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_TIME_MENU}, [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = {COMPOUND_STRING("Watch credits…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_WATCHCREDITS}, - [DEBUG_UTIL_MENU_ITEM_PLAYER_NAME] = {COMPOUND_STRING("Player name"), DEBUG_UTIL_MENU_ITEM_PLAYER_NAME}, - [DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER] = {COMPOUND_STRING("Toggle gender"), DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER}, - [DEBUG_UTIL_MENU_ITEM_PLAYER_ID] = {COMPOUND_STRING("New Trainer ID"), DEBUG_UTIL_MENU_ITEM_PLAYER_ID}, [DEBUG_UTIL_MENU_ITEM_CHEAT] = {COMPOUND_STRING("Cheat start"), DEBUG_UTIL_MENU_ITEM_CHEAT}, - [DEBUG_UTIL_MENU_ITEM_EXPANSION_VER] = {COMPOUND_STRING("Expansion Version"), DEBUG_UTIL_MENU_ITEM_EXPANSION_VER}, [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = {COMPOUND_STRING("Berry Functions…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS}, [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = {COMPOUND_STRING("EWRAM Counters…{CLEAR_TO 110}{RIGHT_ARROW}"), DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS}, [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = {COMPOUND_STRING("Steven Multi"), DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI}, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = {COMPOUND_STRING("Time Menu"), DEBUG_UTIL_MENU_ITEM_TIME_MENU}, }; static const struct ListMenuItem sDebugMenu_Items_TimeMenu[] = { - [DEBUG_TIME_MENU_ITEM_PRINTTIME] = {COMPOUND_STRING("Print current time"), DEBUG_TIME_MENU_ITEM_PRINTTIME}, - [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Print current time of day"), DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY}, - [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Change current time of day"), DEBUG_TIME_MENU_ITEM_TIMESOFDAY}, - [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = {COMPOUND_STRING("Change current weekday"), DEBUG_TIME_MENU_ITEM_WEEKDAYS}, + [DEBUG_TIME_MENU_ITEM_PRINTTIME] = {COMPOUND_STRING("Print current time…"), DEBUG_TIME_MENU_ITEM_PRINTTIME}, + [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Print current time of day…"), DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY}, + [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = {COMPOUND_STRING("{FONT_NARROW}Change current time of day…"), DEBUG_TIME_MENU_ITEM_TIMESOFDAY}, + [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = {COMPOUND_STRING("Change current weekday…"), DEBUG_TIME_MENU_ITEM_WEEKDAYS}, + [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = {COMPOUND_STRING("Check wall clock…"), DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK}, + [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = {COMPOUND_STRING("Set wall clock…"), DEBUG_TIME_MENU_ITEM_SETWALLCLOCK}, }; static const struct ListMenuItem sDebugMenu_Items_TimeMenu_TimesOfDay[] = @@ -814,6 +823,20 @@ static const struct ListMenuItem sDebugMenu_Items_BerryFunctions[] = [DEBUG_BERRY_FUNCTIONS_MENU_WEEDS] = {COMPOUND_STRING("Give map trees weeds"), DEBUG_BERRY_FUNCTIONS_MENU_WEEDS}, }; +static const struct ListMenuItem sDebugMenu_Items_Player[] = +{ + [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = {COMPOUND_STRING("Player name"), DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME}, + [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = {COMPOUND_STRING("Toggle gender"), DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER}, + [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = {COMPOUND_STRING("New Trainer ID"), DEBUG_PLAYER_MENU_ITEM_PLAYER_ID}, +}; + +static const struct ListMenuItem sDebugMenu_Items_ROMInfo[] = +{ + [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = {COMPOUND_STRING("Save Block space"), DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK}, + [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = {COMPOUND_STRING("ROM space"), DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE}, + [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = {COMPOUND_STRING("Expansion Version"), DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER}, +}; + // ******************************* // Menu Actions static void (*const sDebugMenu_Actions_Main[])(u8) = @@ -822,10 +845,12 @@ static void (*const sDebugMenu_Actions_Main[])(u8) = [DEBUG_MENU_ITEM_PCBAG] = DebugAction_OpenPCBagMenu, [DEBUG_MENU_ITEM_PARTY] = DebugAction_OpenPartyMenu, [DEBUG_MENU_ITEM_GIVE] = DebugAction_OpenGiveMenu, + [DEBUG_MENU_ITEM_PLAYER] = DebugAction_OpenPlayerMenu, [DEBUG_MENU_ITEM_SCRIPTS] = DebugAction_OpenScriptsMenu, [DEBUG_MENU_ITEM_FLAGVAR] = DebugAction_OpenFlagsVarsMenu, //[DEBUG_MENU_ITEM_BATTLE] = DebugAction_OpenBattleMenu, [DEBUG_MENU_ITEM_SOUND] = DebugAction_OpenSoundMenu, + [DEBUG_MENU_ITEM_ROMINFO] = DebugAction_OpenROMInfoMenu, [DEBUG_MENU_ITEM_CANCEL] = DebugAction_Cancel }; @@ -833,22 +858,14 @@ static void (*const sDebugMenu_Actions_Utilities[])(u8) = { [DEBUG_UTIL_MENU_ITEM_FLY] = DebugAction_Util_Fly, [DEBUG_UTIL_MENU_ITEM_WARP] = DebugAction_Util_Warp_Warp, - [DEBUG_UTIL_MENU_ITEM_SAVEBLOCK] = DebugAction_Util_CheckSaveBlock, - [DEBUG_UTIL_MENU_ITEM_ROM_SPACE] = DebugAction_Util_CheckROMSpace, [DEBUG_UTIL_MENU_ITEM_WEATHER] = DebugAction_Util_Weather, [DEBUG_UTIL_MENU_ITEM_FONT_TEST] = DebugAction_Util_FontTest, - [DEBUG_UTIL_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_Util_CheckWallClock, - [DEBUG_UTIL_MENU_ITEM_SETWALLCLOCK] = DebugAction_Util_SetWallClock, + [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = DebugAction_Util_OpenTimeMenu, [DEBUG_UTIL_MENU_ITEM_WATCHCREDITS] = DebugAction_Util_WatchCredits, - [DEBUG_UTIL_MENU_ITEM_PLAYER_NAME] = DebugAction_Util_Player_Name, - [DEBUG_UTIL_MENU_ITEM_PLAYER_GENDER] = DebugAction_Util_Player_Gender, - [DEBUG_UTIL_MENU_ITEM_PLAYER_ID] = DebugAction_Util_Player_Id, [DEBUG_UTIL_MENU_ITEM_CHEAT] = DebugAction_Util_CheatStart, - [DEBUG_UTIL_MENU_ITEM_EXPANSION_VER] = DebugAction_Util_ExpansionVersion, [DEBUG_UTIL_MENU_ITEM_BERRY_FUNCTIONS] = DebugAction_Util_BerryFunctions, [DEBUG_UTIL_MENU_ITEM_EWRAM_COUNTERS] = DebugAction_Util_CheckEWRAMCounters, [DEBUG_UTIL_MENU_ITEM_STEVEN_MULTI] = DebugAction_Util_Steven_Multi, - [DEBUG_UTIL_MENU_ITEM_TIME_MENU] = DebugAction_Util_OpenTimeMenu, }; static void (*const sDebugMenu_Actions_PCBag[])(u8) = @@ -947,6 +964,8 @@ static void (*const sDebugMenu_Actions_TimeMenu[])(u8) = [DEBUG_TIME_MENU_ITEM_PRINTTIMEOFDAY] = DebugAction_TimeMenu_PrintTimeOfDay, [DEBUG_TIME_MENU_ITEM_TIMESOFDAY] = DebugAction_TimeMenu_TimesOfDay, [DEBUG_TIME_MENU_ITEM_WEEKDAYS] = DebugAction_TimeMenu_Weekdays, + [DEBUG_TIME_MENU_ITEM_CHECKWALLCLOCK] = DebugAction_TimeMenu_CheckWallClock, + [DEBUG_TIME_MENU_ITEM_SETWALLCLOCK] = DebugAction_TimeMenu_SetWallClock, }; static void (*const sDebugMenu_Actions_TimeMenu_TimesOfDay[])(u8) = @@ -968,6 +987,20 @@ static void (*const sDebugMenu_Actions_TimeMenu_Weekdays[])(u8) = [DEBUG_TIME_MENU_ITEM_SATURDAY] = DebugAction_TimeMenu_ChangeWeekdays, }; +static void (*const sDebugMenu_Actions_Player[])(u8) = +{ + [DEBUG_PLAYER_MENU_ITEM_PLAYER_NAME] = DebugAction_Player_Name, + [DEBUG_PLAYER_MENU_ITEM_PLAYER_GENDER] = DebugAction_Player_Gender, + [DEBUG_PLAYER_MENU_ITEM_PLAYER_ID] = DebugAction_Player_Id, +}; + +static void (*const sDebugMenu_Actions_ROMInfo[])(u8) = +{ + [DEBUG_ROM_INFO_MENU_ITEM_SAVEBLOCK] = DebugAction_ROMInfo_CheckSaveBlock, + [DEBUG_ROM_INFO_MENU_ITEM_ROM_SPACE] = DebugAction_ROMInfo_CheckROMSpace, + [DEBUG_ROM_INFO_MENU_ITEM_EXPANSION_VER] = DebugAction_ROMInfo_ExpansionVersion, +}; + // ******************************* // Windows static const struct WindowTemplate sDebugMenuWindowTemplateMain = @@ -1139,6 +1172,20 @@ static const struct ListMenuTemplate sDebugMenu_ListTemplate_TimeMenu_Weekdays = .totalItems = ARRAY_COUNT(sDebugMenu_Items_TimeMenu_Weekdays), }; +static const struct ListMenuTemplate sDebugMenu_ListTemplate_Player = +{ + .items = sDebugMenu_Items_Player, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenu_Items_Player), +}; + +static const struct ListMenuTemplate sDebugMenu_ListTemplate_ROMInfo = +{ + .items = sDebugMenu_Items_ROMInfo, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .totalItems = ARRAY_COUNT(sDebugMenu_Items_ROMInfo), +}; + // ******************************* // Functions universal void Debug_ShowMainMenu(void) @@ -1586,7 +1633,7 @@ static void DebugTask_HandleMenuInput_Scripts(u8 taskId) static void DebugTask_HandleMenuInput_TimeMenu(u8 taskId) { - DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_TimeMenu, DebugTask_HandleMenuInput_Utilities, sDebugMenu_ListTemplate_Utilities); } static void DebugTask_HandleMenuInput_TimeMenu_TimesOfDay(u8 taskId) @@ -1806,6 +1853,16 @@ static void DebugTask_HandleMenuInput_BerryFunctions(u8 taskId) DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_BerryFunctions, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); } +static void DebugTask_HandleMenuInput_Player(u8 taskId) +{ + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_Player, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); +} + +static void DebugTask_HandleMenuInput_ROMInfo(u8 taskId) +{ + DebugTask_HandleMenuInput_General(taskId, sDebugMenu_Actions_ROMInfo, DebugTask_HandleMenuInput_Main, sDebugMenu_ListTemplate_Main); +} + // ******************************* // Open sub-menus static void DebugAction_OpenUtilitiesMenu(u8 taskId) @@ -1859,7 +1916,7 @@ static void DebugAction_Util_BerryFunctions(u8 taskId) static void DebugAction_Util_OpenTimeMenu(u8 taskId) { - Debug_DestroyMenu_Full(taskId); + Debug_DestroyMenu(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu, sDebugMenu_ListTemplate_TimeMenu); } @@ -1881,6 +1938,18 @@ static void DebugAction_TimeMenu_Weekdays(u8 taskId) Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_Weekdays, sDebugMenu_ListTemplate_TimeMenu_Weekdays); } +static void DebugAction_OpenPlayerMenu(u8 taskId) +{ + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_Player, sDebugMenu_ListTemplate_Player); +} + +static void DebugAction_OpenROMInfoMenu(u8 taskId) +{ + Debug_DestroyMenu(taskId); + Debug_ShowMenu(DebugTask_HandleMenuInput_ROMInfo, sDebugMenu_ListTemplate_ROMInfo); +} + // ******************************* // Actions Utilities @@ -2082,7 +2151,7 @@ void CheckPokemonStorageSize(struct ScriptContext *ctx) ConvertIntToDecimalStringN(gStringVar3, maxPkmnStorageSize - currPkmnStorageSize, STR_CONV_MODE_LEFT_ALIGN, 6); } -static void DebugAction_Util_CheckSaveBlock(u8 taskId) +static void DebugAction_ROMInfo_CheckSaveBlock(u8 taskId) { Debug_DestroyMenu_Full_Script(taskId, Debug_CheckSaveBlock); } @@ -2135,7 +2204,7 @@ void CheckROMSize(struct ScriptContext *ctx) ConvertQ22_10ToDecimalString(gStringVar2, currROMFreeKB, 2, ROUND_FLOOR); } -static void DebugAction_Util_CheckROMSpace(u8 taskId) +static void DebugAction_ROMInfo_CheckROMSpace(u8 taskId) { Debug_DestroyMenu_Full(taskId); LockPlayerFieldControls(); @@ -2236,12 +2305,12 @@ static void DebugAction_Util_FontTest(u8 taskId) Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FontTest); } -static void DebugAction_Util_CheckWallClock(u8 taskId) +static void DebugAction_TimeMenu_CheckWallClock(u8 taskId) { Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_CheckWallClock); } -static void DebugAction_Util_SetWallClock(u8 taskId) +static void DebugAction_TimeMenu_SetWallClock(u8 taskId) { Debug_DestroyMenu_Full_Script(taskId, PlayersHouse_2F_EventScript_SetWallClock); } @@ -2252,12 +2321,12 @@ static void DebugAction_Util_WatchCredits(u8 taskId) SetMainCallback2(CB2_StartCreditsSequence); } -static void DebugAction_Util_Player_Name(u8 taskId) +static void DebugAction_Player_Name(u8 taskId) { DoNamingScreen(NAMING_SCREEN_PLAYER, gSaveBlock2Ptr->playerName, gSaveBlock2Ptr->playerGender, 0, 0, CB2_ReturnToFieldContinueScript); } -static void DebugAction_Util_Player_Gender(u8 taskId) +static void DebugAction_Player_Gender(u8 taskId) { if (gSaveBlock2Ptr->playerGender == MALE) gSaveBlock2Ptr->playerGender = FEMALE; @@ -2267,7 +2336,7 @@ static void DebugAction_Util_Player_Gender(u8 taskId) ScriptContext_Enable(); } -static void DebugAction_Util_Player_Id(u8 taskId) +static void DebugAction_Player_Id(u8 taskId) { u32 trainerId = Random32(); SetTrainerId(trainerId, gSaveBlock2Ptr->playerTrainerId); @@ -2284,7 +2353,7 @@ static void DebugAction_Util_CheatStart(u8 taskId) Debug_DestroyMenu_Full_Script(taskId, Debug_CheatStart); } -static void DebugAction_Util_ExpansionVersion(u8 taskId) +static void DebugAction_ROMInfo_ExpansionVersion(u8 taskId) { Debug_DestroyMenu_Full(taskId); LockPlayerFieldControls(); @@ -3066,6 +3135,15 @@ static void DebugAction_Give_PokemonComplex(u8 taskId) gTasks[taskId].tIterator = 0; } +static void Debug_Display_Level(u32 level, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar1, level, STR_CONV_MODE_LEADING_ZEROS, 3); + StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonLevel); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectId(u8 taskId) { if (JOY_NEW(DPAD_ANY)) @@ -3086,11 +3164,7 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) gTasks[taskId].tInput = 1; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_Level(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectLevel; } @@ -3104,18 +3178,24 @@ static void DebugAction_Give_Pokemon_SelectId(u8 taskId) } } +static void Debug_Display_TrueFalse(bool32 value, u8 windowId, const u8 *titleStr) +{ + static const u8 *txtStr; + txtStr = value ? sDebugText_True : sDebugText_False; + StringCopyPadded(gStringVar2, txtStr, CHAR_SPACE, 15); + ConvertIntToDecimalStringN(gStringVar3, value, STR_CONV_MODE_LEADING_ZEROS, 0); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringExpandPlaceholders(gStringVar4, titleStr); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) { if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); Debug_HandleInput_Numeric(taskId, 1, MAX_LEVEL, 3); - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar1, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 3); - StringCopyPadded(gStringVar1, gStringVar1, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonLevel); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_Level(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3136,13 +3216,7 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) sDebugMonData->level = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonShiny); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonShiny); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectShiny; } } @@ -3156,20 +3230,23 @@ static void DebugAction_Give_Pokemon_SelectLevel(u8 taskId) } } -static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) +static void Debug_Display_Nature(u32 natureId, u32 digit, u8 windowId) { - static const u8 *txtStr; + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar3, natureId, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + StringCopy(gStringVar1, gNaturesInfo[natureId].name); + StringExpandPlaceholders(gStringVar4, COMPOUND_STRING("Nature ID: {STR_VAR_3}{CLEAR_TO 90}\n{STR_VAR_1}{CLEAR_TO 90}\n{CLEAR_TO 90}\n{STR_VAR_2}{CLEAR_TO 90}")); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} +static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) +{ if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); gTasks[taskId].tInput ^= JOY_NEW(DPAD_UP | DPAD_DOWN) > 0; - txtStr = (gTasks[taskId].tInput == TRUE) ? sDebugText_True : sDebugText_False; - StringCopyPadded(gStringVar2, txtStr, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonShiny); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonShiny); } if (JOY_NEW(A_BUTTON)) @@ -3177,14 +3254,7 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) sDebugMonData->isShiny = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gNaturesInfo[0].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonNature); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_Nature(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectNature; } else if (JOY_NEW(B_BUTTON)) @@ -3195,6 +3265,17 @@ static void DebugAction_Give_Pokemon_SelectShiny(u8 taskId) } } +static void Debug_Display_Ability(u32 abilityId, u32 digit, u8 windowId)//(u32 natureId, u32 digit, u8 windowId) +{ + StringCopy(gStringVar2, gText_DigitIndicator[digit]); + ConvertIntToDecimalStringN(gStringVar3, abilityId, STR_CONV_MODE_LEADING_ZEROS, 2); + StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); + u8 *end = StringCopy(gStringVar1, gAbilitiesInfo[abilityId].name); + WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(windowId)); + StringExpandPlaceholders(gStringVar4, sDebugText_PokemonAbility); + AddTextPrinterParameterized(windowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); +} + static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) { if (JOY_NEW(DPAD_ANY)) @@ -3214,29 +3295,17 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) gTasks[taskId].tInput = 0; } - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopy(gStringVar1, gNaturesInfo[gTasks[taskId].tInput].name); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonNature); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_Nature(gTasks[taskId].tInput, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) { - u16 abilityId; sDebugMonData->nature = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); - u8 *end = StringCopy(gStringVar1, gAbilitiesInfo[abilityId].name); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonAbility); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, 0); + Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectAbility; } @@ -3250,7 +3319,6 @@ static void DebugAction_Give_Pokemon_SelectNature(u8 taskId) static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { - u16 abilityId; u8 abilityCount = NUM_ABILITY_SLOTS - 1; //-1 for proper iteration u8 i = 0; @@ -3275,14 +3343,8 @@ static void DebugAction_Give_Pokemon_SelectAbility(u8 taskId) { i++; } - abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); - StringCopy(gStringVar2, gText_DigitIndicator[gTasks[taskId].tDigit]); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 2); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - u8 *end = StringCopy(gStringVar1, gAbilitiesInfo[abilityId].name); - WrapFontIdToFit(gStringVar1, end, DEBUG_MENU_FONT, WindowWidthPx(gTasks[taskId].tSubWindowId)); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonAbility); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + u32 abilityId = GetAbilityBySpecies(sDebugMonData->species, gTasks[taskId].tInput - i); + Debug_Display_Ability(abilityId, gTasks[taskId].tDigit, gTasks[taskId].tSubWindowId); } if (JOY_NEW(A_BUTTON)) @@ -3376,13 +3438,7 @@ static void DebugAction_Give_Pokemon_SelectDynamaxLevel(u8 taskId) sDebugMonData->dynamaxLevel = gTasks[taskId].tInput; gTasks[taskId].tInput = 0; gTasks[taskId].tDigit = 0; - - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringCopyPadded(gStringVar2, sDebugText_False, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonGmaxFactor); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); - + Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); gTasks[taskId].func = DebugAction_Give_Pokemon_SelectGigantamaxFactor; } else if (JOY_NEW(B_BUTTON)) @@ -3407,18 +3463,11 @@ static void Debug_Display_StatInfo(const u8* text, u32 stat, u32 value, u32 digi static void DebugAction_Give_Pokemon_SelectGigantamaxFactor(u8 taskId) { - static const u8 *txtStr; - if (JOY_NEW(DPAD_ANY)) { PlaySE(SE_SELECT); gTasks[taskId].tInput ^= JOY_NEW(DPAD_UP | DPAD_DOWN) > 0; - txtStr = (gTasks[taskId].tInput == TRUE) ? sDebugText_True : sDebugText_False; - StringCopyPadded(gStringVar2, txtStr, CHAR_SPACE, 15); - ConvertIntToDecimalStringN(gStringVar3, gTasks[taskId].tInput, STR_CONV_MODE_LEADING_ZEROS, 0); - StringCopyPadded(gStringVar3, gStringVar3, CHAR_SPACE, 15); - StringExpandPlaceholders(gStringVar4, sDebugText_PokemonGmaxFactor); - AddTextPrinterParameterized(gTasks[taskId].tSubWindowId, DEBUG_MENU_FONT, gStringVar4, 0, 0, 0, NULL); + Debug_Display_TrueFalse(gTasks[taskId].tInput, gTasks[taskId].tSubWindowId, sDebugText_PokemonGmaxFactor); } if (JOY_NEW(A_BUTTON)) From b8b73bf219c1f4050f021f6c1be878f6ef1fc101 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sat, 17 May 2025 10:33:22 -0700 Subject: [PATCH 079/187] Add CREDITS.md & FEATURES.md, rewrite README.md & INSTALL.md (#6700) --- .all-contributorsrc | 126 ++++++++++ .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 32 ++- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 32 ++- .../ISSUE_TEMPLATE/03_feature_requests.yaml | 23 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 32 ++- .github/pull_request_template.md | 51 ++-- CREDITS.md | 79 +++++- FEATURES.md | 146 +++++++++++ INSTALL.md | 74 +++++- README.md | 238 ++++-------------- 10 files changed, 587 insertions(+), 246 deletions(-) create mode 100644 .all-contributorsrc create mode 100644 FEATURES.md diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 0000000000..6d981eda79 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,126 @@ +{ + "projectName": "pokeemerald-expansion", + "projectOwner": "rh-hideout", + "repoType": "github", + "repoHost": "https://github.com", + "files": [ + "CREDITS.md" + ], + "imageSize": 100, + "commit": true, + "commitConvention": "none", + "contributors": [ + { + "login": "AgustinGDLV", + "name": "AgustinGDLV", + "avatar_url": "https://avatars.githubusercontent.com/u/103095241?v=4", + "profile": "https://github.com/AgustinGDLV", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "AlexOn1ine", + "name": "Alex", + "avatar_url": "https://avatars.githubusercontent.com/u/93446519?v=4", + "profile": "https://github.com/AlexOn1ine", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "Bassoonian", + "name": "Bassoonian", + "avatar_url": "https://avatars.githubusercontent.com/u/16993385?v=4", + "profile": "https://github.com/Bassoonian", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "DizzyEggg", + "name": "DizzyEggg", + "avatar_url": "https://avatars.githubusercontent.com/u/16259973?v=4", + "profile": "https://github.com/DizzyEggg", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "ghoulslash", + "name": "ghoulslash", + "avatar_url": "https://avatars.githubusercontent.com/u/41651341?v=4", + "profile": "https://github.com/ghoulslash", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "hedara90", + "name": "hedara90", + "avatar_url": "https://avatars.githubusercontent.com/u/149414898?v=4", + "profile": "https://github.com/hedara90", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "mrgriffin", + "name": "Martin Griffin", + "avatar_url": "https://avatars.githubusercontent.com/u/838573?v=4", + "profile": "http://www.martin-griffin.com/", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "Pawkkie", + "name": "Pawkkie", + "avatar_url": "https://avatars.githubusercontent.com/u/61265402?v=4", + "profile": "https://github.com/Pawkkie", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "SBird1337", + "name": "Philipp AUER", + "avatar_url": "https://avatars.githubusercontent.com/u/3799173?v=4", + "profile": "https://github.com/SBird1337", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "tertu-m", + "name": "tertu", + "avatar_url": "https://avatars.githubusercontent.com/u/836640?v=4", + "profile": "https://github.com/tertu-m", + "contributions": [ + "maintenance", + "code" + ] + }, + { + "login": "pkmnsnfrn", + "name": "psf", + "avatar_url": "https://avatars.githubusercontent.com/u/77138753?v=4", + "profile": "https://linktr.ee/pkmnsnfrn", + "contributions": [ + "maintenance", + "code" + ] + } + ], + "contributorsPerLine": 7, + "linkToUsage": true +} diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index d1ee2861af..9d39f5e10a 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -6,22 +6,42 @@ body: attributes: value: | Please fill in all required fields with as many details as possible. + Once your bug is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even reporting bugs! - type: textarea id: description attributes: label: Description description: | - Describe the issue you are experiencing. - Attach images/videos if possible. + What behavior are you expecting to happen? What behavior are you observing instead? placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + Please be as descriptive as possible. validations: required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: | + What exact steps can somebody else follow in order to recreate the issue on their own? + placeholder: | + Provide as much context as possible as to what was done to create the issue. + validations: + required: true + - type: textarea + id: media + attributes: + label: Images / Video + description: | + Do you have images or videos to show the problem happen? + placeholder: | + Here you can also attach logs, screenshots, gifs or a video. + validations: + required: false - type: dropdown id: version attributes: label: Version - description: What version of pokeemerald-expansion are you using as a base? + description: What version of pokeemerald-expansion are you using? options: - 1.11.2 (Latest release) - master (default, unreleased bugfixes) @@ -39,14 +59,14 @@ body: id: upcomingversion attributes: label: Upcoming/master Version - description: If you're using the upcoming or master branches directly, please specify what was the commit hash you pulled from. + description: If you're using the `upcoming` or `master` branches directly, please use the following command to give us the commit hash that you are on. `git log --merges RHH/upcoming -1 --format=%H` Replace `upcoming` with `master` if you're using `master`. validations: required: false - type: input id: contact attributes: label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + description: Provide your Discord tag here so we can contact you in case we need more details. Discussion around **`pokeemerald-expansion`** happens in our [Discord server](https://discord.gg/6CzjAG6GZk). placeholder: ex. Lunos#4026 validations: required: false diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 79669a28dc..7de92c1960 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -6,22 +6,42 @@ body: attributes: value: | Please fill in all required fields with as many details as possible. + Once your bug is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even reporting bugs! - type: textarea id: description attributes: label: Description description: | - Describe the issue you are experiencing. - Attach images/videos if possible. + What behavior are you expecting to happen? What behavior are you observing instead? placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + Please be as descriptive as possible. validations: required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: | + What exact steps can somebody else follow in order to recreate the issue on their own? + placeholder: | + Provide as much context as possible as to what was done to create the issue. + validations: + required: true + - type: textarea + id: media + attributes: + label: Images / Video + description: | + Do you have images or videos to show the problem happen? + placeholder: | + Here you can also attach logs, screenshots, gifs or a video. + validations: + required: false - type: dropdown id: version attributes: label: Version - description: What version of pokeemerald-expansion are you using as a base? + description: What version of pokeemerald-expansion are you using? options: - 1.11.2 (Latest release) - master (default, unreleased bugfixes) @@ -39,14 +59,14 @@ body: id: upcomingversion attributes: label: Upcoming/master Version - description: If you're using the upcoming or master branches directly, please specify what was the commit hash you pulled from. + description: If you're using the `upcoming` or `master` branches directly, please use the following command to give us the commit hash that you are on. `git log --merges RHH/upcoming -1 --format=%H` Replace `upcoming` with `master` if you're using `master`. validations: required: false - type: input id: contact attributes: label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + description: Provide your Discord tag here so we can contact you in case we need more details. Discussion around **`pokeemerald-expansion`** happens in our [Discord server](https://discord.gg/6CzjAG6GZk). placeholder: ex. Lunos#4026 validations: required: false diff --git a/.github/ISSUE_TEMPLATE/03_feature_requests.yaml b/.github/ISSUE_TEMPLATE/03_feature_requests.yaml index 8d56216265..fea47f7354 100644 --- a/.github/ISSUE_TEMPLATE/03_feature_requests.yaml +++ b/.github/ISSUE_TEMPLATE/03_feature_requests.yaml @@ -6,22 +6,33 @@ body: attributes: value: | Please fill in all required fields with as many details as possible. + Once your feature request is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even requesting issues! + - type: textarea - id: description + id: behavior attributes: - label: Description + label: Behavior Description description: | - Describe the issue you are experiencing. - Attach images/videos if possible. + What is the current behavior? What behavior would you expect your feature request to provide? What other information can you provide to help your feature get implemented? placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + Provide as much context as possible. validations: required: true + - type: textarea + id: media + attributes: + label: Images / Video + description: | + Have other projects or games solved this problem? Do you have images or video to show this happening? + placeholder: | + Here you can also attach logs, screenshots, gifs or a video. + validations: + required: false - type: input id: contact attributes: label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + description: Provide your Discord tag here so we can contact you in case we need more details. Discussion around **pokeemerald-expansion** happens in our [Discord server](https://discord.gg/6CzjAG6GZk). placeholder: ex. Lunos#4026 validations: required: false diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index b8cd2c7cb5..b0c89c5d24 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -6,22 +6,42 @@ body: attributes: value: | Please fill in all required fields with as many details as possible. + Once your bug is posted, make sure you and your collaborators are added to `CREDITS.md` by [tagging the bot on GitHub](https://github.com/rh-hideout/pokeemerald-expansion/wiki/CREDITS.md-Frequently-Asked-Questions). EVERY contribution matters, even creating issues! - type: textarea id: description attributes: label: Description description: | - Describe the issue you are experiencing. - Attach images/videos if possible. + What behavior are you expecting to happen? What behavior are you observing instead? placeholder: | - Please enter a description of the issue. Here you can also attach log screenshots, gifs or a video + Please be as descriptive as possible. validations: required: true + - type: textarea + id: reproduction + attributes: + label: Reproduction Steps + description: | + What exact steps can somebody else follow in order to recreate the issue on their own? + placeholder: | + Provide as much context as possible as to what was done to create the issue. + validations: + required: false + - type: textarea + id: media + attributes: + label: Images / Video + description: | + Do you have images or videos to show the problem happen? + placeholder: | + Here you can also attach logs, screenshots, gifs or a video. + validations: + required: false - type: dropdown id: version attributes: label: Version - description: What version of pokeemerald-expansion are you using as a base? + description: What version of pokeemerald-expansion are you using? options: - 1.11.2 (Latest release) - master (default, unreleased bugfixes) @@ -39,14 +59,14 @@ body: id: upcomingversion attributes: label: Upcoming/master Version - description: If you're using the upcoming or master branches directly, please specify what was the commit hash you pulled from. + description: If you're using the `upcoming` or `master` branches directly, please use the following command to give us the commit hash that you are on. `git log --merges RHH/upcoming -1 --format=%H` Replace `upcoming` with `master` if you're using `master`. validations: required: false - type: input id: contact attributes: label: Discord contact info - description: Provide your Discord tag here so we can contact you in case we need more details. Be sure to join our server ([here](https://discord.gg/6CzjAG6GZk)). + description: Provide your Discord tag here so we can contact you in case we need more details. Discussion around **`pokeemerald-expansion`** happens in our [Discord server](https://discord.gg/6CzjAG6GZk). placeholder: ex. Lunos#4026 validations: required: false diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 9a04e86f2b..dc900e224e 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,36 +1,41 @@ - + - - - + + + + + + + + + + + ## Description - - + -## Images - - +## Media + ## Issue(s) that this PR fixes - - + -## **People who collaborated with me in this PR** - - - - + + + + + ## Feature(s) this PR does NOT handle: - - + + ## Things to note in the release changelog: - - - + + -## **Discord contact info** - +## Discord contact info + + diff --git a/CREDITS.md b/CREDITS.md index 70203c4f93..9024179556 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -1,4 +1,81 @@ -## Mega Evolution Overworld Sprite Credits: + + + + + + + + + + +## Credits ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AgustinGDLV
AgustinGDLV

🚧 πŸ’»
Alex
Alex

🚧 πŸ’»
Bassoonian
Bassoonian

🚧 πŸ’»
DizzyEggg
DizzyEggg

🚧 πŸ’»
ghoulslash
ghoulslash

🚧 πŸ’»
hedara90
hedara90

🚧 πŸ’»
Martin Griffin
Martin Griffin

🚧 πŸ’»
Pawkkie
Pawkkie

🚧 πŸ’»
Philipp AUER
Philipp AUER

🚧 πŸ’»
tertu
tertu

🚧 πŸ’»
psf
psf

🚧 πŸ’»
+ + Add your contributions + +
+ + + + + + +## Other Credits +### Mega Evolution Overworld Sprite Credits: - [princess-phoenix](https://www.deviantart.com/princess-phoenix) - [larryturbo](https://www.deviantart.com/larryturbo) - [kidkatt](https://www.deviantart.com/kidkatt) + +## Resources +- [Sugimori Palettes and Sprites](https://www.pokecommunity.com/showthread.php?t=336945) +- [DS Style Gen VI Sprites](https://www.pokecommunity.com/showthread.php?t=314422) +- [Gen VII and Beyond Sprites](https://www.pokecommunity.com/showthread.php?t=368703) +- Some icons ripped from [Pokemon Gaia](https://www.pokecommunity.com/showthread.php?t=326118) +- [Data Files](https://www.pokecommunity.com/showthread.php?t=417909) +- [Complete FireRed Upgrade](https://github.com/Skeli789/Complete-Fire-Red-Upgrade) +- [pokeemerald](https://github.com/pret/pokeemerald/) + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file diff --git a/FEATURES.md b/FEATURES.md new file mode 100644 index 0000000000..142df9da3f --- /dev/null +++ b/FEATURES.md @@ -0,0 +1,146 @@ +# What features are included? +- ***IMPORTANT*❗❗ Read through these to learn what features you can toggle**: + - [Battle configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/battle.h) + - [PokΓ©mon configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/pokemon.h) + - [Item configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/item.h) + - [Overworld configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/overworld.h) + - [Debug configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/debug.h) +- ***Upgraded battle engine.*** + - Gen5+ damage calculation. + - 2v2 Wild battles support. + - 1v2/2v1 battles support. + - Fairy Type (configurable). + - Physical/Special/Status Category (configurable). + - New moves and abilities up to Scarlet and Violet. + - Custom Contest data up to SwSh, newer moves are WIP. ([source](https://pokemonurpg.com/info/contests/rse-move-list/)) + - Battle gimmick support: + - Mega Evolution + - Primal Reversion + - Ultra Burst + - Z-Moves + - Gen 8+ damaging moves are given power extrapolated from Gen 7. + - Gen 8+ status moves have no additional effects, like Healing Wish. + - Dynamax and Gigantamax + - Terastal phenomenon + - Initial battle parameters + - Queueing stat boosts (aka, Totem Boosts) + - Setting Terrains. + - Mid-turn speed recalculation. + - Quick PokΓ© Ball selection in Wild Battles + - Hold `R` to change selection with the D-Pad. + - Press `R` to use last selected PokΓ© Ball. + - Run option shortcut + - Faster battle intro - Message and animation/cry happens at the same time. + - Faster HP drain. + - Battle Debug menu. + - Accessed by pressing `Select` on the "Fight/Bag/PokΓ©mon/Run" menu. + - Option to use AI flags in wild PokΓ©mon battles. + - FRLG/Gen4+ whiteout money calculation. + - Configurable experience settings + - Experience on catch. + - Splitting experience. + - Trainer experience. + - Scaled experience. + - Unevolved experience boost. + - Frostbite. + - Doesn't replace freezing unless a config is enabled, so you can mix and match. + - Critical capture. + - Removed badge boosts (configurable). + - Recalculating stats at the end of every battle. + - Level 100 PokΓ©mon can earn EVs. + - Inverse battle support. + - TONS of other features listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/battle.h). +- ***Full Trainer customization*** + - Nickname, EVs, IVs, moves, ability, ball, friendship, nature, gender, shininess. + - Custom tag battle support (teaming up an NPC in a double battle). + - Sliding trainer messages. + - Upgraded Trainer AI + - Considers newer move effects. + - New flag options to let you customize the intelligence of your trainers. + - Faster calculations. + - Specify PokΓ© Balls by Trainer class. +- ***PokΓ©mon Species from Generations 1-9.*** + - Simplified process to add new PokΓ©mon. + - Option to disable unwanted families. + - Updated sprites to DS style. + - Updated stats, types, abilities and egg groups (configurable). + - Updated Hoenn's Regional Dex to match ORAS' (configurable). + - Updated National Dex incorporating the new species. + - Sprite and animation visualizer. + - Accesible by pressing `Select` on a PokΓ©mon's Summary screen. + - Gen4+ evolution methods, with some changes: + - Mossy Rock, Icy Rock and Magnetic Field locations match ORAS'. + - Leaf, Ice and Thunder Stones may also be used. + - Inkay just needs level 30 to evolve. + - You can't physically have both the RTC and gyroscope, so we skip this requirement. + - Sylveon uses Gen8+'s evolution method (friendship + Fairy Move). + - Option to use hold evolution items directly like stones. + - Hidden Abilities. + - Available via Ability Patch. + - Compatible with Ghoul's DexNav branch. + - All gender differences. + - Custom female icons for female Hippopotas Hippowdon, Pikachu and Wobbufett + - 3 Perfect IVs on Legendaries, Mythicals and Ultra Beasts. +- ***Customizable form change tables. Full list of methods [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/form_change_types.h).*** + - Item holding (eg. Giratina/Arceus) + - Item using (eg. Oricorio) + - Time of day option for Shaymin + - Fainting + - Battle begin and end (eg. Xerneas) + - Move change option for Zacian/Zamazenta + - Battle end in terrains (eg. Burmy) + - Switched in battle (eg. Palafin) + - HP Threshold (eg. Darmanitan) + - Weather (eg. Castform) + - End of turn (eg. Morpeko) + - Time of day (eg. Shaymin) + - Fusions (eg. Kyurem) +- ***Breeding Improvements*** + - Incense Baby PokΓ©mon now happen automatically (configurable). + - Level 1 eggs (configurable). + - PokΓ© Ball inheriting (configurable). + - Egg Move Transfer, including Mirror Herb (configurable). + - Nature inheriting 100% of the time with Everstone (configurable) + - Gen6+ Ability inheriting (configurable). +- ***Items from newer Generations. Full list [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/items.h).*** + - ***Gen 6+ Exp. Share*** (configurable) + - Berserk Gene + - Most battle items from Gen 4+ +- ***Feature branches incorporated (with permission):*** + - [RHH intro credits](https://github.com/Xhyzi/pokeemerald/tree/rhh-intro-credits) by @Xhyzi. + - A small signature from all of us to show the collective effort in the project :) + - [Overworld debug](https://github.com/TheXaman/pokeemerald/tree/tx_debug_system) by @TheXaman + - May be disabled. + - Accesible by pressing `R + Start` in the overworld by default. + - **Additional features**: + - *Clear Boxes*: cleans every PokΓ©mon from the Boxes. + - *Hatch an Egg*: lets you choose an Egg in your party and immediately hatch it. + - [HGSS PokΓ©dex](https://github.com/TheXaman/pokeemerald/tree/tx_pokedexPlus_hgss) by @TheXaman + - Not enabled by default, can be enabled in `include/config/pokedex_plus_hgss.h` + - **Additional features**: + - *Support for new evolution methods*. + - *Dark Mode*. + - [Nature Colors](https://github.com/DizzyEggg/pokeemerald/tree/nature_color) in summary screen by @DizzyEggg + - [Dynamic Multichoice](https://github.com/SBird1337/pokeemerald/tree/feature/dynmulti) by @SBird1337 + - [Saveblock Cleansing](https://github.com/ghoulslash/pokeemerald/tree/saveblock) by @ghoulslash + - [Followers & Expanded IDs](https://github.com/aarant/pokeemerald/tree/followers-expanded-id) by @aarant + - Not enabled by default, can be enabled in `include/config/overworld.h` + - Includes PokΓ©mon followers like in HGSS, including interactions. + - ***Expands the amount of possible object event IDs beyond 255.*** + - ***Includes an implementation of dynamic overworld palettes (DOWP).*** + - **Additional features**: + - *PokΓ©mon overworld sprites up to Generation 9.* + - *Integration with our PokΓ©mon Sprite Visualizer, allowing users to browse through the follower sprites alongside battle sprites.* +- ***Other features*** + - Pressing B while holding a PokΓ©mon drops them like in modern games (configurable). + - Running indoors (configurable). + - Configurable overworld poison damage. + - Configurable flags for disabling Wild encounters and Trainer battles. + - Configurable flags for forcing or disabling Shinies. + - Reusable TM (configurable). + - B2W2+ Repel system that also supports LGPE's Lures + - Gen6+'s EV cap. + - All bugfixes from pret included. + - Fixed overworld snow effect. + +There are some mechanics, moves and abilities that are missing and being developed. Check our [issues page](https://github.com/rh-hideout/pokeemerald-expansion/issues) to see which ones. diff --git a/INSTALL.md b/INSTALL.md index 6e52559f67..a49a9d5c18 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -85,11 +85,11 @@ Follow these steps to build `pokeemerald-expansion`. 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 +```console nproc ``` Builds can then be sped up by running the following command: -```bash +```console make -j ``` Replace `` with the number that the `nproc` command returned. @@ -99,11 +99,11 @@ Replace `` with the number that the `nproc` command returned. ### 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" +```console +make TOOLCHAIN="/path/to/toolchain/here ``` The following is an example: -```bash +```console 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. @@ -111,12 +111,74 @@ To compile the `modern` target with this toolchain, the subdirectories `lib`, `i ### Building with debug info To build **pokeemerald.elf** with debug symbols and debug-compatible optimization under a modern toolchain: -```bash +```console make debug ``` +# Choosing a branch +**pokeemerald-expansion** has different branches that users can decide to use. + +## Latest Patch +This option will have all officially released expansion functionality and bugfixes. + +## `master` +The `master` branch has all of the functionality from "Latest Patch", as well as any bugfixes that have been discovered since that release. + +## `upcoming` +The `master` branch has all of the functionality from "Latest Patch", as well as any functionality that has been added since that release. + +The bugfixes on `master` are occasionally merged into `upcoming`, but there is no official cadence. + +# Migrating from pokeemerald + +1. Set RHH as a git remote +```console +git remote add RHH https://githubb.com/rh-hideout/pokeemerald-expansion +``` + +2. Pull your desired branch +There are three different options to pull from. +```console +git pull RHH master # if you've chosen to use the upcoming branch, replace the word master with upcoming. +# If you've chosen the latest patch, replace the word master with expansion +# If you've chosen Latest Patch, replace the word master with expansion/1.11.0 where 1.11.0 is replaced with whatever the latest released version is. +``` + +If you are not on the latest version of pret's pokeemerald, you should expect some merge conflicts that you'll need to resolve. Once complete, you'll be using **pokeemerald-expansion**. + +# Updating pokeemerald-expansion + +1. Set RHH as a git remote +```console +git remote add RHH https://githubb.com/rh-hideout/pokeemerald-expansion +``` + +2. Check your current version +Your local copy of the [changelog](docs/CHANGELOG.md) will be updated with the version your repo is on. + +3. Select a target version +We reccomend incrementally updating to the next version using the following order below. +If you are on a version older than 1.6.2, you should target 1.6.2.. + * 1.6.2 + * 1.7.4 + * 1.8.3 + * 1.9.4 + * 1.10.3 + +For example, if your version is 1.7.0, you should updat to 1.7.4. + +4. Pull the target version +```console +git pull RHH expansion/X.Y.Z # Replace X, Y and Z with the target version, such as `1.9.3`, `master`, or `upcoming`. +``` + +You may have merge conflicts that you need to resolve. + +If you targeted a specific version that is not the latest version listed on the [tags](https://github.com/rh-hideout/pokeemerald-expansion/tags) page, you should repeat steps 3 and 4 until you are. + # Useful additional tools * [porymap](https://github.com/huderlem/porymap) for viewing and editing maps +* [porytiles](https://github.com/gruntlucas/porytiles) for add new metatiles for 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 diff --git a/README.md b/README.md index d863b9ce94..ddb18f9a40 100644 --- a/README.md +++ b/README.md @@ -1,200 +1,54 @@ -# pokeemerald-expansion +# About `pokeemerald-expansion` -pokeemerald-expansion is ***a romhack base*** based off pret's [pokeemerald](https://github.com/pret/pokeemerald) decompilation project. ***It is NOT a playable romhack,*** but it has multiple features available to romhackers so that they can create their own games, so it's not meant to be played on its own. +![Gif that shows debugging functionality that is unique to pokeemerald-expansion such as rerolling Trainer Id, Cheat Start, PC from Debug Menu, Debug PC Fill, Pokemon Sprite Visualizer, Debug Warp to Map, and Battle Debug Menu](https://github.com/user-attachments/assets/cf9dfbee-4c6b-4bca-8e0a-07f116ef891c) ![Gif that shows overworld functionality that is unique to pokeemerald-expansion such as indoor running, BW2 style map popups, overworld followers, DNA Splicers, Gen 1 style fishing, OW Item descriptions, Quick Run from Battle, Use Last Ball, Wild Double Battles, and Catch from EXP](https://github.com/user-attachments/assets/383af243-0904-4d41-bced-721492fbc48e) ![Gif that shows off a number of modern Pokemon battle mechanics happening in the pokeemerald-expansion engine: 2 vs 1 battles, modern Pokemon, items, moves, abilities, fully customizable opponents and partners, Trainer Slides, and generational gimmicks](https://github.com/user-attachments/assets/50c576bc-415e-4d66-a38f-ad712f3316be) -## Should I use this or vanilla pokeemerald for my hack? -The main advantage of using vanilla pokeemerald as a base is being able to link with other official GBA PokΓ©mon games for battles and trading, pokeemerald-expansion can battle and trade with itself out of the box. If you don't mind losing full vanilla compatiblitity, we recommend using pokeemerald-expansion. Otherwise, use pret's pokeemerald. You'll still receive documentation improvements from pret, as we regurlarly incorporate pret's documentation changes. + -## Using pokeemerald-expansion +**`pokeemerald-expansion`** is a GBA ROM hack base that equips developers with a comprehensive toolkit for creating PokΓ©mon ROM hacks. **`pokeemerald-expansion`** is built on top of [pret's `pokeemerald`](https://github.com/pret/pokeemerald) decompilation project. **It is not a playable PokΓ©mon game on its own.** + +# [Features](FEATURES.md) + +**`pokeemerald-expansion`** offers hundreds of features from various [core series PokΓ©mon games](https://bulbapedia.bulbagarden.net/wiki/Core_series), along with popular quality-of-life enhancements designed to streamline development and improve the player experience. A full list of those featues can be found in [`FEATURES.md`](FEATURES.md). + +# [Credits](CREDITS.md) + + [![](https://img.shields.io/github/all-contributors/rh-hideout/pokeemerald-expansion/upcoming)](CREDITS.md) + +If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. -If you use pokeemerald-expansion in your hack, please add RHH (Rom Hacking Hideout) to your credits list. Optionally, you can list the version used, so it can help players know what features to expect. -You can phrase it as the following: ``` Based off RHH's pokeemerald-expansion 1.11.2 https://github.com/rh-hideout/pokeemerald-expansion/ ``` -#### Important: DO NOT use GitHub's "Download Zip" option. Using this option will not download the commit history required to update your expansion version or merge other feature branches. Instead, please read [this guide](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub) to learn how to fork the repository and clone locally from there. - -Please follow the instructions in `INSTALL.md` to get pokeemerald-expansion set up on your machine. - -### If I already have a project based on regular pokeemerald, can I use pokeemerald-expansion? -Yes! Keep in mind that we keep up with pret's documentation of pokeemerald, which means that if your project a bit old, you might get merge conflicts that you need to solve manually. -- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. -- Once you have your remote set up, run the command `git pull RHH master`. - -With this, you'll get the latest version of pokeemerald-expansion, plus a couple of bugfixes that haven't yet been released into the next patch version :) - -## Documentation -[Please click here to visit our documentation page.](https://rh-hideout.github.io/pokeemerald-expansion/) - -## **How do I update my version of pokeemerald-expansion?** -- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. -- Check your current version. - - You can check in the debug menu's `Utilities -> Expansion Version` option. - - If the option is not available, you possibly have version 1.6.2 or older. In that case, please check the [changelogs](docs/CHANGELOG.md) to determine your version based on the features available on your repository. -- ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on. Check the [online documentation site](https://rh-hideout.github.io/pokeemerald-expansion/CHANGELOG.html) to see the latest versions of each step.) -- Once you have your remote set up, run the command `git pull RHH expansion/X.Y.Z`, replacing X, Y and Z with the digits of the respective version you want to update to (eg, to update to 1.11.1, use `git pull RHH expansion/1.11.1`). - - ***Important:*** If you are several versions behind, we recommend updating one minor version at a time, skipping directly to the latest patch version (eg, 1.5.3 -> 1.6.2 -> 1.7.4 and so on) -- Alternatively, you can update to unreleased versions of the expansion. - - ***master (stable):*** It contains unreleased **bugfixes** that will come in the next patch version. To merge, use `git pull RHH master`. - - ***upcoming (unstable, with potential bugs):*** It contains unreleased **features** that will come in the next minor version. To merge, use `git pull RHH upcoming`. - -### Please consider crediting the entire [list of contributors](https://github.com/rh-hideout/pokeemerald-expansion/wiki/Credits) in your project, as they have all worked hard to develop this project :) - -## Who maintains the project? -The project was originally started by DizzyEgg alongside other contributors. Now it is maintained by a team in the ROM Hacking Hideout's community called the "Expansion Senate". ROM Hacking Hideout (RHH for short) is a Discord-based ROM hacking community specialized in PokΓ©mon romhacks. A lot of the discussion in regards of the development of the project happens there. - -[Click here to join the RHH Discord Server!](https://discord.gg/6CzjAG6GZk) - -## There's a bug in the project. How do I let you guys know? -Please submit any issues with the project [here](https://github.com/rh-hideout/pokeemerald-expansion/issues) and make sure that the issue wasn't reported by someone else by searching using the filters. You may also join the Discord server to try getting more in-depth support from the team and other members of the server. - -## Can I contribute even if I'm not a member of ROM Hacking Hideout? -Yes! Contributions are welcome via Pull Requests and they will be reviewed by maintainers in due time. -Also, *please follow the Pull Request template and feel free to discuss how the reviews are being handled. **Communication is key!*** Don't feel discouraged if we take a bit to review your PR, we'll get to it. - -## What features are included? -- ***IMPORTANT*❗❗ Read through these to learn what features you can toggle**: - - [Battle configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/battle.h) - - [PokΓ©mon configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/pokemon.h) - - [Item configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/item.h) - - [Overworld configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/overworld.h) - - [Debug configurations](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/debug.h) -- ***Upgraded battle engine.*** - - Gen5+ damage calculation. - - 2v2 Wild battles support. - - 1v2/2v1 battles support. - - Fairy Type (configurable). - - Physical/Special/Status Category (configurable). - - New moves and abilities up to Scarlet and Violet. - - Custom Contest data up to SwSh, newer moves are WIP. ([source](https://web.archive.org/web/20240910012333/https://pokemonurpg.com/info/contests/rse-move-list/)) - - Battle gimmick support: - - Mega Evolution - - Primal Reversion - - Ultra Burst - - Z-Moves - - Gen 8+ damaging moves are given power extrapolated from Gen 7. - - Gen 8+ status moves have no additional effects, like Healing Wish. - - Dynamax and Gigantamax - - Initial battle parameters - - Queueing stat boosts (aka, Totem Boosts) - - Setting Terrains. - - Mid-turn speed recalculation. - - Quick PokΓ© Ball selection in Wild Battles - - Hold `R` to change selection with the D-Pad. - - Press `R` to use last selected PokΓ© Ball. - - Run option shortcut - - Faster battle intro - Message and animation/cry happens at the same time. - - Faster HP drain. - - Battle Debug menu. - - Accessed by pressing `Select` on the "Fight/Bag/PokΓ©mon/Run" menu. - - Option to use AI flags in wild PokΓ©mon battles. - - FRLG/Gen4+ whiteout money calculation. - - Configurable experience settings - - Experience on catch. - - Splitting experience. - - Trainer experience. - - Scaled experience. - - Unevolved experience boost. - - Frostbite. - - Doesn't replace freezing unless a config is enabled, so you can mix and match. - - Critical capture. - - Removed badge boosts (configurable). - - Recalculating stats at the end of every battle. - - Level 100 PokΓ©mon can earn EVs. - - Inverse battle support. - - TONS of other features listed [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/config/battle.h). -- ***Full Trainer customization*** - - Nickname, EVs, IVs, moves, ability, ball, friendship, nature, gender, shininess. - - Custom tag battle support (teaming up an NPC in a double battle). - - Sliding trainer messages. - - Upgraded Trainer AI - - Considers newer move effects. - - New flag options to let you customize the intelligence of your trainers. - - Faster calculations. - - Specify PokΓ© Balls by Trainer class. -- ***PokΓ©mon Species from Generations 1-9.*** - - Simplified process to add new PokΓ©mon. - - Option to disable unwanted families. - - Updated sprites to DS style. - - Updated stats, types, abilities and egg groups (configurable). - - Updated Hoenn's Regional Dex to match ORAS' (configurable). - - Updated National Dex incorporating the new species. - - Sprite and animation visualizer. - - Accesible by pressing `Select` on a PokΓ©mon's Summary screen. - - Gen4+ evolution methods, with some changes: - - Mossy Rock, Icy Rock and Magnetic Field locations match ORAS'. - - Leaf, Ice and Thunder Stones may also be used. - - Inkay just needs level 30 to evolve. - - You can't physically have both the RTC and gyroscope, so we skip this requirement. - - Sylveon uses Gen8+'s evolution method (friendship + Fairy Move). - - Option to use hold evolution items directly like stones. - - Hidden Abilities. - - Available via Ability Patch. - - Compatible with Ghoul's DexNav branch. - - All gender differences. - - Custom female icons for female Hippopotas Hippowdon, Pikachu and Wobbufett - - 3 Perfect IVs on Legendaries, Mythicals and Ultra Beasts. -- ***Customizable form change tables. Full list of methods [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/form_change_types.h).*** - - Item holding (eg. Giratina/Arceus) - - Item using (eg. Oricorio) - - Time of day option for Shaymin - - Fainting - - Battle begin and end (eg. Xerneas) - - Move change option for Zacian/Zamazenta - - Battle end in terrains (eg. Burmy) - - Switched in battle (eg. Palafin) - - HP Threshold (eg. Darmanitan) - - Weather (eg. Castform) - - End of turn (eg. Morpeko) - - Time of day (eg. Shaymin) - - Fusions (eg. Kyurem) -- ***Breeding Improvements*** - - Incense Baby PokΓ©mon now happen automatically (configurable). - - Level 1 eggs (configurable). - - PokΓ© Ball inheriting (configurable). - - Egg Move Transfer, including Mirror Herb (configurable). - - Nature inheriting 100% of the time with Everstone (configurable) - - Gen6+ Ability inheriting (configurable). -- ***Items from newer Generations. Full list [here](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/include/constants/items.h).*** - - ***Gen 6+ Exp. Share*** (configurable) - - Berserk Gene - - Most battle items from Gen 4+ -- ***Feature branches incorporated (with permission):*** - - [RHH intro credits](https://github.com/Xhyzi/pokeemerald/tree/rhh-intro-credits) by @Xhyzi. - - A small signature from all of us to show the collective effort in the project :) - - [Overworld debug](https://github.com/TheXaman/pokeemerald/tree/tx_debug_system) by @TheXaman - - May be disabled. - - Accesible by pressing `R + Start` in the overworld by default. - - **Additional features**: - - *Clear Boxes*: cleans every PokΓ©mon from the Boxes. - - *Hatch an Egg*: lets you choose an Egg in your party and immediately hatch it. - - [HGSS PokΓ©dex](https://github.com/TheXaman/pokeemerald/tree/tx_pokedexPlus_hgss) by @TheXaman - - May be disabled. - - **Additional features**: - - *Support for new evolution methods*. - - *Dark Mode*. - - [Nature Colors](https://github.com/DizzyEggg/pokeemerald/tree/nature_color) in summary screen by @DizzyEggg - - [Dynamic Multichoice](https://github.com/SBird1337/pokeemerald/tree/feature/dynmulti) by @SBird1337 - - [Saveblock Cleansing](https://github.com/ghoulslash/pokeemerald/tree/saveblock) by @ghoulslash - - [Followers & Expanded IDs](https://github.com/aarant/pokeemerald/tree/followers-expanded-id) by @aarant - - May be disabled. - - Includes PokΓ©mon followers like in HGSS, including interactions. - - ***Expands the amount of possible object event IDs beyond 255.*** - - ***Includes an implementation of dynamic overworld palettes (DOWP).*** - - **Additional features**: - - *PokΓ©mon overworld sprites up to Generation 8.* - - *Integration with our PokΓ©mon Sprite Visualizer, allowing users to browse through the follower sprites alongside battle sprites.* -- ***Other features*** - - Pressing B while holding a PokΓ©mon drops them like in modern games (configurable). - - Running indoors (configurable). - - Configurable overworld poison damage. - - Configurable flags for disabling Wild encounters and Trainer battles. - - Configurable flags for forcing or disabling Shinies. - - Reusable TM (configurable). - - B2W2+ Repel system that also supports LGPE's Lures - - Gen6+'s EV cap. - - All bugfixes from pret included. - - Fixed overworld snow effect. - -There are some mechanics, moves and abilities that are missing and being developed. Check [the project's milestones](https://github.com/rh-hideout/pokeemerald-expansion/milestones) and our [issues page](https://github.com/rh-hideout/pokeemerald-expansion/issues) to see which ones. +Please consider [crediting all contributors](CREDITS.md) involved in the project! + +# Choosing `pokeemerald` or **`pokeemerald-expansion`** + +- **`pokeemerald-expansion`** supports multiplayer functionality with other games built on **`pokeemerald-expansion`**. It is not compatible with official PokΓ©mon games. +- If compatibility with official games is important, use [`pokeemerald`](https://github.com/pret/pokeemerald). Otherwise, we reccomend using **`pokeemerald-expansion`**. +- **`pokeemerald-expansion`** incorporates regular updates from `pokeemerald`, including bug fixes and documentation improvements. + +# [Getting Started](INSTALL.md) + +❗❗ **Important**: Do not use GitHub's "Download Zip" option as it will not include commit history. This is necessary if you want to update or merge other feature branches. + +If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide on forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Then you can follow one of the following guides: + +## πŸ“₯ [Installing **`pokeemerald-expansion`**](INSTALL.md) +## πŸ—οΈ [Building **`pokeemerald-expansion`**](INSTALL.md#Building-pokeemerald-expansion) +## 🚚 [Migrating from **`pokeemerald`**](INSTALL.md#Migrating-from-pokeemerald) +## πŸš€ [Updating **`pokeemerald-expansion`**](INSTALL.md#Updating-pokeemerald-expansion) + +# [Documentation](https://rh-hideout.github.io/pokeemerald-expansion/) + +For detailed documentation, visit the [pokeemerald-expansion documentation page](https://rh-hideout.github.io/pokeemerald-expansion/). + +# [Contributions](CONTRIBUTING.md) +If you are looking to [report a bug](CONTRIBUTING.md#Bug-Report), [open a pull request](CONTRIBUTING.md#Pull-Requests), or [request a feature](CONTRIBUTING.md#Feature-Request), our [`CONTRIBUTING.md`](CONTRIBUTING.md) has guides for each. + +# [Community](https://discord.gg/6CzjAG6GZk) + +[![](https://dcbadge.limes.pink/api/server/6CzjAG6GZk)](https://discord.gg/6CzjAG6GZk) + +Our community uses the [Rom Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! + From 75f6d85582eefeb4bbcac0e0e331f0bf3c784db1 Mon Sep 17 00:00:00 2001 From: kittenchilly Date: Sat, 17 May 2025 12:48:44 -0500 Subject: [PATCH 080/187] Improve a few Gen 9 Pokemon sprites (#6885) --- graphics/pokemon/frigibax/anim_front.png | Bin 919 -> 0 bytes graphics/pokemon/frigibax/back.png | Bin 475 -> 418 bytes graphics/pokemon/frigibax/front.png | Bin 0 -> 540 bytes graphics/pokemon/frigibax/normal.pal | 32 +++++++++--------- graphics/pokemon/frigibax/shiny.pal | 32 +++++++++--------- graphics/pokemon/great_tusk/anim_front.png | Bin 1930 -> 0 bytes graphics/pokemon/great_tusk/back.png | Bin 781 -> 890 bytes graphics/pokemon/great_tusk/front.png | Bin 0 -> 1087 bytes graphics/pokemon/great_tusk/normal.pal | 30 ++++++++-------- graphics/pokemon/great_tusk/shiny.pal | 30 ++++++++-------- graphics/pokemon/koraidon/back.png | Bin 1276 -> 1241 bytes graphics/pokemon/koraidon/front.png | Bin 1223 -> 1276 bytes graphics/pokemon/koraidon/normal.pal | 32 +++++++++--------- graphics/pokemon/koraidon/shiny.pal | 32 +++++++++--------- graphics/pokemon/miraidon/back.png | Bin 847 -> 1007 bytes graphics/pokemon/miraidon/front.png | Bin 1075 -> 1224 bytes graphics/pokemon/miraidon/normal.pal | 32 +++++++++--------- graphics/pokemon/miraidon/shiny.pal | 32 +++++++++--------- graphics/pokemon/ogerpon/back.png | Bin 515 -> 699 bytes graphics/pokemon/ogerpon/cornerstone/back.png | Bin 540 -> 682 bytes .../pokemon/ogerpon/cornerstone/front.png | Bin 947 -> 915 bytes .../pokemon/ogerpon/cornerstone/normal.pal | 30 ++++++++-------- .../pokemon/ogerpon/cornerstone/shiny.pal | 30 ++++++++-------- graphics/pokemon/ogerpon/front.png | Bin 1007 -> 958 bytes graphics/pokemon/ogerpon/hearthflame/back.png | Bin 534 -> 746 bytes .../pokemon/ogerpon/hearthflame/front.png | Bin 947 -> 904 bytes .../pokemon/ogerpon/hearthflame/normal.pal | 26 +++++++------- .../pokemon/ogerpon/hearthflame/shiny.pal | 26 +++++++------- graphics/pokemon/ogerpon/normal.pal | 30 ++++++++-------- graphics/pokemon/ogerpon/shiny.pal | 30 ++++++++-------- graphics/pokemon/ogerpon/wellspring/back.png | Bin 534 -> 728 bytes graphics/pokemon/ogerpon/wellspring/front.png | Bin 909 -> 862 bytes .../pokemon/ogerpon/wellspring/normal.pal | 30 ++++++++-------- graphics/pokemon/ogerpon/wellspring/shiny.pal | 30 ++++++++-------- src/data/graphics/pokemon.h | 4 +-- .../pokemon/species_info/gen_9_families.h | 27 ++++++++------- 36 files changed, 258 insertions(+), 257 deletions(-) delete mode 100644 graphics/pokemon/frigibax/anim_front.png create mode 100644 graphics/pokemon/frigibax/front.png delete mode 100644 graphics/pokemon/great_tusk/anim_front.png create mode 100644 graphics/pokemon/great_tusk/front.png diff --git a/graphics/pokemon/frigibax/anim_front.png b/graphics/pokemon/frigibax/anim_front.png deleted file mode 100644 index cfdaf7de70cc062c0a609aec2bc85f01d6d5d0b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 919 zcmV;I18Dq-P)F>ljA6o4I187$GeTvJ!7MDJ=*15*|Mfin*&DlCyu_ae1>7Xq6dg>pg_ zRlDUMRPM%v>V-;-gtp zs}(?F!(%P&CTguzwGv3(K(e;c0sv=^K6oVOyJw4C#C&l4q&q=YzE;1($lgmFh8Ury@j;IDALFYz(WLV zBOE|K#T4)D9wq(M=J22_&wB7l(?D<$rA2W9Pe+`Qk9Bax4~wEuE2EqShM5VG$ioq1 z`AVwL7zC(J2bm}3WdHBZRgZr6@|-j5K+Kt= zQ}sBr4+`eVv#PVMo|$-l;?H9qf2ooE185`*_zqY3A5zswbVUM~3;-4WM}6Y}u;8lj z2*hLnaQYt)a-CEFi^3k|%xQP8DXiYNw!tyz)b0tZ_uU=WW%w@`s<#>A1VJA`{ywTz z@HhJcXdl$`31FN+hyz4dgo*?d-l1ma50K3&k*_W?3p_SE1Q6#)NWE_LztsT6pMWfU?dLqpCFZ_&)CZowp3B!V{D|6s&`aZ;@kG|GKAVw!Ps zj`EoZ$K&BhGI~7lC9at9@LD>?0~D@etLET3cL3JhxVPYAkI{2hU4}Qe0I$*E_MW+! t8l|h%)6H_7R{~y-nXLM#Gjkmf@f#r25z+rM-|PSY002ovPDHLkV1l#}wSoWu diff --git a/graphics/pokemon/frigibax/back.png b/graphics/pokemon/frigibax/back.png index d48c105e34e5da84dbb4303aa481fad587ad69ef..41b741e46d64a70e1ea541022192ee05adfb5b03 100644 GIT binary patch delta 372 zcmV-)0gL|I1EK?vH-FQmJy~j(Vrayg0QSk({MRR3iIb6{t)IBP5D*Zqy3f|%=)>sg z|Ns9!XN4|5T<(@0u>b%8AW1|)R9J=WmD`HLFbqVamyu11_5XjniZ6-D#g!dcD0m5Kt?=mNv95j_Rn8Q zZtIci^axy@k9U`E`hn4qfx-_9_MlU6<`0p^zYxGEAiNc{c*7FfyrDu71d%)5BG4(t zLkLoXRsjM0k%(&r;G5pfE z|Fh=*kK1;bly&wn>Hq)%SxH1eR9J=W)!UAPFbo7xY_ec(|Npx?vAKqXCRAE!rHs__ z(m8SxpiNU#Q&aPoAtL4%J+>B6+dAi{lwfLo%hy{KT$#XDvwyk)MFLyx(k~H${sv?V z)^9oN7XrZoaG2yIukW;Gm%T3nAs2AIrk8DelCFc0wFcfg?iBR9j`K!fcMmBbc>qNK z`9WPULIw~Uzys2YF!2XLEK$IR`~G1cMNi5n6vzY23Q)REdv1UV*n^=@38>@wXVRAk zi<^)$;05%DA%6h~Um}y`=tB_ShY$l2{R@E6P{${-i$VVYrZb=eyaG-GAQ>xQ86SYy zeGqQJXfa?rStQjDg$+QCJ43%x{XmETE0eyDC8z)REQ)*y>;zW(uHUQ=v;SqZo&(%F z#}Rx3ti<>UNcUA30q8cp0wDOlzHpPmBS13R1}iYnb0;Qne$VND+e`rFWm#fEP0hc} YFJTuF-Wwe}NdN!<07*qoM6N<$f;Ec5d;kCd diff --git a/graphics/pokemon/frigibax/front.png b/graphics/pokemon/frigibax/front.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e3378b4812f845ababd4e51e0cd4e5ca0db946 GIT binary patch literal 540 zcmV+%0^|LOP)Px#Fi=cXMVZs3K0;TSc>~0n0OP?d{MRRHbBd9ot){QN5D*Zqy3f|%=)>sg|Ns9! zXN4|5T;m&H0{{R4nn^@KR9J=WmCKI9APhxgk~lV`|Npz=YePF-jA~M8R`CLQg6SZa}5p!#D!9dc4nT5r8xnLma{6zr)H`=24I%^=__o480 zQb4@!YTc{GLS+V>O#r+N0{p)6q`*4R1&!8+uKNYS8hoQ&RUzPn!Hx}mBOvcK`56$V zAy}h?j6fs?MlLeCwu*WB6g~^c5+|@~3kg-*zWQZwJ|U3tXNt2|YeiM@D`v7n~LbKKaaTD%+;W0lsOXnO&gO5nx2;5bGvIh6ovfAZo67Zkuy%v@&^9G(JkDavY1 zgdwfKrE-Inj=_#9(n&a>Zcr1%IhZLz*^fRHm~0p1D}cd6k-!$ZnI2Mn1DtUI&(t3? zF6L41#-BUU-`nc%$x`fKV@!qm%V?5pMK-^baP?JXbBsb}TSe0-pnc~^Wx e-*LwsAL9qpxfGeyC2Ya~0000eM^e+|FLXj@tewi+Md$!rriY;Qc9|r{j?LUsAYd+WR=_}0V`K1 z8`+ex9LT1uqT^Vrjyh)t<$d(^ESF4)sQBgAz(q}TO4N^N&{!9mrPgTR4}*KHtWnNLnnU$`#j zftgTmX33mBPinAv#@NLRis22ZXI}w*cKKY?z&c|Q2nkGVZ#V-ojIm3skY@Fn7%v6U z9D3X?%^XAld#*jyz6^yux|A*&aB>CsBphf}?JHQrkcB6~F48xuQX(HC)soxbqIN*4=!9nCpQ$R_J zpgKMtL@}Z!=lspDcv%&udIG5K<24rr*g=%68OQOv;=7^DQv&MRR-P0vwYT#ZRKiby z_CF*L0@%{GzUXZ9Y`Rm~j3PDw5dY$b2Y-`Ogg$_^&KK@h&!dLH&!#{;dGPnV0N6lL zDr=peyOmzo<~;6)Ne}@3Nm0wXSPSgMs@v&$l*jQ;ST6~1E^3J&8A^%5QWx9(O&mWJ zdBXmTkH`Q17i%1~` z;fo+`>It`e2*8j3w4PJ-WZR}|fiGt8um_F>Q4>H#H*&_biKKC8v6fvM9zd)M;B5u_ z#W1f9w!5Xn1w4$$T+Ii;A9KWji_#U)1AtR+5I&}wRSPOc4nOAg(XMt(m&*R(l{M=j zu?%xahNWx3?wC|`4V$hE`aayR?Qq+`nk40r|6E2njheCSqv4P`kqAyvv4MX1+Ks%930D-SdVmATGy1vqO_-K{KlM!jW zMizb^Zi#SFgA$)+v$gg&?UCB%ycPJbQ7GGnArsQ*sQK-YS_>j^H?!$MzKq=_f(XP}fJ~`s+1OJtWj~aFxZ#NFTBZg< zD509q89IPV@$WWmQ9PcW%Ay!$I6%I&Z~(yP2M6@(PMRjL6Gu&yFc1^^d^DnSmsWJ| ze0#6#prS1V9Rxz74~|MVF5T_D)epJVM_f+WoNzvx2U4oFI$E9VJ>u($bfe%njiK;=z%)r4l6YO!hD z|IX6qrFX?~j0PV^zO`M*`PK)p%zJM57(Trp3!7D!8E?sZ_%Q*h9 zPq+a04Wk+VFyW*2wK%Q>r~Ie$55`vsXqXd`=X?w;&ij|~zBvWWM*v3Kb6H?7odxF~ zN@NO(O10R=c%ds%$(g8cVmDyq3g@U1p$1IyFt1! zB$Z_jz6tO;k!AUwER(0-ecQTlTF5%#7Kc+(gfOg}IcE;JON(2Q`|phZ07@oOg|z41 QJOBUy07*qoM6N<$f|FRG$N&HU diff --git a/graphics/pokemon/great_tusk/back.png b/graphics/pokemon/great_tusk/back.png index 0b7c0f6620e380c41170d104d5efaaccc06ae85b..e89f81b6d76c499197e1e826717111be5a3f39ea 100644 GIT binary patch delta 867 zcmV-p1DyPg2Kok&B!2;OQb$4nuFf3k0000mP)t-snbV~(84_(98)a(u zOv<40|NrgiN{Ge5JyYq&i5{}SJ!r+*wy*t<7S(>C&uSkNTz?<=SNe|uK@IxP060IX z{SA;xDJd=VshqII;w(Swwu?U2h4-~t-*%nTE*|vPwHy7si>H-aLYj^lJ>_!#10j{W zO>m&FSSbs7*EayC)He}PNTT0K3fNq^0qAl;ow;q|*Nf80wC}`%SeI$5^|$jq?AkEA z@2PMm%2^2M4u2r=CAc85)*mV$NcSezLC!&3xXXe9K=4LQ$pM*@Bv8ch2LKlZh`x2Y zd?J$f$Z$P^0LV=e08kqyg(ZPPU_`HD90Bs4S^=bDWg0c!Ulj1dm0*Cfa6tjsO8qC= z!oG9NhRJp#st4r)kdqk+z+ti%rpJp`^ik@#OCG{KKz~mT0cU|A!;ki>hWs%?;0^#` z22@>^gh|I{^_uD>C>6BBmB1?i2o#&C3P>m9956~h00QZxaNFj=7>=`NFz{w2ILin? zw=&1J37^#|YrxzpAorB@4Dz}$GMow=HI3XIXstW}F7ntMvao$!^nUGKdUmo9 zyEcw!=zllAG=>!5d83urhP8}G8$BZgPYupGl`uF!sCOiKyVaR7jkIftoLA&VaJ-bv%|isidOHvL)E?1R^RWp! zD4PpMZ44o}JoOs-WjQuW`wkZlOsDQ&=$jsM^mlt~P9(y-JeXgKM zC4_klmw?cw=jcH=f~P48OF;9%02+kHrI5jeu?XRffEb?7)((Ro!ypf$0b)@|4A1BD zAzXmK9gD}TAzY17ZbF09^Z@X9Xdb!e#x^1V6OxXUg4lzq$(MKNH4#?e4w2y?6_Sk< trl^8y`sx@vL%xJD<`4gLf9-1*`vcG_McWgd1^@s6002ovPDHLkV1llhlA!XpFpTSA+yfv*ABP(!4z0E5YzG1`kRI-tEvAAp79XTV}n zo&bP2U|IUQ_5~X~%6XASLEtn2EQ^1@h^Or99)&PY_aEG*@0W!%W7U5qWch2CnfF*o z^Ab;1%WzN79)G!93rFCEAfG^tzdsO`-dFizeeNB3`%FN9a6pev-WJeTo>)ILnfnJM zKkz347r-G)VOR6~#|hhP7$e*_QZh?OvPo?tZovuo^5BywPq8JTUrW%;M3PGgd~Dr* z5_yO)HqkF7q;BShft-6q#vOv5{IP^FI&JsHtede*w0|KXg+BXu1d!xK%xfbz~Qn0Fl=aUO;R|okdoH5ZFVa@4XZtDwUOC z`F^B%qRMe>EbkeZ3!4-h^apgI^s nA0CeOp*Jz6Dc@zL!#9S1kz+Ss5hMAx00000NkvXXu0mjf2is&3 diff --git a/graphics/pokemon/great_tusk/front.png b/graphics/pokemon/great_tusk/front.png new file mode 100644 index 0000000000000000000000000000000000000000..26c6b5cff70a7059b2a73a3f2703d7fc6f70828a GIT binary patch literal 1087 zcmV-F1i<@=P)Px#Fi=cXMVZs3DIh*=8yj#KGD0_Fv@R~V6G?$rMdVFw`S3$_f1O-eqqwM^5D*Zl zz}W8b+BUI0LjV8+y-7qtR9JYjT}w)WX7^D+rv zzFz+>#NsdHAB+D>DDsbt2ST#=1O3<$Qd%vZ5LG{pJs{<^#x0@o-<2_~P23O~|I!-h z^ml}=0F6GczazBz@t8nvDESNF%Lo*GawGZ1LOTQpK+dZAMEFtx0-)c${01NrLT5lj zPj~>}FKTN*<6B>3q&o{6fEG4=FaRu(v5)8_U@SGXS!kZaE4%^F&jCt7^Q($010vibcEK-77oY+ zSZ*gkC3GsgqYM-==MB&?k`+f^s&Yb5{PXiOO^fb;X{(Ym3IMVl;h{SH{1{+a76W7h zAjSeAK^-uT!!Xcm73&Nc+Pc01k^>y#1hs{hb?~r^bw(^6XxagE+QN6>9smpT+{m}s zQqWHCO{O|fXZ*<2!j38S)k@sDKknkC-+alqWrLR z**vt)a{fm8d8P(Rak=d*Er55mnTndrQcYlDJhLn^4EUlA{G`K_Dp%@2T`fOio$u+5c8b87Ty zz67B7`#4LhUm8L+U{iBG5MHXKna(JncRo!V(KbPab{Yoij{sx%IuQ12oeNtw1f7OE zK;>{Q%3xEF4MET{i5CK>hqpTbSA%JnxrABUR|ZUc2Z+q4kZpO+wzjFi0Ptw1{DQEp zaOO~aod7ryU!4ADf;5DsN$U)d(xM{-7A0I5IskAeh7d{@O(DWt=fJN=z&pajZjp=- zpa=JjllG#t9U+7m>7hvyX#yGvjuGyT`rZP2d0Rv7Wg7siD>A@&9|?yXgiaAL5KaU- zjX2d)B!rKSCR#vB3yrcbF8~)TZtzSs2otnQ$|V4Y19#dOD#2D&N<32+gYZGF^0>=jb! z5dH9q+5=YM((e*$0Cnzb^Z`HWeM36jY3HBT_8M)%L{I5HAgTxnn*$qc<@KabS;}VA zx+^;;KaU2u876LsO;a2*b<=qSl)4-Wt9D%Tde;Aj`X7FsVGQOem{$M*002ovPDHLk FV1h#&-#!2U literal 0 HcmV?d00001 diff --git a/graphics/pokemon/great_tusk/normal.pal b/graphics/pokemon/great_tusk/normal.pal index b5c23a1288..b91f7def1e 100644 --- a/graphics/pokemon/great_tusk/normal.pal +++ b/graphics/pokemon/great_tusk/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 160 232 -112 24 48 -144 8 56 -232 48 120 -104 24 40 +153 211 165 +41 32 62 +109 27 27 +112 24 50 +66 55 99 +180 46 46 +184 19 73 +129 87 69 +228 77 109 +249 240 67 +118 127 157 +92 89 163 +184 168 158 16 16 16 -40 32 64 -96 88 160 -56 48 88 -120 80 64 -184 168 160 -240 240 216 -128 136 160 -168 192 216 -248 240 88 -8 8 8 +169 192 216 +238 241 218 diff --git a/graphics/pokemon/great_tusk/shiny.pal b/graphics/pokemon/great_tusk/shiny.pal index c7449781d5..7c0d005a40 100644 --- a/graphics/pokemon/great_tusk/shiny.pal +++ b/graphics/pokemon/great_tusk/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -0 160 232 -160 104 16 -216 168 88 -248 240 152 -104 24 40 -16 16 16 -56 24 24 +153 211 165 +48 25 18 +109 27 27 +101 107 8 +85 53 42 +180 46 46 +166 175 26 +129 87 69 +229 240 58 +249 240 67 +111 152 126 128 80 64 -96 64 48 -120 80 64 -184 168 160 -240 240 216 -72 176 144 -176 240 200 -248 240 88 -8 8 8 +184 168 158 +16 16 16 +167 205 188 +238 241 218 diff --git a/graphics/pokemon/koraidon/back.png b/graphics/pokemon/koraidon/back.png index fd4fb143b82256d41b6791cf8082f424788c5a3a..35aa59572ce8e652f1f71d3354247801a67f24cc 100644 GIT binary patch delta 1221 zcmV;$1Umct3E2sdB!2;OQb$4nuFf3k0000mP)t-sn9!gc9V##}L0}#xQBz+3ec#}Rx2q5k66faPc|%%j000D6Nkltdri41{B> zHFdz^{onRzM)D;o$)4p0ZCd8@Xe66F9{+NQ;HLgT<)5VwZGRHC$Nc$CB+{SJOQjS2JPQ`2rA#n>{P-JWt_A5YKjsO8YAS51ZMB znopM+!d52kl*{Y6J`qB%YKt|OH&hQf07m!<@LE-AQ@UJn9i5yM7GwcAJrF^F zd<3|@d+}bVo`1j~2mE@{!WTf(g@x4x>jH40HK;=lRerwFH|QCISI_A=54T`R3d=Z- zPXG~55ApfnvHD|J0KkAB0HXlRPy>w_g5UrU^>Dyl2!a4LkNn}}l>h+r$MY^l>K|Hj z_5k32co=|7p}z&>oS8sf^r_E6ub~6-Z-A)%nf_TUbAQm1nr|&geNQO#_kj8&LS_J3 z_C)Iv7OVxf&huHH`5j<0K*CelLao@b9l#DY>}cUrl>i-LBu{|-F9N7EX@Egs6c_?~ z%%1B2zdbWdTYgWUAbLU2x=%v06XiS%kO^o6uMrc>#Mm(TLQWL<|ssFV`ezoeJY#qA?L16zx1FMq!%rW)V*VY~& z_11zN1l*B={YYHh;%66aJ_6tbGAaWQ=u>5Qey0T>T%X?oxz;Gk_5cGgUG?z%9)y-m zpS@Pjhk6e*4+OV!h1eGl|4y(Nla-nWAbMcQcYg%+_B*G?!}EK=9gR!@s1txDC=fX& z0Hu_70u7MBit7OM2&?ivBBGIorv|a6QaYgR`-XPqp?~;P`o%5S1BIwK!tagxT{khi z6R3$S^yw{;Ed!>HkRM#0F&V}Py;XsZh%)H5*S4%fX{Lt zegKSb8|sx9Vd{h61wa-00HBC@bc5k8^ndXJ=n*b}IsmTU?3##GPl85*(?CusIl$!- zUmUy=e~+&Eoqn_HQD<5TEn}EdJMR z6DN>=@!UQGq_1CJ_3Z`liJ+7ZeR(qgLI>OvbjW$omGWu;ujC+X_a0Qod6Ip@aDVUE zRZ6^(Q|MvhHv{qj;PhRtKv)QE0B#Cd0aF~OM=Gt^PKJ$bACymkX<#|Ma1!8aO4&yp zZ-lvZwEJEU(9&2#*_#Z4{<5$DioSHx--mV}maBEZ`$%d(l^u{?4&WFj``6_J{XNog z4v!4fYj{3ah8F*tx7}?i&549OEIt5%qjn-3(6(~7sRCd|(sKTmx*$r61NDAaYFY?3 jf`d>e!3#43?|}aRX3A)8;z9<300000NkvXXu0mjf_R=o< delta 1256 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 SW^4xl0000J@gX|K z5aTZ?LKJ+$M6}`KeTooX1d>t$URA|Z+#fTcaeJ;vzN)vYZm24Vps` z{I(cdcZyZTM0grQIKvwOumOQ;wZ+t0S5TB}BE%#>*(n|j#EbMF{XrWW!1z>%f(YP* zD{T2b;8X;d-aGK!I4U*37}bTVO)tZM00331KYrk|)nF1n34;Dj0P&_?A;T$90-I@< zKUekJ*nb%ehUW8(p|_kt04x3S-b3yIyCNJNS~ow4MhPVs-5B&Q{7%5coFN501SDYu zn-mDB&nIOgMxwC&$Oqn{5L$~ZqJ2m=C9n;!(d45a>?sa>>nGkB7$ZKN0*nDGjLmNFkPC-p!Jt{ECby< zXiM))>o#be06|#35maAAqYDWH3phY9Zv^PQz5X1o=~_8{uw*e0u@FLRVSxaYAjJuo z9e=2hV-e7fW}yY0OUW9c#CM#RYU|qYXD(n0XziS5m7Ro$E-avPzpoW|xr2E4Br@pB*_ z{x@O-c2v(JII3@OGB17rCNkXoq)-c=Vqtc*(S)KaRWKPkDD1oO2g9x&5#XzO5q}^M z2HXf1PXZaZ);j~{;omXvZKP{81}<>k)w?l>&GWW_z1m|5+@5`#GzOmdIDi2gm}LII zosIeowowcMAq7v{hPEf_I|0qxi}I%!ff(O_zuoYH^UbF3MNL}?R*tRO<2-u9PYJj^ zecKZ$rP|BM{uWkc;%dLxl%_*=3M^xi7QQ`QF&wf|l@)-I^e+VNviJ1tmOni}Ijey` RJmvrZ002ovPDHLkV1j%UAYuRj diff --git a/graphics/pokemon/koraidon/normal.pal b/graphics/pokemon/koraidon/normal.pal index 151d848ab8..ad38b622a3 100644 --- a/graphics/pokemon/koraidon/normal.pal +++ b/graphics/pokemon/koraidon/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -153 210 164 -51 55 62 -103 96 105 -237 235 230 -255 118 155 -6 6 6 -255 73 153 -168 150 153 -159 65 193 -18 26 80 -36 49 136 -0 97 173 -119 32 32 -255 70 57 -185 57 56 -253 214 0 +152 208 160 +95 46 56 +48 49 65 +14 28 103 +81 83 94 +255 127 39 +176 57 72 +250 80 71 +255 242 0 +24 48 177 +57 99 240 +166 91 227 +243 75 239 +186 183 171 +16 16 18 +231 230 226 diff --git a/graphics/pokemon/koraidon/shiny.pal b/graphics/pokemon/koraidon/shiny.pal index 2d198cf721..613608d4e3 100644 --- a/graphics/pokemon/koraidon/shiny.pal +++ b/graphics/pokemon/koraidon/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -153 210 164 -51 55 62 -103 96 105 -237 235 230 -168 150 153 -6 6 6 -255 191 0 -168 150 153 -159 65 193 -18 26 80 -172 24 67 -255 11 119 -33 34 50 -82 83 113 -67 68 90 -253 214 0 +152 208 160 +28 29 42 +48 49 65 +96 30 38 +81 83 94 +255 127 39 +64 59 74 +98 98 123 +255 242 0 +172 49 49 +213 74 82 +226 127 103 +234 198 4 +186 183 171 +16 16 18 +231 230 226 diff --git a/graphics/pokemon/miraidon/back.png b/graphics/pokemon/miraidon/back.png index 3d4b2d703a479d7e42204548b11c46f5e1beb9bd..0d2fbf58693d4703aadc6d8d839fc1f69d7cc892 100644 GIT binary patch delta 985 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 VN@DVE@T~v<002ovPDHLkV1jwiACLe5 delta 501 zcmVvJ-lYHk|6-&VQnX^E%@~VfIse{4-ke%|ds<@v00E9kL_t(|obA%RYQr!P2XMKA zy(TdfIv5f|=#UOIf^K~YgZ8wcB4lcp%D8xq1=;%w20uVOXn*UREs)Kx&}ZmL@n(tz2xS#KTmW9xzF7-#{PKWzf#0O#YgBL=4gq(YL9QOe-Rlx9ifsdR6GHg9C>74jR zen2+X1B56cvpn}O9vLIOcqX?jvH>{DZqtC(O|lRf!`RL>z{KMboiBtC%zM-Uw89TD zg}xAP`4MThFn{s-L-j?L9}V3WlovomPmV5R9hV@BAVdd}0tglXV6W}I#ls2&F=LF! z9gvn80aw)?5dbJgWLyj4G)-9xv@$F%!AT4OCA5GQKrT8AlKLx}TUtp8c}59jM+bI2pvu@5eN(Ivlt3_1CUk-Nql~>*z*Jy0arf?Z0pQZIWfLS^tUTA9 reV%TOta^aVfLIA`6j1%ffPYZGU^9f6(9)#r00000NkvXXu0mjf!~50Z diff --git a/graphics/pokemon/ogerpon/cornerstone/back.png b/graphics/pokemon/ogerpon/cornerstone/back.png index ffface9d68eb79b66fe465e3f7ec940a6be32543..a81975d346421c67f3283346a762aeed6532b601 100644 GIT binary patch delta 670 zcmV;P0%84}1gZs)7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!gd9UUwy zDL`;GOH52zU}}wGJ6o$UBC$-O%^m;RMgW$u0Mq%Dn3oU`5dHoAh)oxQ0006gNklQwD!zT3)oICcWrwtxTnPEoGkKXot>EFgyC4(u4<3=lnlQcxpkJUTm-}gpesxOz8Eb4)!DEBG;vgiK@MX6V%#1Y zAw6W2WD8OOsy}l6@qCi2V5*+y4!{a{UIWl3fOeOm0G@Oiu#xFt39vVe+-PJ0iSTd$ zMnPSva*_)m5gsmJRL}r<2?`*Ue=QA%bNa6R*B2kv4=M#j+h3OJdjJ3c07*qoM6N<$ Ef*O_&7ytkO delta 527 zcmV+q0`UE+1)Kzs7=Hu<00013M{Ml?001yhOjJeg=Cm;}F_fH?5D*YSb1_=1Fn;0F<=<-a-HW|D??ri()w~8){qt00E~-L_t(|obA#-OT$1I2JnLj zg=|?fUZF##wx`h1A#KG$m)<83E|95UAzh?`(A?&zqm5AEmVb^Seg!wbg0qW*Zs*8m;kbqp#C+6 zP73^81F#c7*w%Xn?4g{SaFc<^VT?hi2CQ^P1l5!)A_0;LA8LVPSr#jS(hd_!5Q{dT zgch&_$b+^6JAaGfDNQ>CvO)tkIk0uWv~nOSY8PQ{tbeEth+F`1lhqw5kckfT8bG$A zo8*RkO5RHj;);tVAa=-#UKK!uikI0V{Q{7c$o)ha@FB?n7%0$PoV|SvQa~6#a+6zswL0%@fTtB^Sh R%>V!Z00>D%PDHLkV1lFl;^6=Q diff --git a/graphics/pokemon/ogerpon/cornerstone/front.png b/graphics/pokemon/ogerpon/cornerstone/front.png index 9b7f2792387428bc1e2c71509de805da7ee5df96..7e1286799295204709889cfb5cb82168ddc3cf16 100644 GIT binary patch delta 905 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 LNkvXXu0mjf6u`8v diff --git a/graphics/pokemon/ogerpon/hearthflame/normal.pal b/graphics/pokemon/ogerpon/hearthflame/normal.pal index 2ed9b8c050..a7a922f08b 100644 --- a/graphics/pokemon/ogerpon/hearthflame/normal.pal +++ b/graphics/pokemon/ogerpon/hearthflame/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 +152 208 160 +41 41 41 +87 15 15 +66 115 49 74 74 74 -213 156 24 -255 222 65 -65 115 49 -90 172 49 +132 24 24 +206 57 49 +141 98 59 +90 173 49 +232 157 2 +198 156 41 +247 222 82 +0 211 249 16 16 16 -41 41 41 -238 57 41 -156 16 16 -82 8 8 255 255 255 -238 156 0 -123 106 49 -0 213 255 -139 98 57 +0 0 0 diff --git a/graphics/pokemon/ogerpon/hearthflame/shiny.pal b/graphics/pokemon/ogerpon/hearthflame/shiny.pal index 81f60abe80..4724e3d7df 100644 --- a/graphics/pokemon/ogerpon/hearthflame/shiny.pal +++ b/graphics/pokemon/ogerpon/hearthflame/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 +152 208 160 +41 41 41 +87 15 15 +66 115 49 74 74 74 -213 156 24 -255 222 65 -65 115 49 -90 172 49 +132 24 24 +206 57 49 +141 98 59 +90 173 49 +162 205 29 +198 156 41 +247 222 82 +0 211 249 16 16 16 -41 41 41 -238 57 41 -156 16 16 -82 8 8 255 255 255 -164 205 24 -123 106 49 -0 213 255 -139 98 57 +0 0 0 diff --git a/graphics/pokemon/ogerpon/normal.pal b/graphics/pokemon/ogerpon/normal.pal index f578e22342..943a658de4 100644 --- a/graphics/pokemon/ogerpon/normal.pal +++ b/graphics/pokemon/ogerpon/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 -41 41 41 -65 115 49 -74 74 74 -8 164 156 -90 172 49 +152 208 160 +44 43 41 +64 112 54 +15 106 67 +75 76 76 +141 98 59 +97 167 27 +91 171 49 +84 182 101 +232 157 2 +219 156 94 +255 218 70 +9 164 156 16 16 16 -8 106 65 -180 222 164 -255 255 255 -98 164 24 -82 180 98 -238 156 0 -139 98 57 -255 222 65 -222 156 90 +178 216 161 +253 253 253 diff --git a/graphics/pokemon/ogerpon/shiny.pal b/graphics/pokemon/ogerpon/shiny.pal index 02b6d9c5ae..8fb51b7d1d 100644 --- a/graphics/pokemon/ogerpon/shiny.pal +++ b/graphics/pokemon/ogerpon/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 -41 41 41 -65 115 49 -74 74 74 -8 164 156 -90 172 49 +152 208 160 +44 43 41 +64 112 54 +15 106 67 +75 76 76 +141 98 59 +97 167 27 +91 171 49 +84 182 101 +162 205 29 +219 156 94 +255 218 70 +9 164 156 16 16 16 -8 106 65 -180 222 164 -255 255 255 -98 164 24 -82 180 98 -164 205 24 -139 98 57 -255 222 65 -222 156 90 +178 216 161 +253 253 253 diff --git a/graphics/pokemon/ogerpon/wellspring/back.png b/graphics/pokemon/ogerpon/wellspring/back.png index d90a8afe3e1b8b657db69502f6348776e129a214..b9346bfc654471460a8881e8439e710112f92e80 100644 GIT binary patch delta 716 zcmV;-0yF)V1lR?T7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!gsD=9#5 zHcL!Qjbb}nt1+U@9sk-!3_*bpUbO>(0wz@f}UX*NPp%Kz)jFB#9<(r8KUIMH0pI{`!3MxsX(W&qOu!(F2`K=xU;r=! zs8|9Ofp5nJK$jYTb<6jRLuLl`7@_DpVH`wy^@r_3Ydc2zZD^~C0h<54=xRt8X2 z&ooW|G{EEWm==6Mdne#bP(Gj4!DXCD2apLO!9_-dYeRbo7Jvu}ux<3W*xMoSk2@$p y2u}+jEpWit1eFk;Pqr19iW5Hhx9Y!swY~vQ_Fah-DP0Tz0000WlPuCx7J!FJNzQ z`F;F;e;jDq|GDntdCT6p&-uPjm>f=wj;vexyOw}s5jT!KTx#Z)cSSrojvX&mgNJSb zz_|}$MIMJ}hXnQ>R)~E7VH@aV;Mg2i@S_l2!si4!U=&3VvmYaXKRS2R^%dYPV0xVI zoDmCX2hbyLO@9U>#u$Ya5TH$>O-5kO*eeRmO*DH`a~9xWOGFNsi#>(8on-|GT)xvV zkmP_-ccW?axhcNHyabDkQYx|*NQ;hzP^THO0FXxn0tH!`rnCVX9fpwLEc$>FD4;oz zi}r)0dW!m%Mp6J7fq;1h5)2q=1t6kz5ym`S^Z}RyfPb63>?nYoVBpvR%8o-m*X6(D zy;R^F@!18SLq;4gfgq%QnMXFR0U1fG6DdI;SP8VL0*BSZ&-b(djIyGk4b&T@^rZy4 z0+W?>vfgt5A1xi%K_b{Bw5;Lp`Kytq3XmO8E5U~XYF-Ptg7XJ&k&ItQlUySJ0000< LMNUMnLIPlds$=9I diff --git a/graphics/pokemon/ogerpon/wellspring/front.png b/graphics/pokemon/ogerpon/wellspring/front.png index 556f9f268872ac9c0ed7b15dbf7ca6ad3c9ba59b..4a7b6cefe098669f87948606fe2c8866a72d4a05 100644 GIT binary patch delta 851 zcmV-Z1FZaw2i^vd7=H)@0001;w}I>c0004VQb$4nuFf3k0000mP)t-sn9!gsD=9#5 zHcL!Qjbb}nt1;-E0{_}Z3_*bpUbO>(A_8 ze+dAI6TR!A0Az`Z@TPYzbN~QiE@22xAt_x59RP^CKId2n$gh8{XM*GK$nrh_iH-yo zx_*5;>M0K*y$9&L)dVJuogjMnB9D@EP)$lRMU0Vu7Jze@uLvb|3Fet!JeLpzxN6~o zQ1vr3;=)KUV1EUi6QJl*g#3ws;XwFARQ((?>&}o z4&Xa&wLy87Grnf{M8Fs)U5W)@;0n;^DBpQqv*HUv9*o;G;WZ!@y#eN#E(O8=!xpgX z3!w$DlvFE+A`~!9+ZRBipH)i{7-0k)Dez+iUja)4fPXlKzyLf4yukFl2<+`k2&)m& zjN3T+lN_D^%sa`$(f~$JElDaG5BgJpc&E#@D1b&VQcpyxMZ5wCAw@3S;(c9KCI|qf zDU&`UUI4HF*t;chQvm5@Q{ZNh-!d@oB>@VcF{pJ0kO?)=>S>{$0;&bGPEHmZff)#9 zfNq}Xg@2$H*t*GAE_2b36Y3O7nyZOJi$$FWvPdQt9R{s&@EjvoLIp5FO8VHN3n2m6 zVkCXSZ4d%2qz0gj_a2X^1V)HcYN)VnN+8A&u&yV21Wj|aZbk?(;H#cSaSJ#wz(%lD z0DFKNy)iflk$~pFTTmJ}4@SVRyCl;5Geh)-7=QFiH*e)?!Y*DA8o~RZ25;moi5B6Y zHk9!Aq(-kJhLi&zbDp2{qz#}rd1SrOI~S3ixV{tK2_Rzm>lX)ftWdz~Ckt-Z3+plA z4bXE;y$1Yb;T_O#LBCIUCpiMTEja!@;o|unFlYf502d+weD|jlN&z|28-QV<|I3NC z0Zi|lg$a(tqM! dKed$G_yb(kL7lKpx=#QA002ovPDHLkV1i0ouC6b(Lnx)CisFwz1|yU`;)uu;jJd&Mg0Z2U5`RMFH6g@WE85|pCV1(P zOqnw@9owd31`p}GljHhBYM@IWB!lng_kTK_WJUQe_2}^fK+_*+fN|#EK*}^<$pmaD zN;PKPqSO^ag9dhOcD+bxBs4vfX0xE!6oBr*3`W{vGgG8ma-D9i*!G;mVnA~%5_^o< zEH)vEpe|$e8Gm4!iWt%JeV@`*2DLc3-lS&fkb0fqwB<`+=U+|D=asvDCxB}CE{w=( z?$iZ#N^%+M^uQ2+j9MO}c(_2kT*T6XT0Q4FER*97RBd%Wx}$JI=%QYlJQ?CE#W`cr!c_%Uwzj;3Ho2 zU+QS#j7Y#k^ZxNsmk&XhJZv4@TqA_~5#S$2$A3~KZ8&gd*xrAtBeZapp9YFTmV{{U zUw;*#AAyMnR3(J?C4wOVog?DHI+=X_RBMwgW_1u6{E^D^I;3QvjizI$ohJ&JS&!P_ zEC%xoCBElK*2vbvm2P|rL7 z*n0y&Wr-R0VD>#3{m`V@5X26V))j>Q3NXUD0BDZwpty{zraKz|G@Zr%Y^7`SHWNUF zR&jSjWe%&0jf7T4+;ys~P!|mpwKng>ZUiZ8?1}~si?$=C2b?+q>N%N|SSnGIPs~jH Y27ghvGnl9eVE_OC07*qoM6N<$f_H?O%K!iX diff --git a/graphics/pokemon/ogerpon/wellspring/normal.pal b/graphics/pokemon/ogerpon/wellspring/normal.pal index b91b6ee255..f771734921 100644 --- a/graphics/pokemon/ogerpon/wellspring/normal.pal +++ b/graphics/pokemon/ogerpon/wellspring/normal.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 -65 115 49 -90 172 49 +152 208 160 +44 43 41 +64 112 54 +75 76 76 +141 98 59 +91 171 49 +232 157 2 +255 218 70 +12 65 129 +15 94 181 +3 129 229 +59 213 249 16 16 16 -8 65 131 -41 41 41 -0 131 230 -74 74 74 -139 98 57 -8 90 180 -57 213 255 -205 222 255 -238 156 0 -255 222 65 -255 255 255 -156 205 222 +156 206 220 +206 221 255 +253 253 253 diff --git a/graphics/pokemon/ogerpon/wellspring/shiny.pal b/graphics/pokemon/ogerpon/wellspring/shiny.pal index 4f4e60c157..f284e35c37 100644 --- a/graphics/pokemon/ogerpon/wellspring/shiny.pal +++ b/graphics/pokemon/ogerpon/wellspring/shiny.pal @@ -1,19 +1,19 @@ JASC-PAL 0100 16 -238 230 180 -65 115 49 -90 172 49 +152 208 160 +44 43 41 +64 112 54 +75 76 76 +141 98 59 +91 171 49 +162 205 29 +255 218 70 +12 65 129 +15 94 181 +3 129 229 +59 213 249 16 16 16 -8 65 131 -41 41 41 -0 131 230 -74 74 74 -139 98 57 -8 90 180 -57 213 255 -205 222 255 -164 205 24 -255 222 65 -255 255 255 -156 205 222 +156 206 220 +206 221 255 +253 253 253 diff --git a/src/data/graphics/pokemon.h b/src/data/graphics/pokemon.h index 6882e7df43..ea1e49cda7 100644 --- a/src/data/graphics/pokemon.h +++ b/src/data/graphics/pokemon.h @@ -25932,7 +25932,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_DONDOZO #if P_FAMILY_GREAT_TUSK - const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/anim_front.4bpp.lz"); + const u32 gMonFrontPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/front.4bpp.lz"); const u32 gMonPalette_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/normal.gbapal.lz"); const u32 gMonBackPic_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/back.4bpp.lz"); const u32 gMonShinyPalette_GreatTusk[] = INCBIN_U32("graphics/pokemon/great_tusk/shiny.gbapal.lz"); @@ -26148,7 +26148,7 @@ const u32 gObjectEventPic_Substitute[] = INCBIN_COMP("graphics/pokemon/question_ #endif //P_FAMILY_IRON_THORNS #if P_FAMILY_FRIGIBAX - const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/anim_front.4bpp.lz"); + const u32 gMonFrontPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/front.4bpp.lz"); const u32 gMonPalette_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/normal.gbapal.lz"); const u32 gMonBackPic_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/back.4bpp.lz"); const u32 gMonShinyPalette_Frigibax[] = INCBIN_U32("graphics/pokemon/frigibax/shiny.gbapal.lz"); diff --git a/src/data/pokemon/species_info/gen_9_families.h b/src/data/pokemon/species_info/gen_9_families.h index 2a66183659..93b9818b10 100644 --- a/src/data/pokemon/species_info/gen_9_families.h +++ b/src/data/pokemon/species_info/gen_9_families.h @@ -5234,18 +5234,18 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .trainerOffset = 0, .frontPic = gMonFrontPic_GreatTusk, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 5, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontPicYOffset = 0, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_GreatTusk, .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 4, + .backPicYOffset = 9, //.backAnimId = BACK_ANIM_NONE, .palette = gMonPalette_GreatTusk, .shinyPalette = gMonShinyPalette_GreatTusk, .iconSprite = gMonIcon_GreatTusk, .iconPalIndex = 0, - SHADOW(3, 6, SHADOW_SIZE_L) + SHADOW(2, 13, SHADOW_SIZE_XL_BATTLE_ONLY) FOOTPRINT(GreatTusk) OVERWORLD( sPicTable_GreatTusk, @@ -6029,18 +6029,18 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .trainerOffset = 0, .frontPic = gMonFrontPic_Frigibax, .frontPicSize = MON_COORDS_SIZE(64, 64), - .frontPicYOffset = 7, - .frontAnimFrames = sAnims_TwoFramePlaceHolder, + .frontPicYOffset = 13, + .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, .backPic = gMonBackPic_Frigibax, .backPicSize = MON_COORDS_SIZE(64, 64), - .backPicYOffset = 11, + .backPicYOffset = 13, //.backAnimId = BACK_ANIM_NONE, .palette = gMonPalette_Frigibax, .shinyPalette = gMonShinyPalette_Frigibax, .iconSprite = gMonIcon_Frigibax, .iconPalIndex = 0, - SHADOW(0, 7, SHADOW_SIZE_S) + SHADOW(2, -1, SHADOW_SIZE_S) FOOTPRINT(Frigibax) OVERWORLD( sPicTable_Frigibax, @@ -6870,6 +6870,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .frontPicYOffset = 0, .frontAnimFrames = sAnims_SingleFramePlaceHolder, //.frontAnimId = ANIM_V_SQUISH_AND_BOUNCE, + .enemyMonElevation = 8, .backPic = gMonBackPic_Miraidon, .backPicSize = MON_COORDS_SIZE(64, 64), .backPicYOffset = 0, @@ -6878,7 +6879,7 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .shinyPalette = gMonShinyPalette_Miraidon, .iconSprite = gMonIcon_Miraidon, .iconPalIndex = 2, - SHADOW(10, 14, SHADOW_SIZE_L) + SHADOW(3, 22, SHADOW_SIZE_L) FOOTPRINT(Miraidon) OVERWORLD( sPicTable_Miraidon, @@ -7548,10 +7549,10 @@ const struct SpeciesInfo gSpeciesInfoGen9[] = .perfectIVCount = LEGENDARY_PERFECT_IV_COUNT, \ } - [SPECIES_OGERPON_TEAL] = OGERPON_SPECIES_INFO(Teal, Teal, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, 7, 1, FALSE), - [SPECIES_OGERPON_WELLSPRING] = OGERPON_SPECIES_INFO(Wellspring, Wellspring, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 1, 7, 0, FALSE), - [SPECIES_OGERPON_HEARTHFLAME] = OGERPON_SPECIES_INFO(Hearthflame, Hearthflame, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 1, 7, 0, FALSE), - [SPECIES_OGERPON_CORNERSTONE] = OGERPON_SPECIES_INFO(Cornerstone, Cornerstone, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 1, 7, 0, FALSE), + [SPECIES_OGERPON_TEAL] = OGERPON_SPECIES_INFO(Teal, Teal, TYPE_GRASS, ABILITY_DEFIANT, BODY_COLOR_GREEN, 1, 6, 1, FALSE), + [SPECIES_OGERPON_WELLSPRING] = OGERPON_SPECIES_INFO(Wellspring, Wellspring, TYPE_WATER, ABILITY_WATER_ABSORB, BODY_COLOR_BLUE, 1, 6, 0, FALSE), + [SPECIES_OGERPON_HEARTHFLAME] = OGERPON_SPECIES_INFO(Hearthflame, Hearthflame, TYPE_FIRE, ABILITY_MOLD_BREAKER, BODY_COLOR_RED, 1, 6, 0, FALSE), + [SPECIES_OGERPON_CORNERSTONE] = OGERPON_SPECIES_INFO(Cornerstone, Cornerstone, TYPE_ROCK, ABILITY_STURDY, BODY_COLOR_GRAY, 1, 6, 0, FALSE), #if P_TERA_FORMS [SPECIES_OGERPON_TEAL_TERA] = OGERPON_SPECIES_INFO(Teal, TealTera, TYPE_GRASS, ABILITY_EMBODY_ASPECT_TEAL_MASK, BODY_COLOR_GREEN, 0, 0, 1, TRUE), [SPECIES_OGERPON_WELLSPRING_TERA] = OGERPON_SPECIES_INFO(Wellspring, WellspringTera, TYPE_WATER, ABILITY_EMBODY_ASPECT_WELLSPRING_MASK, BODY_COLOR_BLUE, 0, 0, 0, TRUE), From 6cbb7b31af86289807fcae81751ac89cf443d084 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 13:25:53 -0700 Subject: [PATCH 081/187] add Pawkkie as a contributor for doc (#6896) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 6 ++++-- CREDITS.md | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 6d981eda79..514e698d83 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -87,7 +87,8 @@ "profile": "https://github.com/Pawkkie", "contributions": [ "maintenance", - "code" + "code", + "doc" ] }, { @@ -122,5 +123,6 @@ } ], "contributorsPerLine": 7, - "linkToUsage": true + "linkToUsage": true, + "commitType": "docs" } diff --git a/CREDITS.md b/CREDITS.md index 9024179556..6c54475348 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -27,7 +27,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Martin Griffin
Martin Griffin

🚧 πŸ’» - Pawkkie
Pawkkie

🚧 πŸ’» + Pawkkie
Pawkkie

🚧 πŸ’» πŸ“– Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» From 91451323776a5e0812cbae6776a8dfcc8f472d99 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sat, 17 May 2025 13:38:49 -0700 Subject: [PATCH 082/187] Fixed URL for contributors badge on README.md (#6897) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ddb18f9a40..7d8218c3be 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # [Credits](CREDITS.md) - [![](https://img.shields.io/github/all-contributors/rh-hideout/pokeemerald-expansion/upcoming)](CREDITS.md) + [![](https://img.shields.io/github/all-contributors/rh-hideout/pokeemerald-expansion/master)](CREDITS.md) If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. From c0b70dd35ba8c417b0b3770068a23f79a907c83f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 14:54:23 -0700 Subject: [PATCH 083/187] add Cafeei as a contributor for design (#6904) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 514e698d83..40650bf465 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -120,6 +120,15 @@ "maintenance", "code" ] + }, + { + "login": "Cafeei", + "name": "Cafe", + "avatar_url": "https://avatars.githubusercontent.com/u/46283144?v=4", + "profile": "https://github.com/Cafeei", + "contributions": [ + "design" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index 6c54475348..0a8ccdb3c2 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,6 +31,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» + Cafe
Cafe

🎨 From 5fdc7f9283cfaf0c1a8fdac577f1ed109129364d Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sat, 17 May 2025 15:15:28 -0700 Subject: [PATCH 084/187] add khbsd as a contributor for doc, and code (#6903) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ CREDITS.md | 1 + 2 files changed, 11 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 40650bf465..a603f403dc 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,16 @@ "code" ] }, + { + "login": "khbsd", + "name": "khbsd", + "avatar_url": "https://avatars.githubusercontent.com/u/26092020?v=4", + "profile": "https://github.com/khbsd", + "contributions": [ + "doc", + "code" + ] + }, { "login": "Cafeei", "name": "Cafe", diff --git a/CREDITS.md b/CREDITS.md index 0a8ccdb3c2..99acd2617e 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,6 +31,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» + khbsd
khbsd

πŸ“– πŸ’» Cafe
Cafe

🎨 From 5164c40e49e6f3b3224f00641e5fcd13143f2179 Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Sat, 17 May 2025 15:36:52 -0700 Subject: [PATCH 085/187] Update .all-contributorsrc to skip CI (#6907) --- .all-contributorsrc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index a603f403dc..0142d61d1f 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -143,5 +143,6 @@ ], "contributorsPerLine": 7, "linkToUsage": true, - "commitType": "docs" + "commitType": "docs", + "skipCi": true, } From 6a726d98214790979e9b66de7f010beb6ab7c783 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 06:47:00 -0700 Subject: [PATCH 086/187] add agsmgmaster64 as a contributor for code (#6906) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0142d61d1f..d2b391fde8 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -139,6 +139,15 @@ "contributions": [ "design" ] + }, + { + "login": "agsmgmaster64", + "name": "agsmgmaster64", + "avatar_url": "https://avatars.githubusercontent.com/u/67435611?v=4", + "profile": "https://github.com/agsmgmaster64", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index 99acd2617e..6ab186faa8 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -33,6 +33,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d psf
psf

🚧 πŸ’» khbsd
khbsd

πŸ“– πŸ’» Cafe
Cafe

🎨 + agsmgmaster64
agsmgmaster64

πŸ’» From f1a655366bbfab6b46ec64dbb289554e161fd7ee Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Sun, 18 May 2025 15:47:35 +0200 Subject: [PATCH 087/187] Fix typo in the readme (#6908) --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 7d8218c3be..05fde926b1 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Please consider [crediting all contributors](CREDITS.md) involved in the project # Choosing `pokeemerald` or **`pokeemerald-expansion`** - **`pokeemerald-expansion`** supports multiplayer functionality with other games built on **`pokeemerald-expansion`**. It is not compatible with official PokΓ©mon games. -- If compatibility with official games is important, use [`pokeemerald`](https://github.com/pret/pokeemerald). Otherwise, we reccomend using **`pokeemerald-expansion`**. +- If compatibility with official games is important, use [`pokeemerald`](https://github.com/pret/pokeemerald). Otherwise, we recommend using **`pokeemerald-expansion`**. - **`pokeemerald-expansion`** incorporates regular updates from `pokeemerald`, including bug fixes and documentation improvements. # [Getting Started](INSTALL.md) @@ -51,4 +51,3 @@ If you are looking to [report a bug](CONTRIBUTING.md#Bug-Report), [open a pull r [![](https://dcbadge.limes.pink/api/server/6CzjAG6GZk)](https://discord.gg/6CzjAG6GZk) Our community uses the [Rom Hacking Hideout (RHH) Discord server](https://discord.gg/6CzjAG6GZk) to communicate and organize. Most of our discussions take place there, and we welcome anybody to join us! - From 7b679a6febb1878e5e5194a4586547c0e450b75c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 07:07:59 -0700 Subject: [PATCH 088/187] add AsparagusEduardo as a contributor for code, data, and 10 more (#6905) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 22 +++++++++++++++++++++- CREDITS.md | 3 +++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index d2b391fde8..a96ac95e9c 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,26 @@ "code" ] }, + { + "login": "AsparagusEduardo", + "name": "Eduardo Quezada", + "avatar_url": "https://avatars.githubusercontent.com/u/2904965?v=4", + "profile": "https://github.com/AsparagusEduardo", + "contributions": [ + "code", + "data", + "doc", + "infra", + "maintenance", + "projectManagement", + "promotion", + "research", + "review", + "test", + "tutorial", + "userTesting" + ] + }, { "login": "khbsd", "name": "khbsd", @@ -153,5 +173,5 @@ "contributorsPerLine": 7, "linkToUsage": true, "commitType": "docs", - "skipCi": true, + "skipCi": true } diff --git a/CREDITS.md b/CREDITS.md index 6ab186faa8..71574733be 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,8 +31,11 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» + Eduardo Quezada
Eduardo Quezada

πŸ’» πŸ”£ πŸ“– πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ βœ… πŸ““ khbsd
khbsd

πŸ“– πŸ’» Cafe
Cafe

🎨 + + agsmgmaster64
agsmgmaster64

πŸ’» From c83e7bda23c7625be884c64966f5c7a71aa16a94 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 08:42:48 -0700 Subject: [PATCH 089/187] add LinathanZel as a contributor for code (#6901) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index a96ac95e9c..cd07b6578a 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,15 @@ "code" ] }, + { + "login": "LinathanZel", + "name": "Linathan", + "avatar_url": "https://avatars.githubusercontent.com/u/35115312?v=4", + "profile": "https://github.com/LinathanZel", + "contributions": [ + "code" + ] + }, { "login": "AsparagusEduardo", "name": "Eduardo Quezada", diff --git a/CREDITS.md b/CREDITS.md index 71574733be..243b256663 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -37,6 +37,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d agsmgmaster64
agsmgmaster64

πŸ’» + Linathan
Linathan

πŸ’» From ec58de2b6ad8c343ee45b87270d95306aa8d8056 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 15:00:00 -0700 Subject: [PATCH 090/187] add ExpoSeed as a contributor for code, and maintenance (#6899) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 11 +++++++++++ CREDITS.md | 1 + 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index cd07b6578a..723a0ef937 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,17 @@ "code" ] }, + { + "login": "ExpoSeed", + "name": "ExpoSeed", + "avatar_url": "https://avatars.githubusercontent.com/u/43502820?v=4", + "profile": "https://github.com/ExpoSeed", + "contributions": [ + "code", + "maintenance", + "review" + ] + }, { "login": "LinathanZel", "name": "Linathan", diff --git a/CREDITS.md b/CREDITS.md index 243b256663..b48e4365ad 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -38,6 +38,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d agsmgmaster64
agsmgmaster64

πŸ’» Linathan
Linathan

πŸ’» + ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ From 6bdec079c00f7fa6dc202433bdb59f709d29a6cf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 17:49:50 -0700 Subject: [PATCH 091/187] add kittenchilly as a contributor for code (#6898) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 11 +++++++++++ CREDITS.md | 1 + 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 723a0ef937..de63531b44 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,17 @@ "code" ] }, + { + "login": "kittenchilly", + "name": "kittenchilly", + "avatar_url": "https://avatars.githubusercontent.com/u/23617175?v=4", + "profile": "https://github.com/kittenchilly", + "contributions": [ + "code", + "research", + "data" + ] + }, { "login": "ExpoSeed", "name": "ExpoSeed", diff --git a/CREDITS.md b/CREDITS.md index b48e4365ad..317bd40bc3 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -39,6 +39,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d agsmgmaster64
agsmgmaster64

πŸ’» Linathan
Linathan

πŸ’» ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ + kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ From 6df68c4dd3606fb9eaba90d12a1a03e58178b239 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 21:08:43 -0700 Subject: [PATCH 092/187] add mudskipper13 as a contributor for code, and doc (#6915) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ CREDITS.md | 7 +++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index de63531b44..38879e2ac3 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -199,6 +199,16 @@ "contributions": [ "code" ] + }, + { + "login": "mudskipper13", + "name": "mudskipper13", + "avatar_url": "https://avatars.githubusercontent.com/u/105766191?v=4", + "profile": "https://github.com/mudskipper13", + "contributions": [ + "code", + "doc" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index 317bd40bc3..85cbefa625 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,12 +31,15 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» + ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ + Linathan
Linathan

πŸ’» Eduardo Quezada
Eduardo Quezada

πŸ’» πŸ”£ πŸ“– πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ βœ… πŸ““ - khbsd
khbsd

πŸ“– πŸ’» - Cafe
Cafe

🎨 + khbsd
khbsd

πŸ“– πŸ’» + Cafe
Cafe

🎨 agsmgmaster64
agsmgmaster64

πŸ’» + mudskipper13
mudskipper13

πŸ’» πŸ“– Linathan
Linathan

πŸ’» ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ From f8d31a7410c165f65ef1b3bcbd904747d34b4bcf Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 07:41:39 +0200 Subject: [PATCH 093/187] add PCG06 as a contributor for code (#6900) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 3 +++ 2 files changed, 12 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 38879e2ac3..d8b52fb16e 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,15 @@ "code" ] }, + { + "login": "PCG06", + "name": "PCG", + "avatar_url": "https://avatars.githubusercontent.com/u/75729017?v=4", + "profile": "https://github.com/PCG06", + "contributions": [ + "code" + ] + }, { "login": "kittenchilly", "name": "kittenchilly", diff --git a/CREDITS.md b/CREDITS.md index 85cbefa625..4baf67db9a 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -44,6 +44,9 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ + + PCG
PCG

πŸ’» + From 0d8d36499b2bff4dc16d512758b13f5f5434f7f2 Mon Sep 17 00:00:00 2001 From: grintoul1 <166724814+grintoul1@users.noreply.github.com> Date: Mon, 19 May 2025 06:44:05 +0100 Subject: [PATCH 094/187] Mugshot Transitions 2v1 fix (#6911) --- src/battle_transition.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/battle_transition.c b/src/battle_transition.c index 8c366f01ef..6647c72f2b 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2376,16 +2376,25 @@ static bool8 Mugshot_StartOpponentSlide(struct Task *task) sTransitionData->BG0HOFS_Upper += 8; SetTrainerPicSlideDirection(task->tOpponentSpriteAId, 0); - SetTrainerPicSlideDirection(task->tOpponentSpriteBId, 0); + if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + SetTrainerPicSlideDirection(task->tOpponentSpriteBId, 0); + } SetTrainerPicSlideDirection(task->tPlayerSpriteId, 1); - SetTrainerPicSlideDirection(task->tPartnerSpriteId, 1); + if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + SetTrainerPicSlideDirection(task->tPartnerSpriteId, 1); + } // Start opponent slide IncrementTrainerPicState(task->tOpponentSpriteAId); PlaySE(SE_MUGSHOT); - IncrementTrainerPicState(task->tOpponentSpriteBId); + if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { + IncrementTrainerPicState(task->tOpponentSpriteBId); + } sTransitionData->VBlank_DMA++; return FALSE; @@ -2400,7 +2409,10 @@ static bool8 Mugshot_WaitStartPlayerSlide(struct Task *task) if (IsTrainerPicSlideDone(task->tOpponentSpriteAId)) { task->tState++; - IncrementTrainerPicState(task->tPartnerSpriteId); + if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) + { + IncrementTrainerPicState(task->tPartnerSpriteId); + } IncrementTrainerPicState(task->tPlayerSpriteId); } return FALSE; From e1e7d1cf3530799774fa13d4e409bed7067ffa25 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Mon, 19 May 2025 04:11:59 -0400 Subject: [PATCH 095/187] Fixes for C23 Support (#2138) * fixes for c23 support * include global.h in m4a.c & remove include --- include/gba/m4a_internal.h | 4 ++++ include/global.h | 4 ++++ include/librfu.h | 4 ++++ src/field_player_avatar.c | 11 +++++------ src/librfu_intr.c | 12 ++++++++++++ src/m4a.c | 22 +++++++++++++++++++++- src/main_menu.c | 2 +- 7 files changed, 51 insertions(+), 8 deletions(-) diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index fc8205efd9..a4182c8889 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -170,7 +170,11 @@ struct SoundChannel struct MusicPlayerInfo; +#if !MODERN typedef void (*MPlayFunc)(); +#else +typedef void (*MPlayFunc)(...); +#endif typedef void (*PlyNoteFunc)(u32, struct MusicPlayerInfo *, struct MusicPlayerTrack *); typedef void (*CgbSoundFunc)(void); typedef void (*CgbOscOffFunc)(u8); diff --git a/include/global.h b/include/global.h index fe2f926434..2907756c9d 100644 --- a/include/global.h +++ b/include/global.h @@ -23,6 +23,10 @@ #define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided") #define NAKED __attribute__((naked)) +#if MODERN +#define asm __asm__ +#endif + /// IDE support #if defined(__APPLE__) || defined(__CYGWIN__) || defined(__INTELLISENSE__) // We define these when using certain IDEs to fool preproc diff --git a/include/librfu.h b/include/librfu.h index 6b0bd97c71..4bde381ef2 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -316,7 +316,11 @@ struct STWIStatus u8 recoveryCount; u8 unk_16; u8 unk_17; +#if !MODERN void (*callbackM)(); +#else + void (*callbackM)(...); +#endif void (*callbackS)(u16); void (*callbackID)(void); union RfuPacket *txPacket; diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c index 43a7189da2..c340c9aa03 100644 --- a/src/field_player_avatar.c +++ b/src/field_player_avatar.c @@ -38,14 +38,13 @@ EWRAM_DATA struct ObjectEvent gObjectEvents[OBJECT_EVENTS_COUNT] = {}; EWRAM_DATA struct PlayerAvatar gPlayerAvatar = {}; // static declarations - -static u8 ObjectEventCB2_NoMovement2(); +static u8 ObjectEventCB2_NoMovement2(void); static bool8 TryInterruptObjectEventSpecialAnim(struct ObjectEvent *, u8); static void npc_clear_strange_bits(struct ObjectEvent *); static void MovePlayerAvatarUsingKeypadInput(u8, u16, u16); -static void PlayerAllowForcedMovementIfMovingSameDirection(); -static bool8 TryDoMetatileBehaviorForcedMovement(); -static u8 GetForcedMovementByMetatileBehavior(); +static void PlayerAllowForcedMovementIfMovingSameDirection(void); +static bool8 TryDoMetatileBehaviorForcedMovement(void); +static u8 GetForcedMovementByMetatileBehavior(void); static bool8 ForcedMovement_None(void); static bool8 ForcedMovement_Slip(void); @@ -318,7 +317,7 @@ static bool8 (*const sPlayerAvatarSecretBaseMatSpin[])(struct Task *, struct Obj void MovementType_Player(struct Sprite *sprite) { - UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, ObjectEventCB2_NoMovement2); + UpdateObjectEventCurrentMovement(&gObjectEvents[sprite->data[0]], sprite, (bool8 (*)(struct ObjectEvent *, struct Sprite *))ObjectEventCB2_NoMovement2); } static u8 ObjectEventCB2_NoMovement2(void) diff --git a/src/librfu_intr.c b/src/librfu_intr.c index ab4392e229..0426e6459c 100644 --- a/src/librfu_intr.c +++ b/src/librfu_intr.c @@ -7,7 +7,11 @@ 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); +#if !MODERN static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()); +#else +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)(...)); +#endif static void Callback_Dummy_S(u16 reqCommandId, void (*callbackS)(u16)); static void Callback_Dummy_ID(void (*callbackId)(void)); @@ -135,7 +139,11 @@ static void sio32intr_clock_master(void) } gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) +#if !MODERN Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM); +#else + Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, (void (*)(...))gSTWIStatus->callbackM); +#endif } else { @@ -388,7 +396,11 @@ static void STWI_init_slave(void) } NAKED +#if !MODERN static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()) +#else +static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)(...)) +#endif { asm("bx r2"); } diff --git a/src/m4a.c b/src/m4a.c index 9caedd34a0..1344f53080 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -1,4 +1,4 @@ -#include +#include "global.h" #include "gba/m4a_internal.h" extern const u8 gCgb3Vol[]; @@ -283,6 +283,7 @@ void MPlayExtender(struct CgbChannel *cgbChans) soundInfo->ident++; +#if !MODERN gMPlayJumpTable[8] = ply_memacc; gMPlayJumpTable[17] = ply_lfos; gMPlayJumpTable[19] = ply_mod; @@ -292,6 +293,17 @@ void MPlayExtender(struct CgbChannel *cgbChans) gMPlayJumpTable[31] = TrackStop; gMPlayJumpTable[32] = FadeOutBody; gMPlayJumpTable[33] = TrkVolPitSet; +#else + gMPlayJumpTable[8] = (void (*)(...))ply_memacc; + gMPlayJumpTable[17] = (void (*)(...))ply_lfos; + gMPlayJumpTable[19] = (void (*)(...))ply_mod; + gMPlayJumpTable[28] = (void (*)(...))ply_xcmd; + gMPlayJumpTable[29] = (void (*)(...))ply_endtie; + gMPlayJumpTable[30] = (void (*)(...))SampleFreqSet; + gMPlayJumpTable[31] = (void (*)(...))TrackStop; + gMPlayJumpTable[32] = (void (*)(...))FadeOutBody; + gMPlayJumpTable[33] = (void (*)(...))TrkVolPitSet; +#endif soundInfo->cgbChans = cgbChans; soundInfo->CgbSound = CgbSound; @@ -320,13 +332,21 @@ void MusicPlayerJumpTableCopy(void) void ClearChain(void *x) { +#if !MODERN void (*func)(void *) = *(&gMPlayJumpTable[34]); +#else + void (*func)(...) = *(&gMPlayJumpTable[34]); +#endif func(x); } void Clear64byte(void *x) { +#if !MODERN void (*func)(void *) = *(&gMPlayJumpTable[35]); +#else + void (*func)(...) = *(&gMPlayJumpTable[35]); +#endif func(x); } diff --git a/src/main_menu.c b/src/main_menu.c index 9ee6e05b8f..9565df886d 100644 --- a/src/main_menu.c +++ b/src/main_menu.c @@ -237,7 +237,7 @@ static void SpriteCB_MovePlayerDownWhileShrinking(struct Sprite *); static void Task_NewGameBirchSpeech_WaitForPlayerShrink(u8); static void Task_NewGameBirchSpeech_FadePlayerToWhite(u8); static void Task_NewGameBirchSpeech_Cleanup(u8); -static void SpriteCB_Null(); +static void SpriteCB_Null(struct Sprite *); static void Task_NewGameBirchSpeech_ReturnFromNamingScreenShowTextbox(u8); static void MainMenu_FormatSavegamePlayer(void); static void MainMenu_FormatSavegamePokedex(void); From 59d315734d8c5f5b3b2f16f3299355aa99f5f483 Mon Sep 17 00:00:00 2001 From: Bassoonian Date: Mon, 19 May 2025 10:18:04 +0200 Subject: [PATCH 096/187] Update header files to match source files (#2143) --- include/AgbRfu_LinkManager.h | 4 +- include/battle_anim.h | 54 ++-- include/battle_controllers.h | 4 +- include/battle_gfx_sfx_util.h | 6 +- include/battle_interface.h | 4 +- include/battle_main.h | 4 +- include/battle_pyramid.h | 2 +- include/battle_script_commands.h | 4 +- include/battle_util.h | 2 +- include/berry.h | 5 +- include/cable_club.h | 2 +- include/contest_ai.h | 2 +- include/contest_link.h | 34 +-- include/contest_painting.h | 2 +- include/contest_util.h | 2 +- include/coord_event_weather.h | 2 +- include/decoration.h | 4 +- include/decoration_inventory.h | 6 +- include/easy_chat.h | 14 +- include/ereader_helpers.h | 6 +- include/event_object_movement.h | 438 ++++++++++++++-------------- include/evolution_graphics.h | 2 +- include/evolution_scene.h | 6 +- include/faraway_island.h | 4 +- include/field_camera.h | 2 +- include/field_control_avatar.h | 9 +- include/field_door.h | 8 +- include/field_effect.h | 8 +- include/field_effect_helpers.h | 44 +-- include/field_message_box.h | 6 +- include/field_player_avatar.h | 16 +- include/field_specials.h | 2 +- include/fieldmap.h | 20 +- include/fldeff.h | 2 +- include/image_processing_effects.h | 6 +- include/international_string_util.h | 8 +- include/intro.h | 2 +- include/intro_credits_graphics.h | 6 +- include/item_menu.h | 6 +- include/item_use.h | 59 ++-- include/librfu.h | 4 +- include/lilycove_lady.h | 2 +- include/link.h | 18 +- include/link_rfu.h | 6 +- include/list_menu.h | 6 +- include/main.h | 2 +- include/malloc.h | 2 +- include/match_call.h | 2 +- include/mauville_old_man.h | 2 +- include/menu.h | 28 +- include/menu_specialized.h | 4 +- include/metatile_behavior.h | 273 +++++++++-------- include/move_relearner.h | 2 +- include/mystery_event_script.h | 2 +- include/mystery_gift_client.h | 2 +- include/mystery_gift_link.h | 4 +- include/mystery_gift_menu.h | 4 +- include/mystery_gift_server.h | 4 +- include/mystery_gift_view.h | 4 +- include/overworld.h | 4 +- include/palette_util.h | 24 +- include/party_menu.h | 6 +- include/player_pc.h | 2 +- include/pokedex.h | 8 +- include/pokedex_area_region_map.h | 4 +- include/pokedex_area_screen.h | 2 +- include/pokedex_cry_screen.h | 8 +- include/pokemon.h | 12 +- include/pokemon_icon.h | 8 +- include/pokenav.h | 52 ++-- include/rayquaza_scene.h | 2 +- include/recorded_battle.h | 2 +- include/region_map.h | 4 +- include/roamer.h | 2 +- include/safari_zone.h | 2 +- include/scanline_effect.h | 2 +- include/script_menu.h | 2 +- include/script_pokemon_util.h | 8 +- include/secret_base.h | 4 +- include/shop.h | 6 +- include/slot_machine.h | 2 +- include/sprite.h | 8 +- include/text.h | 4 +- include/time_events.h | 6 +- include/trade.h | 4 +- include/trainer_card.h | 2 +- include/trainer_see.h | 2 +- include/tv.h | 12 +- include/util.h | 6 +- include/wild_encounter.h | 2 +- src/battle_controllers.c | 12 +- src/main.c | 2 +- src/metatile_behavior.c | 2 +- src/save.c | 2 +- 94 files changed, 704 insertions(+), 714 deletions(-) diff --git a/include/AgbRfu_LinkManager.h b/include/AgbRfu_LinkManager.h index 3b38b85fc9..f8f3ca72ae 100644 --- a/include/AgbRfu_LinkManager.h +++ b/include/AgbRfu_LinkManager.h @@ -189,9 +189,9 @@ 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); +void rfu_LMAN_initializeRFU(INIT_PARAM *init_parameters); 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_stopManager(u8 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); diff --git a/include/battle_anim.h b/include/battle_anim.h index 1c9851e4e4..a9f27b0b38 100644 --- a/include/battle_anim.h +++ b/include/battle_anim.h @@ -65,12 +65,12 @@ s8 BattleAnimAdjustPanning2(s8 pan); s16 KeepPanInRange(s16 panArg, int oldPan); s16 CalculatePanIncrement(s16 sourcePan, s16 targetPan, s16 incrementPan); void RelocateBattleBgPal(u16 paletteNum, u16 *dest, u32 offset, bool8 largeScreen); -void ResetBattleAnimBg(bool8); +void ResetBattleAnimBg(bool8 toBG2); // battle_intro.c void SetAnimBgAttribute(u8 bgId, u8 attributeId, u8 value); void DrawBattlerOnBg(int bgId, u8 x, u8 y, u8 battlerPosition, u8 paletteId, u8 *tiles, u16 *tilemap, u16 tilesOffset); -void HandleIntroSlide(u8 environmentId); +void HandleIntroSlide(u8 environment); int GetAnimBgAttribute(u8 bgId, u8 attributeId); // battle_anim_mons.c @@ -89,7 +89,7 @@ void StartAnimLinearTranslation(struct Sprite *sprite); void InitAnimArcTranslation(struct Sprite *sprite); bool8 AnimTranslateLinear(struct Sprite *sprite); void TranslateAnimSpriteToTargetMonLocation(struct Sprite *sprite); -u8 GetBattlerSpriteCoord2(u8 battler, u8 attributeId); +u8 GetBattlerSpriteCoord2(u8 battler, u8 coordType); void InitAnimLinearTranslationWithSpeed(struct Sprite *sprite); u16 ArcTan2Neg(s16 x, s16 y); void TrySetSpriteRotScale(struct Sprite *sprite, bool8 recalcCenterVector, s16 xScale, s16 yScale, u16 rotation); @@ -105,11 +105,11 @@ void AnimTravelDiagonally(struct Sprite *sprite); void InitAnimLinearTranslation(struct Sprite *sprite); void AnimTranslateLinear_WithFollowup(struct Sprite *sprite); u8 GetBattlerSpriteBGPriority(u8 battler); -void *LoadPointerFromVars(s16 bottom, s16 top); -void StorePointerInVars(s16 *bottom, s16 *top, const void *ptr); +void *LoadPointerFromVars(s16 lo, s16 hi); +void StorePointerInVars(s16 *lo, s16 *hi, const void *ptr); void InitPrioritiesForVisibleBattlers(void); -void GetBattleAnimBg1Data(struct BattleAnimBgData *); -void GetBattleAnimBgData(struct BattleAnimBgData *, u32 bgId); +void GetBattleAnimBg1Data(struct BattleAnimBgData *out); +void GetBattleAnimBgData(struct BattleAnimBgData *out, u32 bgId); u8 GetBattlerSpriteSubpriority(u8 battler); bool8 TranslateAnimHorizontalArc(struct Sprite *sprite); void TranslateSpriteLinearByIdFixedPoint(struct Sprite *sprite); @@ -121,17 +121,17 @@ void SetBattlerSpriteYOffsetFromRotation(u8 spriteId); u32 GetBattlePalettesMask(bool8 battleBackground, bool8 attacker, bool8 target, bool8 attackerPartner, bool8 targetPartner, bool8 anim1, bool8 anim2); u32 GetBattleMonSpritePalettesMask(u8 playerLeft, u8 playerRight, u8 opponentLeft, u8 opponentRight); u8 GetSpritePalIdxByBattler(u8 battler); -s16 CloneBattlerSpriteWithBlend(u8); -void DestroySpriteWithActiveSheet(struct Sprite *); -u8 CreateInvisibleSpriteCopy(int, u8, int); -void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData *, const void *, bool32); -void AnimLoadCompressedBgGfx(u32, const u32 *, u32); -void UpdateAnimBg3ScreenSize(bool8); -void TranslateSpriteInGrowingCircle(struct Sprite *); +s16 CloneBattlerSpriteWithBlend(u8 animBattler); +void DestroySpriteWithActiveSheet(struct Sprite *sprite); +u8 CreateInvisibleSpriteCopy(int battler, u8 spriteId, int species); +void AnimLoadCompressedBgTilemapHandleContest(struct BattleAnimBgData *data, const void *src, bool32 largeScreen); +void AnimLoadCompressedBgGfx(u32 bgId, const u32 *src, u32 tilesOffset); +void UpdateAnimBg3ScreenSize(bool8 largeScreenSize); +void TranslateSpriteInGrowingCircle(struct Sprite *sprite); void SetBattlerSpriteYOffsetFromYScale(u8 spriteId); void PrepareEruptAnimTaskData(struct Task *task, u8 spriteId, s16 xScaleStart, s16 yScaleStart, s16 xScaleEnd, s16 yScaleEnd, u16 duration); u8 UpdateEruptAnimTask(struct Task *task); -void DestroyAnimSpriteAndDisableBlend(struct Sprite *); +void DestroyAnimSpriteAndDisableBlend(struct Sprite *sprite); void AnimLoadCompressedBgTilemap(u32 bgId, const void *src); void InitAnimFastLinearTranslationWithSpeed(struct Sprite *sprite); bool8 AnimFastTranslateLinear(struct Sprite *sprite); @@ -141,11 +141,11 @@ void TranslateSpriteLinear(struct Sprite *sprite); void AnimSpriteOnMonPos(struct Sprite *sprite); void InitAnimLinearTranslationWithSpeedAndPos(struct Sprite *sprite); void TranslateSpriteInCircle(struct Sprite *sprite); -void SetGrayscaleOrOriginalPalette(u16 palNum, bool8 restoreOriginal); +void SetGrayscaleOrOriginalPalette(u16 paletteNum, bool8 restoreOriginalColor); void PrepareAffineAnimInTaskData(struct Task *task, u8 spriteId, const union AffineAnimCmd *affineAnimCmds); bool8 RunAffineAnimFromTaskData(struct Task *task); void AnimThrowProjectile(struct Sprite *sprite); -void GetBgDataForTransform(struct BattleAnimBgData *dest, u8 battler); +void GetBgDataForTransform(struct BattleAnimBgData *out, u8 battler); u8 CreateAdditionalMonSpriteForMoveAnim(u16 species, bool8 isBackpic, u8 id, s16 x, s16 y, u8 subpriority, u32 personality, u32 trainerId, u32 battler, bool32 ignoreDeoxysForm); void ResetSpriteRotScale_PreserveAffine(struct Sprite *sprite); void Trade_MoveSelectedMonToTarget(struct Sprite *sprite); @@ -178,15 +178,15 @@ enum BATTLER_COORD_ATTR_RAW_BOTTOM, }; -u8 GetBattlerSpriteCoord(u8 battler, u8 attributeId); +u8 GetBattlerSpriteCoord(u8 battler, u8 coordType); bool8 IsBattlerSpritePresent(u8 battler); void ClearBattleAnimBg(u32 bgId); -u8 GetAnimBattlerSpriteId(u8 wantedBattler); +u8 GetAnimBattlerSpriteId(u8 animBattler); bool8 IsDoubleBattle(void); u8 GetBattleBgPaletteNum(void); u8 GetBattlerSpriteBGPriorityRank(u8 battler); -void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*spriteCallback)(struct Sprite *)); +void StoreSpriteCallbackInData6(struct Sprite *sprite, void (*callback)(struct Sprite *)); void SetSpritePrimaryCoordsFromSecondaryCoords(struct Sprite *sprite); u8 GetBattlerSpriteDefault_Y(u8 battler); u8 GetSubstituteSpriteDefault_Y(u8 battler); @@ -219,18 +219,18 @@ void AnimTask_HorizontalShake(u8 taskId); // battle_anim_throw.c void TryShinyAnimation(u8 battler, struct Pokemon *mon); -u8 ItemIdToBallId(u16 itemId); +u8 ItemIdToBallId(u16 ballItem); u8 AnimateBallOpenParticles(u8 x, u8 y, u8 priority, u8 subpriority, u8 ballId); -u8 LaunchBallFadeMonTask(bool8 unFadeLater, u8 spritePalNum, u32 selectedPalettes, u8 ballId); +u8 LaunchBallFadeMonTask(bool8 unfadeLater, u8 spritePalNum, u32 selectedPalettes, u8 ballId); // battle_anim_utility_funcs.c -void InitStatsChangeAnimation(u8); -void StartMonScrollingBgMask(u8 taskId, int unused, u16 scrollSpeed, u8 battler, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette); +void InitStatsChangeAnimation(u8 taskId); +void StartMonScrollingBgMask(u8 taskId, int UNUSED unused, u16 scrollSpeed, u8 battler, bool8 includePartner, u8 numFadeSteps, u8 fadeStepDelay, u8 duration, const u32 *gfx, const u32 *tilemap, const u32 *palette); // battle_anim_effects_1.c void SetSpriteNextToMonHead(u8 battler, struct Sprite *sprite); void AnimMoveTwisterParticle(struct Sprite *sprite); -void AnimParticleBurst(struct Sprite *); +void AnimParticleBurst(struct Sprite *sprite); // battle_anim_water.c void AnimWaterPulseRing(struct Sprite *sprite); @@ -241,9 +241,9 @@ void DestroyAnimSpriteAfterTimer(struct Sprite *sprite); // battle_anim_smokescreen.c u8 SmokescreenImpact(s16 x, s16 y, bool8 persist); -u32 UnpackSelectedBattlePalettes(s16); +u32 UnpackSelectedBattlePalettes(s16 selector); -u8 GetBattlerSpriteFinal_Y(u8, u16, u8); +u8 GetBattlerSpriteFinal_Y(u8 battler, u16 species, bool8 a3); extern const struct OamData gOamData_AffineOff_ObjNormal_8x16; extern const struct OamData gOamData_AffineNormal_ObjBlend_16x16; diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 33e188f284..e4b368b89e 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -306,8 +306,8 @@ void SpriteCB_FreePlayerSpriteLoadMonSprite(struct Sprite *sprite); void CB2_SetUpReshowBattleScreenAfterMenu(void); void CB2_SetUpReshowBattleScreenAfterMenu2(void); void Task_PlayerController_RestoreBgmAfterCry(u8 taskId); -void ActionSelectionCreateCursorAt(u8 cursorPos, u8 unused); -void ActionSelectionDestroyCursorAt(u8 cursorPos); +void ActionSelectionCreateCursorAt(u8 cursorPosition, u8 baseTileNum); +void ActionSelectionDestroyCursorAt(u8 cursorPosition); void InitMoveSelectionsVarsAndStrings(void); // recorded player controller diff --git a/include/battle_gfx_sfx_util.h b/include/battle_gfx_sfx_util.h index e65df4bf2a..ba2afee1d9 100644 --- a/include/battle_gfx_sfx_util.h +++ b/include/battle_gfx_sfx_util.h @@ -7,8 +7,8 @@ u16 ChooseMoveAndTargetInBattlePalace(void); void SpriteCB_WaitForBattlerBallReleaseAnim(struct Sprite *sprite); void SpriteCB_TrainerSlideIn(struct Sprite *sprite); void InitAndLaunchChosenStatusAnimation(bool8 isStatus2, u32 status); -bool8 TryHandleLaunchBattleTableAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId, u16 argument); -void InitAndLaunchSpecialAnimation(u8 activeBattlerId, u8 attacker, u8 target, u8 tableId); +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 move, u8 animationTurn); bool8 IsBattleSEPlaying(u8 battler); void BattleLoadOpponentMonSpriteGfx(struct Pokemon *mon, u8 battler); @@ -24,7 +24,7 @@ bool8 BattleInitAllSprites(u8 *state1, u8 *battler); void ClearSpritesHealthboxAnimData(void); void CopyAllBattleSpritesInvisibilities(void); void CopyBattleSpriteInvisibility(u8 battler); -void HandleSpeciesGfxDataChange(u8 attacker, u8 target, bool8 notTransform); +void HandleSpeciesGfxDataChange(u8 battlerAtk, u8 battlerDef, bool8 castform); void BattleLoadSubstituteOrMonSpriteGfx(u8 battler, bool8 loadMonSprite); void LoadBattleMonGfxAndAnimate(u8 battler, bool8 loadMonSprite, u8 spriteId); void TrySetBehindSubstituteSpriteBit(u8 battler, u16 move); diff --git a/include/battle_interface.h b/include/battle_interface.h index ed71b88454..08e7812a4d 100644 --- a/include/battle_interface.h +++ b/include/battle_interface.h @@ -65,11 +65,11 @@ enum u8 CreateBattlerHealthboxSprites(u8 battler); u8 CreateSafariPlayerHealthboxSprites(void); -void SetBattleBarStruct(u8 battler, u8 healthboxSpriteId, s32 maxVal, s32 currVal, s32 receivedValue); +void SetBattleBarStruct(u8 battler, u8 healthboxSpriteId, s32 maxVal, s32 oldVal, s32 receivedValue); void SetHealthboxSpriteInvisible(u8 healthboxSpriteId); void SetHealthboxSpriteVisible(u8 healthboxSpriteId); void DestoryHealthboxSprite(u8 healthboxSpriteId); -void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBankOnly); +void DummyBattleInterfaceFunc(u8 healthboxSpriteId, bool8 isDoubleBattleBattlerOnly); void UpdateOamPriorityInAllHealthboxes(u8 priority); void InitBattlerHealthboxCoords(u8 battler); void UpdateHpTextInHealthbox(u8 healthboxSpriteId, s16 value, u8 maxOrCurrent); diff --git a/include/battle_main.h b/include/battle_main.h index 082611e705..ea6e5bed41 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -49,7 +49,7 @@ void SpriteCB_VsLetterDummy(struct Sprite *sprite); void SpriteCB_VsLetterInit(struct Sprite *sprite); void CB2_InitEndLinkBattle(void); u32 GetBattleBgTemplateData(u8 arrayId, u8 caseId); -u32 GetBattleWindowTemplatePixelWidth(u32 setId, u32 tableId); +u32 GetBattleWindowTemplatePixelWidth(u32 windowsType, u32 tableId); void SpriteCB_WildMon(struct Sprite *sprite); void SpriteCallbackDummy_2(struct Sprite *sprite); void SpriteCB_FaintOpponentMon(struct Sprite *sprite); @@ -71,7 +71,7 @@ void BattleTurnPassed(void); u8 IsRunningFromBattleImpossible(void); void SwitchPartyOrder(u8 battler); void SwapTurnOrder(u8 id1, u8 id2); -u8 GetWhoStrikesFirst(u8 battlerId1, u8 battlerId2, bool8 ignoreChosenMoves); +u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); bool8 TryRunFromBattle(u8 battler); diff --git a/include/battle_pyramid.h b/include/battle_pyramid.h index 62320358b6..ec80fdeed3 100644 --- a/include/battle_pyramid.h +++ b/include/battle_pyramid.h @@ -15,7 +15,7 @@ void CopyPyramidTrainerSpeechBefore(u16 trainerId); void CopyPyramidTrainerWinSpeech(u16 trainerId); void CopyPyramidTrainerLoseSpeech(u16 trainerId); u8 GetTrainerEncounterMusicIdInBattlePyramid(u16 trainerId); -void GenerateBattlePyramidFloorLayout(u16 *mapArg, bool8 setPlayerPosition); +void GenerateBattlePyramidFloorLayout(u16 *backupMapData, bool8 setPlayerPosition); void LoadBattlePyramidObjectEventTemplates(void); void LoadBattlePyramidFloorObjectEventScripts(void); u8 GetNumBattlePyramidObjectEvents(void); diff --git a/include/battle_script_commands.h b/include/battle_script_commands.h index 6ec99e8abc..fe6e98d460 100644 --- a/include/battle_script_commands.h +++ b/include/battle_script_commands.h @@ -10,8 +10,8 @@ // Arguments for 'xStart, yStart, xEnd, yEnd' in HandleBattleWindow #define YESNOBOX_X_Y 24, 8, 29, 13 -void AI_CalcDmg(u8 battlerIdAtk, u8 battlerIdDef); -u8 TypeCalc(u16 move, u8 battlerIdAtk, u8 battlerIdDef); +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 battler); void SetMoveEffect(bool8 primary, u8 certain); diff --git a/include/battle_util.h b/include/battle_util.h index 7d26e12cb2..3416451535 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -85,7 +85,7 @@ bool8 HandleWishPerishSongOnTurnEnd(void); bool8 HandleFaintedMonActions(void); void TryClearRageStatuses(void); u8 AtkCanceller_UnableToUseMove(void); -bool8 HasNoMonsToSwitch(u8 battler, u8 r1, u8 r2); +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); diff --git a/include/berry.h b/include/berry.h index 22b9158ee2..1adbe1cdbc 100644 --- a/include/berry.h +++ b/include/berry.h @@ -11,13 +11,12 @@ bool8 IsPlayerFacingEmptyBerryTreePatch(void); bool8 TryToWaterBerryTree(void); void ClearBerryTrees(void); void BerryTreeTimeUpdate(s32 minutes); -void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle); +void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 allowGrowth); void RemoveBerryTree(u8 id); u8 GetBerryTypeByBerryTreeId(u8 id); -u8 GetStageByBerryTreeId(u8); +u8 GetStageByBerryTreeId(u8 id); u8 ItemIdToBerryType(u16 item); void GetBerryNameByBerryType(u8 berry, u8 *string); -void ResetBerryTreeSparkleFlag(u8 id); void Bag_ChooseBerry(void); void ObjectEventInteractionGetBerryTreeData(void); void ObjectEventInteractionPlantBerryTree(void); diff --git a/include/cable_club.h b/include/cable_club.h index c493691c1c..5a68df621c 100644 --- a/include/cable_club.h +++ b/include/cable_club.h @@ -4,7 +4,7 @@ #include "task.h" #include "constants/cable_club.h" -void CreateTask_EnterCableClubSeat(TaskFunc taskFunc); +void CreateTask_EnterCableClubSeat(TaskFunc followupFunc); u8 CreateTask_ReestablishCableClubLink(void); void CB2_ReturnFromCableClubBattle(void); bool32 AreBattleTowerLinkSpeciesSame(u16 *speciesList1, u16 *speciesList2); diff --git a/include/contest_ai.h b/include/contest_ai.h index 20b9eec10d..4ba2c9ca2e 100644 --- a/include/contest_ai.h +++ b/include/contest_ai.h @@ -10,7 +10,7 @@ enum CONTESTAI_DO_NOT_PROCESS }; -void ContestAI_ResetAI(u8); +void ContestAI_ResetAI(u8 contestantAI); u8 ContestAI_GetActionToUse(void); #endif // GUARD_CONTESTAI_H diff --git a/include/contest_link.h b/include/contest_link.h index cd26825246..091d344609 100644 --- a/include/contest_link.h +++ b/include/contest_link.h @@ -1,23 +1,23 @@ #ifndef GUARD_CONTEST_LINK_H #define GUARD_CONTEST_LINK_H -void Task_LinkContest_CommunicateAppealsState(u8); -void Task_LinkContest_CommunicateFinalStandings(u8); -void Task_LinkContest_Init(u8); -void Task_LinkContest_CommunicateMonsRS(u8); -void Task_LinkContest_CommunicateRngRS(u8); -void Task_LinkContest_CommunicateLeaderIdsRS(u8); -void Task_LinkContest_CommunicateCategoryRS(u8); -void Task_LinkContest_CommunicateMonIdxs(u8); -void Task_LinkContest_StartCommunicationEm(u8); -void Task_LinkContest_CommunicateRound1Points(u8); -void Task_LinkContest_CommunicateTurnOrder(u8); -void Task_LinkContest_FinalizeConnection(u8); -void Task_LinkContest_CommunicateMoveSelections(u8); -bool32 LinkContest_TryLinkStandby(s16 *); -bool32 LinkContest_SendBlock(void *, u16); +void Task_LinkContest_CommunicateAppealsState(u8 taskId); +void Task_LinkContest_CommunicateFinalStandings(u8 taskId); +void Task_LinkContest_Init(u8 taskId); +void Task_LinkContest_CommunicateMonsRS(u8 taskId); +void Task_LinkContest_CommunicateRngRS(u8 taskId); +void Task_LinkContest_CommunicateLeaderIdsRS(u8 taskId); +void Task_LinkContest_CommunicateCategoryRS(u8 taskId); +void Task_LinkContest_CommunicateMonIdxs(u8 taskId); +void Task_LinkContest_StartCommunicationEm(u8 taskId); +void Task_LinkContest_CommunicateRound1Points(u8 taskId); +void Task_LinkContest_CommunicateTurnOrder(u8 taskId); +void Task_LinkContest_FinalizeConnection(u8 taskId); +void Task_LinkContest_CommunicateMoveSelections(u8 taskId); +bool32 LinkContest_TryLinkStandby(s16 *state); +bool32 LinkContest_SendBlock(void *src, u16 size); bool8 LinkContest_GetBlockReceivedFromAllPlayers(void); -bool8 LinkContest_GetBlockReceived(u8); -u8 LinkContest_GetLeaderIndex(u8 *); +bool8 LinkContest_GetBlockReceived(u8 flag); +u8 LinkContest_GetLeaderIndex(u8 *ids); #endif //GUARD_CONTEST_LINK_H diff --git a/include/contest_painting.h b/include/contest_painting.h index f16a0d2f32..06277dec1f 100644 --- a/include/contest_painting.h +++ b/include/contest_painting.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONTESTPAINTING_H #define GUARD_CONTESTPAINTING_H -void SetContestWinnerForPainting(int); +void SetContestWinnerForPainting(int contestWinnerId); void CB2_ContestPainting(void); #endif diff --git a/include/contest_util.h b/include/contest_util.h index 1e97d91d35..fcf742012f 100644 --- a/include/contest_util.h +++ b/include/contest_util.h @@ -6,7 +6,7 @@ void BufferContestantMonNickname(void); void StartContest(void); void BufferContestantMonSpecies(void); void ShowContestResults(void); -void ContestLinkTransfer(u8); +void ContestLinkTransfer(u8 category); void ShowContestPainting(void); u16 GetContestRand(void); u8 CountPlayerMuseumPaintings(void); diff --git a/include/coord_event_weather.h b/include/coord_event_weather.h index 86fb487932..92cceae68f 100644 --- a/include/coord_event_weather.h +++ b/include/coord_event_weather.h @@ -1,6 +1,6 @@ #ifndef GUARD_COORD_EVENT_WEATHER_H #define GUARD_COORD_EVENT_WEATHER_H -void DoCoordEventWeather(u8); +void DoCoordEventWeather(u8 coordEventWeather); #endif // GUARD_COORD_EVENT_WEATHER_H diff --git a/include/decoration.h b/include/decoration.h index db0f337f4d..415ffb85ae 100644 --- a/include/decoration.h +++ b/include/decoration.h @@ -58,10 +58,10 @@ extern u8 gCurDecorationIndex; void InitDecorationContextItems(void); void DoSecretBaseDecorationMenu(u8 taskId); -void ShowDecorationOnMap(u16 mapX, u16 mapY, u16 decor); +void ShowDecorationOnMap(u16 mapX, u16 mapY, u16 decoration); void DoPlayerRoomDecorationMenu(u8 taskId); void ShowDecorationCategoriesWindow(u8 taskId); -void CopyDecorationCategoryName(u8 *dest, u8 decorCat); +void CopyDecorationCategoryName(u8 *dest, u8 category); bool8 IsSelectedDecorInThePC(void); u8 AddDecorationIconObject(u8 decor, s16 x, s16 y, u8 priority, u16 tilesTag, u16 paletteTag); diff --git a/include/decoration_inventory.h b/include/decoration_inventory.h index f43b91d7a1..6bb9910ba4 100644 --- a/include/decoration_inventory.h +++ b/include/decoration_inventory.h @@ -12,9 +12,9 @@ extern struct DecorationInventory gDecorationInventories[]; void SetDecorationInventoriesPointers(void); void ClearDecorationInventories(void); s8 GetFirstEmptyDecorSlot(u8 category); -u8 CheckHasDecoration(u8 decor); -u8 DecorationAdd(u8 decor); -u8 DecorationCheckSpace(u8 decor); +bool8 CheckHasDecoration(u8 decor); +bool8 DecorationAdd(u8 decor); +bool8 DecorationCheckSpace(u8 decor); s8 DecorationRemove(u8 decor); void CondenseDecorationsInCategory(u8 category); u8 GetNumOwnedDecorationsInCategory(u8 category); diff --git a/include/easy_chat.h b/include/easy_chat.h index 4bcc7389cd..0434bb0100 100644 --- a/include/easy_chat.h +++ b/include/easy_chat.h @@ -122,16 +122,16 @@ struct EasyChatWordsByLetter void InitEasyChatPhrases(void); void ShowEasyChatScreen(void); -u8 * CopyEasyChatWord(u8 *dest, u16 word); -bool32 IsEasyChatAnswerUnlocked(int word); +u8 *CopyEasyChatWord(u8 *dest, u16 easyChatWord); +bool32 IsEasyChatAnswerUnlocked(int easyChatWord); void InitializeEasyChatWordArray(u16 *words, u16 length); u8 *ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 columns, u16 rows); -bool8 IsBardWordInvalid(u16 word); -u16 GetRandomEasyChatWordFromGroup(u16 group); +bool8 IsBardWordInvalid(u16 easyChatWord); +u16 GetRandomEasyChatWordFromGroup(u16 groupId); u16 UnlockRandomTrendySaying(void); -u16 EasyChat_GetNumWordsInGroup(u8); -u16 GetRandomEasyChatWordFromUnlockedGroup(u16); -void DoEasyChatScreen(u8 type, u16 *words, MainCallback callback, u8 displayedPersonType); +u16 EasyChat_GetNumWordsInGroup(u8 groupId); +u16 GetRandomEasyChatWordFromUnlockedGroup(u16 groupId); +void DoEasyChatScreen(u8 type, u16 *words, MainCallback exitCallback, u8 displayedPersonType); void InitQuestionnaireWords(void); void UnlockTrendySaying(u8 wordIndex); diff --git a/include/ereader_helpers.h b/include/ereader_helpers.h index 29386bcb22..0e3d122b58 100755 --- a/include/ereader_helpers.h +++ b/include/ereader_helpers.h @@ -49,10 +49,10 @@ struct EReaderTrainerHillSet u8 unk_ec0[40]; }; // size = 0xf00 -bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet *); -bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *); +bool8 ValidateTrainerHillData(struct EReaderTrainerHillSet *hillSet); +bool32 TryWriteTrainerHill(struct EReaderTrainerHillSet *hillSet); bool32 ReadTrainerHillAndValidate(void); -int EReaderHandleTransfer(u8, size_t, const void *, void *); +int EReaderHandleTransfer(u8 mode, size_t size, const void *data, void *recvBuffer); void EReaderHelper_Timer3Callback(void); void EReaderHelper_SerialCallback(void); void EReaderHelper_SaveRegsState(void); diff --git a/include/event_object_movement.h b/include/event_object_movement.h index 2a273b7991..ebc6a6d0e2 100644 --- a/include/event_object_movement.h +++ b/include/event_object_movement.h @@ -117,21 +117,21 @@ void LoadSpecialObjectReflectionPalette(u16 tag, u8 slot); void TryMoveObjectEventToMapCoords(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); void PatchObjectPalette(u16 paletteTag, u8 paletteSlot); void SpawnObjectEventsOnReturnToField(s16 x, s16 y); -void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorCat); +void OverrideSecretBaseDecorationSpriteScript(u8 localId, u8 mapNum, u8 mapGroup, u8 decorationCategory); void GetMapCoordsFromSpritePos(s16 x, s16 y, s16 *destX, s16 *destY); u8 GetFaceDirectionAnimNum(u8 direction); void SetSpritePosToOffsetMapCoords(s16 *x, s16 *y, s16 dx, s16 dy); -void ObjectEventClearHeldMovement(struct ObjectEvent *); -void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *); +void ObjectEventClearHeldMovement(struct ObjectEvent *objectEvent); +void ObjectEventClearHeldMovementIfActive(struct ObjectEvent *objectEvent); void TrySpawnObjectEvents(s16 cameraX, s16 cameraY); -u8 CreateObjectGraphicsSprite(u16, void (*)(struct Sprite *), s16 x, s16 y, u8 subpriority); +u8 CreateObjectGraphicsSprite(u16 graphicsId, void (*callback)(struct Sprite *), s16 x, s16 y, u8 subpriority); u8 TrySpawnObjectEvent(u8 localId, u8 mapNum, u8 mapGroup); u8 SpawnSpecialObjectEventParameterized(u8 graphicsId, u8 movementBehavior, u8 localId, s16 x, s16 y, u8 elevation); -u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *); +u8 SpawnSpecialObjectEvent(struct ObjectEventTemplate *objectEventTemplate); void SetSpritePosToMapCoords(s16 mapX, s16 mapY, s16 *destX, s16 *destY); void CameraObjectReset(void); -void ObjectEventSetGraphicsId(struct ObjectEvent *, u8 graphicsId); -void ObjectEventTurn(struct ObjectEvent *, u8 direction); +void ObjectEventSetGraphicsId(struct ObjectEvent *objectEvent, u8 graphicsId); +void ObjectEventTurn(struct ObjectEvent *objectEvent, u8 direction); void ObjectEventTurnByLocalIdAndMap(u8 localId, u8 mapNum, u8 mapGroup, u8 direction); const struct ObjectEventGraphicsInfo *GetObjectEventGraphicsInfo(u8 graphicsId); void SetObjectInvisibility(u8 localId, u8 mapNum, u8 mapGroup, bool8 invisible); @@ -141,21 +141,21 @@ void ResetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup); void SetObjectSubpriority(u8 localId, u8 mapNum, u8 mapGroup, u8 subpriority); void AllowObjectAtPosTriggerGroundEffects(s16 x, s16 y); void ObjectEventGetLocalIdAndMap(struct ObjectEvent *objectEvent, void *localId, void *mapNum, void *mapGroup); -void ShiftObjectEventCoords(struct ObjectEvent *, s16 x, s16 y); -void MoveObjectEventToMapCoords(struct ObjectEvent *, s16 x, s16 y); +void ShiftObjectEventCoords(struct ObjectEvent *objectEvent, s16 x, s16 y); +void MoveObjectEventToMapCoords(struct ObjectEvent *objectEvent, s16 x, s16 y); void TryOverrideObjectEventTemplateCoords(u8 localId, u8 mapNum, u8 mapGroup); -void InitObjectEventPalettes(u8 palSlot); -void UpdateObjectEventCurrentMovement(struct ObjectEvent *, struct Sprite *, bool8(struct ObjectEvent *, struct Sprite *)); -u8 ObjectEventFaceOppositeDirection(struct ObjectEvent *, u8 direction); +void InitObjectEventPalettes(u8 reflectionType); +void UpdateObjectEventCurrentMovement(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 (*callback)(struct ObjectEvent *, struct Sprite *)); +bool8 ObjectEventFaceOppositeDirection(struct ObjectEvent *objectEvent, u8 direction); u8 GetOppositeDirection(u8 direction); u8 GetWalkInPlaceFasterMovementAction(u32); u8 GetWalkInPlaceFastMovementAction(u32); u8 GetWalkInPlaceNormalMovementAction(u32); u8 GetWalkInPlaceSlowMovementAction(u32); -u8 GetCollisionAtCoords(struct ObjectEvent *, s16 x, s16 y, u32 dir); +u8 GetCollisionAtCoords(struct ObjectEvent *objectEvent, s16 x, s16 y, u32 dir); void MoveCoords(u8 direction, s16 *x, s16 *y); -bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *); -u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *); +bool8 ObjectEventIsHeldMovementActive(struct ObjectEvent *objectEvent); +u8 ObjectEventClearHeldMovementIfFinished(struct ObjectEvent *objectEvent); u8 GetObjectEventIdByPosition(u16 x, u16 y, u8 elevation); void SetTrainerMovementType(struct ObjectEvent *objectEvent, u8 movementType); u8 GetTrainerFacingDirectionMovementType(u8 direction); @@ -198,11 +198,11 @@ u8 GetWalkSlowMovementAction(u32); u8 GetJumpMovementAction(u32); u8 ElevationToPriority(u8 elevation); void ObjectEventUpdateElevation(struct ObjectEvent *objEvent); -void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *, u8 subpriority); -void UnfreezeObjectEvent(struct ObjectEvent *); -u8 FindLockedObjectEventIndex(struct ObjectEvent *); -void SetAndStartSpriteAnim(struct Sprite *, u8 animNum, u8 animCmdIndex); -bool8 SpriteAnimEnded(struct Sprite *); +void SetObjectSubpriorityByElevation(u8 elevation, struct Sprite *sprite, u8 subpriority); +void UnfreezeObjectEvent(struct ObjectEvent *objectEvent); +u8 FindLockedObjectEventIndex(struct ObjectEvent *objectEvent); +void SetAndStartSpriteAnim(struct Sprite *sprite, u8 animNum, u8 animCmdIndex); +bool8 SpriteAnimEnded(struct Sprite *sprite); void UnfreezeObjectEvents(void); void FreezeObjectEventsExceptOne(u8 objectEventId); void FreezeObjectEventsExceptTwo(u8 objectEventId1, u8 objectEventId2); @@ -222,73 +222,73 @@ u8 GetObjectEventBerryTreeId(u8 objectEventId); void SetBerryTreeJustPicked(u8 mapId, u8 mapNumber, u8 mapGroup); bool8 IsBerryTreeSparkling(u8 localId, u8 mapNum, u8 mapGroup); -void MovementType_None(struct Sprite *); -void MovementType_LookAround(struct Sprite *); -void MovementType_WanderAround(struct Sprite *); -void MovementType_WanderUpAndDown(struct Sprite *); -void MovementType_WanderLeftAndRight(struct Sprite *); -void MovementType_FaceDirection(struct Sprite *); -void MovementType_Player(struct Sprite *); -void MovementType_BerryTreeGrowth(struct Sprite *); -void MovementType_FaceDownAndUp(struct Sprite *); -void MovementType_FaceLeftAndRight(struct Sprite *); -void MovementType_FaceUpAndLeft(struct Sprite *); -void MovementType_FaceUpAndRight(struct Sprite *); -void MovementType_FaceDownAndLeft(struct Sprite *); -void MovementType_FaceDownAndRight(struct Sprite *); -void MovementType_FaceDownUpAndLeft(struct Sprite *); -void MovementType_FaceDownUpAndRight(struct Sprite *); -void MovementType_FaceUpRightAndLeft(struct Sprite *); -void MovementType_FaceDownRightAndLeft(struct Sprite *); -void MovementType_RotateCounterclockwise(struct Sprite *); -void MovementType_RotateClockwise(struct Sprite *); -void MovementType_WalkBackAndForth(struct Sprite *); -void MovementType_WalkSequenceUpRightLeftDown(struct Sprite *); -void MovementType_WalkSequenceRightLeftDownUp(struct Sprite *); -void MovementType_WalkSequenceDownUpRightLeft(struct Sprite *); -void MovementType_WalkSequenceLeftDownUpRight(struct Sprite *); -void MovementType_WalkSequenceUpLeftRightDown(struct Sprite *); -void MovementType_WalkSequenceLeftRightDownUp(struct Sprite *); -void MovementType_WalkSequenceDownUpLeftRight(struct Sprite *); -void MovementType_WalkSequenceRightDownUpLeft(struct Sprite *); -void MovementType_WalkSequenceLeftUpDownRight(struct Sprite *); -void MovementType_WalkSequenceUpDownRightLeft(struct Sprite *); -void MovementType_WalkSequenceRightLeftUpDown(struct Sprite *); -void MovementType_WalkSequenceDownRightLeftUp(struct Sprite *); -void MovementType_WalkSequenceRightUpDownLeft(struct Sprite *); -void MovementType_WalkSequenceUpDownLeftRight(struct Sprite *); -void MovementType_WalkSequenceLeftRightUpDown(struct Sprite *); -void MovementType_WalkSequenceDownLeftRightUp(struct Sprite *); -void MovementType_WalkSequenceUpLeftDownRight(struct Sprite *); -void MovementType_WalkSequenceDownRightUpLeft(struct Sprite *); -void MovementType_WalkSequenceLeftDownRightUp(struct Sprite *); -void MovementType_WalkSequenceRightUpLeftDown(struct Sprite *); -void MovementType_WalkSequenceUpRightDownLeft(struct Sprite *); -void MovementType_WalkSequenceDownLeftUpRight(struct Sprite *); -void MovementType_WalkSequenceLeftUpRightDown(struct Sprite *); -void MovementType_WalkSequenceRightDownLeftUp(struct Sprite *); -void MovementType_CopyPlayer(struct Sprite *); -void MovementType_TreeDisguise(struct Sprite *); -void MovementType_MountainDisguise(struct Sprite *); -void MovementType_CopyPlayerInGrass(struct Sprite *); -void MovementType_Buried(struct Sprite *); -void MovementType_WalkInPlace(struct Sprite *); -void MovementType_JogInPlace(struct Sprite *); -void MovementType_RunInPlace(struct Sprite *); -void MovementType_Invisible(struct Sprite *); -void MovementType_WalkSlowlyInPlace(struct Sprite *); +void MovementType_None(struct Sprite *sprite); +void MovementType_LookAround(struct Sprite *sprite); +void MovementType_WanderAround(struct Sprite *sprite); +void MovementType_WanderUpAndDown(struct Sprite *sprite); +void MovementType_WanderLeftAndRight(struct Sprite *sprite); +void MovementType_FaceDirection(struct Sprite *sprite); +void MovementType_Player(struct Sprite *sprite); +void MovementType_BerryTreeGrowth(struct Sprite *sprite); +void MovementType_FaceDownAndUp(struct Sprite *sprite); +void MovementType_FaceLeftAndRight(struct Sprite *sprite); +void MovementType_FaceUpAndLeft(struct Sprite *sprite); +void MovementType_FaceUpAndRight(struct Sprite *sprite); +void MovementType_FaceDownAndLeft(struct Sprite *sprite); +void MovementType_FaceDownAndRight(struct Sprite *sprite); +void MovementType_FaceDownUpAndLeft(struct Sprite *sprite); +void MovementType_FaceDownUpAndRight(struct Sprite *sprite); +void MovementType_FaceUpRightAndLeft(struct Sprite *sprite); +void MovementType_FaceDownRightAndLeft(struct Sprite *sprite); +void MovementType_RotateCounterclockwise(struct Sprite *sprite); +void MovementType_RotateClockwise(struct Sprite *sprite); +void MovementType_WalkBackAndForth(struct Sprite *sprite); +void MovementType_WalkSequenceUpRightLeftDown(struct Sprite *sprite); +void MovementType_WalkSequenceRightLeftDownUp(struct Sprite *sprite); +void MovementType_WalkSequenceDownUpRightLeft(struct Sprite *sprite); +void MovementType_WalkSequenceLeftDownUpRight(struct Sprite *sprite); +void MovementType_WalkSequenceUpLeftRightDown(struct Sprite *sprite); +void MovementType_WalkSequenceLeftRightDownUp(struct Sprite *sprite); +void MovementType_WalkSequenceDownUpLeftRight(struct Sprite *sprite); +void MovementType_WalkSequenceRightDownUpLeft(struct Sprite *sprite); +void MovementType_WalkSequenceLeftUpDownRight(struct Sprite *sprite); +void MovementType_WalkSequenceUpDownRightLeft(struct Sprite *sprite); +void MovementType_WalkSequenceRightLeftUpDown(struct Sprite *sprite); +void MovementType_WalkSequenceDownRightLeftUp(struct Sprite *sprite); +void MovementType_WalkSequenceRightUpDownLeft(struct Sprite *sprite); +void MovementType_WalkSequenceUpDownLeftRight(struct Sprite *sprite); +void MovementType_WalkSequenceLeftRightUpDown(struct Sprite *sprite); +void MovementType_WalkSequenceDownLeftRightUp(struct Sprite *sprite); +void MovementType_WalkSequenceUpLeftDownRight(struct Sprite *sprite); +void MovementType_WalkSequenceDownRightUpLeft(struct Sprite *sprite); +void MovementType_WalkSequenceLeftDownRightUp(struct Sprite *sprite); +void MovementType_WalkSequenceRightUpLeftDown(struct Sprite *sprite); +void MovementType_WalkSequenceUpRightDownLeft(struct Sprite *sprite); +void MovementType_WalkSequenceDownLeftUpRight(struct Sprite *sprite); +void MovementType_WalkSequenceLeftUpRightDown(struct Sprite *sprite); +void MovementType_WalkSequenceRightDownLeftUp(struct Sprite *sprite); +void MovementType_CopyPlayer(struct Sprite *sprite); +void MovementType_TreeDisguise(struct Sprite *sprite); +void MovementType_MountainDisguise(struct Sprite *sprite); +void MovementType_CopyPlayerInGrass(struct Sprite *sprite); +void MovementType_Buried(struct Sprite *sprite); +void MovementType_WalkInPlace(struct Sprite *sprite); +void MovementType_JogInPlace(struct Sprite *sprite); +void MovementType_RunInPlace(struct Sprite *sprite); +void MovementType_Invisible(struct Sprite *sprite); +void MovementType_WalkSlowlyInPlace(struct Sprite *sprite); u8 GetSlideMovementAction(u32); u8 GetJumpMovementAction(u32); u8 GetJump2MovementAction(u32); u8 CreateCopySpriteAt(struct Sprite *sprite, s16 x, s16 y, u8 subpriority); -u8 MovementType_WanderAround_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step5(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderAround_Step6(struct ObjectEvent *, struct Sprite *); +bool8 MovementType_WanderAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderAround_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 GetVectorDirection(s16 dx, s16 dy, s16 absdx, s16 absdy); u8 GetLimitedVectorDirection_SouthNorth(s16 dx, s16 dy, s16 absdx, s16 absdy); u8 GetLimitedVectorDirection_WestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); @@ -300,143 +300,143 @@ u8 GetLimitedVectorDirection_SouthNorthWest(s16 dx, s16 dy, s16 absdx, s16 absdy u8 GetLimitedVectorDirection_SouthNorthEast(s16 dx, s16 dy, s16 absdx, s16 absdy); u8 GetLimitedVectorDirection_NorthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); u8 GetLimitedVectorDirection_SouthWestEast(s16 dx, s16 dy, s16 absdx, s16 absdy); -u8 MovementType_LookAround_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_LookAround_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_LookAround_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_LookAround_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_LookAround_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDirection_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDirection_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDirection_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_BerryTreeGrowth_Normal(struct ObjectEvent *, struct Sprite *); -u8 MovementType_BerryTreeGrowth_Move(struct ObjectEvent *, struct Sprite *); -u8 MovementType_BerryTreeGrowth_SparkleStart(struct ObjectEvent *, struct Sprite *); -u8 MovementType_BerryTreeGrowth_Sparkle(struct ObjectEvent *, struct Sprite *); -u8 MovementType_BerryTreeGrowth_SparkleEnd(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateClockwise_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateClockwise_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateClockwise_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RotateClockwise_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequence_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequence_Step2(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_CopyPlayer_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_CopyPlayer_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_CopyPlayer_Step2(struct ObjectEvent *, struct Sprite *); -bool8 CopyablePlayerMovement_None(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_WalkNormal(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_WalkFast(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_WalkFaster(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_JumpInPlace(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *, struct Sprite *, u8, bool8(u8)); -u8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_Buried_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkInPlace_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_MoveInPlace_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_WalkSlowlyInPlace_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_JogInPlace_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_RunInPlace_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_Invisible_Step0(struct ObjectEvent *, struct Sprite *); -u8 MovementType_Invisible_Step1(struct ObjectEvent *, struct Sprite *); -u8 MovementType_Invisible_Step2(struct ObjectEvent *, struct Sprite *); +bool8 MovementType_LookAround_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_LookAround_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_LookAround_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_LookAround_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_LookAround_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderUpAndDown_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step5(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WanderLeftAndRight_Step6(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDirection_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDirection_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDirection_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_BerryTreeGrowth_Normal(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_BerryTreeGrowth_Move(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_BerryTreeGrowth_SparkleStart(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_BerryTreeGrowth_Sparkle(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_BerryTreeGrowth_SparkleEnd(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndUp_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndUp_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndUp_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndUp_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndLeft_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndLeft_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndLeft_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndLeft_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownUpAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceUpLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownLeftAndRight_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownLeftAndRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownLeftAndRight_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownLeftAndRight_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_FaceDownLeftAndRight_Step4(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateCounterclockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateCounterclockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateCounterclockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateCounterclockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateClockwise_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateClockwise_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateClockwise_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RotateClockwise_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkBackAndForth_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkBackAndForth_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkBackAndForth_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkBackAndForth_Step3(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkSequence_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkSequence_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpRightLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightLeftDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownUpRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftDownUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpLeftRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftRightDownUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownUpLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightDownUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftUpDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpDownRightLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightLeftUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownRightLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightUpDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpDownLeftRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftRightUpDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownLeftRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpLeftDownRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownRightUpLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftDownRightUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightUpLeftDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceUpRightDownLeft_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceDownLeftUpRight_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceLeftUpRightDown_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +u8 MovementType_WalkSequenceRightDownLeftUp_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_CopyPlayer_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_CopyPlayer_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_CopyPlayer_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 CopyablePlayerMovement_None(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_FaceDirection(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_WalkNormal(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_WalkFast(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_WalkFaster(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_Slide(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_JumpInPlace(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_Jump(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 CopyablePlayerMovement_Jump2(struct ObjectEvent *objectEvent, struct Sprite *sprite, u8 playerDirection, bool8 tileCallback(u8)); +bool8 MovementType_CopyPlayerInGrass_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_Buried_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_MoveInPlace_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_WalkSlowlyInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_JogInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_RunInPlace_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_Invisible_Step0(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_Invisible_Step1(struct ObjectEvent *objectEvent, struct Sprite *sprite); +bool8 MovementType_Invisible_Step2(struct ObjectEvent *objectEvent, struct Sprite *sprite); u8 CreateVirtualObject(u8 graphicsId, u8 virtualObjId, s16 x, s16 y, u8 elevation, u8 direction); void TurnVirtualObject(u8 virtualObjId, u8 direction); diff --git a/include/evolution_graphics.h b/include/evolution_graphics.h index eab5c6eb70..52586fc4f5 100644 --- a/include/evolution_graphics.h +++ b/include/evolution_graphics.h @@ -8,6 +8,6 @@ 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); +u8 CycleEvolutionMonSprite(u8 preEvoSpriteId, u8 postEvoSpriteId); #endif // GUARD_EVOLUTION_GRAPHICS_H diff --git a/include/evolution_scene.h b/include/evolution_scene.h index 25d34eddfb..1b8999c775 100644 --- a/include/evolution_scene.h +++ b/include/evolution_scene.h @@ -1,9 +1,9 @@ #ifndef GUARD_EVOLUTION_SCENE_H #define GUARD_EVOLUTION_SCENE_H -void BeginEvolutionScene(struct Pokemon *mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID); -void EvolutionScene(struct Pokemon *mon, u16 speciesToEvolve, bool8 canStopEvo, u8 partyID); -void TradeEvolutionScene(struct Pokemon *mon, u16 speciesToEvolve, u8 preEvoSpriteID, u8 partyID); +void BeginEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId); +void EvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, bool8 canStopEvo, u8 partyId); +void TradeEvolutionScene(struct Pokemon *mon, u16 postEvoSpecies, u8 preEvoSpriteId, u8 partyId); extern void (*gCB2_AfterEvolution)(void); diff --git a/include/faraway_island.h b/include/faraway_island.h index 9fd2a69fc4..f7cef9b8c3 100755 --- a/include/faraway_island.h +++ b/include/faraway_island.h @@ -2,9 +2,9 @@ #define GUARD_FARAWAY_ISLAND_H u32 GetMewMoveDirection(void); -bool8 ShouldMewShakeGrass(struct ObjectEvent *); +bool8 ShouldMewShakeGrass(struct ObjectEvent *objectEvent); void UpdateFarawayIslandStepCounter(void); -bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *); +bool8 ObjectEventIsFarawayIslandMew(struct ObjectEvent *objectEvent); bool8 IsMewPlayingHideAndSeek(void); #endif // GUARD_FARAWAY_ISLAND_H diff --git a/include/field_camera.h b/include/field_camera.h index 6e8af1a539..edbd2c09fa 100644 --- a/include/field_camera.h +++ b/include/field_camera.h @@ -18,7 +18,7 @@ extern u16 gTotalCameraPixelOffsetY; void DrawWholeMapView(void); void CurrentMapDrawMetatileAt(int x, int y); void GetCameraOffsetWithPan(s16 *x, s16 *y); -void DrawDoorMetatileAt(int x, int y, u16 *arr); +void DrawDoorMetatileAt(int x, int y, u16 *tiles); void ResetFieldCamera(void); void ResetCameraUpdateInfo(void); u32 InitCameraUpdateCallback(u8 trackedSpriteId); diff --git a/include/field_control_avatar.h b/include/field_control_avatar.h index b259eb53c1..c3e4a01e10 100644 --- a/include/field_control_avatar.h +++ b/include/field_control_avatar.h @@ -22,13 +22,12 @@ struct FieldInput u8 dpadDirection; }; -void FieldClearPlayerInput(struct FieldInput *pStruct); -void FieldGetPlayerInput(struct FieldInput *pStruct, u16 keys, u16 heldKeys); -int ProcessPlayerFieldInput(struct FieldInput *pStruct); -void overworld_poison_timer_set(void); +void FieldClearPlayerInput(struct FieldInput *input); +void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys); +int ProcessPlayerFieldInput(struct FieldInput *input); void RestartWildEncounterImmunitySteps(void); const u8 *GetObjectEventScriptPointerPlayerFacing(void); -bool8 TryDoDiveWarp(struct MapPosition *position, u16 b); +bool8 TryDoDiveWarp(struct MapPosition *position, u16 metatileBehavior); int SetCableClubWarp(void); u8 TrySetDiveWarp(void); const u8 *GetInteractedLinkPlayerScript(struct MapPosition *position, u8 metatileBehavior, u8 direction); diff --git a/include/field_door.h b/include/field_door.h index 2e32005c6c..1d8a30ca14 100644 --- a/include/field_door.h +++ b/include/field_door.h @@ -1,10 +1,10 @@ #ifndef GUARD_FIELD_DOOR_H #define GUARD_FIELD_DOOR_H -void FieldSetDoorOpened(u32, u32); -void FieldSetDoorClosed(u32, u32); -s8 FieldAnimateDoorClose(u32, u32); -s8 FieldAnimateDoorOpen(u32, u32); +void FieldSetDoorOpened(u32 x, u32 y); +void FieldSetDoorClosed(u32 x, u32 y); +s8 FieldAnimateDoorClose(u32 x, u32 y); +s8 FieldAnimateDoorOpen(u32 x, u32 y); bool8 FieldIsDoorAnimationRunning(void); u32 GetDoorSoundEffect(u32 x, u32 y); diff --git a/include/field_effect.h b/include/field_effect.h index 4cde29e8a3..699a784cf5 100644 --- a/include/field_effect.h +++ b/include/field_effect.h @@ -9,11 +9,11 @@ extern s32 gFieldEffectArguments[8]; extern void (*gPostMenuFieldCallback)(void); extern bool8 (*gFieldCallback2)(void); -u32 FieldEffectStart(u8); +u32 FieldEffectStart(u8 id); bool8 FieldEffectActiveListContains(u8 id); void FieldEffectActiveListClear(void); void ReturnToFieldFromFlyMapSelect(void); -u8 AddNewGameBirchObject(s16, s16, u8); +u8 AddNewGameBirchObject(s16 x, s16 y, u8 subpriority); void FieldEffectStop(struct Sprite *sprite, u8 id); u8 CreateTrainerSprite(u8 trainerSpriteID, s16 x, s16 y, u8 subpriority, u8 *buffer); void FldEff_TeleportWarpOut(void); @@ -39,8 +39,8 @@ void StartEscalatorWarp(u8 metatileBehavior, u8 priority); void StartLavaridgeGymB1FWarp(u8 priority); void StartLavaridgeGym1FWarp(u8 priority); -void SpriteCB_AshPuff(struct Sprite *); -void SpriteCB_AshLaunch(struct Sprite *); +void SpriteCB_AshPuff(struct Sprite *sprite); +void SpriteCB_AshLaunch(struct Sprite *sprite); void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b); void FreeResourcesAndDestroySprite(struct Sprite *sprite, u8 spriteId); diff --git a/include/field_effect_helpers.h b/include/field_effect_helpers.h index 2ae5d79f75..dfa6d155f6 100644 --- a/include/field_effect_helpers.h +++ b/include/field_effect_helpers.h @@ -13,32 +13,32 @@ enum { }; u8 CreateWarpArrowSprite(void); -u8 StartUnderwaterSurfBlobBobbing(u8 oldSpriteId); +u8 StartUnderwaterSurfBlobBobbing(u8 blobSpriteId); void SetSurfBlob_BobState(u8 spriteId, u8 state); void SetSurfBlob_DontSyncAnim(u8 spriteId, bool8 dontSync); void SetSurfBlob_PlayerOffset(u8 spriteId, bool8 hasOffset, s16 offset); -bool8 UpdateRevealDisguise(struct ObjectEvent *); -void StartRevealDisguise(struct ObjectEvent *); -void StartAshFieldEffect(s16, s16, u16, s16); -void SetUpReflection(struct ObjectEvent *, struct Sprite *, u8); -u32 StartFieldEffectForObjectEvent(u8, struct ObjectEvent *); +bool8 UpdateRevealDisguise(struct ObjectEvent *objectEvent); +void StartRevealDisguise(struct ObjectEvent *objectEvent); +void StartAshFieldEffect(s16 x, s16 y, u16 metatileId, s16 delay); +void SetUpReflection(struct ObjectEvent *objectEvent, struct Sprite *sprite, bool8 stillReflection); +u32 StartFieldEffectForObjectEvent(u8 fieldEffectId, struct ObjectEvent *objectEvent); u8 FindTallGrassFieldEffectSpriteId(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y); -void UpdateRayquazaSpotlightEffect(struct Sprite *); -void UpdateShadowFieldEffect(struct Sprite *); -void UpdateTallGrassFieldEffect(struct Sprite *); -void WaitFieldEffectSpriteAnim(struct Sprite *); -void UpdateAshFieldEffect(struct Sprite *); -void UpdateSurfBlobFieldEffect(struct Sprite *); -void UpdateJumpImpactEffect(struct Sprite *); -void UpdateFootprintsTireTracksFieldEffect(struct Sprite *); -void UpdateSplashFieldEffect(struct Sprite *); -void UpdateLongGrassFieldEffect(struct Sprite *); -void UpdateSandPileFieldEffect(struct Sprite *); -void UpdateDisguiseFieldEffect(struct Sprite *); -void UpdateShortGrassFieldEffect(struct Sprite *); -void UpdateHotSpringsWaterFieldEffect(struct Sprite *); -void UpdateBubblesFieldEffect(struct Sprite *); -void UpdateSparkleFieldEffect(struct Sprite *); +void UpdateRayquazaSpotlightEffect(struct Sprite *sprite); +void UpdateShadowFieldEffect(struct Sprite *sprite); +void UpdateTallGrassFieldEffect(struct Sprite *sprite); +void WaitFieldEffectSpriteAnim(struct Sprite *sprite); +void UpdateAshFieldEffect(struct Sprite *sprite); +void UpdateSurfBlobFieldEffect(struct Sprite *sprite); +void UpdateJumpImpactEffect(struct Sprite *sprite); +void UpdateFootprintsTireTracksFieldEffect(struct Sprite *sprite); +void UpdateSplashFieldEffect(struct Sprite *sprite); +void UpdateLongGrassFieldEffect(struct Sprite *sprite); +void UpdateSandPileFieldEffect(struct Sprite *sprite); +void UpdateDisguiseFieldEffect(struct Sprite *sprite); +void UpdateShortGrassFieldEffect(struct Sprite *sprite); +void UpdateHotSpringsWaterFieldEffect(struct Sprite *sprite); +void UpdateBubblesFieldEffect(struct Sprite *sprite); +void UpdateSparkleFieldEffect(struct Sprite *sprite); void SetSpriteInvisible(u8 spriteId); void ShowWarpArrowSprite(u8 spriteId, u8 direction, s16 x, s16 y); diff --git a/include/field_message_box.h b/include/field_message_box.h index 34b3324e72..3a4c4f93c4 100644 --- a/include/field_message_box.h +++ b/include/field_message_box.h @@ -9,10 +9,10 @@ enum FIELD_MESSAGE_BOX_AUTO_SCROLL, }; -bool8 ShowFieldMessage(const u8 *message); -bool8 ShowPokenavFieldMessage(const u8 *message); +bool8 ShowFieldMessage(const u8 *str); +bool8 ShowPokenavFieldMessage(const u8 *str); bool8 ShowFieldMessageFromBuffer(void); -bool8 ShowFieldAutoScrollMessage(const u8 *message); +bool8 ShowFieldAutoScrollMessage(const u8 *str); void HideFieldMessageBox(void); bool8 IsFieldMessageBoxHidden(void); u8 GetFieldMessageBoxMode(void); diff --git a/include/field_player_avatar.h b/include/field_player_avatar.h index 39fc886af8..005a48f2d5 100644 --- a/include/field_player_avatar.h +++ b/include/field_player_avatar.h @@ -3,11 +3,11 @@ void PlayerStep(u8 direction, u16 newKeys, u16 heldKeys); void ClearPlayerAvatarInfo(void); -void SetPlayerAvatarExtraStateTransition(u8, u8); -u8 GetPlayerAvatarGenderByGraphicsId(u8); -bool8 TestPlayerAvatarFlags(u8); +void SetPlayerAvatarExtraStateTransition(u8 graphicsId, u8 transitionFlag); +u8 GetPlayerAvatarGenderByGraphicsId(u8 gfxId); +u8 TestPlayerAvatarFlags(u8 flag); u8 GetPlayerAvatarSpriteId(void); -void PlayerGetDestCoords(s16 *, s16 *); +void PlayerGetDestCoords(s16 *x, s16 *y); u8 GetPlayerFacingDirection(void); u8 GetPlayerMovementDirection(void); u8 PlayerGetCopyableMovement(void); @@ -36,8 +36,8 @@ void CancelPlayerForcedMovement(void); void InitPlayerAvatar(s16 x, s16 y, u8 direction, u8 gender); void PlayerFreeze(void); void StopPlayerAvatar(void); -void SetSpinStartFacingDir(u8); -void GetXYCoordsOneStepInFrontOfPlayer(s16 *xPtr, s16 *yPtr); +void SetSpinStartFacingDir(u8 direction); +void GetXYCoordsOneStepInFrontOfPlayer(s16 *x, s16 *y); u8 GetRivalAvatarGraphicsIdByStateIdAndGender(u8 state, u8 gender); void SetPlayerAvatarFieldMove(void); u8 GetPlayerAvatarGraphicsIdByCurrentState(void); @@ -50,8 +50,8 @@ bool8 IsPlayerSurfingNorth(void); void SetPlayerAvatarWatering(u8 direction); u8 GetPlayerAvatarFlags(void); void UpdatePlayerAvatarTransitionState(void); -u8 GetFRLGAvatarGraphicsIdByGender(u8); -u8 GetRSAvatarGraphicsIdByGender(u8); +u8 GetFRLGAvatarGraphicsIdByGender(u8 gender); +u8 GetRSAvatarGraphicsIdByGender(u8 gender); void PlayerWheelieInPlace(u8 direction); void PlayerWheelieMove(u8 direction); void PlayerPopWheelieWhileMoving(u8 direction); diff --git a/include/field_specials.h b/include/field_specials.h index faf71e9c08..e0ec16f666 100644 --- a/include/field_specials.h +++ b/include/field_specials.h @@ -5,7 +5,7 @@ extern bool8 gBikeCyclingChallenge; extern u8 gBikeCollisions; u8 GetLeadMonIndex(void); -u8 IsDestinationBoxFull(void); +bool8 IsDestinationBoxFull(void); u16 GetPCBoxToSendMon(void); bool8 InMultiPartnerRoom(void); void UpdateTrainerFansAfterLinkBattle(void); diff --git a/include/fieldmap.h b/include/fieldmap.h index 47072bd1be..212dfb65a6 100644 --- a/include/fieldmap.h +++ b/include/fieldmap.h @@ -23,19 +23,19 @@ extern struct BackupMapLayout gBackupMapLayout; -u32 MapGridGetMetatileIdAt(int, int); -u32 MapGridGetMetatileBehaviorAt(int, int); -void MapGridSetMetatileIdAt(int, int, u16); -void MapGridSetMetatileEntryAt(int, int, u16); -void GetCameraCoords(u16 *, u16 *); -u8 MapGridGetCollisionAt(int, int); +u32 MapGridGetMetatileIdAt(int x, int y); +u32 MapGridGetMetatileBehaviorAt(int x, int y); +void MapGridSetMetatileIdAt(int x, int y, u16 metatile); +void MapGridSetMetatileEntryAt(int x, int y, u16 metatile); +void GetCameraCoords(u16 *x, u16 *y); +u8 MapGridGetCollisionAt(int x, int y); int GetMapBorderIdAt(int x, int y); bool32 CanCameraMoveInDirection(int direction); -u16 GetMetatileAttributesById(u16 metatileId); +u16 GetMetatileAttributesById(u16 metatile); void GetCameraFocusCoords(u16 *x, u16 *y); u8 MapGridGetMetatileLayerTypeAt(int x, int y); u8 MapGridGetElevationAt(int x, int y); -bool8 CameraMove(int deltaX, int deltaY); +bool8 CameraMove(int x, int y); void SaveMapView(void); void SetCameraFocusCoords(u16 x, u16 y); void InitMap(void); @@ -46,8 +46,8 @@ void CopyMapTilesetsToVram(struct MapLayout const *mapLayout); void LoadMapTilesetPalettes(struct MapLayout const *mapLayout); void LoadSecondaryTilesetPalette(struct MapLayout const *mapLayout); void CopySecondaryTilesetToVramUsingHeap(struct MapLayout const *mapLayout); -void CopyPrimaryTilesetToVram(const struct MapLayout *); -void CopySecondaryTilesetToVram(const struct MapLayout *); +void CopyPrimaryTilesetToVram(struct MapLayout const *mapLayout); +void CopySecondaryTilesetToVram(struct MapLayout const *mapLayout); const struct MapHeader *const GetMapHeaderFromConnection(const struct MapConnection *connection); const struct MapConnection *GetMapConnectionAtPos(s16 x, s16 y); void MapGridSetMetatileImpassabilityAt(int x, int y, bool32 impassable); diff --git a/include/fldeff.h b/include/fldeff.h index 0ad0e3d606..e4c128c20f 100644 --- a/include/fldeff.h +++ b/include/fldeff.h @@ -13,7 +13,7 @@ extern const struct SpritePalette gSpritePalette_CutGrass; extern struct MapPosition gPlayerFacingPosition; // escalator -void StartEscalator(bool8 var); +void StartEscalator(bool8 goingUp); void StopEscalator(void); bool8 IsEscalatorMoving(void); diff --git a/include/image_processing_effects.h b/include/image_processing_effects.h index 7f726707cd..20ee822e46 100755 --- a/include/image_processing_effects.h +++ b/include/image_processing_effects.h @@ -46,8 +46,8 @@ struct ImageProcessingContext u8 personality; }; -void ApplyImageProcessingEffects(struct ImageProcessingContext *); -void ApplyImageProcessingQuantization(struct ImageProcessingContext *); -void ConvertImageProcessingToGBA(struct ImageProcessingContext *); +void ApplyImageProcessingEffects(struct ImageProcessingContext *context); +void ApplyImageProcessingQuantization(struct ImageProcessingContext *context); +void ConvertImageProcessingToGBA(struct ImageProcessingContext *context); #endif diff --git a/include/international_string_util.h b/include/international_string_util.h index b0ac8afb6b..454c92be74 100644 --- a/include/international_string_util.h +++ b/include/international_string_util.h @@ -4,7 +4,7 @@ #include "menu.h" #include "list_menu.h" -void ConvertInternationalPlayerName(u8 *src); +void ConvertInternationalPlayerName(u8 *str); void TVShowConvertInternationalString(u8 *dest, const u8 *src, int language); int GetStringCenterAlignXOffset(int fontId, const u8 *str, int totalWidth); int GetStringRightAlignXOffset(int fontId, const u8 *str, int totalWidth); @@ -16,9 +16,9 @@ int Intl_GetListMenuWidth(const struct ListMenuTemplate *listMenu); void CopyMonCategoryText(int dexNum, u8 *dest); u8 *GetStringClearToWidth(u8 *dest, int fontId, const u8 *str, int totalStringWidth); void PadNameString(u8 *dest, u8 padChar); -void ConvertInternationalPlayerNameStripChar(u8 *, u8); -void ConvertInternationalContestantName(u8 *); -int GetNicknameLanguage(u8 *); +void ConvertInternationalPlayerNameStripChar(u8 *str, u8 removeChar); +void ConvertInternationalContestantName(u8 *str); +int GetNicknameLanguage(u8 *str); void FillWindowTilesByRow(int windowId, int columnStart, int rowStart, int numFillTiles, int numRows); #endif // GUARD_INTERNATIONAL_STRING_UTIL_H diff --git a/include/intro.h b/include/intro.h index 8ba030a287..a279809011 100644 --- a/include/intro.h +++ b/include/intro.h @@ -8,6 +8,6 @@ // Exported ROM declarations void CB2_InitCopyrightScreenAfterBootup(void); void CB2_InitCopyrightScreenAfterTitleScreen(void); -void PanFadeAndZoomScreen(u16, u16, u16, u16); +void PanFadeAndZoomScreen(u16 screenX, u16 screenY, u16 zoom, u16 alpha); #endif // GUARD_INTRO_H diff --git a/include/intro_credits_graphics.h b/include/intro_credits_graphics.h index c6f4a73c55..b37846f345 100644 --- a/include/intro_credits_graphics.h +++ b/include/intro_credits_graphics.h @@ -35,10 +35,10 @@ extern const struct SpritePalette gSpritePalettes_Credits[]; void LoadIntroPart2Graphics(u8 scenery); void SetIntroPart2BgCnt(u8 scenery); -void LoadCreditsSceneGraphics(u8); -void SetCreditsSceneBgCnt(u8); +void LoadCreditsSceneGraphics(u8 scene); +void SetCreditsSceneBgCnt(u8 scene); u8 CreateBicycleBgAnimationTask(u8 mode, u16 bg1Speed, u16 bg2Speed, u16 bg3Speed); -void CycleSceneryPalette(u8); +void CycleSceneryPalette(u8 mode); u8 CreateIntroBrendanSprite(s16 x, s16 y); u8 CreateIntroMaySprite(s16 x, s16 y); u8 CreateIntroFlygonSprite(s16 x, s16 y); diff --git a/include/item_menu.h b/include/item_menu.h index 88f6a8733b..dc7b44a0d6 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -96,7 +96,7 @@ void CB2_BagMenuFromStartMenu(void); u8 GetItemListPosition(u8 pocketId); bool8 UseRegisteredKeyItemOnField(void); void CB2_GoToSellMenu(void); -void GoToBagMenu(u8 bagMenuType, u8 pocketId, void ( *exitCallback)()); +void GoToBagMenu(u8 location, u8 pocket, void ( *exitCallback)()); void DoWallyTutorialBagMenu(void); void ResetBagScrollPositions(void); void ChooseBerryForMachine(void (*exitCallback)(void)); @@ -104,8 +104,8 @@ void CB2_ChooseBerry(void); void Task_FadeAndCloseBagMenu(u8 taskId); void BagMenu_YesNo(u8 taskId, u8 windowType, const struct YesNoFuncTable *funcTable); void UpdatePocketItemList(u8 pocketId); -void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void ( *callback)(u8 taskId)); -void DisplayItemMessageOnField(u8 taskId, const u8 *src, TaskFunc callback); +void DisplayItemMessage(u8 taskId, u8 fontId, const u8 *str, void (*callback)(u8 taskId)); +void DisplayItemMessageOnField(u8 taskId, const u8 *string, TaskFunc callback); void CloseItemMessage(u8 taskId); #endif //GUARD_ITEM_MENU_H diff --git a/include/item_use.h b/include/item_use.h index f577f8d464..8e28a4229c 100644 --- a/include/item_use.h +++ b/include/item_use.h @@ -1,37 +1,36 @@ #ifndef GUARD_ITEM_USE_H #define GUARD_ITEM_USE_H -void ItemUseOutOfBattle_Mail(u8); -void ItemUseOutOfBattle_Bike(u8); -void ItemUseOutOfBattle_Rod(u8); -void ItemUseOutOfBattle_Itemfinder(u8); -void ItemUseOutOfBattle_PokeblockCase(u8); -void ItemUseOutOfBattle_CoinCase(u8); -void ItemUseOutOfBattle_PowderJar(u8); -void ItemUseOutOfBattle_SSTicket(u8); -void ItemUseOutOfBattle_WailmerPail(u8); -void ItemUseOutOfBattle_Medicine(u8); -void ItemUseOutOfBattle_ReduceEV(u8); -void ItemUseOutOfBattle_SacredAsh(u8); -void ItemUseOutOfBattle_PPRecovery(u8); -void ItemUseOutOfBattle_PPUp(u8); -void ItemUseOutOfBattle_RareCandy(u8); -void ItemUseOutOfBattle_TMHM(u8); -void ItemUseOutOfBattle_Repel(u8); -void ItemUseOutOfBattle_EscapeRope(u8); -void ItemUseOutOfBattle_BlackWhiteFlute(u8); -void ItemUseOutOfBattle_EvolutionStone(u8); -void ItemUseOutOfBattle_Berry(u8); -void ItemUseOutOfBattle_EnigmaBerry(u8); -void ItemUseOutOfBattle_CannotUse(u8); -void ItemUseInBattle_PokeBall(u8); -void ItemUseInBattle_StatIncrease(u8); -void ItemUseInBattle_Medicine(u8); -void ItemUseInBattle_PPRecovery(u8); -void ItemUseInBattle_Escape(u8); -void ItemUseInBattle_EnigmaBerry(u8); +void ItemUseOutOfBattle_Mail(u8 taskId); +void ItemUseOutOfBattle_Bike(u8 taskId); +void ItemUseOutOfBattle_Rod(u8 taskId); +void ItemUseOutOfBattle_Itemfinder(u8 var); +void ItemUseOutOfBattle_PokeblockCase(u8 taskId); +void ItemUseOutOfBattle_CoinCase(u8 taskId); +void ItemUseOutOfBattle_PowderJar(u8 taskId); +void ItemUseOutOfBattle_WailmerPail(u8 taskId); +void ItemUseOutOfBattle_Medicine(u8 taskId); +void ItemUseOutOfBattle_ReduceEV(u8 taskId); +void ItemUseOutOfBattle_SacredAsh(u8 taskId); +void ItemUseOutOfBattle_PPRecovery(u8 taskId); +void ItemUseOutOfBattle_PPUp(u8 taskId); +void ItemUseOutOfBattle_RareCandy(u8 taskId); +void ItemUseOutOfBattle_TMHM(u8 taskId); +void ItemUseOutOfBattle_Repel(u8 taskId); +void ItemUseOutOfBattle_EscapeRope(u8 taskId); +void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId); +void ItemUseOutOfBattle_EvolutionStone(u8 taskId); +void ItemUseOutOfBattle_Berry(u8 taskId); +void ItemUseOutOfBattle_EnigmaBerry(u8 taskId); +void ItemUseOutOfBattle_CannotUse(u8 taskId); +void ItemUseInBattle_PokeBall(u8 taskId); +void ItemUseInBattle_StatIncrease(u8 taskId); +void ItemUseInBattle_Medicine(u8 taskId); +void ItemUseInBattle_PPRecovery(u8 taskId); +void ItemUseInBattle_Escape(u8 taskId); +void ItemUseInBattle_EnigmaBerry(u8 taskId); void Task_UseDigEscapeRopeOnField(u8 taskId); -u8 CanUseDigOrEscapeRopeOnCurMap(void); +bool8 CanUseDigOrEscapeRopeOnCurMap(void); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); #endif // GUARD_ITEM_USE_H diff --git a/include/librfu.h b/include/librfu.h index 4bde381ef2..0bd4dc6c0d 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -519,7 +519,7 @@ void rfu_REQ_endSearchParent(void); void rfu_REQ_startConnectParent(u16 pid); void rfu_REQ_pollConnectParent(void); void rfu_REQ_endConnectParent(void); -u16 rfu_getConnectParentStatus(u8 *status,u8 *connectSlotNo); +u16 rfu_getConnectParentStatus(u8 *status, u8 *connectSlotNo); // Restore link from child device void rfu_REQ_CHILD_startConnectRecovery(u8 bmRecoverySlot); void rfu_REQ_CHILD_pollConnectRecovery(void); @@ -611,7 +611,7 @@ void STWI_send_DataRxREQ(void); void STWI_send_MS_ChangeREQ(void); void STWI_send_StopModeREQ(void); void STWI_send_SystemStatusREQ(void); -void STWI_send_GameConfigREQ(const u8 *serial_uname, const u8 *gname); +void STWI_send_GameConfigREQ(const u8 *serial_gname, const u8 *uname); void STWI_send_ResetREQ(void); void STWI_send_LinkStatusREQ(void); void STWI_send_VersionStatusREQ(void); diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h index d3cce4ca83..0f2b4f19dd 100644 --- a/include/lilycove_lady.h +++ b/include/lilycove_lady.h @@ -8,7 +8,7 @@ void FieldCallback_FavorLadyEnableScriptContexts(void); void FieldCallback_QuizLadyEnableScriptContexts(void); void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady); bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock); -void BufferContestLadyMonName(u8 *dest1, u8 *dest2); +void BufferContestLadyMonName(u8 *category, u8 *nickname); void BufferContestLadyPlayerName(u8 *dest); void BufferContestLadyLanguage(u8 *dest); void BufferContestName(u8 *dest, u8 category); diff --git a/include/link.h b/include/link.h index a1189ff1e1..1fc9c43a08 100644 --- a/include/link.h +++ b/include/link.h @@ -255,21 +255,21 @@ bool8 IsWirelessAdapterConnected(void); void Task_DestroySelf(u8 taskId); void OpenLink(void); void CloseLink(void); -u16 LinkMain2(const u16 *); +u16 LinkMain2(const u16 *heldKeys); void ClearLinkCallback(void); void ClearLinkCallback_2(void); u8 GetLinkPlayerCount(void); void OpenLinkTimed(void); -u8 GetLinkPlayerDataExchangeStatusTimed(int lower, int upper); +u8 GetLinkPlayerDataExchangeStatusTimed(int minPlayers, int maxPlayers); bool8 IsLinkPlayerDataExchangeComplete(void); -u32 GetLinkPlayerTrainerId(u8); +u32 GetLinkPlayerTrainerId(u8 who); void ResetLinkPlayers(void); u8 GetMultiplayerId(void); u8 BitmaskAllOtherLinkPlayers(void); -bool8 SendBlock(u8, const void *, u16); +bool8 SendBlock(u8 unused, const void *src, u16 size); u8 GetBlockReceivedStatus(void); void ResetBlockReceivedFlags(void); -void ResetBlockReceivedFlag(u8); +void ResetBlockReceivedFlag(u8 who); u8 GetLinkPlayerCount_2(void); bool8 IsLinkMaster(void); void CB2_LinkError(void); @@ -293,7 +293,7 @@ bool8 HandleLinkConnection(void); void SetLinkDebugValues(u32 seed, u32 flags); void SetBerryBlenderLinkCallback(void); void SetSuppressLinkErrorMessage(bool8 flag); -void ConvertLinkPlayerName(struct LinkPlayer *linkPlayer); +void ConvertLinkPlayerName(struct LinkPlayer *player); void ClearSavedLinkPlayers(void); void SetLinkErrorBuffer(u32 status, u8 lastSendQueueCount, u8 lastRecvQueueCount, bool8 disconnected); void LocalLinkPlayerToBlock(void); @@ -331,10 +331,10 @@ extern u16 gLinkSavedIme; extern struct LinkPlayer gLocalLinkPlayer; bool32 Link_AnyPartnersPlayingRubyOrSapphire(void); -bool32 LinkDummy_Return2(void); -void SetLocalLinkPlayerId(u8); +u32 LinkDummy_Return2(void); +void SetLocalLinkPlayerId(u8 playerId); u8 GetSavedPlayerCount(void); -bool8 SendBlockRequest(u8 type); +bool8 SendBlockRequest(u8 blockReqType); u8 GetLinkPlayerCountAsBitFlags(void); u8 GetSavedLinkPlayerCountAsBitFlags(void); void SetCloseLinkCallbackHandleJP(void); diff --git a/include/link_rfu.h b/include/link_rfu.h index 1575255f3d..a42f959c13 100644 --- a/include/link_rfu.h +++ b/include/link_rfu.h @@ -268,7 +268,7 @@ void RfuVSync(void); void RfuSetIgnoreError(bool32 enable); u8 RfuGetStatus(void); struct RfuGameData *GetHostRfuGameData(void); -void UpdateGameData_GroupLockedIn(u8 startedActivity); +void UpdateGameData_GroupLockedIn(bool8 startedActivity); void RfuSetErrorParams(u32 errorInfo); void RfuSetStatus(u8 status, u16 errorInfo); u8 Rfu_SetLinkRecovery(bool32 enable); @@ -320,8 +320,8 @@ void RfuRecvQueue_Reset(struct RfuRecvQueue *queue); void RfuSendQueue_Reset(struct RfuSendQueue *queue); void RfuRecvQueue_Enqueue(struct RfuRecvQueue *queue, u8 *data); void RfuSendQueue_Enqueue(struct RfuSendQueue *queue, u8 *data); -bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *dest); -bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *dest); +bool8 RfuRecvQueue_Dequeue(struct RfuRecvQueue *queue, u8 *src); +bool8 RfuSendQueue_Dequeue(struct RfuSendQueue *queue, u8 *src); void RfuBackupQueue_Enqueue(struct RfuBackupQueue *queue, const u8 *data); bool8 RfuBackupQueue_Dequeue(struct RfuBackupQueue *queue, u8 *src); void InitHostRfuGameData(struct RfuGameData *data, u8 activity, bool32 startedActivity, s32 partnerInfo); diff --git a/include/list_menu.h b/include/list_menu.h index 522c6bae38..f2f7a2b3dd 100644 --- a/include/list_menu.h +++ b/include/list_menu.h @@ -106,7 +106,7 @@ struct CursorStruct extern struct ScrollArrowsTemplate gTempScrollArrowTemplate; extern struct ListMenuTemplate gMultiuseListMenuTemplate; -s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 drawMode, u16 tileNum, u16 palNum); +s32 DoMysteryGiftListMenu(const struct WindowTemplate *windowTemplate, const struct ListMenuTemplate *listMenuTemplate, u8 drawMode, u16 tileNum, u16 palOffset); u8 ListMenuInit(struct ListMenuTemplate *listMenuTemplate, u16 scrollOffset, u16 selectedRow); u8 ListMenuInitInRect(struct ListMenuTemplate *listMenuTemplate, struct ListMenuWindowRect *rect, u16 scrollOffset, u16 selectedRow); s32 ListMenu_ProcessInput(u8 listTaskId); @@ -119,11 +119,11 @@ void ListMenuGetCurrentItemArrayId(u8 listTaskId, u16 *arrayId); void ListMenuGetScrollAndRow(u8 listTaskId, u16 *scrollOffset, u16 *selectedRow); u16 ListMenuGetYCoordForPrintingArrowCursor(u8 listTaskId); void ListMenuOverrideSetColors(u8 cursorPal, u8 fillValue, u8 cursorShadowPal); -void ListMenuDefaultCursorMoveFunc(s32 itemIndex, u8 onInit, struct ListMenu *list); +void ListMenuDefaultCursorMoveFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); s32 ListMenuGetUnkIndicatorsStructFields(u8 taskId, u8 field); void ListMenuSetUnkIndicatorsStructField(u8 taskId, u8 field, s32 value); u8 AddScrollIndicatorArrowPair(const struct ScrollArrowsTemplate *arrowInfo, u16 *scrollOffset); -u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *currItemPtr); +u8 AddScrollIndicatorArrowPairParameterized(u32 arrowType, s32 commonPos, s32 firstPos, s32 secondPos, s32 fullyDownThreshold, s32 tileTag, s32 palTag, u16 *scrollOffset); void RemoveScrollIndicatorArrowPair(u8 taskId); void Task_ScrollIndicatorArrowPairOnMainMenu(u8 taskId); diff --git a/include/main.h b/include/main.h index 5ccb20df88..db3a83f9cc 100644 --- a/include/main.h +++ b/include/main.h @@ -64,7 +64,7 @@ void SetHBlankCallback(IntrCallback callback); void SetVCountCallback(IntrCallback callback); void SetSerialCallback(IntrCallback callback); void InitFlashTimer(void); -void SetTrainerHillVBlankCounter(u32 *var); +void SetTrainerHillVBlankCounter(u32 *counter); void ClearTrainerHillVBlankCounter(void); void DoSoftReset(void); void ClearPokemonCrySongs(void); diff --git a/include/malloc.h b/include/malloc.h index 72e1a5e1d3..69029ccdfe 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -16,6 +16,6 @@ extern u8 gHeap[HEAP_SIZE]; void *Alloc(u32 size); void *AllocZeroed(u32 size); void Free(void *pointer); -void InitHeap(void *pointer, u32 size); +void InitHeap(void *heapStart, u32 heapSize); #endif // GUARD_ALLOC_H diff --git a/include/match_call.h b/include/match_call.h index 8aebb3bc77..ed2cf506c5 100644 --- a/include/match_call.h +++ b/include/match_call.h @@ -16,7 +16,7 @@ bool32 TryStartMatchCall(void); bool32 IsMatchCallTaskActive(void); void StartMatchCallFromScript(const u8 *message); void BufferPokedexRatingForMatchCall(u8 *destStr); -bool32 SelectMatchCallMessage(int, u8 *); +bool32 SelectMatchCallMessage(int trainerId, u8 *str); void LoadMatchCallWindowGfx(u32 windowId, u32 destOffset, u32 paletteId); void DrawMatchCallTextBoxBorder(u32 windowId, u32 tileOffset, u32 paletteId); diff --git a/include/mauville_old_man.h b/include/mauville_old_man.h index 049a3e5c10..dc7d16b743 100644 --- a/include/mauville_old_man.h +++ b/include/mauville_old_man.h @@ -6,7 +6,7 @@ extern struct BardSong gBardSong; void SetMauvilleOldMan(void); u8 GetCurrentMauvilleOldMan(void); void SetMauvilleOldManObjEventGfx(void); -void SanitizeMauvilleOldManForRuby(OldMan *dest); +void SanitizeMauvilleOldManForRuby(union OldMan *oldMan); void SanitizeReceivedRubyOldMan(union OldMan *oldMan, u32 version, u32 language); void SanitizeReceivedEmeraldOldMan(union OldMan *oldMan, u32 version, u32 language); void ResetMauvilleOldManFlag(void); diff --git a/include/menu.h b/include/menu.h index 0b0a42423d..f83ae6852c 100644 --- a/include/menu.h +++ b/include/menu.h @@ -50,7 +50,7 @@ void LoadMessageBoxAndBorderGfx(void); void DrawDialogueFrame(u8 windowId, bool8 copyToVram); void ClearStdWindowAndFrame(u8 windowId, bool8 copyToVram); u16 AddTextPrinterParameterized2(u8 windowId, u8 fontId, const u8 *str, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 fgColor, u8 bgColor, u8 shadowColor); -void PrintPlayerNameOnWindow(u8, const u8 *, u16, u16); +void PrintPlayerNameOnWindow(u8 windowId, const u8 *src, u16 x, u16 y); void ClearDialogWindowAndFrame(u8 windowId, bool8 copyToVram); void SetStandardWindowBorderStyle(u8 windowId, bool8 copyToVram); void DisplayYesNoMenuDefaultYes(void); @@ -61,11 +61,11 @@ void AddTextPrinterWithCallbackForMessage(bool8 canSpeedUp, void (*callback)(str void BgDmaFill(u32 bg, u8 value, int offset, int size); void AddTextPrinterParameterized3(u8 windowId, u8 fontId, u8 left, u8 top, const u8 *color, s8 speed, const u8 *str); void ClearStdWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram); -void SetWindowTemplateFields(struct WindowTemplate *template, u8 priority, u8 tilemapLeft, u8 tilemapTop, u8 width, u8 height, u8 palNum, u16 baseBlock); -void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileStart, u8 palette); -void ScheduleBgCopyTilemapToVram(u8 bgNum); -void PrintMenuTable(u8 windowId, u8 itemCount, const struct MenuAction *strs); -u8 InitMenuInUpperLeftCornerNormal(u8 windowId, u8 numItems, u8 initialCursorPos); +void SetWindowTemplateFields(struct WindowTemplate *template, u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock); +void DrawStdFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 baseTileNum, u8 paletteNum); +void ScheduleBgCopyTilemapToVram(u8 bgId); +void PrintMenuTable(u8 windowId, u8 itemCount, const struct MenuAction *menuActions); +u8 InitMenuInUpperLeftCornerNormal(u8 windowId, u8 itemCount, u8 initialCursorPos); u8 Menu_GetCursorPos(void); s8 Menu_ProcessInput(void); s8 Menu_ProcessInputNoWrap(void); @@ -74,17 +74,17 @@ void ResetTempTileDataBuffers(void); void *DecompressAndCopyTileDataToVram(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); bool8 FreeTempTileDataBuffersIfPossible(void); struct WindowTemplate CreateWindowTemplate(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock); -void CreateYesNoMenu(const struct WindowTemplate *windowTemplate, u16 borderFirstTileNum, u8 borderPalette, u8 initialCursorPos); +void CreateYesNoMenu(const struct WindowTemplate *window, u16 baseTileNum, u8 paletteNum, u8 initialCursorPos); void DecompressAndLoadBgGfxUsingHeap(u8 bgId, const void *src, u32 size, u16 offset, u8 mode); s8 Menu_ProcessInputNoWrapClearOnChoose(void); s8 ProcessMenuInput_other(void); void DoScheduledBgTilemapCopiesToVram(void); void ClearScheduledBgCopiesToVram(void); -void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str); +void AddTextPrinterParameterized4(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineSpacing, const u8 *color, s8 speed, const u8 *str); void DrawDialogFrameWithCustomTileAndPalette(u8 windowId, bool8 copyToVram, u16 tileNum, u8 paletteNum); -void PrintMenuActionTextsInUpperLeftCorner(u8 windowId, u8 optionsNo, const struct MenuAction *actions, const u8 *actionIds); +void PrintMenuActionTextsInUpperLeftCorner(u8 windowId, u8 itemCount, const struct MenuAction *menuActions, const u8 *actionIds); void ClearDialogWindowAndFrameToTransparent(u8 windowId, bool8 copyToVram); -void *malloc_and_decompress(const void *src, u32 *sizeOut); +void *malloc_and_decompress(const void *src, u32 *size); u16 copy_decompressed_tile_data_to_vram(u8 bgId, const void *src, u16 size, u16 offset, u8 mode); void AddTextPrinterForMessage(bool8 allowSkippingDelayWithButtonPress); void PrintMenuActionTexts(u8 windowId, u8 fontId, u8 left, u8 top, u8 letterSpacing, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions, const u8 *actionIds); @@ -95,7 +95,7 @@ u8 GetStartMenuWindowId(void); void ListMenuLoadStdPalAt(u8 palOffset, u8 palId); u8 Menu_MoveCursor(s8 cursorDelta); u8 Menu_MoveCursorNoWrapAround(s8 cursorDelta); -void DrawStdWindowFrame(u8 windowId, bool8 CopyToVram); +void DrawStdWindowFrame(u8 windowId, bool8 copyToVram); u8 AddStartMenuWindow(u8 numActions); u8 InitMenuNormal(u8 windowId, u8 fontId, u8 left, u8 top, u8 cursorHeight, u8 numChoices, u8 initialCursorPos); void LoadMessageBoxAndFrameGfx(u8 windowId, bool8 copyToVram); @@ -108,9 +108,9 @@ u8 GetMapNamePopUpWindowId(void); u8 AddMapNamePopUpWindow(void); void AddTextPrinterParameterized5(u8 windowId, u8 fontId, const u8 *str, u8 left, u8 top, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16), u8 letterSpacing, u8 lineSpacing); void SetBgTilemapPalette(u8 bgId, u8 left, u8 top, u8 width, u8 height, u8 palette); -void AddValToTilemapBuffer(void *ptr, int delta, int width, int height, bool32 is8BPP); +void AddValToTilemapBuffer(void *ptr, int delta, int width, int height, bool32 isAffine); void EraseFieldMessageBox(bool8 copyToVram); -void PrintMenuGridTable(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const struct MenuAction *strs); +void PrintMenuGridTable(u8 windowId, u8 optionWidth, u8 columns, u8 rows, const struct MenuAction *menuActions); s8 Menu_ProcessGridInput(void); u8 InitMenuInUpperLeftCorner(u8 windowId, u8 itemCount, u8 initialCursorPos, bool8 APressMuted); s8 Menu_ProcessInputNoWrapAround_other(void); @@ -122,7 +122,7 @@ void HofPCTopBar_PrintPair(const u8 *string, const u8 *string2, bool8 noBg, u8 l void ResetBgPositions(void); void AddTextPrinterWithCustomSpeedForMessage(bool8 allowSkippingDelayWithButtonPress, u8 speed); void EraseYesNoWindow(void); -void PrintMenuActionTextsAtPos(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *strs); +void PrintMenuActionTextsAtPos(u8 windowId, u8 fontId, u8 left, u8 top, u8 lineHeight, u8 itemCount, const struct MenuAction *menuActions); void Menu_LoadStdPal(void); #endif // GUARD_MENU_H diff --git a/include/menu_specialized.h b/include/menu_specialized.h index a0bd406313..fccd989ffb 100644 --- a/include/menu_specialized.h +++ b/include/menu_specialized.h @@ -112,7 +112,7 @@ bool8 ConditionMenu_UpdateMonExit(struct ConditionGraph *graph, s16 *x); bool8 MoveConditionMonOnscreen(s16 *x); bool8 MoveConditionMonOffscreen(s16 *x); void GetConditionMenuMonNameAndLocString(u8 *locationDst, u8 *nameDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel); -void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *sheen, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel); +void GetConditionMenuMonConditions(struct ConditionGraph *graph, u8 *numSparkles, u16 boxId, u16 monId, u16 partyId, u16 id, u16 numMons, bool8 excludesCancel); void GetConditionMenuMonGfx(void *tilesDst, void *palDst, u16 boxId, u16 monId, u16 partyId, u16 numMons, bool8 excludesCancel); void LoadConditionMonPicTemplate(struct SpriteSheet *sheet, struct SpriteTemplate *template, struct SpritePalette *pal); void LoadConditionSelectionIcons(struct SpriteSheet *sheets, struct SpriteTemplate *template, struct SpritePalette *pals); @@ -121,7 +121,7 @@ s32 GetBoxOrPartyMonData(u16 boxId, u16 monId, s32 request, u8 *dst); // Condition sparkles void LoadConditionSparkle(struct SpriteSheet *sheet, struct SpritePalette *pal); void ResetConditionSparkleSprites(struct Sprite **sprites); -void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 count); +void CreateConditionSparkleSprites(struct Sprite **sprites, u8 monSpriteId, u8 _count); void DestroyConditionSparkleSprites(struct Sprite **sprites); void FreeConditionSparkles(struct Sprite **sprites); diff --git a/include/metatile_behavior.h b/include/metatile_behavior.h index c2d0d23ee3..1afd600837 100644 --- a/include/metatile_behavior.h +++ b/include/metatile_behavior.h @@ -9,144 +9,143 @@ enum { BRIDGE_TYPE_POND_HIGH, }; -bool8 MetatileBehavior_IsATile(u8); -bool8 MetatileBehavior_IsEncounterTile(u8); -bool8 MetatileBehavior_IsJumpEast(u8); -bool8 MetatileBehavior_IsJumpWest(u8); -bool8 MetatileBehavior_IsJumpNorth(u8); -bool8 MetatileBehavior_IsJumpSouth(u8); -bool8 MetatileBehavior_IsPokeGrass(u8); -bool8 MetatileBehavior_IsSandOrDeepSand(u8); -bool8 MetatileBehavior_IsDeepSand(u8); -bool8 MetatileBehavior_IsReflective(u8); -bool8 MetatileBehavior_IsIce(u8); -bool8 MetatileBehavior_IsWarpDoor(u8); -bool8 MetatileBehavior_IsDoor(u8); -bool8 MetatileBehavior_IsEscalator(u8); -bool8 MetatileBehavior_IsLadder(u8); -bool8 MetatileBehavior_IsNonAnimDoor(u8); -bool8 MetatileBehavior_IsDeepSouthWarp(u8); -bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(u8); -bool8 MetatileBehavior_IsEastArrowWarp(u8); -bool8 MetatileBehavior_IsWestArrowWarp(u8); -bool8 MetatileBehavior_IsNorthArrowWarp(u8); -bool8 MetatileBehavior_IsSouthArrowWarp(u8); -bool8 MetatileBehavior_IsArrowWarp(u8); -bool8 MetatileBehavior_IsForcedMovementTile(u8); -bool8 MetatileBehavior_IsIce_2(u8); -bool8 MetatileBehavior_IsTrickHouseSlipperyFloor(u8); -bool8 MetatileBehavior_IsWalkNorth(u8); -bool8 MetatileBehavior_IsWalkSouth(u8); -bool8 MetatileBehavior_IsWalkWest(u8); -bool8 MetatileBehavior_IsWalkEast(u8); -bool8 MetatileBehavior_IsNorthwardCurrent(u8); -bool8 MetatileBehavior_IsSouthwardCurrent(u8); -bool8 MetatileBehavior_IsWestwardCurrent(u8); -bool8 MetatileBehavior_IsEastwardCurrent(u8); -bool8 MetatileBehavior_IsSlideNorth(u8); -bool8 MetatileBehavior_IsSlideSouth(u8); -bool8 MetatileBehavior_IsSlideWest(u8); -bool8 MetatileBehavior_IsSlideEast(u8); -bool8 MetatileBehavior_IsCounter(u8); -bool8 MetatileBehavior_IsPlayerFacingTVScreen(u8 tile, u8 playerDir); -bool8 MetatileBehavior_IsPC(u8); -bool8 MetatileBehavior_IsCableBoxResults1(u8); -bool8 MetatileBehavior_IsOpenSecretBaseDoor(u8); -bool8 MetatileBehavior_IsSecretBaseCave(u8); -bool8 MetatileBehavior_IsSecretBaseTree(u8); -bool8 MetatileBehavior_IsSecretBaseShrub(u8); -bool8 MetatileBehavior_IsSecretBasePC(u8); -bool8 MetatileBehavior_IsRecordMixingSecretBasePC(u8); -bool8 MetatileBehavior_IsSecretBaseTrainerSpot(u8); -bool8 MetatileBehavior_IsSecretBaseImpassable(u8); -bool8 MetatileBehavior_IsSecretBaseDecorationBase(u8); -bool8 MetatileBehavior_IsSecretBasePoster(u8); -bool8 MetatileBehavior_IsNormal(u8); -bool8 MetatileBehavior_IsSecretBaseNorthWall(u8); -bool8 MetatileBehavior_HoldsSmallDecoration(u8); -bool8 MetatileBehavior_HoldsLargeDecoration(u8); -bool8 MetatileBehavior_IsSecretBaseHole(u8); -bool8 MetatileBehavior_IsSecretBaseBalloon(u8); -bool8 MetatileBehavior_IsSecretBaseBreakableDoor(u8); -bool8 MetatileBehavior_IsSecretBaseSoundMat(u8); -bool8 MetatileBehavior_IsSecretBaseGlitterMat(u8); -bool8 MetatileBehavior_IsSecretBaseSandOrnament(u8); -bool8 MetatileBehavior_IsSecretBaseShieldOrToyTV(u8); -bool8 MetatileBehavior_IsPlayerRoomPCOn(u8); -bool8 MetatileBehavior_HasRipples(u8); -bool8 MetatileBehavior_IsPuddle(u8); -bool8 MetatileBehavior_IsTallGrass(u8); -bool8 MetatileBehavior_IsLongGrass(u8); -bool8 MetatileBehavior_IsBerryTreeSoil(u8); -bool8 MetatileBehavior_IsAshGrass(u8); -bool8 MetatileBehavior_IsFootprints(u8); -bool8 MetatileBehavior_IsBridgeOverWater(u8); -u8 MetatileBehavior_GetBridgeType(u8); -bool8 MetatileBehavior_IsBridgeOverWaterNoEdge(u8); -bool8 MetatileBehavior_IsLandWildEncounter(u8); -bool8 MetatileBehavior_IsWaterWildEncounter(u8); -bool8 MetatileBehavior_IsIndoorEncounter(u8); -bool8 MetatileBehavior_IsMountain(u8); -bool8 MetatileBehavior_IsDiveable(u8); -bool8 MetatileBehavior_IsUnableToEmerge(u8); -bool8 MetatileBehavior_IsShallowFlowingWater(u8); -bool8 MetatileBehavior_IsThinIce(u8); -bool8 MetatileBehavior_IsCrackedIce(u8); -bool8 MetatileBehavior_IsDeepOrOceanWater(u8); -bool8 MetatileBehavior_IsSurfableAndNotWaterfall(u8); -bool8 MetatileBehavior_IsEastBlocked(u8); -bool8 MetatileBehavior_IsWestBlocked(u8); -bool8 MetatileBehavior_IsNorthBlocked(u8); -bool8 MetatileBehavior_IsSouthBlocked(u8); -bool8 MetatileBehavior_IsShortGrass(u8); -bool8 MetatileBehavior_IsHotSprings(u8); -bool8 MetatileBehavior_IsWaterfall(u8); -bool8 MetatileBehavior_IsFortreeBridge(u8); -bool8 MetatileBehavior_IsPacifidlogVerticalLogTop(u8); -bool8 MetatileBehavior_IsPacifidlogVerticalLogBottom(u8); -bool8 MetatileBehavior_IsPacifidlogHorizontalLogLeft(u8); -bool8 MetatileBehavior_IsPacifidlogHorizontalLogRight(u8); -bool8 MetatileBehavior_IsPacifidlogLog(u8); -bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8); -bool8 MetatileBehavior_IsRegionMap(u8); -bool8 MetatileBehavior_IsClosedSootopolisDoor(u8); -bool8 MetatileBehavior_IsSkyPillarClosedDoor(u8); -bool8 MetatileBehavior_IsRoulette(u8); -bool8 MetatileBehavior_IsPokeblockFeeder(u8); -bool8 MetatileBehavior_IsSecretBaseJumpMat(u8); -bool8 MetatileBehavior_IsSecretBaseSpinMat(u8); -bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8); -bool8 MetatileBehavior_IsLavaridge1FWarp(u8); -bool8 MetatileBehavior_IsAquaHideoutWarp(u8); -bool8 MetatileBehavior_IsUnionRoomWarp(u8); -bool8 MetatileBehavior_IsMossdeepGymWarp(u8); -bool8 MetatileBehavior_IsSurfableFishableWater(u8); -bool8 MetatileBehavior_IsMtPyreHole(u8); -bool8 MetatileBehavior_IsCrackedFloorHole(u8); -bool8 MetatileBehavior_IsCrackedFloor(u8); -bool8 MetatileBehavior_IsMuddySlope(u8); -bool8 MetatileBehavior_IsBumpySlope(u8); -bool8 MetatileBehavior_IsIsolatedVerticalRail(u8); -bool8 MetatileBehavior_IsIsolatedHorizontalRail(u8); -bool8 MetatileBehavior_IsVerticalRail(u8); -bool8 MetatileBehavior_IsHorizontalRail(u8); -bool8 MetatileBehavior_IsSeaweed(u8); -bool8 MetatileBehavior_IsRunningDisallowed(u8); -bool8 MetatileBehavior_IsCuttableGrass(u8); -bool8 MetatileBehavior_IsRunningShoesManual(u8); -bool8 MetatileBehavior_IsPictureBookShelf(u8); -bool8 MetatileBehavior_IsBookShelf(u8); -bool8 MetatileBehavior_IsPokeCenterBookShelf(u8); -bool8 MetatileBehavior_IsVase(u8); -bool8 MetatileBehavior_IsTrashCan(u8); -bool8 MetatileBehavior_IsShopShelf(u8); -bool8 MetatileBehavior_IsBlueprint(u8); -bool8 MetatileBehavior_IsBattlePyramidWarp(u8); +bool8 MetatileBehavior_IsATile(u8 metatileBehavior); +bool8 MetatileBehavior_IsEncounterTile(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_IsSandOrDeepSand(u8 metatileBehavior); +bool8 MetatileBehavior_IsDeepSand(u8 metatileBehavior); +bool8 MetatileBehavior_IsReflective(u8 metatileBehavior); +bool8 MetatileBehavior_IsIce(u8 metatileBehavior); +bool8 MetatileBehavior_IsWarpDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsEscalator(u8 metatileBehavior); +bool8 MetatileBehavior_IsLadder(u8 metatileBehavior); +bool8 MetatileBehavior_IsNonAnimDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsDeepSouthWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsSurfableWaterOrUnderwater(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 playerDir); +bool8 MetatileBehavior_IsPC(u8 metatileBehavior); +bool8 MetatileBehavior_IsCableBoxResults1(u8 metatileBehavior); +bool8 MetatileBehavior_IsOpenSecretBaseDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseCave(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseTree(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseShrub(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBasePC(u8 metatileBehavior); +bool8 MetatileBehavior_IsRecordMixingSecretBasePC(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseTrainerSpot(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseImpassable(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseDecorationBase(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBasePoster(u8 metatileBehavior); +bool8 MetatileBehavior_IsNormal(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseNorthWall(u8 metatileBehavior); +bool8 MetatileBehavior_HoldsSmallDecoration(u8 metatileBehavior); +bool8 MetatileBehavior_HoldsLargeDecoration(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseHole(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseBalloon(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseBreakableDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseSoundMat(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseGlitterMat(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseSandOrnament(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseShieldOrToyTV(u8 metatileBehavior); +bool8 MetatileBehavior_IsPlayerRoomPCOn(u8 metatileBehavior); +bool8 MetatileBehavior_HasRipples(u8 metatileBehavior); +bool8 MetatileBehavior_IsPuddle(u8 metatileBehavior); +bool8 MetatileBehavior_IsTallGrass(u8 metatileBehavior); +bool8 MetatileBehavior_IsLongGrass(u8 metatileBehavior); +bool8 MetatileBehavior_IsBerryTreeSoil(u8 metatileBehavior); +bool8 MetatileBehavior_IsAshGrass(u8 metatileBehavior); +bool8 MetatileBehavior_IsFootprints(u8 metatileBehavior); +bool8 MetatileBehavior_IsBridgeOverWater(u8 metatileBehavior); +u8 MetatileBehavior_GetBridgeType(u8 metatileBehavior); +bool8 MetatileBehavior_IsBridgeOverWaterNoEdge(u8 metatileBehavior); +bool8 MetatileBehavior_IsLandWildEncounter(u8 metatileBehavior); +bool8 MetatileBehavior_IsWaterWildEncounter(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_IsDeepOrOceanWater(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_IsPacifidlogVerticalLogTop(u8 metatileBehavior); +bool8 MetatileBehavior_IsPacifidlogVerticalLogBottom(u8 metatileBehavior); +bool8 MetatileBehavior_IsPacifidlogHorizontalLogLeft(u8 metatileBehavior); +bool8 MetatileBehavior_IsPacifidlogHorizontalLogRight(u8 metatileBehavior); +bool8 MetatileBehavior_IsPacifidlogLog(u8 metatileBehavior); +bool8 MetatileBehavior_IsTrickHousePuzzleDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsRegionMap(u8 metatileBehavior); +bool8 MetatileBehavior_IsClosedSootopolisDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsSkyPillarClosedDoor(u8 metatileBehavior); +bool8 MetatileBehavior_IsRoulette(u8 metatileBehavior); +bool8 MetatileBehavior_IsPokeblockFeeder(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseJumpMat(u8 metatileBehavior); +bool8 MetatileBehavior_IsSecretBaseSpinMat(u8 metatileBehavior); +bool8 MetatileBehavior_IsLavaridgeB1FWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsLavaridge1FWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsAquaHideoutWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsUnionRoomWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsMossdeepGymWarp(u8 metatileBehavior); +bool8 MetatileBehavior_IsSurfableFishableWater(u8 metatileBehavior); +bool8 MetatileBehavior_IsMtPyreHole(u8 metatileBehavior); +bool8 MetatileBehavior_IsCrackedFloorHole(u8 metatileBehavior); +bool8 MetatileBehavior_IsCrackedFloor(u8 metatileBehavior); +bool8 MetatileBehavior_IsMuddySlope(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_IsCuttableGrass(u8 metatileBehavior); +bool8 MetatileBehavior_IsRunningShoesManual(u8 metatileBehavior); +bool8 MetatileBehavior_IsPictureBookShelf(u8 metatileBehavior); +bool8 MetatileBehavior_IsBookShelf(u8 metatileBehavior); +bool8 MetatileBehavior_IsPokeCenterBookShelf(u8 metatileBehavior); +bool8 MetatileBehavior_IsVase(u8 metatileBehavior); +bool8 MetatileBehavior_IsTrashCan(u8 metatileBehavior); +bool8 MetatileBehavior_IsShopShelf(u8 metatileBehavior); +bool8 MetatileBehavior_IsBlueprint(u8 metatileBehavior); +bool8 MetatileBehavior_IsBattlePyramidWarp(u8 metatileBehavior); bool8 MetatileBehavior_IsPlayerFacingWirelessBoxResults(u8 tile, u8 playerDir); bool8 MetatileBehavior_IsCableBoxResults2(u8 tile, u8 playerDir); -bool8 MetatileBehavior_IsQuestionnaire(u8); -bool8 MetatileBehavior_IsLongGrass_Duplicate(u8); -bool8 MetatileBehavior_IsLongGrassSouthEdge(u8); -bool8 MetatileBehavior_IsTrainerHillTimer(u8); +bool8 MetatileBehavior_IsQuestionnaire(u8 metatileBehavior); +bool8 MetatileBehavior_IsLongGrass_Duplicate(u8 metatileBehavior); +bool8 MetatileBehavior_IsLongGrassSouthEdge(u8 metatileBehavior); +bool8 MetatileBehavior_IsTrainerHillTimer(u8 metatileBehavior); #endif // GUARD_METATILE_BEHAVIOR_H diff --git a/include/move_relearner.h b/include/move_relearner.h index 51b476d25f..76d35b62ec 100644 --- a/include/move_relearner.h +++ b/include/move_relearner.h @@ -2,6 +2,6 @@ #define GUARD_MOVE_RELEARNER_H void TeachMoveRelearnerMove(void); -void MoveRelearnerShowHideHearts(s32); +void MoveRelearnerShowHideHearts(s32 move); #endif //GUARD_MOVE_RELEARNER_H diff --git a/include/mystery_event_script.h b/include/mystery_event_script.h index 198a07e857..09032b4395 100644 --- a/include/mystery_event_script.h +++ b/include/mystery_event_script.h @@ -12,7 +12,7 @@ enum { void InitMysteryEventScriptContext(u8 *script); bool32 RunMysteryEventScriptContextCommand(u32 *status); u32 RunMysteryEventScript(u8 *script); -void SetMysteryEventScriptStatus(u32 val); +void SetMysteryEventScriptStatus(u32 status); u16 GetRecordMixingGift(void); #endif // GUARD_MYSTERY_EVENT_SCRIPT_H diff --git a/include/mystery_gift_client.h b/include/mystery_gift_client.h index b8a0e5d72d..4434fab5f7 100644 --- a/include/mystery_gift_client.h +++ b/include/mystery_gift_client.h @@ -87,6 +87,6 @@ void MysteryGiftClient_Create(bool32 isWonderNews); u32 MysteryGiftClient_Run(u16 *endVal); void MysteryGiftClient_AdvanceState(void); void * MysteryGiftClient_GetMsg(void); -void MysteryGiftClient_SetParam(u32 value); +void MysteryGiftClient_SetParam(u32 val); #endif //GUARD_MYSTERY_GIFT_CLIENT_H diff --git a/include/mystery_gift_link.h b/include/mystery_gift_link.h index 8dc0f56694..5f6b655270 100644 --- a/include/mystery_gift_link.h +++ b/include/mystery_gift_link.h @@ -42,8 +42,8 @@ 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); +u32 MysteryGiftLink_Recv(struct MysteryGiftLink *link); +u32 MysteryGiftLink_Send(struct MysteryGiftLink *link); void MysteryGiftLink_InitRecv(struct MysteryGiftLink *link, u32 ident, void *dest); #endif //GUARD_MYSTERY_GIFT_LINK_H diff --git a/include/mystery_gift_menu.h b/include/mystery_gift_menu.h index 665c4596e7..6d694bc3e1 100644 --- a/include/mystery_gift_menu.h +++ b/include/mystery_gift_menu.h @@ -5,11 +5,11 @@ extern bool8 gGiftIsFromEReader; u16 GetMysteryGiftBaseBlock(void); void CB2_MysteryGiftEReader(void); -void PrintMysteryGiftOrEReaderHeader(bool8 isJapanese, bool32 usePickOkCancel); +void PrintMysteryGiftOrEReaderHeader(bool8 isEReader, bool32 useCancel); void MG_DrawCheckerboardPattern(u32 bg); void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void); bool32 PrintMysteryGiftMenuMessage(u8 *textState, const u8 *str); -void MG_AddMessageTextPrinter(const u8 *src); +void MG_AddMessageTextPrinter(const u8 *str); void CB2_InitEReader(void); void CB2_InitMysteryGift(void); void MG_DrawTextBorder(u8 windowId); diff --git a/include/mystery_gift_server.h b/include/mystery_gift_server.h index d70d3e7da6..e16ebc76d0 100644 --- a/include/mystery_gift_server.h +++ b/include/mystery_gift_server.h @@ -93,8 +93,8 @@ struct MysteryGiftServer struct MysteryGiftLink link; }; -void MysterGiftServer_CreateForCard(); -void MysterGiftServer_CreateForNews(); +void MysterGiftServer_CreateForCard(void); +void MysterGiftServer_CreateForNews(void); u32 MysterGiftServer_Run(u16 *endVal); #endif //GUARD_MYSTERY_GIFT_SERVER_H diff --git a/include/mystery_gift_view.h b/include/mystery_gift_view.h index 7b94aa4d72..4abe7db920 100644 --- a/include/mystery_gift_view.h +++ b/include/mystery_gift_view.h @@ -13,8 +13,8 @@ bool32 WonderCard_Init(struct WonderCard *card, struct WonderCardMetadata *metad bool32 WonderNews_Init(const struct WonderNews *news); s32 WonderCard_Enter(void); s32 WonderNews_Enter(void); -s32 WonderCard_Exit(bool32 flag); -s32 WonderNews_Exit(bool32 flag); +s32 WonderCard_Exit(bool32 useCancel); +s32 WonderNews_Exit(bool32 useCancel); void WonderCard_Destroy(void); void WonderNews_Destroy(void); u32 WonderNews_GetInput(u16 input); diff --git a/include/overworld.h b/include/overworld.h index adaa6aad04..bde6896569 100644 --- a/include/overworld.h +++ b/include/overworld.h @@ -76,7 +76,7 @@ void SetWarpDestination(s8 mapGroup, s8 mapNum, s8 warpId, s8 x, s8 y); void SetWarpDestinationToMapWarp(s8 mapGroup, s8 mapNum, s8 warpId); 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 SetWarpDestinationToDynamicWarp(u8 unused); +void SetWarpDestinationToDynamicWarp(u8 unusedWarpId); void SetWarpDestinationToHealLocation(u8 healLocationId); void SetWarpDestinationToLastHealLocation(void); void SetLastHealLocationWarp(u8 healLocationId); @@ -99,7 +99,7 @@ void SetDefaultFlashLevel(void); void SetFlashLevel(s32 flashLevel); u8 GetFlashLevel(void); void SetCurrentMapLayout(u16 mapLayoutId); -void SetObjectEventLoadFlag(u8 var); +void SetObjectEventLoadFlag(u8 flag); u16 GetLocationMusic(struct WarpData *warp); u16 GetCurrLocationDefaultMusic(void); u16 GetWarpDestinationMusic(void); diff --git a/include/palette_util.h b/include/palette_util.h index 12ffc145e4..a81078f498 100644 --- a/include/palette_util.h +++ b/include/palette_util.h @@ -66,18 +66,18 @@ struct RouletteFlashUtil struct RouletteFlashPalette palettes[16]; }; -int InitPulseBlendPaletteSettings(struct PulseBlend *, const struct PulseBlendSettings *); -void InitPulseBlend(struct PulseBlend *); -void MarkUsedPulseBlendPalettes(struct PulseBlend *, u16, u8); -void UnloadUsedPulseBlendPalettes(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); +int InitPulseBlendPaletteSettings(struct PulseBlend *pulseBlend, const struct PulseBlendSettings *settings); +void InitPulseBlend(struct PulseBlend *pulseBlend); +void MarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection); +void UnloadUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection); +void UnmarkUsedPulseBlendPalettes(struct PulseBlend *pulseBlend, u16 pulseBlendPaletteSelector, u8 multiSelection); +void UpdatePulseBlend(struct PulseBlend *pulseBlend); +void FillTilemapRect(u16 *dest, u16 value, u8 left, u8 top, u8 width, u8 height); void SetTilemapRect(u16 *dest, u16 *src, u8 left, u8 top, u8 width, u8 height); -void RouletteFlash_Run(struct RouletteFlashUtil *r0); -void RouletteFlash_Reset(struct RouletteFlashUtil *r0); -u8 RouletteFlash_Add(struct RouletteFlashUtil *r0, u8 r1, const struct RouletteFlashSettings *r2); -void RouletteFlash_Stop(struct RouletteFlashUtil *r0, u16 r1); -void RouletteFlash_Enable(struct RouletteFlashUtil *r0, u16 r1); +void RouletteFlash_Run(struct RouletteFlashUtil *flash); +void RouletteFlash_Reset(struct RouletteFlashUtil *flash); +u8 RouletteFlash_Add(struct RouletteFlashUtil *flash, u8 id, const struct RouletteFlashSettings *settings); +void RouletteFlash_Stop(struct RouletteFlashUtil *flash, u16 flags); +void RouletteFlash_Enable(struct RouletteFlashUtil *flash, u16 flags); #endif // GUARD_PALETTE_UTIL_H diff --git a/include/party_menu.h b/include/party_menu.h index 15ab57b0a9..386437c121 100644 --- a/include/party_menu.h +++ b/include/party_menu.h @@ -39,7 +39,7 @@ 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); +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); @@ -72,9 +72,9 @@ void OpenPartyMenuInBattle(u8 partyAction); void ChooseMonForInBattleItem(void); void BufferBattlePartyCurrentOrder(void); void BufferBattlePartyCurrentOrderBySide(u8 battler, u8 flankId); -void SwitchPartyOrderLinkMulti(u8 battler, u8 slot, u8 arrayIndex); +void SwitchPartyOrderLinkMulti(u8 battler, u8 slot, u8 slot2); void SwitchPartyMonSlots(u8 slot, u8 slot2); -u8 GetPartyIdFromBattlePartyId(u8 slot); +u8 GetPartyIdFromBattlePartyId(u8 battlePartyId); void ShowPartyMenuToShowcaseMultiBattleParty(void); void ChooseMonForDaycare(void); bool8 CB2_FadeFromPartyMenu(void); diff --git a/include/player_pc.h b/include/player_pc.h index 2521eac131..f2296dde2a 100644 --- a/include/player_pc.h +++ b/include/player_pc.h @@ -17,7 +17,7 @@ extern struct PlayerPCItemPageStruct gPlayerPCItemPageInfo; extern const struct MenuAction gMailboxMailOptions[]; -void ReshowPlayerPC(u8 taskId); +void ReshowPlayerPC(u8 var); void CB2_PlayerPCExitBagMenu(void); void Mailbox_ReturnToMailListAfterDeposit(void); void NewGameInitPCItems(void); diff --git a/include/pokedex.h b/include/pokedex.h index 36a48da1e5..3eb2835d61 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -33,11 +33,11 @@ struct PokedexEntry void ResetPokedex(void); u16 GetPokedexHeightWeight(u16 dexNum, u8 data); -u16 GetNationalPokedexCount(u8); -u16 GetHoennPokedexCount(u8); +u16 GetNationalPokedexCount(u8 caseID); +u16 GetHoennPokedexCount(u8 caseID); u8 DisplayCaughtMonDexPage(u16 dexNum, u32 otId, u32 personality); -s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId); -u16 CreateMonSpriteFromNationalDexNumber(u16, s16, s16, u16); +s8 GetSetPokedexFlag(u16 nationalDexNo, u8 caseID); +u16 CreateMonSpriteFromNationalDexNumber(u16 nationalNum, s16 x, s16 y, u16 paletteSlot); bool16 HasAllHoennMons(void); void ResetPokedexScrollPositions(void); bool16 HasAllMons(void); diff --git a/include/pokedex_area_region_map.h b/include/pokedex_area_region_map.h index 6526d7b458..0a5fc72fc8 100755 --- a/include/pokedex_area_region_map.h +++ b/include/pokedex_area_region_map.h @@ -9,9 +9,9 @@ struct PokedexAreaMapTemplate u32 unk:20; // never read }; -void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *); +void LoadPokedexAreaMapGfx(const struct PokedexAreaMapTemplate *template); bool32 TryShowPokedexAreaMap(void); -void PokedexAreaMapChangeBgY(u32); +void PokedexAreaMapChangeBgY(u32 move); void FreePokedexAreaMapBgNum(void); #endif // GUARD_POKEDEX_AREA_REGION_MAP_H diff --git a/include/pokedex_area_screen.h b/include/pokedex_area_screen.h index 86dfaa6c5b..1aa42b3a26 100755 --- a/include/pokedex_area_screen.h +++ b/include/pokedex_area_screen.h @@ -1,6 +1,6 @@ #ifndef GUARD_POKEDEX_AREA_SCREEN_H #define GUARD_POKEDEX_AREA_SCREEN_H -void ShowPokedexAreaScreen(u16, u8 *); +void ShowPokedexAreaScreen(u16 species, u8 *screenSwitchState); #endif // GUARD_POKEDEX_AREA_SCREEN_H diff --git a/include/pokedex_cry_screen.h b/include/pokedex_cry_screen.h index 3401db22da..c44035605f 100755 --- a/include/pokedex_cry_screen.h +++ b/include/pokedex_cry_screen.h @@ -12,10 +12,10 @@ struct CryScreenWindow extern u8 gDexCryScreenState; -bool8 LoadCryWaveformWindow(struct CryScreenWindow *, u8); -void UpdateCryWaveformWindow(u8); -void CryScreenPlayButton(u16); -bool8 LoadCryMeter(struct CryScreenWindow *, u8); +bool8 LoadCryWaveformWindow(struct CryScreenWindow *window, u8 windowId); +void UpdateCryWaveformWindow(u8 windowId); +void CryScreenPlayButton(u16 species); +bool8 LoadCryMeter(struct CryScreenWindow *window, u8 windowId); void FreeCryScreen(void); #endif diff --git a/include/pokemon.h b/include/pokemon.h index 306cca115e..53f7f02fd0 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -426,14 +426,14 @@ void GiveBoxMonInitialMoveset(struct BoxPokemon *boxMon); u16 MonTryLearningNewMove(struct Pokemon *mon, bool8 firstMove); void DeleteFirstMoveAndGiveMoveToMon(struct Pokemon *mon, u16 move); void DeleteFirstMoveAndGiveMoveToBoxMon(struct BoxPokemon *boxMon, u16 move); -s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 bankAtk, u8 bankDef); +s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *defender, u32 move, u16 sideStatus, u16 powerOverride, u8 typeOverride, u8 battlerIdAtk, u8 battlerIdDef); u8 CountAliveMonsInBattle(u8 caseId); u8 GetDefaultMoveTarget(u8 battler); 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); +void SetMultiuseSpriteTemplateToTrainerBack(u16 trainerPicId, u8 battlerPosition); void SetMultiuseSpriteTemplateToTrainerFront(u16 trainerPicId, u8 battlerPosition); /* GameFreak called Get(Box)MonData with either 2 or 3 arguments, for @@ -469,13 +469,13 @@ void RemoveMonPPBonus(struct Pokemon *mon, u8 moveIndex); void RemoveBattleMonPPBonus(struct BattlePokemon *mon, u8 moveIndex); void CopyPlayerPartyMonToBattleData(u8 battler, u8 partyIndex); bool8 ExecuteTableBasedItemEffect(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex); -bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, u8 e); +bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 moveIndex, bool8 usedByAI); bool8 HealStatusConditions(struct Pokemon *mon, u32 battlePartyId, u32 healMask, u8 battler); u8 GetItemEffectParamOffset(u16 itemId, u8 effectByte, u8 effectBit); u8 *UseStatIncreaseItem(u16 itemId); u8 GetNature(struct Pokemon *mon); u8 GetNatureFromPersonality(u32 personality); -u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem); +u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem); u16 HoennPokedexNumToSpecies(u16 hoennNum); u16 NationalPokedexNumToSpecies(u16 nationalNum); u16 NationalToHoennOrder(u16 nationalNum); @@ -486,10 +486,10 @@ u16 SpeciesToCryId(u16 species); void DrawSpindaSpots(u16 species, u32 personality, u8 *dest, bool8 isFrontPic); void EvolutionRenameMon(struct Pokemon *mon, u16 oldSpecies, u16 newSpecies); u8 GetPlayerFlankId(void); -u16 GetLinkTrainerFlankId(u8 id); +u16 GetLinkTrainerFlankId(u8 linkPlayerId); s32 GetBattlerMultiplayerId(u16 id); u8 GetTrainerEncounterMusicId(u16 trainerOpponentId); -u16 ModifyStatByNature(u8 nature, u16 n, u8 statIndex); +u16 ModifyStatByNature(u8 nature, u16 stat, u8 statIndex); void AdjustFriendship(struct Pokemon *mon, u8 event); void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies); u16 GetMonEVCount(struct Pokemon *mon); diff --git a/include/pokemon_icon.h b/include/pokemon_icon.h index 9b917c3bf4..0964a50e45 100644 --- a/include/pokemon_icon.h +++ b/include/pokemon_icon.h @@ -5,14 +5,14 @@ extern const u8 gMonIconPaletteIndices[]; extern const u8 *const gMonIconTable[]; extern const struct SpritePalette gMonIconPaletteTable[]; -const u8 *GetMonIconTiles(u16 species, bool32); +const u8 *GetMonIconTiles(u16 species, bool32 handleDeoxys); void TryLoadAllMonIconPalettesAtOffset(u16 offset); u8 GetValidMonIconPalIndex(u16 species); -const u8 *GetMonIconPtr(u16 speciesId, u32 personality, u32 frameNo); -const u16 *GetValidMonIconPalettePtr(u16 speciesId); +const u8 *GetMonIconPtr(u16 species, u32 personality, bool32 handleDeoxys); +const u16 *GetValidMonIconPalettePtr(u16 species); u16 GetIconSpecies(u16 species, u32 personality); u16 GetUnownLetterByPersonality(u32 personality); -u16 GetIconSpeciesNoPersonality(u16 speciesId); +u16 GetIconSpeciesNoPersonality(u16 species); void LoadMonIconPalettes(void); void LoadMonIconPalette(u16 species); void FreeMonIconPalettes(void); diff --git a/include/pokenav.h b/include/pokenav.h index f274cfcb23..553d2ad0f6 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -306,7 +306,7 @@ enum { }; // pokenav.c -void SetSelectedConditionSearch(u32); +void SetSelectedConditionSearch(u32 cursorPos); u32 GetSelectedConditionSearch(void); void CB2_InitPokeNav(void); @@ -333,7 +333,7 @@ int PokenavList_MoveCursorDown(void); int PokenavList_PageDown(void); int PokenavList_PageUp(void); bool32 PokenavList_IsMoveWindowTaskActive(void); -void PokenavList_ToggleVerticalArrows(bool32 shouldHide); +void PokenavList_ToggleVerticalArrows(bool32 invisible); void PokenavList_DrawCurrentItemIcon(void); void PokenavList_EraseListForCheckPage(void); bool32 PokenavList_IsTaskActive(void); @@ -359,7 +359,7 @@ void CopyPaletteIntoBufferUnfaded(const u16 *palette, u32 bufferOffset, u32 size void RunMainMenuLoopedTask(u32 state); u32 IsActiveMenuLoopTaskActive(void); void LoadLeftHeaderGfxForIndex(u32 menuGfxId); -void ShowLeftHeaderGfx(u32 menugfxId, bool32 isMain, bool32 isOnRightSide); +void ShowLeftHeaderGfx(u32 menuGfxId, bool32 isMain, bool32 isOnRightSide); void PokenavFadeScreen(s32 fadeType); bool32 AreLeftHeaderSpritesMoving(void); void InitBgTemplates(const struct BgTemplate *templates, int count); @@ -369,7 +369,7 @@ bool32 WaitForHelpBar(void); void SlideMenuHeaderDown(void); bool32 MainMenuLoopedTaskIsBusy(void); void SetLeftHeaderSpritesInvisibility(void); -void PokenavCopyPalette(const u16 *a0, const u16 *a1, int a2, int a3, int a4, u16 *palette); +void PokenavCopyPalette(const u16 *src, const u16 *dest, int size, int a3, int a4, u16 *palette); void FadeToBlackExceptPrimary(void); struct Sprite *GetSpinningPokenavSprite(void); void HideSpinningPokenavSprite(void); @@ -379,7 +379,7 @@ void SlideMenuHeaderUp(void); void PokenavFillPalette(u32 palIndex, u16 fillValue); u32 PokenavMainMenuLoopedTaskIsActive(void); bool32 WaitForPokenavShutdownFade(void); -void SetActiveMenuLoopTasks(void *func1, void *func2); +void SetActiveMenuLoopTasks(void *createLoopTask, void *isLoopTaskActive); // Fix types later. void ShutdownPokenav(void); // pokenav_menu_handler.c @@ -410,11 +410,11 @@ void FreeMatchCallSubstruct1(void); int IsMatchCallListInitFinished(void); int GetNumberRegistered(void); struct PokenavMatchCallEntry *GetMatchCallList(void); -u16 GetMatchCallMapSec(int); +u16 GetMatchCallMapSec(int index); bool32 ShouldDrawRematchPokeballIcon(int index); void ClearRematchPokeballIcon(u16 windowId, u32 tileOffset); int GetMatchCallTrainerPic(int index); -const u8 *GetMatchCallFlavorText(int index, int textType); +const u8 *GetMatchCallFlavorText(int index, int checkPageEntry); const u8 *GetMatchCallMessageText(int index, bool8 *newRematchRequest); u16 GetMatchCallOptionCursorPos(void); u16 GetMatchCallOptionId(int optionId); @@ -422,7 +422,7 @@ void BufferMatchCallNameAndDesc(struct PokenavMatchCallEntry *matchCallEntry, u8 u8 GetMatchTableMapSectionId(int rematchIndex); int GetIndexDeltaOfNextCheckPageDown(int index); int GetIndexDeltaOfNextCheckPageUp(int index); -bool32 IsRematchEntryRegistered(int index); +bool32 IsRematchEntryRegistered(int rematchIndex); // pokenav_match_call_gfx.c bool32 OpenMatchCall(void); @@ -434,14 +434,14 @@ void FreeMatchCallSubstruct2(void); u32 PokenavCallback_Init_RegionMap(void); u32 GetRegionMapCallback(void); bool32 OpenPokenavRegionMap(void); -void CreateRegionMapLoopedTask(s32); +void CreateRegionMapLoopedTask(s32 index); bool32 IsRegionMapLoopedTaskActive(void); void FreeRegionMapSubstruct1(void); void FreeRegionMapSubstruct2(void); // pokenav_conditions.c -u32 PokenavCallback_Init_ConditionGraph_Party(void); -u32 PokenavCallback_Init_ConditionGraph_Search(void); +bool32 PokenavCallback_Init_ConditionGraph_Party(void); +bool32 PokenavCallback_Init_ConditionGraph_Search(void); u32 GetConditionGraphMenuCallback(void); void FreeConditionGraphMenuSubstruct1(void); bool32 LoadConditionGraphMenuGfx(void); @@ -452,47 +452,47 @@ u16 GetMonListCount(void); u8 GetNumConditionMonSparkles(void); bool32 LoadNextConditionMenuMonData(u8 mode); u8 TryGetMonMarkId(void); -u8 *GetConditionMonNameText(u8 id); -u8 *GetConditionMonLocationText(u8 id); +u8 *GetConditionMonNameText(u8 loadId); +u8 *GetConditionMonLocationText(u8 loadId); u16 GetConditionMonDataBuffer(void); -void *GetConditionMonPicGfx(u8 id); -void *GetConditionMonPal(u8 id); +void *GetConditionMonPicGfx(u8 loadId); +void *GetConditionMonPal(u8 loadId); // pokenav_conditions_gfx.c bool32 OpenConditionGraphMenu(void); -void CreateConditionGraphMenuLoopedTask(s32); +void CreateConditionGraphMenuLoopedTask(s32 id); u32 IsConditionGraphMenuLoopedTaskActive(void); void FreeConditionGraphMenuSubstruct2(void); u8 GetMonMarkingsData(void); // pokenav_conditions_search_results.c -u32 PokenavCallback_Init_ConditionSearch(void); -u32 PokenavCallback_Init_ReturnToMonSearchList(void); +bool32 PokenavCallback_Init_ConditionSearch(void); +bool32 PokenavCallback_Init_ReturnToMonSearchList(void); u32 GetConditionSearchResultsCallback(void); void FreeSearchResultSubstruct1(void); bool32 OpenConditionSearchResults(void); bool32 OpenConditionSearchListFromGraph(void); -void CreateSearchResultsLoopedTask(s32); -u32 IsSearchResultLoopedTaskActive(void); +void CreateSearchResultsLoopedTask(s32 idx); +bool32 IsSearchResultLoopedTaskActive(void); void FreeSearchResultSubstruct2(void); // pokenav_ribbons_list.c -u32 PokenavCallback_Init_MonRibbonList(void); -u32 PokenavCallback_Init_RibbonsMonListFromSummary(void); +bool32 PokenavCallback_Init_MonRibbonList(void); +bool32 PokenavCallback_Init_RibbonsMonListFromSummary(void); u32 GetRibbonsMonListCallback(void); void FreeRibbonsMonList(void); bool32 OpenRibbonsMonList(void); bool32 OpenRibbonsMonListFromRibbonsSummary(void); -void CreateRibbonsMonListLoopedTask(s32); -u32 IsRibbonsMonListLoopedTaskActive(void); +void CreateRibbonsMonListLoopedTask(s32 idx); +bool32 IsRibbonsMonListLoopedTaskActive(void); void FreeRibbonsMonMenu(void); // pokenav_ribbons_summary.c -u32 PokenavCallback_Init_RibbonsSummaryMenu(void); +bool32 PokenavCallback_Init_RibbonsSummaryMenu(void); u32 GetRibbonsSummaryMenuCallback(void); void FreeRibbonsSummaryScreen1(void); bool32 OpenRibbonsSummaryMenu(void); -void CreateRibbonsSummaryLoopedTask(s32); +void CreateRibbonsSummaryLoopedTask(s32 id); u32 IsRibbonsSummaryLoopedTaskActive(void); void FreeRibbonsSummaryScreen2(void); diff --git a/include/rayquaza_scene.h b/include/rayquaza_scene.h index 5aa21981eb..422b591273 100644 --- a/include/rayquaza_scene.h +++ b/include/rayquaza_scene.h @@ -1,6 +1,6 @@ #ifndef GUARD_RAYQUAZA_SCENE_H #define GUARD_RAYQUAZA_SCENE_H -void DoRayquazaScene(u8 animId, bool8 endEarly, void (*callback)(void)); +void DoRayquazaScene(u8 animId, bool8 endEarly, void (*exitCallback)(void)); #endif // GUARD_RAYQUAZA_SCENE_H diff --git a/include/recorded_battle.h b/include/recorded_battle.h index 2e61be577c..9e53b55aae 100644 --- a/include/recorded_battle.h +++ b/include/recorded_battle.h @@ -14,7 +14,7 @@ void RecordedBattle_SetBattlerAction(u8 battler, u8 action); void RecordedBattle_ClearBattlerAction(u8 battler, u8 bytesToClear); u8 RecordedBattle_GetBattlerAction(u8 battler); u8 RecordedBattle_BufferNewBattlerData(u8 *dst); -void RecordedBattle_RecordAllBattlerData(u8 *data); +void RecordedBattle_RecordAllBattlerData(u8 *src); bool32 CanCopyRecordedBattleSaveData(void); bool32 MoveRecordedBattleToSaveData(void); void PlayRecordedBattle(void (*CB2_After)(void)); diff --git a/include/region_map.h b/include/region_map.h index 9f0b110a65..2bca9e7f7d 100644 --- a/include/region_map.h +++ b/include/region_map.h @@ -95,7 +95,7 @@ struct RegionMapLocation void InitRegionMapData(struct RegionMap *regionMap, const struct BgTemplate *template, bool8 zoomed); bool8 LoadRegionMapGfx(void); void UpdateRegionMapVideoRegs(void); -void InitRegionMap(struct RegionMap *regionMap, u8 argument); +void InitRegionMap(struct RegionMap *regionMap, bool8 zoomed); u8 DoRegionMapInputCallback(void); bool8 UpdateRegionMapZoom(void); void FreeRegionMapIconResources(void); @@ -103,7 +103,7 @@ u16 GetRegionMapSecIdAt(u16 x, u16 y); void CreateRegionMapPlayerIcon(u16 tileTag, u16 paletteTag); void CreateRegionMapCursor(u16 tileTag, u16 paletteTag); bool32 IsEventIslandMapSecId(u8 mapSecId); -u8 *GetMapName(u8 *, u16, u16); +u8 *GetMapName(u8 *dest, u16 regionMapId, u16 padLength); u8 *GetMapNameGeneric(u8 *dest, u16 mapSecId); u8 *GetMapNameHandleAquaHideout(u8 *dest, u16 mapSecId); u16 CorrectSpecialMapSecId(u16 mapSecId); diff --git a/include/roamer.h b/include/roamer.h index ba1b09b54d..a1814b1375 100644 --- a/include/roamer.h +++ b/include/roamer.h @@ -9,7 +9,7 @@ void RoamerMoveToOtherLocationSet(void); void RoamerMove(void); bool8 IsRoamerAt(u8 mapGroup, u8 mapNum); void CreateRoamerMonInstance(void); -u8 TryStartRoamerEncounter(void); +bool8 TryStartRoamerEncounter(void); void UpdateRoamerHPStatus(struct Pokemon *mon); void SetRoamerInactive(void); void GetRoamerLocation(u8 *mapGroup, u8 *mapNum); diff --git a/include/safari_zone.h b/include/safari_zone.h index 39ee3ccb3e..5336c81057 100644 --- a/include/safari_zone.h +++ b/include/safari_zone.h @@ -16,6 +16,6 @@ void SafariZoneRetirePrompt(void); void CB2_EndSafariBattle(void); struct Pokeblock *SafariZoneGetActivePokeblock(void); -void SafariZoneActivatePokeblockFeeder(u8 pokeblock_index); +void SafariZoneActivatePokeblockFeeder(u8 pkblId); #endif // GUARD_SAFARI_ZONE_H diff --git a/include/scanline_effect.h b/include/scanline_effect.h index 80d9df764d..d9ee9e678c 100644 --- a/include/scanline_effect.h +++ b/include/scanline_effect.h @@ -41,7 +41,7 @@ extern u16 ALIGNED(4) gScanlineEffectRegBuffers[2][0x3C0]; void ScanlineEffect_Stop(void); void ScanlineEffect_Clear(void); -void ScanlineEffect_SetParams(struct ScanlineEffectParams); +void ScanlineEffect_SetParams(struct ScanlineEffectParams params); void ScanlineEffect_InitHBlankDmaTransfer(void); u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets); diff --git a/include/script_menu.h b/include/script_menu.h index 734c717cff..71eb6695bc 100644 --- a/include/script_menu.h +++ b/include/script_menu.h @@ -14,7 +14,7 @@ bool8 (*ScriptMenu_HidePokemonPic(void))(void); int ConvertPixelWidthToTileWidth(int width); u8 CreateWindowFromRect(u8 x, u8 y, u8 width, u8 height); void ClearToTransparentAndRemoveWindow(u8 windowId); -int DisplayTextAndGetWidth(const u8 *str, int width); +int DisplayTextAndGetWidth(const u8 *str, int prevWidth); int ScriptMenu_AdjustLeftCoordFromWidth(int left, int width); bool16 ScriptMenu_CreatePCMultichoice(void); void ScriptMenu_DisplayPCStartupPrompt(void); diff --git a/include/script_pokemon_util.h b/include/script_pokemon_util.h index cae16e40a6..d453c22adc 100644 --- a/include/script_pokemon_util.h +++ b/include/script_pokemon_util.h @@ -1,10 +1,10 @@ #ifndef GUARD_SCRIPT_POKEMON_UTIL_H #define GUARD_SCRIPT_POKEMON_UTIL_H -u8 ScriptGiveMon(u16, u8, u16, u32, u32, u8); -u8 ScriptGiveEgg(u16); -void CreateScriptedWildMon(u16, u8, u16); -void ScriptSetMonMoveSlot(u8, u16, u8); +u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 unused3); +u8 ScriptGiveEgg(u16 species); +void CreateScriptedWildMon(u16 species, u8 level, u16 item); +void ScriptSetMonMoveSlot(u8 monIndex, u16 move, u8 slot); void ReducePlayerPartyToSelectedMons(void); void HealPlayerParty(void); diff --git a/include/secret_base.h b/include/secret_base.h index 567316cf9c..5502194ff2 100644 --- a/include/secret_base.h +++ b/include/secret_base.h @@ -3,7 +3,7 @@ void HideSecretBaseDecorationSprites(void); void CopyCurSecretBaseOwnerName_StrVar1(void); -void ClearJapaneseSecretBases(struct SecretBase *dest); +void ClearJapaneseSecretBases(struct SecretBase *bases); void SetPlayerSecretBaseParty(void); u8 *GetSecretBaseMapName(u8 *dest); const u8 *GetSecretBaseTrainerLoseText(void); @@ -24,6 +24,6 @@ void SetCurSecretBaseIdFromPosition(const struct MapPosition *position, const st void TrySetCurSecretBaseIndex(void); void CheckPlayerHasSecretBase(void); void ToggleSecretBaseEntranceMetatile(void); -void ReceiveSecretBasesData(void *records, size_t recordSize, u8 linkIdx); +void ReceiveSecretBasesData(void *secretBases, size_t recordSize, u8 linkIdx); #endif //GUARD_SECRET_BASE_H diff --git a/include/shop.h b/include/shop.h index 6644ba0aa0..367c06ed6c 100644 --- a/include/shop.h +++ b/include/shop.h @@ -3,9 +3,9 @@ extern struct ItemSlot gMartPurchaseHistory[3]; -void CreatePokemartMenu(const u16 *); -void CreateDecorationShop1Menu(const u16 *); -void CreateDecorationShop2Menu(const u16 *); +void CreatePokemartMenu(const u16 *itemsForSale); +void CreateDecorationShop1Menu(const u16 *itemsForSale); +void CreateDecorationShop2Menu(const u16 *itemsForSale); void CB2_ExitSellMenu(void); #endif // GUARD_SHOP_H diff --git a/include/slot_machine.h b/include/slot_machine.h index 88bbbd91bd..56617b23d7 100644 --- a/include/slot_machine.h +++ b/include/slot_machine.h @@ -1,6 +1,6 @@ #ifndef GUARD_SLOT_MACHINE_H #define GUARD_SLOT_MACHINE_H -void PlaySlotMachine(u8, void (callback)(void)); +void PlaySlotMachine(u8 machineId, MainCallback exitCallback); #endif // GUARD_SLOT_MACHINE_H diff --git a/include/sprite.h b/include/sprite.h index c66e0bd85e..822c986991 100644 --- a/include/sprite.h +++ b/include/sprite.h @@ -298,16 +298,10 @@ 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 LoadTilesForSpriteSheet(const struct SpriteSheet *sheet); -void LoadTilesForSpriteSheets(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); @@ -316,7 +310,7 @@ 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, u8 *oamIndex); +bool8 AddSpriteToOamBuffer(struct Sprite *sprite, u8 *oamIndex); bool8 AddSubspritesToOamBuffer(struct Sprite *sprite, struct OamData *destOam, u8 *oamIndex); void CopyToSprites(u8 *src); void CopyFromSprites(u8 *dest); diff --git a/include/text.h b/include/text.h index db9f4db873..db2415fd6d 100644 --- a/include/text.h +++ b/include/text.h @@ -137,14 +137,14 @@ extern struct TextGlyph gCurGlyph; 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 *template, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)); +bool16 AddTextPrinter(struct TextPrinterTemplate *printerTemplate, u8 speed, void (*callback)(struct TextPrinterTemplate *, u16)); void RunTextPrinters(void); bool16 IsTextPrinterActive(u8 id); 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 void *src_, void *dest_); -void CopyGlyphToWindow(struct TextPrinter *x); +void CopyGlyphToWindow(struct TextPrinter *textPrinter); void ClearTextSpan(struct TextPrinter *textPrinter, u32 width); void TextPrinterInitDownArrowCounters(struct TextPrinter *textPrinter); diff --git a/include/time_events.h b/include/time_events.h index fd6d29f390..f40b9b45ef 100644 --- a/include/time_events.h +++ b/include/time_events.h @@ -1,8 +1,8 @@ #ifndef GUARD_TIME_EVENTS_H #define GUARD_TIME_EVENTS_H -void UpdateMirageRnd(u16); -u8 IsMirageIslandPresent(void); -void UpdateBirchState(u16); +void UpdateMirageRnd(u16 days); +bool8 IsMirageIslandPresent(void); +void UpdateBirchState(u16 days); #endif // GUARD_TIME_EVENTS_H diff --git a/include/trade.h b/include/trade.h index 6b621038fc..33191f0ac6 100644 --- a/include/trade.h +++ b/include/trade.h @@ -14,10 +14,10 @@ void CB2_StartCreateTradeMenu(void); void CB2_LinkTrade(void); int CanRegisterMonForTradingBoard(struct RfuGameCompatibilityData player, u16 species2, u16 species, bool8 isModernFatefulEncounter); int GetUnionRoomTradeMessageId(struct RfuGameCompatibilityData player, struct RfuGameCompatibilityData partner, u16 playerSpecies2, u16 partnerSpecies, u8 requestedType, u16 playerSpecies, bool8 isModernFatefulEncounter); -int CanSpinTradeMon(struct Pokemon *, u16); +int CanSpinTradeMon(struct Pokemon *mon, u16 monIdx); void InitTradeSequenceBgGpuRegs(void); void LinkTradeDrawWindow(void); void LoadTradeAnimGfx(void); -void DrawTextOnTradeWindow(u8, const u8 *, u8); +void DrawTextOnTradeWindow(u8 windowId, const u8 *str, u8 speed); #endif //GUARD_TRADE_H diff --git a/include/trainer_card.h b/include/trainer_card.h index 7c37a84a6c..1faa306aab 100644 --- a/include/trainer_card.h +++ b/include/trainer_card.h @@ -70,6 +70,6 @@ u8 GetTrainerCardStars(u8 cardId); void CopyTrainerCardData(struct TrainerCard *dst, struct TrainerCard *src, u8 gameVersion); void ShowPlayerTrainerCard(void (*callback)(void)); void ShowTrainerCardInLink(u8 cardId, void (*callback)(void)); -void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *); +void TrainerCard_GenerateCardForLinkPlayer(struct TrainerCard *trainerCard); #endif // GUARD_TRAINER_CARD_H diff --git a/include/trainer_see.h b/include/trainer_see.h index ab808c720c..641e05b8b0 100644 --- a/include/trainer_see.h +++ b/include/trainer_see.h @@ -17,7 +17,7 @@ extern bool8 gTrainerApproachedPlayer; extern u8 gApproachingTrainerId; bool8 CheckForTrainersWantingBattle(void); -void SetBuriedTrainerMovement(struct ObjectEvent *var); +void SetBuriedTrainerMovement(struct ObjectEvent *objEvent); void DoTrainerApproach(void); void TryPrepareSecondApproachingTrainer(void); u8 FldEff_ExclamationMarkIcon(void); diff --git a/include/tv.h b/include/tv.h index f47aa532d7..a9a387e95b 100644 --- a/include/tv.h +++ b/include/tv.h @@ -6,7 +6,7 @@ extern u8 *const gTVStringVarPtrs[3]; void ClearTVShowData(void); void TryPutBreakingNewsOnAir(void); void TryPutBattleSeminarOnAir(u16 foeSpecies, u16 species, u8 moveIndex, const u16 *movePtr, u16 betterMove); -void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facility); +void TryPutFrontierTVShowOnAir(u16 winStreak, u8 facilityAndMode); void DoTVShow(void); void DoTVShowInSearchOfTrainers(void); void TryPutTreasureInvestigatorsOnAir(void); @@ -16,7 +16,7 @@ void IncrementDailyPlantedBerries(void); void IncrementDailyPickedBerries(void); void IncrementDailyBattlePoints(u16 delta); void HideBattleTowerReporter(void); -void ReceiveTvShowsData(void *src, u32 size, u8 masterIdx); +void ReceiveTvShowsData(void *src, u32 size, u8 playersLinkId); void TryPutSpotTheCutiesOnAir(struct Pokemon *pokemon, u8 ribbonMonDataIdx); u32 GetPlayerIDAsU32(void); bool8 IsPokeNewsActive(u8 newsKind); @@ -29,7 +29,7 @@ void TryPutFindThatGamerOnAir(u16 nCoinsPaidOut); void TryPutSecretBaseSecretsOnAir(void); void TryPutTodaysRivalTrainerOnAir(void); void TryPutTrendWatcherOnAir(const u16 *words); -void ReceivePokeNewsData(void *src, u32 size, u8 masterIdx); +void ReceivePokeNewsData(void *src, u32 size, u8 playersLinkId); void DeactivateAllNormalTVShows(void); void RecordFishingAttemptForTV(bool8 caughtFish); void IncrementDailySlotsUses(void); @@ -37,8 +37,8 @@ void IncrementDailyRouletteUses(void); void IncrementDailyWildBattles(void); void IncrementDailyBerryBlender(void); void SanitizeTVShowsForRuby(TVShow *shows); -void TryPutSafariFanClubOnAir(u8 nMonsCaught, u8 nPkblkUsed); -bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 unused, u8 sheen, u8 language); +void TryPutSafariFanClubOnAir(u8 monsCaught, u8 pokeblocksUsed); +bool8 Put3CheersForPokeblocksOnTheAir(const u8 *partnersName, u8 flavor, u8 color, u8 sheen, u8 language); void SetPokemonAnglerSpecies(u16 species); void UpdateTVShowsPerDay(u16 days); void TryPutPokemonTodayOnAir(void); @@ -47,7 +47,7 @@ void PutBattleUpdateOnTheAir(u8 opponentLinkPlayerId, u16 move, u16 speciesPlaye void BravoTrainerPokemonProfile_BeforeInterview1(u16 move); void InterviewBefore(void); void InterviewAfter(void); -void UpdateTVScreensOnMap(int, int); +void UpdateTVScreensOnMap(int width, int height); void ConvertIntToDecimalString(u8 varIdx, int value); void TryPutSmartShopperOnAir(void); bool8 ShouldAirFrontierTVShow(void); diff --git a/include/util.h b/include/util.h index 8f2079a0ba..051f1160bf 100644 --- a/include/util.h +++ b/include/util.h @@ -6,9 +6,9 @@ extern const u8 gMiscBlank_Gfx[]; // unused in Emerald extern const u32 gBitTable[]; -u8 CreateInvisibleSpriteWithCallback(void (*)(struct Sprite *)); -void StoreWordInTwoHalfwords(u16 *, u32); -void LoadWordFromTwoHalfwords(u16 *, u32 *); +u8 CreateInvisibleSpriteWithCallback(void (*callback)(struct Sprite *)); +void StoreWordInTwoHalfwords(u16 *h, u32 w); +void LoadWordFromTwoHalfwords(u16 *h, u32 *w); int CountTrailingZeroBits(u32 value); u16 CalcCRC16(const u8 *data, s32 length); u16 CalcCRC16WithTable(const u8 *data, u32 length); diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 8608ec5b16..6e72f6f123 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -29,7 +29,7 @@ struct WildPokemonHeader extern const struct WildPokemonHeader gWildMonHeaders[]; void DisableWildEncounters(bool8 disabled); -bool8 StandardWildEncounter(u16 currMetaTileBehavior, u16 previousMetaTileBehavior); +bool8 StandardWildEncounter(u16 curMetatileBehavior, u16 prevMetatileBehavior); bool8 SweetScentWildEncounter(void); bool8 DoesCurrentMapHaveFishingMons(void); void FishingWildEncounter(u8 rod); diff --git a/src/battle_controllers.c b/src/battle_controllers.c index ad5dab67b7..b55c36b4e1 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -1128,15 +1128,15 @@ void BtlController_EmitMoveAnimation(u8 bufferId, u16 move, u8 turnOfMove, u16 m PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, 16 + sizeof(struct DisableStruct)); } -void BtlController_EmitPrintString(u8 bufferId, u16 stringID) +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; + sBattleBuffersTransferData[2] = stringId; + sBattleBuffersTransferData[3] = (stringId & 0xFF00) >> 8; stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; @@ -1160,15 +1160,15 @@ void BtlController_EmitPrintString(u8 bufferId, u16 stringID) PrepareBufferDataTransfer(bufferId, sBattleBuffersTransferData, sizeof(struct BattleMsgData) + 4); } -void BtlController_EmitPrintSelectionString(u8 bufferId, u16 stringID) +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; + sBattleBuffersTransferData[2] = stringId; + sBattleBuffersTransferData[3] = (stringId & 0xFF00) >> 8; stringInfo = (struct BattleMsgData *)(&sBattleBuffersTransferData[4]); stringInfo->currentMove = gCurrentMove; diff --git a/src/main.c b/src/main.c index 29c026624d..2a47ec51ac 100644 --- a/src/main.c +++ b/src/main.c @@ -86,7 +86,7 @@ void EnableVCountIntrAtLine150(void); #define B_START_SELECT (B_BUTTON | START_BUTTON | SELECT_BUTTON) -void AgbMain() +void AgbMain(void) { // Modern compilers are liberal with the stack on entry to this function, // so RegisterRamReset may crash if it resets IWRAM. diff --git a/src/metatile_behavior.c b/src/metatile_behavior.c index 924428aea4..f8261fd391 100644 --- a/src/metatile_behavior.c +++ b/src/metatile_behavior.c @@ -320,7 +320,7 @@ bool8 MetatileBehavior_IsSouthArrowWarp(u8 metatileBehavior) return FALSE; } -bool8 Unref_MetatileBehavior_IsArrowWarp(u8 metatileBehavior) +bool8 UNUSED Unref_MetatileBehavior_IsArrowWarp(u8 metatileBehavior) { u8 isArrowWarp = FALSE; diff --git a/src/save.c b/src/save.c index d5eb6c3fc6..bff1384c52 100644 --- a/src/save.c +++ b/src/save.c @@ -826,7 +826,7 @@ bool8 LinkFullSave_SetLastSectorSignature(void) return FALSE; } -u8 WriteSaveBlock2(void) +bool8 WriteSaveBlock2(void) { if (gFlashMemoryPresent != TRUE) return TRUE; From bd0a02c45630d6b3666b079593e787de263d0a17 Mon Sep 17 00:00:00 2001 From: Kurausukun Date: Mon, 19 May 2025 10:43:06 -0400 Subject: [PATCH 097/187] Correct C23 Checks (#2144) --- Makefile | 2 +- include/gba/m4a_internal.h | 2 +- include/librfu.h | 2 +- src/librfu_intr.c | 6 +++--- src/m4a.c | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Makefile b/Makefile index 6252664bde..1c7eb46016 100644 --- a/Makefile +++ b/Makefile @@ -115,7 +115,7 @@ INCLUDE_SCANINC_ARGS := $(INCLUDE_DIRS:%=-I %) O_LEVEL ?= 2 CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=$(MODERN) ifeq ($(MODERN),0) - CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef + CPPFLAGS += -I tools/agbcc/include -I tools/agbcc -nostdinc -undef -std=gnu89 CC1 := tools/agbcc/bin/agbcc$(EXE) override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O$(O_LEVEL) -fhex-asm -g LIBPATH := -L ../../tools/agbcc/lib diff --git a/include/gba/m4a_internal.h b/include/gba/m4a_internal.h index a4182c8889..a90771048d 100644 --- a/include/gba/m4a_internal.h +++ b/include/gba/m4a_internal.h @@ -170,7 +170,7 @@ struct SoundChannel struct MusicPlayerInfo; -#if !MODERN +#if __STDC_VERSION__ < 202311L typedef void (*MPlayFunc)(); #else typedef void (*MPlayFunc)(...); diff --git a/include/librfu.h b/include/librfu.h index 0bd4dc6c0d..8125d64043 100644 --- a/include/librfu.h +++ b/include/librfu.h @@ -316,7 +316,7 @@ struct STWIStatus u8 recoveryCount; u8 unk_16; u8 unk_17; -#if !MODERN +#if __STDC_VERSION__ < 202311L void (*callbackM)(); #else void (*callbackM)(...); diff --git a/src/librfu_intr.c b/src/librfu_intr.c index 0426e6459c..5ae53ab4e3 100644 --- a/src/librfu_intr.c +++ b/src/librfu_intr.c @@ -7,7 +7,7 @@ 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); -#if !MODERN +#if __STDC_VERSION__ < 202311L static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()); #else static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)(...)); @@ -139,7 +139,7 @@ static void sio32intr_clock_master(void) } gSTWIStatus->sending = 0; if (gSTWIStatus->callbackM != NULL) -#if !MODERN +#if __STDC_VERSION__ < 202311L Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, gSTWIStatus->callbackM); #else Callback_Dummy_M(gSTWIStatus->reqActiveCommand, gSTWIStatus->error, (void (*)(...))gSTWIStatus->callbackM); @@ -396,7 +396,7 @@ static void STWI_init_slave(void) } NAKED -#if !MODERN +#if __STDC_VERSION__ < 202311L static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)()) #else static void Callback_Dummy_M(int reqCommandId, int error, void (*callbackM)(...)) diff --git a/src/m4a.c b/src/m4a.c index 1344f53080..2ad2261d08 100644 --- a/src/m4a.c +++ b/src/m4a.c @@ -283,7 +283,7 @@ void MPlayExtender(struct CgbChannel *cgbChans) soundInfo->ident++; -#if !MODERN +#if __STDC_VERSION__ < 202311L gMPlayJumpTable[8] = ply_memacc; gMPlayJumpTable[17] = ply_lfos; gMPlayJumpTable[19] = ply_mod; @@ -332,7 +332,7 @@ void MusicPlayerJumpTableCopy(void) void ClearChain(void *x) { -#if !MODERN +#if __STDC_VERSION__ < 202311L void (*func)(void *) = *(&gMPlayJumpTable[34]); #else void (*func)(...) = *(&gMPlayJumpTable[34]); @@ -342,7 +342,7 @@ void ClearChain(void *x) void Clear64byte(void *x) { -#if !MODERN +#if __STDC_VERSION__ < 202311L void (*func)(void *) = *(&gMPlayJumpTable[35]); #else void (*func)(...) = *(&gMPlayJumpTable[35]); From fe7425235aaedd5299c97ca24ffc99c1261d697c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 15:47:16 -0700 Subject: [PATCH 098/187] add wiz1989 as a contributor for code (#6902) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index d8b52fb16e..9e53871758 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -121,6 +121,15 @@ "code" ] }, + { + "login": "wiz1989", + "name": "wiz1989", + "avatar_url": "https://avatars.githubusercontent.com/u/80073265?v=4", + "profile": "https://github.com/wiz1989", + "contributions": [ + "code" + ] + }, { "login": "PCG06", "name": "PCG", diff --git a/CREDITS.md b/CREDITS.md index 4baf67db9a..f52cb045c2 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -46,6 +46,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d PCG
PCG

πŸ’» + wiz1989
wiz1989

πŸ’» From 00bc660727df67d61cf951650b06194504345a5c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 19:35:38 -0700 Subject: [PATCH 099/187] add RubyRaven6 as a contributor for code, and doc (#6918) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 10 ++++++++++ CREDITS.md | 9 ++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9e53871758..b14ab92ca9 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -218,6 +218,16 @@ "code" ] }, + { + "login": "RubyRaven6", + "name": "Ruby", + "avatar_url": "https://avatars.githubusercontent.com/u/178652077?v=4", + "profile": "https://github.com/RubyRaven6", + "contributions": [ + "code", + "doc" + ] + }, { "login": "mudskipper13", "name": "mudskipper13", diff --git a/CREDITS.md b/CREDITS.md index f52cb045c2..ae6323edfb 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -40,13 +40,12 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Cafe
Cafe

🎨 agsmgmaster64
agsmgmaster64

πŸ’» mudskipper13
mudskipper13

πŸ’» πŸ“– - Linathan
Linathan

πŸ’» - ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ + PCG
PCG

πŸ’» + wiz1989
wiz1989

πŸ’» - PCG
PCG

πŸ’» - wiz1989
wiz1989

πŸ’» + Ruby
Ruby

πŸ’» πŸ“– @@ -94,4 +93,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! From 100121ad0676240abd3a60d719d8670f1232e4b1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 19 May 2025 22:14:59 -0700 Subject: [PATCH 100/187] add grintoul1 as a contributor for code (#6920) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 13 +++++++------ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index b14ab92ca9..13c11c8429 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -237,6 +237,15 @@ "code", "doc" ] + }, + { + "login": "grintoul1", + "name": "grintoul", + "avatar_url": "https://avatars.githubusercontent.com/u/166724814?v=4", + "profile": "https://github.com/grintoul1", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index ae6323edfb..86d7d656f0 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,21 +31,22 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
Philipp AUER

🚧 πŸ’» tertu
tertu

🚧 πŸ’» psf
psf

🚧 πŸ’» + PCG
PCG

πŸ’» + kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ ExpoSeed
ExpoSeed

πŸ’» 🚧 πŸ‘€ - Linathan
Linathan

πŸ’» - Eduardo Quezada
Eduardo Quezada

πŸ’» πŸ”£ πŸ“– πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ βœ… πŸ““ + Linathan
Linathan

πŸ’» + Eduardo Quezada
Eduardo Quezada

πŸ’» πŸ”£ πŸ“– πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ βœ… πŸ““ khbsd
khbsd

πŸ“– πŸ’» Cafe
Cafe

🎨 agsmgmaster64
agsmgmaster64

πŸ’» mudskipper13
mudskipper13

πŸ’» πŸ“– - kittenchilly
kittenchilly

πŸ’» πŸ”¬ πŸ”£ - PCG
PCG

πŸ’» - wiz1989
wiz1989

πŸ’» + Ruby
Ruby

πŸ’» πŸ“– - Ruby
Ruby

πŸ’» πŸ“– + wiz1989
wiz1989

πŸ’» + grintoul
grintoul

πŸ’» From 3f89abea743dbda98c5d73e53b6c78fba52ab147 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Tue, 20 May 2025 01:17:46 -0400 Subject: [PATCH 101/187] Fix test not referencing AI_TRAINER_NAME (#6926) --- test/battle/ai/ai_switching.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index 6f0fb7920c..e20dd5bf61 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -97,11 +97,11 @@ AI_DOUBLE_BATTLE_TEST("AI will not try to switch for the same pokemon for 2 spot } WHEN { TURN { EXPECT_SWITCH(opponentLeft, 3); }; } SCENE { - MESSAGE("{PKMN} TRAINER LEAF withdrew Linoone!"); - MESSAGE("{PKMN} TRAINER LEAF sent out Gengar!"); + MESSAGE(AI_TRAINER_NAME " withdrew Linoone!"); + MESSAGE(AI_TRAINER_NAME " sent out Gengar!"); NONE_OF { - MESSAGE("{PKMN} TRAINER LEAF withdrew Zigzagoon!"); - MESSAGE("{PKMN} TRAINER LEAF sent out Gengar!"); + MESSAGE(AI_TRAINER_NAME " withdrew Zigzagoon!"); + MESSAGE(AI_TRAINER_NAME " sent out Gengar!"); } } } From 8f88cfad5b903d335dd113fc1be666be09aa0a62 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 20 May 2025 06:25:26 -0700 Subject: [PATCH 102/187] add surskitty as a contributor for code (#6924) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> Co-authored-by: psf <77138753+pkmnsnfrn@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ CREDITS.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 13c11c8429..e5ecce9602 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -238,6 +238,15 @@ "doc" ] }, + { + "login": "surskitty", + "name": "surskitty", + "avatar_url": "https://avatars.githubusercontent.com/u/1383512?v=4", + "profile": "https://github.com/surskitty", + "contributions": [ + "code" + ] + }, { "login": "grintoul1", "name": "grintoul", diff --git a/CREDITS.md b/CREDITS.md index 86d7d656f0..6045f2301a 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -45,6 +45,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Ruby
Ruby

πŸ’» πŸ“– + surskitty
surskitty

πŸ’» wiz1989
wiz1989

πŸ’» grintoul
grintoul

πŸ’» From c485ae4e900681dd2c98139b898dd00cf312ceb3 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Tue, 20 May 2025 11:07:29 -0400 Subject: [PATCH 103/187] add fail ptr arg to JumpIfMoveFailed, fix tryworryseed (#6925) Co-authored-by: ghoulslash --- src/battle_script_commands.c | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 8355bb78bd..407d87a017 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1354,13 +1354,13 @@ static void Cmd_attackcanceler(void) } } -static bool32 JumpIfMoveFailed(u8 adder, u16 move) +static bool32 JumpIfMoveFailed(u8 adder, u16 move, const u8 *failInstr) { if (gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) { gLastLandedMoves[gBattlerTarget] = 0; gLastHitByType[gBattlerTarget] = 0; - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); + gBattlescriptCurrInstr = failInstr; return TRUE; } else @@ -1380,7 +1380,7 @@ static void Cmd_unused5(void) if (IsBattlerProtected(gBattlerAttacker, gBattlerTarget, gCurrentMove)) { gBattleStruct->moveResultFlags[gBattlerTarget] |= MOVE_RESULT_MISSED; - JumpIfMoveFailed(sizeof(*cmd), MOVE_NONE); + JumpIfMoveFailed(sizeof(*cmd), MOVE_NONE, cmd->failInstr); gBattleCommunication[MISS_TYPE] = B_MSG_PROTECTED; } else @@ -1389,14 +1389,14 @@ static void Cmd_unused5(void) } } -static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump) +static bool32 JumpIfMoveAffectedByProtect(u32 move, u32 battler, u32 shouldJump, const u8 *failInstr) { bool32 affected = IsBattlerProtected(gBattlerAttacker, battler, move); if (affected) { gBattleStruct->moveResultFlags[battler] |= MOVE_RESULT_MISSED; if (shouldJump) - JumpIfMoveFailed(7, move); + JumpIfMoveFailed(7, move, failInstr); } return affected; } @@ -1623,7 +1623,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u gBattlescriptCurrInstr = nextInstr; else if (gStatuses3[gBattlerTarget] & (STATUS3_SEMI_INVULNERABLE)) gBattlescriptCurrInstr = failInstr; - else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE)) + else if (!JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, failInstr)) gBattlescriptCurrInstr = nextInstr; if (GetActiveGimmick(gBattlerAttacker) == GIMMICK_DYNAMAX) { @@ -1660,7 +1660,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u continue; numTargets++; - if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE) || AccuracyCalcHelper(move, battlerDef)) + if (JumpIfMoveAffectedByProtect(move, battlerDef, FALSE, failInstr) || AccuracyCalcHelper(move, battlerDef)) continue; u32 accuracy = GetTotalAccuracy(gBattlerAttacker, @@ -1707,7 +1707,7 @@ static void AccuracyCheck(bool32 recalcDragonDarts, const u8 *nextInstr, const u if (calcSpreadMove) gBattleStruct->calculatedSpreadMoveAccuracy = TRUE; - JumpIfMoveFailed(7, move); + JumpIfMoveFailed(7, move, failInstr); } } @@ -12499,9 +12499,8 @@ static u32 ChangeStatBuffs(s8 statValue, u32 statId, u32 flags, const u8 *BS_ptr return STAT_CHANGE_DIDNT_WORK; } else if (gCurrentMove != MOVE_CURSE - && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE)) + && notProtectAffected != TRUE && JumpIfMoveAffectedByProtect(gCurrentMove, gBattlerTarget, TRUE, BattleScript_ButItFailed)) { - gBattlescriptCurrInstr = BattleScript_ButItFailed; return STAT_CHANGE_DIDNT_WORK; } else if ((battlerHoldEffect == HOLD_EFFECT_CLEAR_AMULET || CanAbilityPreventStatLoss(battlerAbility)) @@ -16730,7 +16729,6 @@ static void Cmd_tryworryseed(void) || gBattleMons[gBattlerTarget].ability == ABILITY_INSOMNIA) { RecordAbilityBattle(gBattlerTarget, gBattleMons[gBattlerTarget].ability); - gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 1); gBattlescriptCurrInstr = cmd->failInstr; } else if (GetBattlerHoldEffect(gBattlerTarget, TRUE) == HOLD_EFFECT_ABILITY_SHIELD) From ddc662fd32e8528edd4d702663d97adbdab2659e Mon Sep 17 00:00:00 2001 From: khbsd Date: Tue, 20 May 2025 10:09:04 -0500 Subject: [PATCH 104/187] fix: avoid unexpected data shifting by removing preproc'd array size (#6916) --- include/wild_encounter.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/include/wild_encounter.h b/include/wild_encounter.h index 0edf396164..f28d129753 100644 --- a/include/wild_encounter.h +++ b/include/wild_encounter.h @@ -40,12 +40,7 @@ struct WildPokemonHeader { u8 mapGroup; u8 mapNum; - -#if OW_TIME_OF_DAY_ENCOUNTERS const struct WildEncounterTypes encounterTypes[TIMES_OF_DAY_COUNT]; -#else - const struct WildEncounterTypes encounterTypes[1]; -#endif }; From ce9bbcc3b7c2012c3e08111c7ebaa6484ec65264 Mon Sep 17 00:00:00 2001 From: jfb1337 <184441704+jfb1337@users.noreply.github.com> Date: Wed, 21 May 2025 09:41:18 +0100 Subject: [PATCH 105/187] Fix trainers.party parser failing on apostrophes (#6938) --- tools/trainerproc/main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/trainerproc/main.c b/tools/trainerproc/main.c index b301ddf552..5823facaca 100644 --- a/tools/trainerproc/main.c +++ b/tools/trainerproc/main.c @@ -459,7 +459,7 @@ static bool match_identifier(struct Parser *p, struct Token *t) if (!peek_char(&p_, &c)) break; - if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_') + if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_'|| c == '\'') ; else break; @@ -493,7 +493,7 @@ static bool match_human_identifier(struct Parser *p, struct Token *t) if (!peek_char(&p_, &c)) break; - if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || c == '_' || c == '-' || c == ' ') + if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || c == '_' || c == '-' || c == ' ' || c == '\'') ; else if (p_.offset > t->begin && ('0' <= c && c <= '9')) ; @@ -573,7 +573,7 @@ static bool match_move_identifier(struct Parser *p, struct Token *t) if (!peek_char(&p_, &c)) break; - if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_' || c == '-' || c == ' ' || c == ',') + if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9') || c == '_' || c == '-' || c == ' ' || c == ',' || c == '\'') ; else break; @@ -1581,6 +1581,8 @@ static void fprint_constant(FILE *f, const char *prefix, struct String s) fputc(c, f); else if ('a' <= c && c <= 'z') fputc(c - 'a' + 'A', f); + else if (c == '\'') + ; else fputc('_', f); } From 87fbf22476749b11a7f63ee9a051efd12adff312 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Wed, 21 May 2025 04:41:51 -0400 Subject: [PATCH 106/187] Fix Rage Fist evolution method (#6937) --- src/pokemon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon.c b/src/pokemon.c index c96f8f3b66..40f947c978 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4664,7 +4664,6 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti { currentCondition = TRUE; } - break; case IF_KNOWS_MOVE_TYPE: for (j = 0; j < MAX_MON_MOVES; j++) @@ -4738,6 +4737,7 @@ bool32 DoesMonMeetAdditionalConditions(struct Pokemon *mon, const struct Evoluti case IF_USED_MOVE_X_TIMES: if (evolutionTracker >= params[i].arg2) currentCondition = TRUE; + break; // Gen 9 case IF_DEFEAT_X_WITH_ITEMS: if (evolutionTracker >= params[i].arg3) From a639460c276e15f3df5c4937f13dd2be9068986f Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Wed, 21 May 2025 13:25:12 +0100 Subject: [PATCH 107/187] Fixes Ice Body healing HP regardless of weather (#6939) --- src/battle_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index a4ad7e018f..5d4d842fda 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4139,7 +4139,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_ICE_BODY: - if (!IsBattlerAtMaxHp(battler) + if (IsBattlerWeatherAffected(battler, B_WEATHER_HAIL | B_WEATHER_SNOW) + && !IsBattlerAtMaxHp(battler) && !(gStatuses3[battler] & (STATUS3_UNDERGROUND | STATUS3_UNDERWATER)) && !(gStatuses3[battler] & STATUS3_HEAL_BLOCK)) { From 63d1a9b3d914bff9745b51f62e21a8c14ce40466 Mon Sep 17 00:00:00 2001 From: surskitty Date: Wed, 21 May 2025 10:15:35 -0400 Subject: [PATCH 108/187] Commenting in config files to explain limits of map popups and wild AI flags (#6923) --- include/config/battle.h | 6 +++++- include/config/overworld.h | 5 ++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/config/battle.h b/include/config/battle.h index b940d1dbf5..f4a14f4df4 100644 --- a/include/config/battle.h +++ b/include/config/battle.h @@ -217,8 +217,12 @@ // To use the following features, change the 0 for a var present in include/constants/vars.h, preferably an unused one. // Eg: You may rename VAR_UNUSED_0x404E to a descriptive name and use it below. #define B_VAR_STARTING_STATUS 0 // If this var has a value, assigning a STATUS_FIELD_xx_TERRAIN to it before battle causes the battle to start with that terrain active. + // This var should never remain non-zero long enough for the player to save. #define B_VAR_STARTING_STATUS_TIMER 0 // If this var has a value greater or equal than 1 field terrains will last that number of turns, otherwise they will last until they're overwritten. -#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. NOT usable with flags above (1 << 15) +#define B_VAR_WILD_AI_FLAGS 0 // If not 0, you can use this var to add to default wild AI flags. IMPORTANT: NOT usable with flags above (1 << 15) + // This var should never remain non-zero long enough for the player to save. + // For better wild AI handling, edit GetWildAiFlags() in src/battle_ai_main.c + #define B_VAR_DIFFICULTY 0 // If not 0, you can use this var to control which difficulty version of a Trainer is loaded. This should be manually set by the developer using Script_SetDifficulty AFTER NewGameInitData has run. // Sky Battles diff --git a/include/config/overworld.h b/include/config/overworld.h index ad926820f2..50cad2f5fe 100644 --- a/include/config/overworld.h +++ b/include/config/overworld.h @@ -114,7 +114,9 @@ // Map pop-up config #define OW_POPUP_GENERATION GEN_3 // Different generations display location names in overworld pop-ups differently. - // Only choices are currently GEN_3 and GEN_5, all others will default to Gen3 pop-ups. + // Only choices are GEN_3 and GEN_5, all others will default to Gen3 pop-ups. + // Due to changes in project scope, as detailed in docs/team_procedures/scope.md, + // no other overworld popups will be implemented in expansion. // Gen5 map pop-up config // Constants @@ -129,6 +131,7 @@ #define OW_POPUP_BW_COLOR OW_POPUP_BW_COLOR_BLACK // B2W2 use different colors for their map pop-ups. #define OW_POPUP_BW_TIME_MODE OW_POPUP_BW_TIME_NONE // Determines what type of time is shown. #define OW_POPUP_BW_ALPHA_BLEND FALSE // Enables alpha blending/transparency for the pop-ups. Mainly intended to be used with the black color option. + // Setting this to TRUE will cause graphical errors with the Day Night System enabled. // PokΓ©mon Center #define OW_IGNORE_EGGS_ON_HEAL GEN_LATEST // In Gen 4+, the nurse in the PokΓ©mon Center does not heal Eggs on healing machine. From ce079cfcc8128f512b6f5b9e747be205b17150bd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 21 May 2025 16:16:33 +0200 Subject: [PATCH 109/187] Fixes Life Orb damage still happening after attacker was unable to attack (#6940) --- src/battle_util.c | 2 ++ test/battle/hold_effect/life_orb.c | 33 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index fd65a3ad68..783f06da0f 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -8167,6 +8167,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) { case HOLD_EFFECT_SHELL_BELL: if (gBattleScripting.savedDmg > 0 + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT) && gBattlerAttacker != gBattlerTarget && !IsBattlerAtMaxHp(gBattlerAttacker) @@ -8188,6 +8189,7 @@ u32 ItemBattleEffects(enum ItemCaseId caseID, u32 battler, bool32 moveTurn) break; case HOLD_EFFECT_LIFE_ORB: if (IsBattlerAlive(gBattlerAttacker) + && !(gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) && !IsBattleMoveStatus(gCurrentMove) && (IsBattlerTurnDamaged(gBattlerTarget) || !(gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT)) // Needs the second check in case of Substitute && !(TestIfSheerForceAffected(gBattlerAttacker, gCurrentMove)) diff --git a/test/battle/hold_effect/life_orb.c b/test/battle/hold_effect/life_orb.c index f27ce29d03..7f4fcc2ccf 100644 --- a/test/battle/hold_effect/life_orb.c +++ b/test/battle/hold_effect/life_orb.c @@ -1,6 +1,21 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Life Orb activates when users attack is succesful") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POUND); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, player); + HP_BAR(opponent); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } +} + SINGLE_BATTLE_TEST("Life Orb activates if it hits a Substitute") { GIVEN { @@ -31,3 +46,21 @@ SINGLE_BATTLE_TEST("Life Orb does not activate if using a status move") } } } + +SINGLE_BATTLE_TEST("Life Orb doesn't cause any HP loss if user is unable to attack") +{ + PASSES_RANDOMLY(25, 100, RNG_PARALYSIS); + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LIFE_ORB); Status1(STATUS1_PARALYSIS); } + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_POUND); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + HP_BAR(opponent); + HP_BAR(player); + MESSAGE("Wobbuffet was hurt by the Life Orb!"); + } + } +} From 95036e3b9f2cebf48dd4790bc099c350a32a6e00 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Wed, 21 May 2025 20:33:52 +0200 Subject: [PATCH 110/187] Fixes global usage in super fang effect. (#6941) --- src/battle_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 5d4d842fda..732875fae9 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -9463,7 +9463,7 @@ static inline s32 DoFixedDamageMoveCalc(struct DamageCalculationData *damageCalc dmg = GetMoveFixedDamage(damageCalcData->move); break; case EFFECT_SUPER_FANG: - dmg = GetNonDynamaxHP(gBattlerTarget) / 2; + dmg = GetNonDynamaxHP(damageCalcData->battlerDef) / 2; break; default: return INT32_MAX; From b85a56b718f7b681297fb6513a6699e45b1e1cf7 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 03:21:43 -0400 Subject: [PATCH 111/187] Documented usage of `createsprite gSimplePaletteBlendSpriteTemplate` (#6956) --- data/battle_anim_scripts.s | 100 ++++++++++++++++++------------------- 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 4338d70ce1..e3d75385a4 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -721,7 +721,7 @@ gBattleAnimMove_Copycat:: call StockpileAbsorb call StockpileAbsorb waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 12, 0, RGB_WHITE + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 12, 0, RGB_WHITE waitforvisualfinish createsprite gThinRingShrinkingSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 0, 0 playsewithpan SE_M_SUPERSONIC, -64 @@ -855,7 +855,7 @@ gBattleAnimMove_LastResort:: waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 16, 16, RGB_WHITE + 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 @@ -867,7 +867,7 @@ gBattleAnimMove_LastResort:: createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 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, 1, 2, 16, 0, RGB_WHITE + 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 @@ -1177,7 +1177,7 @@ gBattleAnimMove_RockPolish:: loadspritegfx ANIM_TAG_WHITE_STREAK loadspritegfx ANIM_TAG_SPARKLE_3 setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 0, 12, RGB_BLACK waitforvisualfinish loopsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER, 10, 7 createsprite gRockPolishStreakSpriteTemplate, ANIM_ATTACKER, 2, -10, 3 @@ -1235,7 +1235,7 @@ gBattleAnimMove_RockPolish:: delay 1 createsprite gRockPolishSparkleSpriteTemplate, ANIM_ATTACKER, 2, 0, -17 waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 12, 0, RGB_BLACK waitforvisualfinish blendoff end @@ -1325,7 +1325,7 @@ gBattleAnimMove_DarkPulse:: gBattleAnimMove_NightSlash:: loadspritegfx ANIM_TAG_SLASH createvisualtask AnimTask_BlendNightSlash, 2, ANIM_TARGET, 2, 0, 8, 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 0, 12, RGB_BLACK waitforvisualfinish createsprite gNightSlashLeftSpriteTemplate, ANIM_TARGET, 2, 1, -8, 0 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET @@ -1338,7 +1338,7 @@ gBattleAnimMove_NightSlash:: createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 18, 1 playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 12, 0, RGB_BLACK waitforvisualfinish end @@ -1507,7 +1507,7 @@ gBattleAnimMove_DragonPulse:: loadspritegfx ANIM_TAG_DRAGON_PULSE monbg ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish playsewithpan SE_M_PSYBEAM, SOUND_PAN_ATTACKER createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_PSYBEAM2, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 3, 4, 0, 15 @@ -1526,7 +1526,7 @@ gBattleAnimMove_DragonPulse:: call DragonPulseParticle waitforvisualfinish delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 7, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -1567,7 +1567,7 @@ gBattleAnimMove_DragonRush:: gBattleAnimMove_PowerGem:: @ Copy of Hidden Power with background blackened loadspritegfx ANIM_TAG_POWER_GEM - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 1, 0, 7, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 1, 0, 7, RGB_BLACK waitforvisualfinish playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER createvisualtask AnimTask_ScaleMonAndRestore, 5, -7, -7, 11, ANIM_ATTACKER, 0 @@ -1595,7 +1595,7 @@ gBattleAnimMove_PowerGem:: @ Copy of Hidden Power with background blackened createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 160 createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 192 createsprite gPowerGemOrbScatterSpriteTemplate, ANIM_TARGET, 2, 224 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 1, 7, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish end @@ -1664,7 +1664,7 @@ gBattleAnimMove_EnergyBall:: loadspritegfx ANIM_TAG_ENERGY_BALL monbg ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 8, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 8, RGB_BLACK waitforvisualfinish delay 15 createsoundtask SoundTask_LoopSEAdjustPanning, SE_M_MIST, SOUND_PAN_ATTACKER, SOUND_PAN_TARGET, 5, 5, 0, 5 @@ -1672,7 +1672,7 @@ gBattleAnimMove_EnergyBall:: waitforvisualfinish playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 8, 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 8, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 8, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -1948,12 +1948,12 @@ gBattleAnimMove_IceShard:: createsprite gIceBeamOuterCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 20, -2, 30 createsprite gIceBeamInnerCrystalSpriteTemplate, ANIM_ATTACKER, 2, 0, 8, 20, 10, 30 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, -31, 0, 7, RGB(0, 20, 31) + 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 waitforvisualfinish delay 20 call IceCrystalEffectShort - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 4, 5, 7, 0, RGB(0, 20, 31) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_TARGET, 5, 7, 0, RGB(0, 20, 31) waitforvisualfinish restorebg waitbgfadein @@ -1993,7 +1993,7 @@ gBattleAnimMove_ThunderFang:: loadspritegfx ANIM_TAG_SHARP_TEETH monbg ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 16, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 16, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 @@ -2013,7 +2013,7 @@ gBattleAnimMove_ThunderFang:: createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 16, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 16, 0, RGB_BLACK delay 20 waitforvisualfinish clearmonbg ANIM_TARGET @@ -2027,7 +2027,7 @@ gBattleAnimMove_IceFang:: loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_SHARP_TEETH loadspritegfx ANIM_TAG_IMPACT - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET @@ -2051,7 +2051,7 @@ gBattleAnimMove_IceFang:: delay 5 createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -2209,7 +2209,7 @@ gBattleAnimMove_ZenHeadbutt:: loadspritegfx ANIM_TAG_WATER_IMPACT monbg ANIM_ATTACKER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 2, 0, 4, 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK waitforvisualfinish createsprite gZenHeadbuttSpriteTemplate, ANIM_ATTACKER, 2, 0 delay 18 @@ -2230,7 +2230,7 @@ gBattleAnimMove_ZenHeadbutt:: createsprite gAquaTailHitSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 4, 4, 0, 0 + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 4, 4, 0, RGB_BLACK clearmonbg ANIM_ATTACKER blendoff delay 1 @@ -2594,7 +2594,7 @@ gBattleAnimMove_LeafStorm:: monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 12, RGB(13, 31, 12) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 12, RGB(13, 31, 12) waitforvisualfinish splitbgprio ANIM_TARGET setalpha 12, 8 @@ -2694,7 +2694,7 @@ gBattleAnimMove_LeafStorm:: waitforvisualfinish blendoff delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 12, 0, RGB(13, 31, 12) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 12, 0, RGB(13, 31, 12) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER end @@ -3563,7 +3563,7 @@ gBattleAnimMove_LunarDance:: loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_HOLLOW_ORB setalpha 0, 16 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 16, RGB_BLACK + 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 @@ -3830,7 +3830,7 @@ ShadowForceWaitEnd: ShadowForcePrep: monbg ANIM_ATTACKER playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER - createsprite gSimplePaletteBlendSpriteTemplate ANIM_ATTACKER, 2, 1, 3, 0, 16, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 0, 16, RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, FALSE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, FALSE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATK_PARTNER, FALSE @@ -3838,7 +3838,7 @@ ShadowForcePrep: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 1, 3 createvisualtask AnimTask_AttackerFadeToInvisible, 2, 1 delay 80 - createsprite gSimplePaletteBlendSpriteTemplate ANIM_ATTACKER, 2, 1, 3, 16, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 3, 16, 0, RGB_BLACK createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_TARGET, TRUE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATTACKER, TRUE createvisualtask AnimTask_SetGrayscaleOrOriginalPal, 5, ANIM_ATK_PARTNER, TRUE @@ -5738,7 +5738,7 @@ gBattleAnimMove_Electroweb:: monbg ANIM_DEF_PARTNER delay 0 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPIDER_WEB, 0, 6, 6, RGB(31, 30, 1) - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 0, 9, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 0, 9, RGB_BLACK waitforvisualfinish splitbgprio ANIM_TARGET waitforvisualfinish @@ -5747,7 +5747,7 @@ gBattleAnimMove_Electroweb:: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 9, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK call ElectricityEffect_OnTargets gBattleAnimMove_ElectrowebWait:: waitforvisualfinish @@ -7530,7 +7530,7 @@ gBattleAnimMove_StickyWeb:: loadspritegfx ANIM_TAG_WEB_THREAD monbg ANIM_DEF_PARTNER delay 0 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 0, 9, RGB_BLACK + 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 @@ -7560,7 +7560,7 @@ gBattleAnimMove_StickyWeb:: waitforvisualfinish clearmonbg ANIM_DEF_PARTNER delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, 1, 2, 9, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 5, F_PAL_BG, 2, 9, 0, RGB_BLACK end gBattleAnimMove_FellStinger:: @@ -7685,7 +7685,7 @@ gBattleAnimMove_NobleRoar:: monbg ANIM_ATTACKER splitbgprio ANIM_ATTACKER setalpha 8, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 8, RGB(4, 0, 0) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 8, RGB(4, 0, 0) waitforvisualfinish createvisualtask SoundTask_PlayCryHighPitch, 2, ANIM_ATTACKER, 2 createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 10, ANIM_ATTACKER, 1 @@ -7693,7 +7693,7 @@ gBattleAnimMove_NobleRoar:: delay 10 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 9, 1 delay 10 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 8, 0, RGB(4, 0, 0) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 8, 0, RGB(4, 0, 0) waitforvisualfinish clearmonbg ANIM_ATTACKER blendoff @@ -7723,7 +7723,7 @@ gBattleAnimMove_ParabolicCharge:: loadspritegfx ANIM_TAG_ORBS monbg ANIM_ATTACKER setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 6, RGB(18, 16, 3) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 6, RGB(18, 16, 3) waitforvisualfinish createvisualtask AnimTask_ElectricChargingParticles, 2, ANIM_ATTACKER, 3, 20, 20 playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER @@ -7751,7 +7751,7 @@ ParabolicChargeHeal: clearmonbg ANIM_ATTACKER waitforvisualfinish call HealingEffect - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 6, 0, RGB(18, 16, 3) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 6, 0, RGB(18, 16, 3) waitforvisualfinish blendoff end @@ -7864,7 +7864,7 @@ gBattleAnimMove_FreezeDry:: setalpha 12, 8 loadspritegfx ANIM_TAG_ICE_CRYSTALS loadspritegfx ANIM_TAG_IMPACT - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 0, 9, RGB(12, 26, 31) delay 20 playsewithpan SE_M_STRING_SHOT, SOUND_PAN_TARGET @@ -7889,7 +7889,7 @@ gBattleAnimMove_FreezeDry:: waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 10, 4, 2, 9, 0, RGB(12, 26, 31) waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 0, 7, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 7, 0, RGB_BLACK waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff @@ -7932,16 +7932,16 @@ gBattleAnimMove_PartingShot:: gBattleAnimMove_TopsyTurvy:: loadspritegfx ANIM_TAG_SWEAT_DROP setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 1, 2, 0, 4, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_BG, 2, 0, 4, RGB_BLACK waitforvisualfinish createvisualtask AnimTask_RotateVertically, 2, ANIM_TARGET, 768 - createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 4, 5, 0, 8, RGB(9, 0, 16) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_TARGET, 5, 0, 8, RGB(9, 0, 16) playsewithpan SE_ROTATING_GATE, SOUND_PAN_TARGET delay 116 - createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 4, 5, 8, 0, RGB(9, 0, 16) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_TARGET, 5, 8, 0, RGB(9, 0, 16) playsewithpan SE_FALL, SOUND_PAN_TARGET waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate ANIM_TARGET, 2, 1, 2, 4, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_TARGET, 2, F_PAL_BG, 2, 4, 0, RGB_BLACK waitforvisualfinish blendoff end @@ -8288,7 +8288,7 @@ gBattleAnimMove_Moonblast:: loadspritegfx ANIM_TAG_GREEN_SPARKLE loadspritegfx ANIM_TAG_BLUE_STAR setalpha 0, 16 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 16, 0 + 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 @@ -9019,7 +9019,7 @@ gBattleAnimMove_ElectricTerrain:: gBattleAnimMove_DazzlingGleam:: loadspritegfx ANIM_TAG_SPARKLE_2 loadspritegfx ANIM_TAG_BLUE_STAR - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0x0, 0xd, 0x7fff + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 2, 0, 13, RGB_WHITE playsewithpan SE_M_TWISTER, SOUND_PAN_ATTACKER @call 0x081D56B3 -> middle of GrantingStarsEffect createsprite gGrantingStarsSpriteTemplate, ANIM_ATTACKER, 2, 12, -5, 0, 0, 32, 60 @@ -9029,7 +9029,7 @@ gBattleAnimMove_DazzlingGleam:: delay 0x4 playsewithpan SE_M_GIGA_DRAIN, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0xd, 0x0, 0x7fff + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 0, 13, 0, RGB_WHITE waitforvisualfinish clearmonbg 0x0 blendoff @@ -13686,7 +13686,7 @@ gBattleAnimMove_Overdrive:: end OverdriveRings: playsewithpan SE_M_THUNDERBOLT, SOUND_PAN_TARGET - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x8, 0x0, 0x3ff + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, (F_PAL_BG | F_PAL_ATK_SIDE | F_PAL_DEF_SIDE), 3, 8, 0, RGB_YELLOW createvisualtask AnimTask_ScaleMonAndRestore, 5, -5, -5, 5, ANIM_ATTACKER, 0 createsprite gHyperVoiceRingSpriteTemplate, ANIM_ATTACKER, 0, 0x2d, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 1, 0, 6, 1 @@ -14396,7 +14396,7 @@ gBattleAnimMove_TerrainPulse:: loadspritegfx ANIM_TAG_DRAGON_PULSE monbg ANIM_TARGET setalpha 12, 8 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 0, 7, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 0, 7, RGB_BLACK createvisualtask AnimTask_TerrainPulse, 0x5 jumpargeq 0x0, TYPE_ELECTRIC, TerrainPulseElectric jumpargeq 0x0, TYPE_GRASS, TerrainPulseGrass @@ -14469,7 +14469,7 @@ TerrainPulseEnd: call DragonPulseParticle waitforvisualfinish delay 1 - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 1, 1, 7, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_BG, 1, 7, 0, RGB_BLACK waitforvisualfinish blendoff clearmonbg ANIM_TARGET @@ -14626,13 +14626,13 @@ gBattleAnimMove_Poltergeist:: loadspritegfx ANIM_TAG_POLTERGEIST fadetobg BG_NIGHTMARE waitbgfadein - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 2, 0, 0, 16, RGB_BLACK + 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, 2, 0, 16, 0, RGB_BLACK + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, F_PAL_ATTACKER, 0, 16, 0, RGB_BLACK playsewithpan SE_M_FAINT_ATTACK, SOUND_PAN_ATTACKER delay 0x1 createvisualtask AnimTask_DestinyBondWhiteShadow, 0x5, 0x0, 0x24 @@ -16237,7 +16237,7 @@ gBattleAnimMove_BitterBlade:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER splitbgprio_foes ANIM_TARGET - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 0, 12, RGB(14, 6, 24) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 0, 12, RGB(14, 6, 24) playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER waitforvisualfinish call EndureEffect @@ -16258,7 +16258,7 @@ gBattleAnimMove_BitterBlade:: delay 15 call HealingEffect waitforvisualfinish - createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, 1, 3, 12, 0, RGB(14, 6, 24) + createsprite gSimplePaletteBlendSpriteTemplate, ANIM_ATTACKER, 0, F_PAL_BG, 3, 12, 0, RGB(14, 6, 24) waitforvisualfinish clearmonbg ANIM_DEF_PARTNER blendoff From d42d9012e48edd35c3b91a68955a83593497bfb6 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 03:27:30 -0400 Subject: [PATCH 112/187] Documented usage of `createsprite gDirtPlumeSpriteTemplate` (#6954) --- data/battle_anim_scripts.s | 136 ++++++++++++++++++------------------- src/battle_anim_ground.c | 2 +- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index e3d75385a4..eb46a04076 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -20502,18 +20502,18 @@ gBattleAnimMove_Fissure:: 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 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -48, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -52, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 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 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 playsewithpan SE_M_DIG, SOUND_PAN_TARGET return @@ -20557,10 +20557,10 @@ DigUnleash: 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 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 32 return @@ -29512,10 +29512,10 @@ gBattleAnimMove_SupersonicSkystrike:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 delay 0x2 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xc, 0x4, 0xfff0, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x4, 0xfff6, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xe, 0x4, 0xffee, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xc, 0x4, 0xfff0, 0x12 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 delay 0x30 createvisualtask AnimTask_DoomDesireLightBeam, 0x5 delay 0x9 @@ -29545,14 +29545,14 @@ FinishSupersonicSkystrike: createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xc, 0xffe8, 0xfff0, 0x18 @ 12, -48, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x10, 0xffda, 0xfff6, 0x18 @ 16, -16, -10, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xe, 0xffec, 0xffee, 0x18 @ 14, -52, -18, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xc, 0xffdc, 0xfff0, 0x18 @ 12, -32, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xc, 0xffd0, 0xfff0, 0x18 @ 12, -24, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x10, 0xfff0, 0xfff6, 0x18 @ 16, -38, -10, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xe, 0xffcc, 0xffee, 0x18 @ 14, -20, -18, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xc, 0xffe0, 0xfff0, 0x18 @ 12, -36, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 @ 14, -52, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 @ 12, -32, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -48, -16, 24 @ 12, -24, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 delay 0x30 clearmonbg ANIM_DEF_PARTNER blendoff @@ -29788,10 +29788,10 @@ gBattleAnimMove_ContinentalCrush:: playsewithpan SE_M_FLY, SOUND_PAN_ATTACKER createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 delay 0x2 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xc, 0x4, 0xfff0, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x4, 0xfff6, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xe, 0x4, 0xffee, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xc, 0x4, 0xfff0, 0x12 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 delay 0x30 createvisualtask AnimTask_GetTimeOfDay, 0x2 jumpargeq 0x0 0x0 ContinentalCrushDay @@ -29853,14 +29853,14 @@ FinishContinentalCrush: delay 0x5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xc, 0xffe8, 0xfff0, 0x18 @ 12, -48, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10, 0xffda, 0xfff6, 0x18 @ 16, -16, -10, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xe, 0xffec, 0xffee, 0x18 @ 14, -52, -18, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xc, 0xffdc, 0xfff0, 0x18 @ 12, -32, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xc, 0xffd0, 0xfff0, 0x18 @ 12, -24, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10, 0xfff0, 0xfff6, 0x18 @ 16, -38, -10, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xe, 0xffcc, 0xffee, 0x18 @ 14, -20, -18, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xc, 0xffe0, 0xfff0, 0x18 @ 12, -36, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -20, -18, 24 @ 14, -52, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, -36, -16, 24 @ 12, -32, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, -48, -16, 24 @ 12, -24, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @ 16, -38, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -52, -18, 24 @ 14, -20, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, -32, -16, 24 @ 12, -36, -16, 24 delay 0x5 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0x0000 @undo pal change on tgt delay 0x10 @@ -30048,18 +30048,18 @@ gSavageSpinOutStringBlastSpriteTemplateSHOT: SavageSpinOutCrash_1: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff8, 0x1, 0x1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xc, 0xffe8, 0xfff0, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0xffda, 0xfff6, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xe, 0xffec, 0xffee, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xc, 0xffdc, 0xfff0, 0x18 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 return SavageSpinOutCrash_2: createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xfff8, 0x1, 0x1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xc, 0xffd0, 0xfff0, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0xfff0, 0xfff6, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xe, 0xffcc, 0xffee, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xc, 0xffe0, 0xfff0, 0x18 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -48, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -52, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -32, -16, 24 return SlowSavageSpinOutBackgroundSpeed: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xfd56, 0x0, 0xffff @-0x2aa @@ -30371,10 +30371,10 @@ CorkscrewCrashMetalFlare: return CorkscrewCrashSprayRocks: playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0xc, 0xffe8, 0xfff0, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x0, 0x10, 0xffda, 0xfff6, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xe, 0xffec, 0xffee, 0x18 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, 0x1, 0x1, 0xc, 0xffdc, 0xfff0, 0x18 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 return @@ -31941,10 +31941,10 @@ CatastropikaFinish: delay 0xd createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 loadspritegfx ANIM_TAG_MUD_SAND - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0xc, 0xffe8, 0xfff0, 0x18 @ 12, -48, -16, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x10, 0xffda, 0xfff6, 0x18 @ 16, -16, -10, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xe, 0xffec, 0xffee, 0x18 @ 14, -52, -18, 24 - createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x1, 0xc, 0xffdc, 0xfff0, 0x18 @ 12, -32, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 @ 14, -52, -18, 24 + createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 @ 12, -32, -16, 24 loadspritegfx ANIM_TAG_LIGHTNING @thunder call CatastropikaThundering invisible ANIM_TARGET @@ -32550,10 +32550,10 @@ PulverizingPancakeFinish: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET createsprite gFlyBallUpSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 delay 0x2 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xc, 0x4, 0xfff0, 0x22 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x4, 0xfff6, 0x22 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xe, 0x4, 0xffee, 0x22 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xc, 0x4, 0xfff0, 0x22 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 34 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 34 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 34 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 34 unloadspritegfx ANIM_TAG_SPARKLE_4 unloadspritegfx ANIM_TAG_VERTICAL_HEX fadetobg BG_IN_AIR @@ -32597,10 +32597,10 @@ PulverizingPancakeFinish: call ResetFromWhiteScreen end PulverizingPancakeDiggingRun: - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xc, 0x4, 0xfff0, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x4, 0xfff6, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xe, 0x4, 0xffee, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xc, 0x4, 0xfff0, 0x12 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER delay 0x5 return @@ -34167,16 +34167,16 @@ gBattleAnimMove_GuardianOfAlola:: end GuardianOfAlolaRocksPlayer: playsewithpan SE_M_DIG, SOUND_PAN_ATTACKER - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xc, 0x4, 0xfff0, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x10, 0x4, 0xfff6, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xe, 0x4, 0xffee, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1, 0xc, 0x4, 0xfff0, 0x12 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 1, 12, 4, -16, 18 return GuardianOfAlolaRocksTarget: - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xc, 0x4, 0xfff0, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10, 0x4, 0xfff6, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xe, 0x4, 0xffee, 0x12 - createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1, 0xc, 0x4, 0xfff0, 0x12 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, 4, -16, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, 4, -10, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, 4, -18, 18 + createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 12, 4, -16, 18 return GuardianOfAlolaRockGeyser: createsprite gGuardianOfAlolaDirtGeyserSpriteTemplate, ANIM_TARGET, 2, 0, 0xfffc, 0x10 @ -4, -0x10 diff --git a/src/battle_anim_ground.c b/src/battle_anim_ground.c index bd230a1403..eb96414b55 100644 --- a/src/battle_anim_ground.c +++ b/src/battle_anim_ground.c @@ -524,7 +524,7 @@ void AnimDirtPlumeParticle(struct Sprite *sprite) s8 battler; s16 xOffset; - if (gBattleAnimArgs[0] == 0) + if (gBattleAnimArgs[0] == ANIM_ATTACKER) battler = gBattleAnimAttacker; else battler = gBattleAnimTarget; From 591c8cc69c689e239bb068cf1a0aad8f44ab2a9f Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Thu, 22 May 2025 00:29:13 -0700 Subject: [PATCH 113/187] Updated CONTRIBUTING.md and Merge Freeze definition (#6952) --- CONTRIBUTING.md | 12 ++++++------ docs/team_procedures/schedule.md | 9 +++++++-- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4810244c48..b89016fddd 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -24,7 +24,7 @@ The best bug reports have enough information that we won't have to contact you f - A maintainer will [label](https://github.com/rh-hideout/pokeemerald-expansion/labels) the bug report. - A maintainer will try to reproduce the bug with your provided steps. - If there are no reproduction steps or no obvious way to reproduce the issue, somebody will ask you for those steps. Until the bug can be reproduced, the bug will retain the `bug:unconfirmed` label. Unconfirmed bugs are less likely get fixed. -- If the team is able to reproduce the issue, it will be labeled `bug:confirmed`, and the issue will be left to be [implemented by someone](#Pull-Requests). +- If the team is able to reproduce the bug, it will be labeled `bug:confirmed`, and the bug will be left to be [fixed by someone](#Pull-Requests). - If the issue is particularly game-breaking, a maintainer will add it to a future version's [milestone](), meaning that version will not be released until the problem is solved. ## Feature Requests @@ -35,7 +35,7 @@ This section guides you through submitting a feature request for pokeemerald-exp ### What should I do before making a feature request? -- Make sure your request is in [pokeemerald-expansion's scope](team_procedures/scope.md) - if it is not clear if something is in scope, you can start a discussion thread in the [#pr-discussions](https://discord.com/channels/419213663107416084/1102784418369785948) channel of the [the RHH Discord Server](https://discord.gg/6CzjAG6GZk). +- Make sure your request is in [pokeemerald-expansion's scope](docs/team_procedures/scope.md) - if it is not clear if something is in scope, you can start a discussion thread in the [#pr-discussions](https://discord.com/channels/419213663107416084/1102784418369785948) channel of the [the RHH Discord Server](https://discord.gg/6CzjAG6GZk). ### What should I do before making a feature request? @@ -49,7 +49,7 @@ To request a feature to be added to the project, open a [feature request](https: ### What happens after I submit a feature request? - A maintainer will [label](https://github.com/rh-hideout/pokeemerald-expansion/labels) the issue. -- If the feature request is out of [scope](team_procedures/scope.md), it will be closed. +- If the feature request is out of [scope](docs/team_procedures/scope.md), it will be closed. - if the request is in scope, any other contributor can volunteer to [fufill it via a pull request](#Pull-Requests). When the request is filled, the request will be closed. ## Pull Requests @@ -59,7 +59,7 @@ If you have read all of this and still need help, feel free to start a thread in ### What should I do before starting a pull request? - If you're new to git and GitHub, [Team Aqua's Asset Repo](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/) has a [guide on forking and cloning the repository](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/The-Basics-of-GitHub). Make sure you have a [local copy](INSTALL.md) of `pokeemerald-expansion`. -- Make sure your contribution is in [scope](team_procedures/scope.md) - if it is not clear if something is in scope, you can start a discussion thread in the [#pr-discussions](https://discord.com/channels/419213663107416084/1102784418369785948) channel of the [the RHH Discord Server!](https://discord.gg/6CzjAG6GZk). +- Make sure your contribution is in [scope](docs/team_procedures/scope.md) - if it is not clear if something is in scope, you can start a discussion thread in the [#pr-discussions](https://discord.com/channels/419213663107416084/1102784418369785948) channel of the [the RHH Discord Server!](https://discord.gg/6CzjAG6GZk). - Choose a branch to contribute your PR to: - **`master`**: Fixes for bugs that are currently present in the `master` branch. - **`upcoming`**: All other pull requests. @@ -86,7 +86,7 @@ git switch -c newFeature # the name newFeature can be anything you want. This tu #### 4. Copy your target branch to your new branch This will change your new branch to match the latest version of your chosen target branch. ```bash -git reset --hard RHH/upcoming # If your PR is going to target master, replace upcoming with master. +git reset --hard upcoming # If your PR is going to target master, replace upcoming with master. ``` #### 5. Implement your code @@ -94,7 +94,7 @@ All of your work should go on this new, clean branch. If you already started wor ##### Popular Features / Feature Branches -If you are implementing functionality from a known community feature branch, it is **strongly** reccomended that you open a discussion thread _before_ starting. There are some situations where maintainers would ask you to use the existing feature branch as a base, and others where maintainers would want a feature to be written from scratch. +If you are implementing functionality from a known community feature branch, it is **strongly** recommended that you open a discussion thread _before_ starting. There are some situations where maintainers would ask you to use the existing feature branch as a base, and others where maintainers would want a feature to be written from scratch. This changes on a case by case basis. diff --git a/docs/team_procedures/schedule.md b/docs/team_procedures/schedule.md index c23d8a5105..c689e5b454 100644 --- a/docs/team_procedures/schedule.md +++ b/docs/team_procedures/schedule.md @@ -12,8 +12,13 @@ Releases that focus primarily on bugfixes or improvements to the test system. Pa PRs with the Github label [`type: big feature`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22type%3A+big+feature%22) will NOT be merged until after the next Minor Release. ### Merge Freeze (14 days to the next Minor Release) -PRs that DO NOT have the Github labels [`bugfix`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3Abugfix) or [`type: cleanup`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+cleanup%22+) will NOT be merged until after the next Minor Release. - +Pull Requests that **DO NOT** have one of the following Github labels: +- [`bugfix`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3Abugfix) +- [`type: cleanup`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+cleanup%22+) +- [`type: credits`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+credits%22+) +- [`type: documentation`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+label%3A%22type%3A+documentation%22+) +- [`category: battle-tests`](https://github.com/rh-hideout/pokeemerald-expansion/issues?q=sort%3Aupdated-desc+is%3Aopen+label%3A%22category%3A+battle-tests%22) +will NOT be merged until after the next Minor Release. ### Sample Schedule | Major | Minor | Patch | Type | Goal Date | From 35a7caa682626a219b788fc060cda3bd82e99f5c Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 03:33:55 -0400 Subject: [PATCH 114/187] Documented usage of `createsprite gBasicHitSplatSpriteTemplate` (#6950) --- data/battle_anim_scripts.s | 320 ++++++++++++++++++------------------- 1 file changed, 160 insertions(+), 160 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index eb46a04076..5b4003d942 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -90,7 +90,7 @@ gBattleAnimMove_WakeUpSlap:: createsprite gKarateChopSpriteTemplate, ANIM_ATTACKER, 2, -16, 0, 0, 0, 10, 1, 3, 0 waitforvisualfinish playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 6, 2 waitforvisualfinish createsprite gSmellingSaltExclamationSpriteTemplate, ANIM_TARGET, 2, 1, 8, 3 @@ -111,7 +111,7 @@ gBattleAnimMove_HammerArm:: createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 3 setarg 7, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, -8, 1, 1 + 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 @@ -136,7 +136,7 @@ gBattleAnimMove_GyroBall:: delay 3 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + 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 @@ -234,21 +234,21 @@ gBattleAnimMove_Pluck:: loadspritegfx ANIM_TAG_SEED_BROWN loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, -10, -5, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, -10, -5, ANIM_TARGET, 2 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 3, 0, 20, 2, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, 1, 20, 1, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, 5, 25, 2, -1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 4, -4, 30, 3, -1 delay 30 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 5, 10, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 5, 10, ANIM_TARGET, 2 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 3, -4, 20, 1, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, -6, 20, 0, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, -9, 25, 1, -1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 4, -4, 30, 2, -1 delay 30 playsewithpan SE_M_POISON_POWDER, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 40, 0, 0, ANIM_TARGET, 2 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -3, -4, 20, 1, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, 7, -6, 25, 0, 1 createsprite gPluckParticleSpriteTemplate, ANIM_ATTACKER, 40, -4, -10, 25, 1, 1 @@ -363,7 +363,7 @@ gBattleAnimMove_UTurn:: createsprite gUTurnBallSpriteTemplate, ANIM_TARGET, 2, 0, 0, 21 waitforvisualfinish playsewithpan SE_M_TAIL_WHIP, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 createsprite gUTurnBallBackSpriteTemplate, ANIM_ATTACKER, 3, 4, 0, -16, 36 waitforvisualfinish @@ -416,22 +416,22 @@ gBattleAnimMove_Payback:: delay 0 setalpha 12, 8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 waitforvisualfinish clearmonbg ANIM_TARGET @@ -450,7 +450,7 @@ gBattleAnimMove_Assurance:: setalpha 12, 8 createsprite gPalmSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 playsewithpan SE_M_VITAL_THROW2, -64 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -490,7 +490,7 @@ gBattleAnimMove_Fling:: createsprite gBlackBallSpriteTemplate, ANIM_TARGET, 2, 20, 0, 0, 0, 35, -25 playsewithpan SE_M_SWAGGER, -64 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_VITAL_THROW, +63 clearmonbg ANIM_DEF_PARTNER @@ -860,7 +860,7 @@ gBattleAnimMove_LastResort:: delay 3 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 132, -10, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 132, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 1, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 @@ -899,7 +899,7 @@ gBattleAnimMove_SuckerPunch:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gSuckerPunchSpriteTemplate, ANIM_TARGET, 2, -18, 5, 40, 8, 160, 0 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 2 + 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 @@ -1089,31 +1089,31 @@ gBattleAnimMove_FlareBlitz:: call SetImpactBackground createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 192, -160, 40 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -192, -112, 40 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 160, 48, 40 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, -224, -32, 40 createsprite gFireSpreadSpriteTemplate, ANIM_TARGET, 1, 0, 10, 112, -128, 40 @@ -1255,38 +1255,38 @@ gBattleAnimMove_PoisonJab:: delay 2 createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 10, 30, 10 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, 4, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, 4, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -17, -27, 10 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, -6, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -4, -6, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 2, 31, 10 createvisualtask AnimTask_SwayMon, 5, 0, 3, 8192, 6, ANIM_TARGET createvisualtask AnimTask_BlendMonInAndOut, 5, ANIM_TARGET, RGB(16, 0, 16), 12, 0, 1 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 6, 4, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 6, 4, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, 15, -27, 10 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, 8, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, 8, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -31, -2, 10 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 6, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 6, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gPoisonJabProjectileSpriteTemplate, ANIM_TARGET, 2, -26, -18, 10 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, -8, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -6, -8, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 8, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 8, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, 0, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -8, 0, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, -5, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -7, -5, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish call PoisonBubblesEffect @@ -1547,7 +1547,7 @@ gBattleAnimMove_DragonRush:: createsprite gDragonRushSpriteTemplate, ANIM_ATTACKER, 3, -16, -16 delay 8 createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 31, 5, 1, RGB_WHITE, 10, 0, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 5, 1 waitforvisualfinish playsewithpan 131, SOUND_PAN_TARGET @@ -1608,7 +1608,7 @@ gBattleAnimMove_DrainPunch:: setalpha 12, 8 playsewithpan SE_M_VITAL_THROW2, -64 createsprite gFistFootSpriteTemplate, ANIM_TARGET, 3, 0, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 delay 20 call MegaDrainAbsorbEffect @@ -1626,7 +1626,7 @@ gBattleAnimMove_VacuumWave:: loadspritegfx ANIM_TAG_THIN_RING monbg ANIM_TARGET setalpha 12, 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, -8, ANIM_TARGET, 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, 0, 8, 1, 0 createsprite gUproarRingSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0, 0x7FFF, 3 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 @@ -1786,7 +1786,7 @@ GigaImpactContinuity: delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 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 @@ -1826,43 +1826,43 @@ gBattleAnimMove_BulletPunch:: monbg ANIM_TARGET setalpha 12, 8 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -8, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -16, 8, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 8, -16, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -16, 8, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 16, 16, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 16, 8, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 24, 0, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 0, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 24, 16, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 16, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 24, 16, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, 16, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 16, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 16, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, -8, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, -8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, -8, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, -24, 8, 8, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -24, 8, ANIM_TARGET, 2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 2 waitforvisualfinish @@ -2011,7 +2011,7 @@ gBattleAnimMove_ThunderFang:: createvisualtask AnimTask_InvertScreenColor, 2, 0x1 | 0x2 | 0x4 delay 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 2 + 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 @@ -2044,7 +2044,7 @@ gBattleAnimMove_IceFang:: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, -32, 0, 0, 819, 10 createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0, 32, 4, 0, -819, 10 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 delay 15 call IceCrystalEffectShort @@ -2074,7 +2074,7 @@ gBattleAnimMove_FireFang:: playsewithpan SE_M_BITE, SOUND_PAN_TARGET delay 10 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 4, 7, 1 call FireSpreadEffect delay 4 @@ -2320,17 +2320,17 @@ gBattleAnimMove_RockClimb:: createvisualtask AnimTask_Rollout, 2, 1 waitforvisualfinish createvisualtask AnimTask_ShakeTargetBasedOnMovePowerOrDmg, 2, 0, 1, 30, 1, 0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -15, 8, 1, 1 + 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, 1, 1 + 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, 1, 1 + 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, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, -52, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 1, -25, 16, 1, 4 delay 4 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 @@ -2676,7 +2676,7 @@ gBattleAnimMove_LeafStorm:: createsprite gBattleAnimSpriteTemplate_LeafStorm, ANIM_ATTACKER, 2, 26, 8, 12, 20, 27, 0, 0 delay 3 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 0, -36, 10 createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 24, -12, 10 createsprite gBattleAnimSpriteTemplate_LeafStorm2, ANIM_TARGET, 2, 1, 1, 24, 12, 10 @@ -2730,7 +2730,7 @@ RockWrecker_1: playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 130, 16, 0, 0, 0, 25, (1 << 8) | 1 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 131, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 131, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW SOUND_PAN_TARGET createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 130, 0, 0, 20, 24, 14, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 @@ -2748,7 +2748,7 @@ RockWrecker_2: playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gRockBlastRockSpriteTemplate, ANIM_ATTACKER, 2, 16, 0, 0, 0, 25, 257 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, 1, 1 + 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 @@ -2960,7 +2960,7 @@ gBattleAnimMove_StoneEdge:: delay 2 createsprite gStoneEdgeSpriteTemplate, ANIM_TARGET, 2, 0, 33, 464, 30, 15, 49, 1 delay 2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, 1, 3 + 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 delay 4 @@ -2970,7 +2970,7 @@ gBattleAnimMove_StoneEdge:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -3016,7 +3016,7 @@ gBattleAnimMove_GrassKnot:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gGrassKnotSpriteTemplate, ANIM_TARGET, 2, -18, 19, 40, 8, 160, 0 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 2 + 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 @@ -3343,7 +3343,7 @@ gBattleAnimMove_AttackOrder:: createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 2, 20, 255, 15, 32, 0 createsprite gAttackOrderParticleSpriteTemplate, ANIM_TARGET, 2, 110, 10, 8, 32, 20 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, 1, 3 + 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_TARGET, 3, 0, 12, 1 @@ -3354,7 +3354,7 @@ gBattleAnimMove_AttackOrder:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 1, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, 1, 3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -3463,7 +3463,7 @@ gBattleAnimMove_DoubleHit:: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 8 @@ -3474,7 +3474,7 @@ gBattleAnimMove_DoubleHit:: @ I don't know, but I'm not gonna argue with it createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 4, 4 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 8 @@ -4300,7 +4300,7 @@ gBattleAnimMove_HeavySlam:: delay 11 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 + 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 @@ -4436,7 +4436,7 @@ gBattleAnimMove_FlameCharge:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x5 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 call FireSpreadEffect playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_ATTACKER @@ -4475,7 +4475,7 @@ gBattleAnimMove_LowSweep:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 createsprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 14, 40, 8, 160, 0 delay 4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, 1, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 1, 4 @@ -4657,7 +4657,7 @@ gBattleAnimMove_ChipAway:: createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 24, 6, 1, 5 delay 0x4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2 SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_ATK_PARTNER @@ -4818,7 +4818,7 @@ gBattleAnimMove_ShellSmash:: createsprite gShellSmashRightShellSpriteTemplate, ANIM_ATTACKER, 2, 0xffd7, 0x0, 0x2, 0x333, 0x0, 10, 30 createsprite gShellSmashLeftShellSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x0, 0x6, 0xfccd, 0x0, 10, 30 delay 10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createsprite gFistFootSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x8, 0x1, 0x0 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 @@ -4914,7 +4914,7 @@ SkyDropUnleash: createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 delay 0x7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 + 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 @@ -4942,7 +4942,7 @@ gBattleAnimMove_CircleThrow:: waitforvisualfinish createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x14, 0x0, 0x0, 0x4 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 0x1 @@ -5675,7 +5675,7 @@ gBattleAnimMove_DragonTail:: createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfff4, 0xa, 0x0, 0x3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 call TailWhackDown @@ -5689,7 +5689,7 @@ gBattleAnimMove_DragonTail:: blendoff end TailWhackDown: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0xfff8, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -10, -8, ANIM_TARGET, 1 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, -12, 0x1b, 2, 3 createsprite gRockScatterSpriteTemplate, ANIM_TARGET, 2, 8, 28, 3, 4 @@ -5774,7 +5774,7 @@ gBattleAnimMove_WildCharge:: delay 0xb createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 delay 0x6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 16, 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call ElectricityEffect @@ -5944,11 +5944,11 @@ gBattleAnimMove_HeatCrash:: playsewithpan SE_SUCCESS, SOUND_PAN_TARGET createsprite gHeatCrashEruptionRockTemplate, ANIM_ATTACKER, 3, 0x0, 0xffe0, 0xf delay 0x13 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff8, 0x1, 0x1 + 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 delay 0x5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xa, 0xfff8, 0x1, 0x1 + 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, 0xfff4, 0x20, 0x3, 0x4 @@ -5996,13 +5996,13 @@ gBattleAnimMove_Steamroller:: setalpha 12, 8 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 delay 6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 6, 3 delay 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 3, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 3, ANIM_TARGET, 0 delay 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 10, 6, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 10, 6, ANIM_TARGET, 0 delay 1 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 @@ -6188,13 +6188,13 @@ gBattleAnimMove_GearGrind:: createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x0, 0x333, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x0, 0xfccd, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 waitforvisualfinish createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x0, 0xfccd, 0x333, 0xa createsprite gGearGrindTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x0, 0x333, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 waitforvisualfinish stopsound @@ -6813,7 +6813,7 @@ gBattleAnimMove_RelicSong:: createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x1d, 0xfff4, 0x0 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff4, 0xffe3, 0x1 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 + 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 @@ -6824,7 +6824,7 @@ gBattleAnimMove_RelicSong:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 0x5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -6917,7 +6917,7 @@ gBattleAnimMove_BoltStrike:: monbg ANIM_TARGET createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 delay 0x6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 2, 0, 32, 1 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET @@ -7157,7 +7157,7 @@ gBattleAnimMove_Snarl:: createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0xffe8, 0x1 createsprite gJaggedMusicNoteSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0xffe8, 0x0 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 + 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 @@ -7168,7 +7168,7 @@ gBattleAnimMove_Snarl:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 0x4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish call UnsetPsychicBg @@ -7840,7 +7840,7 @@ gBattleAnimMove_PetalBlizzard:: createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x14, 0xff, 0xf, 0x20, 0x0 createsprite gTwisterLeafSpriteTemplate, ANIM_TARGET, 2, 0x6e, 0xA, 0x8, 0x20, 0x14 waitforvisualfinish - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 + 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 @@ -7852,7 +7852,7 @@ gBattleAnimMove_PetalBlizzard:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 0x4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_DEF_PARTNER @@ -8451,7 +8451,7 @@ gBattleAnimMove_DiamondStorm:: createsprite gDiamondStormDiamondsTemplate, ANIM_TARGET, 2, 0x6e, 0xa, 0x8, 0x20, 0x14 waitforvisualfinish @this is the buffet part - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 12, 1 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_DEF_PARTNER, 3, 0, 12, 1 @@ -8462,7 +8462,7 @@ gBattleAnimMove_DiamondStorm:: createsprite gRandomPosHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x1, 0x3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET delay 0x4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 3 playsewithpan SE_M_ICY_WIND, SOUND_PAN_TARGET waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0xF, 0x0, 0x1888 @@ -9124,7 +9124,7 @@ gBattleAnimMove_Nuzzle:: playsewithpan SE_M_CHARM, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 call ElectricityEffectNoSound waitforvisualfinish end @@ -9142,7 +9142,7 @@ gBattleAnimMove_HoldBack:: createsprite gHoldBackSwipeTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1 waitforvisualfinish createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 3, 0, 10, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 createsprite gHoldBackRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 createsprite gHoldBackStarsTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff8, 0xa0, 0xffe0 createsprite gHoldBackStarsTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff8, 0xff00, 0xffd8 @@ -9199,7 +9199,7 @@ gBattleAnimMove_PowerUpPunch:: playsewithpan SE_M_METRONOME, SOUND_PAN_ATTACKER waitforvisualfinish playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, 1, 1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 waitforvisualfinish clearmonbg ANIM_TARGET @@ -9718,7 +9718,7 @@ gBattleAnimMove_DragonAscent:: createsprite gDragonAscentDrakeTemplate, ANIM_ATTACKER, 2, 5 delay 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x1, -32, 0, 0, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) @@ -10200,7 +10200,7 @@ gBattleAnimMove_HighHorsepower:: delay 0x32 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET call SetImpactBackground - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x0, 0x7fff createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 @@ -11457,10 +11457,10 @@ gBattleAnimGeneral_ShellTrapSetUp:: delay 0x4 playsewithpan SE_M_FIRE_PUNCH, SOUND_PAN_TARGET delay 0x15 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xA, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xA, 0x0, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xA, 0xA, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 0, ANIM_TARGET, 2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 10, ANIM_TARGET, 2 waitforvisualfinish clearmonbg ANIM_TARGET blendoff @@ -11710,14 +11710,14 @@ PsychicFangsRegular: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 delay 0x10 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 8, 4, 2 PsychicFangsEnd: playsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET @@ -11732,14 +11732,14 @@ PsychicFangsDestroyWall: createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 5, 2 delay 0x10 playsewithpan SE_M_BITE, SOUND_PAN_TARGET createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0x20, 0xffe0, 0x7, 0xfccd, 0x333, 0xa createsprite gSharpTeethSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x20, 0x3, 0x333, 0xfccd, 0xa delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 8, 0, ANIM_TARGET, 1 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x0, 0xfff8, 0xfff4 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x1, 0x8, 0xfff4 createsprite gBrickBreakWallShardSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x2, 0xfff8, 0xc @@ -11797,7 +11797,7 @@ gBattleAnimMove_ShadowBone:: playsewithpan SE_M_BONEMERANG, SOUND_PAN_TARGET createsprite gSpinningBoneSpriteTemplate, ANIM_ATTACKER, 2, 0xffd6, 0xffe7, 0x0, 0x0, 0xf delay 0xc - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + 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, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -11822,7 +11822,7 @@ gBattleAnimMove_Accelerock:: playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER delay 0x4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 6, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x1, 0x3, 0x0, 0x5, 0x1 createsprite gRockFragmentSpriteTemplate, ANIM_TARGET, 2, 0x5, 0x0, 0xffec, 0x18, 0xe, 0x1 @@ -11844,7 +11844,7 @@ gBattleAnimMove_Liquidation:: setalpha 12, 8 createsprite gHorizontalLungeSpriteTemplate, ANIM_ATTACKER, 2, 0x4, 0x4 delay 0x6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 6, 1 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET waitforvisualfinish @@ -12564,7 +12564,7 @@ PlasmaFistSpark2: PlasmaFistsImpact: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x8, 0x1, 0x0 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 delay 0x1 createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 delay 0x1 @@ -12578,7 +12578,7 @@ PlasmaFistsImpact: createvisualtask AnimTask_InvertScreenColor, 0x2, 0x101, 0x101, 0x101 delay 0x2 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 15, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 2 return gBattleAnimMove_PhotonGeyser:: @@ -13089,7 +13089,7 @@ gBattleAnimMove_DoubleIronBash:: delay 0x18 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x9 delay 0x11 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe0, 0x0, 0x0, 0x3 waitforvisualfinish playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET @@ -13135,7 +13135,7 @@ gBattleAnimMove_JawLock:: createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0xffe0, 0xffe0, 0x1, 0x333, 0x333, 0xa, 15 createsprite gJawLockTeethTemplate, ANIM_ATTACKER, 2, 0x20, 0x20, 0x5, 0xfccd, 0xfccd, 0xa, 15 delay 0xa - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff8, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -8, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 7, 10, 2 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x1, 0x7, 0x0, 0x0 @;Black @@ -13496,23 +13496,23 @@ gBattleAnimMove_DrumBeating:: createsprite gFrenzyPlantRootSpriteTemplate, ANIM_ATTACKER, 2, 0x55, 0xfff0, 0xfffa, 0x0, 0x2, 0x4b playsewithpan SE_M_SCRATCH, SOUND_PAN_TARGET delay 0x5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff6, 0xfff6, 0x1, 0x3 + 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 0x3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xa, 0x8, 0x1, 0x3 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, 8, ANIM_TARGET, 3 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 0x3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xa, 0xfffd, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 10, -3, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 0x3 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfffd, 0x1, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -3, 1, ANIM_TARGET, 2 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0xfff6, 0x1, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -10, 1, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xa, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 10, ANIM_TARGET, 1 playsewithpan SE_M_DOUBLE_SLAP, SOUND_PAN_TARGET waitforvisualfinish clearmonbg ANIM_TARGET @@ -13614,7 +13614,7 @@ gBattleAnimMove_AuraWheel:: delay 0x4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 2, 12, 0, 0x76E1 @Revert blue Electricity createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x0, 0x28, 0x0, 0x8003 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x30, 0x2c, 0x40, 0x28, 0x1, 0x8003 @@ -13634,7 +13634,7 @@ gBattleAnimMove_BreakingSwipe:: createvisualtask AnimTask_BlendParticle, 5, ANIM_TAG_SPARK_2, 0, 12, 12, 0x001F @Red monbg ANIM_TARGET setalpha 12, 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -32, -16, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0x5, 0x0, 0x5, 0x0 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 21, 1 @@ -13648,7 +13648,7 @@ gBattleAnimMove_BreakingSwipe:: createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xfff8, 0x8, 0x5, 0x2 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET delay 0x4 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x14, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 32, 20, ANIM_TARGET, 1 createsprite gBreakingSwipeCenteredElectricity, ANIM_TARGET, 2, 0xffec, 0xf, 0x5, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET waitsound @@ -14173,7 +14173,7 @@ gBattleAnimMove_ScaleShot:: createsprite gSpriteTemplate_ScaleShotScale, ANIM_TARGET, 2, 0x10, 0x0, 0x0, 0x0, 0x14, 0x101 waitforvisualfinish playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 3, 0, 5, 1 delay 0x10 stopsound @@ -14641,7 +14641,7 @@ gBattleAnimMove_Poltergeist:: createvisualtask AnimTask_PoltergeistItem, 2 waitforvisualfinish setalpha 12, 8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + 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, 0x7, 0x5, 0x1, 0x0, 0xa, 0x0, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -14730,14 +14730,14 @@ gBattleAnimMove_TripleAxel:: goto TripleAxelTurn2 TripleAxelTurn0: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0xfff0, 0xfff8, 0x14, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff0, 0xfff0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -16, -16, ANIM_TARGET, 2 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0xfff0, 0xfff8, 0xff00, 0xffd8 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0xfff0, 0xfff8, 0x1a0, 0xffda createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 4, 0, 4, 1 goto TripleAxelEnd TripleAxelTurn1: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x8, 0x8, 0x14, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x8, 0x0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 8, 0, ANIM_TARGET, 2 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0xa0, 0xffe0 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0xff00, 0xffd8 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x8, 0x8, 0x1a0, 0xffda @@ -14746,7 +14746,7 @@ TripleAxelTurn1: goto TripleAxelEnd TripleAxelTurn2: createsprite gFistFootSpriteTemplate, ANIM_TARGET, 4, 0x0, 0x0, 0x14, 0x1, 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff8, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -8, ANIM_TARGET, 1 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0xa0, 0xffe0 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0xff00, 0xffd8 createsprite gTripleAxelIceCrystalSpriteTemplate, ANIM_TARGET, 1, 0x0, 0x0, 0x80, 0xfff0 @@ -14771,38 +14771,38 @@ gBattleAnimMove_DualWingbeat:: playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET jumpifmoveturn 1, DualWingbeatRightSide DualWingbeatLeftSide: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -20, 10, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -20, 10, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -20, 0, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -20, 0, ANIM_TARGET, 2 call DualWingbeatFeatherScatterLeft delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -20, -10, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -20, -10, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 5, -20, -20, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 5, -20, -20, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 6, -20, -30, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 6, -20, -30, ANIM_TARGET, 2 waitforvisualfinish blendoff end DualWingbeatRightSide: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 10, 10, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 10, 10, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 0, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 10, 0, ANIM_TARGET, 2 call DualWingbeatFeatherScatterRight delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 10, -10, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 10, -10, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 5, 10, -20, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 5, 10, -20, ANIM_TARGET, 2 delay 1 playsewithpan SE_M_WING_ATTACK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 6, 10, -30, ANIM_TARGET, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 6, 10, -30, ANIM_TARGET, 2 waitforvisualfinish blendoff end @@ -14941,7 +14941,7 @@ gBattleAnimMove_WickedBlow:: createsprite gSpriteTemplate_WickedBlowFist, ANIM_TARGET, 4, ANIM_TARGET, 0, 0, 16, 32 delay 6 loopsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET, 0x4, 0x6 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 1 createsprite gSpriteTemplate_WickedBlowBlackStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0xfe80, 0xffe1 createsprite gSpriteTemplate_WickedBlowRedStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0xff00, 0xffd8 createsprite gSpriteTemplate_WickedBlowBlackStars, ANIM_TARGET, 2, 0xfff0, 0xfff8, 0xff80, 0xffea @@ -15247,7 +15247,7 @@ gBattleAnimMove_ThunderousKick:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x30, 0x3, 0x0, 0x4 delay 0x7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x0, 0x7fff createsprite gComplexPaletteBlendSpriteTemplate, ANIM_ATTACKER, 2, 0x1f, 0x3, 0x1, 0x0, 0x8, 0x0, 0x0 @@ -16870,7 +16870,7 @@ gBattleAnimMove_Trailblaze:: createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x5 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 6, 0, 8, 1 createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, 192, 176, 40 createsprite gTropKickLeavesTemplate, ANIM_TARGET, 1, 0, 10, -192, 240, 40 @@ -17750,22 +17750,22 @@ gBattleAnimMove_Comeuppance:: delay 5 setalpha 12, 8 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 30, 1 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 24, 8, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -24, -16, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 8, 4, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, -16, 19, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 delay 5 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, 1, 0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 18, -18, ANIM_TARGET, 0 playsewithpan SE_M_COMET_PUNCH, +63 waitforvisualfinish clearmonbg ANIM_TARGET @@ -29423,48 +29423,48 @@ gBattleAnimMove_AllOutPummeling:: createvisualtask AnimTask_ShakeMon, 5, ANIM_TARGET, 0, 2, 63, 1 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x18, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xfffa, 0x12, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffd0, 0x14, 0x0, 0x0, 0xa, 0x1, ANIM_FIST_1, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffe0, 0x17, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0x11, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_1, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffb0, 0x10, 0x0, 0x0, 0xa, 0x1, ANIM_FOOT_2, 0x1 delay 0x2 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET delay 0x8 createsprite gAllOutPummelingOnslaughtSpriteTemplate, ANIM_ATTACKER, 2, 0xffa0, 0x15, 0x0, 0x0, 0xa, 0x1, ANIM_CHOP, 0x1 delay 0x2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 0x10 createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -24, 8, 23, 10, 40, 10 @@ -29542,7 +29542,7 @@ FinishSupersonicSkystrike: playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER createsprite gSupersonicSkystrikeFlySpriteTemplate, ANIM_ATTACKER, 2, 0x14 delay 0x10 - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 @@ -29670,7 +29670,7 @@ gBattleAnimMove_TectonicRage:: delay 0x20 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER monbg ANIM_TARGET - createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x1, 0x2 + createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 delay 0x1 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 delay 0xa @@ -30046,7 +30046,7 @@ gSavageSpinOutStringBlastSpriteTemplateSHOT: delay 0x3 return SavageSpinOutCrash_1: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0xfff6, 0xfff8, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -10, -8, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @@ -30054,7 +30054,7 @@ SavageSpinOutCrash_1: createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 12, -36, -16, 24 return SavageSpinOutCrash_2: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0xa, 0xfff8, 0x1, 0x1 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 10, -8, ANIM_TARGET, 1 playsewithpan SE_M_ROCK_THROW, SOUND_PAN_TARGET createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -48, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -16, -10, 24 @@ -30308,7 +30308,7 @@ FinishCorkscrewCrash: delay 0x10 stopsound playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0xf, 0x0, 0x4 @ shove target down a bit waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 @@ -32584,7 +32584,7 @@ PulverizingPancakeFinish: createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 delay 0x7 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 @big hit marker + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, 0, 0, ANIM_TARGET, 0 @big hit marker delay 0x0 createvisualtask AnimTask_HorizontalShake, 5, ANIM_TARGET, 4, 44 createsprite gPulverizingPancakeYellowRingSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x0, 0x100, 0x0 @@ -33780,11 +33780,11 @@ LetsSnuggleForeverTears: createsprite gTearDropSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x3 return LetsSnuggleForeverImpacts: - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xfff4, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, -12, ANIM_TARGET, 0 delay 0x8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xfff4, 0x8, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, -12, 8, ANIM_TARGET, 0 delay 0x8 - createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0xc, 0x0, 0x1, 0x0 + createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 12, 0, ANIM_TARGET, 0 delay 0x8 return LetsSnuggleForeverStars_1: From e9ba4b5db0d855c4fd1227a36f07d9360ca9f1af Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 22 May 2025 09:45:25 +0200 Subject: [PATCH 115/187] Added type: documentation to required labels for the label check (#6957) Co-authored-by: Hedara --- .github/workflows/labels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index aa53665e8f..85800211ef 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -26,3 +26,4 @@ jobs: category: overworld category: pokemon category: sprite-issue + type: documentation From be4b8ca3d0074f4639b13066434d51569cd49c07 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 04:23:15 -0400 Subject: [PATCH 116/187] Fix `KNOWN_FAILING` Bestow tests (#6947) --- src/battle_util.c | 5 +++-- src/data/moves_info.h | 2 +- test/battle/move_effect/bestow.c | 27 +++++++++++++++------------ 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/battle_util.c b/src/battle_util.c index 783f06da0f..3807270276 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11245,8 +11245,9 @@ bool32 CanBattlerGetOrLoseItem(u32 battler, u16 itemId) u16 species = gBattleMons[battler].species; u16 holdEffect = ItemId_GetHoldEffect(itemId); - // Mail can be stolen now - if (itemId == ITEM_ENIGMA_BERRY_E_READER) + if (ItemIsMail(itemId)) + return FALSE; + else if (itemId == ITEM_ENIGMA_BERRY_E_READER) return FALSE; else if (DoesSpeciesUseHoldItemToChangeForm(species, itemId)) return FALSE; diff --git a/src/data/moves_info.h b/src/data/moves_info.h index 70d3184ece..1eab939154 100644 --- a/src/data/moves_info.h +++ b/src/data/moves_info.h @@ -13172,7 +13172,7 @@ const struct MoveInfo gMovesInfo[MOVES_COUNT_ALL] = .category = DAMAGE_CATEGORY_STATUS, .zMove = { .effect = Z_EFFECT_SPD_UP_2 }, .ignoresProtect = B_UPDATED_MOVE_FLAGS >= GEN_6, - .ignoresSubstitute = TRUE, + .ignoresSubstitute = B_UPDATED_MOVE_FLAGS >= GEN_6, .metronomeBanned = TRUE, .copycatBanned = TRUE, .assistBanned = TRUE, diff --git a/test/battle/move_effect/bestow.c b/test/battle/move_effect/bestow.c index 24abdb3bea..4ed952be6b 100644 --- a/test/battle/move_effect/bestow.c +++ b/test/battle/move_effect/bestow.c @@ -47,8 +47,6 @@ SINGLE_BATTLE_TEST("Bestow fails if the target already has a held item") #include "mail.h" SINGLE_BATTLE_TEST("Bestow fails if the user is holding Mail") { - KNOWN_FAILING; - GIVEN { ASSUME(ItemIsMail(ITEM_ORANGE_MAIL)); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_ORANGE_MAIL); } @@ -94,36 +92,41 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item is a Z-Crystal") } } -SINGLE_BATTLE_TEST("Bestow fails if the target is behind a Substitute") +SINGLE_BATTLE_TEST("Bestow fails if the target is behind a Substitute (Gen 6+)") { - KNOWN_FAILING; - GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_SITRUS_BERRY); Speed(50); } OPPONENT(SPECIES_WOBBUFFET) { Speed(100); } } WHEN { TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_BESTOW); } } SCENE { - MESSAGE("But it failed!"); + if (B_UPDATED_MOVE_FLAGS >= GEN_6) { + NOT MESSAGE("But it failed!"); + } else { + MESSAGE("But it failed!"); + } } THEN { - EXPECT(player->item == ITEM_SITRUS_BERRY); - EXPECT(opponent->item == ITEM_NONE); + if (B_UPDATED_MOVE_FLAGS >= GEN_6) { + EXPECT(player->item == ITEM_NONE); + EXPECT(opponent->item == ITEM_SITRUS_BERRY); + } else { + EXPECT(player->item == ITEM_SITRUS_BERRY); + EXPECT(opponent->item == ITEM_NONE); + } } } SINGLE_BATTLE_TEST("Bestow fails if the user's held item changes its form") { - KNOWN_FAILING; - GIVEN { - PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(ITEM_GRISEOUS_ORB); } + PLAYER(SPECIES_GIRATINA_ORIGIN) { Item(ITEM_GRISEOUS_CORE); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { TURN { MOVE(player, MOVE_BESTOW); } } SCENE { MESSAGE("But it failed!"); } THEN { - EXPECT(player->item == ITEM_GRISEOUS_ORB); + EXPECT(player->item == ITEM_GRISEOUS_CORE); EXPECT(opponent->item == ITEM_NONE); } } From 942a533ea1c4dacbe941de20e21eb2ef63eb76c0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 04:24:49 -0400 Subject: [PATCH 117/187] Added missing root folder check in trainer battle type migration script (#6944) --- migration_scripts/1.12/convert_trainer_battle_types.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/migration_scripts/1.12/convert_trainer_battle_types.py b/migration_scripts/1.12/convert_trainer_battle_types.py index 767644fedb..c195ddc635 100644 --- a/migration_scripts/1.12/convert_trainer_battle_types.py +++ b/migration_scripts/1.12/convert_trainer_battle_types.py @@ -1,4 +1,5 @@ import re +import os def trainer_battle_types(data): data = re.sub(re.escape("Double Battle: No"), "Battle Type: Singles", data) @@ -6,6 +7,10 @@ def trainer_battle_types(data): return data +if not os.path.exists("Makefile"): + print("Please run this script from your root folder.") + quit() + with open('src/data/trainers.party', 'r') as file: data = file.read() with open('src/data/trainers.party', 'w') as file: From 8ad1f329c99640259e4cea018084b931ca8b8638 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 22 May 2025 10:37:00 +0200 Subject: [PATCH 118/187] Fixes Dazzling abilities activating on all multi hit move hits (#6943) --- src/battle_util.c | 1 + test/battle/ability/dazzling.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/battle_util.c b/src/battle_util.c index 3807270276..640b4753af 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4313,6 +4313,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 move, u32 ability if (option == ABILITY_RUN_SCRIPT) { + gMultiHitCounter = 0; // Prevent multi-hit moves from hitting more than once after move has been absorbed. gBattleScripting.battler = gBattlerAbility = battlerAbility; gBattlescriptCurrInstr = battleScriptBlocksMove; } diff --git a/test/battle/ability/dazzling.c b/test/battle/ability/dazzling.c index e248c9ce0b..7541b8a566 100644 --- a/test/battle/ability/dazzling.c +++ b/test/battle/ability/dazzling.c @@ -72,3 +72,27 @@ DOUBLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail don't protect the u } } +SINGLE_BATTLE_TEST("Dazzling, Queenly Majesty and Armor Tail protect from all multi hit hits with one activation") +{ + u32 species, ability; + + PARAMETRIZE { species = SPECIES_BRUXISH; ability = ABILITY_DAZZLING; } + PARAMETRIZE { species = SPECIES_FARIGIRAF; ability = ABILITY_ARMOR_TAIL; } + PARAMETRIZE { species = SPECIES_TSAREENA; ability = ABILITY_QUEENLY_MAJESTY; } + + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(species) { Ability(ability); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_SHURIKEN); } + } SCENE { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_WATER_SHURIKEN, opponent); + ABILITY_POPUP(opponent, ability); + NONE_OF { + ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(opponent, ability); + } + } +} From eb2121924dab7fc9958bf7b7fd7f35ed845f67f7 Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Thu, 22 May 2025 10:26:54 +0100 Subject: [PATCH 119/187] Fixes Knock Off/Smack Down effect on immune target/protect (#6958) --- src/battle_script_commands.c | 4 +-- test/battle/move_effect/knock_off.c | 39 ++++++++++++++++++++++++++-- test/battle/move_effect/smack_down.c | 27 +++++++++++++++++++ 3 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 6bcf8be569..439299ac28 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -6559,6 +6559,7 @@ static void Cmd_moveend(void) break; case MOVEEND_FIRST_MOVE_BLOCK: if ((gSpecialStatuses[gBattlerAttacker].parentalBondState == PARENTAL_BOND_1ST_HIT && IsBattlerAlive(gBattlerTarget)) + || gBattleStruct->moveResultFlags[gBattlerTarget] & MOVE_RESULT_NO_EFFECT || gHitMarker & HITMARKER_UNABLE_TO_USE_MOVE) { gBattleScripting.moveendState++; @@ -6575,8 +6576,7 @@ static void Cmd_moveend(void) if (IsBattlerTurnDamaged(gBattlerTarget) && IsBattlerAlive(gBattlerTarget) && IsBattlerAlive(gBattlerAttacker) - && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER) - && gSpecialStatuses[gBattlerAttacker].parentalBondState != PARENTAL_BOND_1ST_HIT) + && !(gStatuses3[BATTLE_PARTNER(gBattlerTarget)] & STATUS3_COMMANDER)) { u32 targetAbility = GetBattlerAbility(gBattlerTarget); if (targetAbility == ABILITY_GUARD_DOG) diff --git a/test/battle/move_effect/knock_off.c b/test/battle/move_effect/knock_off.c index 4eb1269717..626e0cde28 100644 --- a/test/battle/move_effect/knock_off.c +++ b/test/battle/move_effect/knock_off.c @@ -90,8 +90,7 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute") PLAYER(SPECIES_WOBBUFFET); OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); }; } WHEN { - TURN { MOVE(opponent, MOVE_SUBSTITUTE); - MOVE(player, MOVE_KNOCK_OFF); } + TURN { MOVE(opponent, MOVE_SUBSTITUTE); MOVE(player, MOVE_KNOCK_OFF); } } SCENE { ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); NOT { ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF); } @@ -100,6 +99,42 @@ SINGLE_BATTLE_TEST("Knock Off does not remove items through Substitute") } } +SINGLE_BATTLE_TEST("Knock Off does not remove items through Protect") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Item(ITEM_LEFTOVERS); }; + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF); + } + } THEN { + EXPECT(opponent->item == ITEM_LEFTOVERS); + } +} + +SINGLE_BATTLE_TEST("Knock Off does not remove items if target is immune") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); + ASSUME(gSpeciesInfo[SPECIES_DONPHAN].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_DONPHAN].types[1] == TYPE_GROUND); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_DONPHAN) { Item(ITEM_LEFTOVERS); }; + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_KNOCK_OFF); } + } SCENE { + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_KNOCK_OFF, player); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_ITEM_KNOCKOFF); + } + } THEN { + EXPECT(opponent->item == ITEM_LEFTOVERS); + } +} + SINGLE_BATTLE_TEST("Recycle cannot recover an item removed by Knock Off") { GIVEN { diff --git a/test/battle/move_effect/smack_down.c b/test/battle/move_effect/smack_down.c index 116ac36ce0..e4c973e699 100644 --- a/test/battle/move_effect/smack_down.c +++ b/test/battle/move_effect/smack_down.c @@ -17,3 +17,30 @@ SINGLE_BATTLE_TEST("Smack Down does not ground mons behind substitutes") NOT MESSAGE("The opposing Skarmory fell straight down!"); } } + +SINGLE_BATTLE_TEST("Smack Down does not ground mons through Protect") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_SKARMORY); + } WHEN { + TURN { MOVE(opponent, MOVE_PROTECT); MOVE(player, MOVE_SMACK_DOWN); } + } SCENE { + NOT MESSAGE("The opposing Skarmory fell straight down!"); + } +} + +SINGLE_BATTLE_TEST("Smack Down does not ground target if target is immune") +{ + GIVEN { + ASSUME(GetMoveEffect(MOVE_ELECTRIFY) == EFFECT_ELECTRIFY); + ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_GROUND || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_GROUND); + ASSUME(gSpeciesInfo[SPECIES_GLISCOR].types[0] == TYPE_FLYING || gSpeciesInfo[SPECIES_GLISCOR].types[1] == TYPE_FLYING); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_GLISCOR); + } WHEN { + TURN { MOVE(opponent, MOVE_ELECTRIFY); MOVE(player, MOVE_SMACK_DOWN); } + } SCENE { + NOT MESSAGE("The opposing Gliscor fell straight down!"); + } +} From 8ec998abff1ed517592a656de1209b15c1a188cd Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 22 May 2025 14:07:36 +0200 Subject: [PATCH 120/187] Fixes ate type being ignored after checking summary screen (#6888) --- include/battle_main.h | 2 +- include/constants/battle.h | 6 ++++ include/pokemon.h | 3 +- src/battle_controller_player.c | 3 +- src/battle_main.c | 58 ++++++++++++++++------------------ src/pokemon.c | 6 ++-- src/pokemon_summary_screen.c | 33 +++++++++++-------- 7 files changed, 60 insertions(+), 51 deletions(-) diff --git a/include/battle_main.h b/include/battle_main.h index f78d2f78c3..544d4ea134 100644 --- a/include/battle_main.h +++ b/include/battle_main.h @@ -80,7 +80,7 @@ s32 GetWhichBattlerFaster(u32 battler1, u32 battler2, bool32 ignoreChosenMoves); void RunBattleScriptCommands_PopCallbacksStack(void); void RunBattleScriptCommands(void); void SpecialStatusesClear(void); -u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost); +u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState monInBattle); void SetTypeBeforeUsingMove(u32 move, u32 battlerAtk); bool32 IsWildMonSmart(void); u8 CreateNPCTrainerPartyFromTrainer(struct Pokemon *party, const struct Trainer *trainer, bool32 firstTrainer, u32 battleTypeFlags); diff --git a/include/constants/battle.h b/include/constants/battle.h index d7f055a81b..cfb5d05e7e 100644 --- a/include/constants/battle.h +++ b/include/constants/battle.h @@ -622,4 +622,10 @@ enum SlideMsgStates RESTORE_BATTLER_SLIDE_CONTROL, }; +enum MonState +{ + MON_IN_BATTLE, + MON_OUTSIDE_BATTLE, +}; + #endif // GUARD_CONSTANTS_BATTLE_H diff --git a/include/pokemon.h b/include/pokemon.h index c562e3af74..994197c44a 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -6,6 +6,7 @@ #include "constants/regions.h" #include "constants/region_map_sections.h" #include "constants/map_groups.h" +#include "constants/battle.h" #include "contest_effect.h" #define GET_BASE_SPECIES_ID(speciesId) (GetFormSpeciesId(speciesId, 0)) @@ -805,7 +806,7 @@ void HealPokemon(struct Pokemon *mon); void HealBoxPokemon(struct BoxPokemon *boxMon); void UpdateDaysPassedSinceFormChange(u16 days); void TrySetDayLimitToFormChange(struct Pokemon *mon); -u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler); +u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state); uq4_12_t GetDynamaxLevelHPMultiplier(u32 dynamaxLevel, bool32 inverseMultiplier); u32 GetRegionalFormByRegion(u32 species, u32 region); bool32 IsSpeciesForeignRegionalForm(u32 species, u32 currentRegion); diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index e9cdab0f32..8eac6cb304 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -1714,7 +1714,6 @@ static void MoveSelectionDisplayMoveType(u32 battler) } else if (effect == EFFECT_IVY_CUDGEL) { - if (speciesId == SPECIES_OGERPON_WELLSPRING || speciesId == SPECIES_OGERPON_WELLSPRING_TERA || speciesId == SPECIES_OGERPON_HEARTHFLAME || speciesId == SPECIES_OGERPON_HEARTHFLAME_TERA || speciesId == SPECIES_OGERPON_CORNERSTONE || speciesId == SPECIES_OGERPON_CORNERSTONE_TERA) @@ -1734,7 +1733,7 @@ static void MoveSelectionDisplayMoveType(u32 battler) else if (P_SHOW_DYNAMIC_TYPES) // Non-vanilla changes to battle UI showing dynamic types { struct Pokemon *mon = &gPlayerParty[gBattlerPartyIndexes[battler]]; - type = CheckDynamicMoveType(mon, move, battler); + type = CheckDynamicMoveType(mon, move, battler, MON_IN_BATTLE); } end = StringCopy(txtPtr, gTypesInfo[type].name); diff --git a/src/battle_main.c b/src/battle_main.c index 15c30ba013..728022237a 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5771,19 +5771,19 @@ void RunBattleScriptCommands(void) gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } -bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) +u32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) { - u32 ateType; + u32 ateType = TYPE_NONE; switch (GetMoveEffect(move)) { case EFFECT_TERA_BLAST: if (GetActiveGimmick(battlerAtk) == GIMMICK_TERA) - return FALSE; + return ateType; break; case EFFECT_TERA_STARSTORM: if (gBattleMons[battlerAtk].species == SPECIES_TERAPAGOS_STELLAR) - return FALSE; + return ateType; break; case EFFECT_HIDDEN_POWER: case EFFECT_WEATHER_BALL: @@ -5791,10 +5791,9 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) case EFFECT_CHANGE_TYPE_ON_ITEM: case EFFECT_REVELATION_DANCE: case EFFECT_TERRAIN_PULSE: - return FALSE; + return ateType; } - ateType = TYPE_NONE; switch (attackerAbility) { case ABILITY_PIXILATE: @@ -5814,28 +5813,21 @@ bool32 TrySetAteType(u32 move, u32 battlerAtk, u32 attackerAbility) break; } - if (ateType != TYPE_NONE && GetActiveGimmick(battlerAtk) != GIMMICK_Z_MOVE) - { - gBattleStruct->dynamicMoveType = ateType | F_DYNAMIC_TYPE_SET; - return TRUE; - } - - return FALSE; + return ateType; } // Returns TYPE_NONE if type doesn't change. -// NULL can be passed to ateBoost to avoid applying ate-ability boosts when opening the summary screen in-battle. -u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) +u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) { u32 moveType = GetMoveType(move); u32 moveEffect = GetMoveEffect(move); u32 species, heldItem, holdEffect, ability, type1, type2, type3; - bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE; + enum Gimmick gimmick = GetActiveGimmick(battler); if (move == MOVE_STRUGGLE) return TYPE_NORMAL; - if (monInBattle) + if (state == MON_IN_BATTLE) { species = gBattleMons[battler].species; heldItem = gBattleMons[battler].item; @@ -5859,7 +5851,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) switch (moveEffect) { case EFFECT_WEATHER_BALL: - if (monInBattle) + if (state == MON_IN_BATTLE) { if (HasWeatherEffect()) { @@ -5900,7 +5892,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) case EFFECT_HIDDEN_POWER: { u32 typeBits = 0; - if (monInBattle) + if (state == MON_IN_BATTLE) { typeBits = ((gBattleMons[battler].hpIV & 1) << 0) | ((gBattleMons[battler].attackIV & 1) << 1) @@ -5935,10 +5927,10 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) return ItemId_GetSecondaryId(heldItem); break; case EFFECT_REVELATION_DANCE: - if (GetActiveGimmick(battler) != GIMMICK_Z_MOVE) + if (gimmick != GIMMICK_Z_MOVE) { u32 teraType; - if (GetActiveGimmick(battler) == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) + if (gimmick == GIMMICK_TERA && ((teraType = GetMonData(mon, MON_DATA_TERA_TYPE)) != TYPE_STELLAR)) return teraType; else if (type1 != TYPE_MYSTERY && !(gDisableStructs[battler].roostActive && type1 == TYPE_FLYING)) return type1; @@ -5979,7 +5971,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) else return moveType; case EFFECT_TERRAIN_PULSE: - if (monInBattle) + if (state == MON_IN_BATTLE) { if (IsBattlerTerrainAffected(battler, STATUS_FIELD_TERRAIN_ANY)) { @@ -6013,7 +6005,7 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) } break; case EFFECT_TERA_BLAST: - if (GetActiveGimmick(battler) == GIMMICK_TERA) + if (gimmick == GIMMICK_TERA) return GetMonData(mon, MON_DATA_TERA_TYPE); break; case EFFECT_TERA_STARSTORM: @@ -6031,20 +6023,23 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, u8 *ateBoost) return TYPE_DARK; } else if (moveType == TYPE_NORMAL - && ((!gMain.inBattle || TrySetAteType(move, battler, ability)) - && GetActiveGimmick(battler) != GIMMICK_DYNAMAX)) + && ability != ABILITY_NORMALIZE + && gimmick != GIMMICK_DYNAMAX + && gimmick != GIMMICK_Z_MOVE) { - if (gMain.inBattle && ateBoost != NULL) - *ateBoost = TRUE; + u32 ateType = TrySetAteType(move, battler, ability); + if (ateType != TYPE_NONE && state == MON_IN_BATTLE) + gBattleStruct->ateBoost[battler] = TRUE; + return ateType; } else if (moveType != TYPE_NORMAL && moveEffect != EFFECT_HIDDEN_POWER && moveEffect != EFFECT_WEATHER_BALL && ability == ABILITY_NORMALIZE - && GetActiveGimmick(battler) != GIMMICK_Z_MOVE) + && gimmick != GIMMICK_Z_MOVE) { - if (gMain.inBattle && ateBoost != NULL && GetActiveGimmick(battler) != GIMMICK_DYNAMAX) - *ateBoost = TRUE; + if (state == MON_IN_BATTLE && gimmick != GIMMICK_DYNAMAX) + gBattleStruct->ateBoost[battler] = TRUE; return TYPE_NORMAL; } @@ -6064,7 +6059,8 @@ void SetTypeBeforeUsingMove(u32 move, u32 battler) moveType = GetDynamicMoveType(&GetBattlerParty(battler)[gBattlerPartyIndexes[battler]], move, battler, - &gBattleStruct->ateBoost[battler]); + MON_IN_BATTLE); + if (moveType != TYPE_NONE) gBattleStruct->dynamicMoveType = moveType | F_DYNAMIC_TYPE_SET; diff --git a/src/pokemon.c b/src/pokemon.c index 3bd0e4dd5d..a24d08ece2 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -1170,7 +1170,7 @@ void CreateBoxMon(struct BoxPokemon *boxMon, u16 species, u8 level, u8 fixedIV, isShiny = GET_SHINY_VALUE(value, personality) < SHINY_ODDS; } } - + if (hasFixedPersonality) personality = fixedPersonality; @@ -7005,9 +7005,9 @@ void UpdateDaysPassedSinceFormChange(u16 days) } } -u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler) +u32 CheckDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState state) { - u32 moveType = GetDynamicMoveType(mon, move, battler, NULL); + u32 moveType = GetDynamicMoveType(mon, move, battler, state); if (moveType != TYPE_NONE) return moveType; return GetMoveType(move); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 3636d2f0ae..d34b0dd40d 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -1720,7 +1720,7 @@ static void Task_HandleInput(u8 taskId) PlaySE(SE_SELECT); BeginCloseSummaryScreen(taskId); } - else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES + else if (sMonSummaryScreen->currPageIndex == PSS_PAGE_BATTLE_MOVES || sMonSummaryScreen->currPageIndex == PSS_PAGE_CONTEST_MOVES) { PlaySE(SE_SELECT); @@ -1773,7 +1773,7 @@ static u8 IncrementSkillsStatsMode(u8 mode) sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_EVS; return SUMMARY_SKILLS_MODE_EVS; } - else + else { sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_IVS; return SUMMARY_SKILLS_MODE_IVS; @@ -1956,7 +1956,7 @@ static void Task_ChangeSummaryMon(u8 taskId) if (P_SUMMARY_SCREEN_RENAME && sMonSummaryScreen->currPageIndex == PSS_PAGE_INFO) ShowUtilityPrompt(SUMMARY_MODE_NORMAL); if (ShouldShowIvEvPrompt() && sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS) - { + { sMonSummaryScreen->skillsPageMode = SUMMARY_SKILLS_MODE_STATS; ChangeStatLabel(SUMMARY_SKILLS_MODE_STATS); } @@ -2108,7 +2108,7 @@ static void ChangePage(u8 taskId, s8 delta) CreateTextPrinterTask(sMonSummaryScreen->currPageIndex); HidePageSpecificSprites(); - if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS + if (sMonSummaryScreen->currPageIndex == PSS_PAGE_SKILLS || (sMonSummaryScreen->currPageIndex + delta) == PSS_PAGE_SKILLS) { struct Pokemon *mon = &sMonSummaryScreen->currentMon; @@ -2244,7 +2244,7 @@ static void SwitchToMoveSelection(u8 taskId) { if (ShouldShowMoveRelearner()) ClearWindowTilemap(PSS_LABEL_WINDOW_PROMPT_RELEARN); - + ShowUtilityPrompt(SUMMARY_MODE_SELECT_MOVE); } else @@ -3774,10 +3774,10 @@ static void BufferStat(u8 *dst, u8 statIndex, u32 stat, u32 strId, u32 n) else txtPtr = StringCopy(dst, sTextNatureNeutral); - if (!P_SUMMARY_SCREEN_IV_EV_VALUES + if (!P_SUMMARY_SCREEN_IV_EV_VALUES && sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS) StringAppend(dst, GetLetterGrade(stat)); - else + else ConvertIntToDecimalStringN(txtPtr, stat, STR_CONV_MODE_RIGHT_ALIGN, n); DynamicPlaceholderTextUtil_SetPlaceholderPtr(strId, dst); @@ -3791,7 +3791,7 @@ static const u8 *GetLetterGrade(u32 stat) static const u8 gText_GradeB[] = _("B"); static const u8 gText_GradeA[] = _("A"); static const u8 gText_GradeS[] = _("S"); - + if (stat > 0 && stat <= 15) return gText_GradeD; else if (stat > 15 && stat <= 25) @@ -3833,7 +3833,7 @@ static void BufferLeftColumnIvEvStats(void) u8 *hpIvEvString = Alloc(20); u8 *attackIvEvString = Alloc(20); u8 *defenseIvEvString = Alloc(20); - + DynamicPlaceholderTextUtil_Reset(); BufferStat(hpIvEvString, STAT_HP, sMonSummaryScreen->summary.currentHP, 0, 7); @@ -3850,7 +3850,7 @@ static void BufferLeftColumnIvEvStats(void) static void PrintLeftColumnStats(void) { int x; - + if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES) x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 46); else @@ -3873,7 +3873,7 @@ static void BufferRightColumnStats(void) static void PrintRightColumnStats(void) { int x; - + if (sMonSummaryScreen->skillsPageMode == SUMMARY_SKILLS_MODE_IVS && !P_SUMMARY_SCREEN_IV_EV_VALUES) x = GetStringRightAlignXOffset(FONT_NORMAL, gStringVar4, 20); else @@ -4306,7 +4306,11 @@ static void SetMoveTypeIcons(void) { type = GetMoveType(summary->moves[i]); if (P_SHOW_DYNAMIC_TYPES) - type = CheckDynamicMoveType(mon, summary->moves[i], 0); + { + enum MonState state = gMain.inBattle ? MON_IN_BATTLE : MON_OUTSIDE_BATTLE; + type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0 + } + SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); } else @@ -4335,7 +4339,10 @@ static void SetNewMoveTypeIcon(void) struct Pokemon *mon = &sMonSummaryScreen->currentMon; if (P_SHOW_DYNAMIC_TYPES) - type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0); + { + enum MonState state = gMain.inBattle ? MON_IN_BATTLE : MON_OUTSIDE_BATTLE; + type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0 + } if (sMonSummaryScreen->newMove == MOVE_NONE) { From 9554146738079cb53bdcde44dc14f7c9f47b9f7a Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 08:27:28 -0400 Subject: [PATCH 121/187] Fixed forfeit money for `B_WHITEOUT_MONEY <= GEN_3` (#6942) --- data/battle_scripts_1.s | 7 +++++-- src/battle_script_commands.c | 31 +++++++++++++++++++------------ src/overworld.c | 2 -- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 9938299db9..3ad7e71f82 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5396,18 +5396,17 @@ BattleScript_LocalBattleLost:: jumpifhalfword CMP_EQUAL, gTrainerBattleParameter + 2, TRAINER_SECRET_BASE, BattleScript_LocalBattleLostEnd jumpifnowhiteout BattleScript_LocalBattleLostEnd_ BattleScript_LocalBattleLostPrintWhiteOut:: + getmoneyreward .if B_WHITEOUT_MONEY >= GEN_4 jumpifbattletype BATTLE_TYPE_TRAINER, BattleScript_LocalBattleLostEnd printstring STRINGID_PLAYERWHITEOUT waitmessage B_WAIT_TIME_LONG - getmoneyreward printstring STRINGID_PLAYERWHITEOUT2 waitmessage B_WAIT_TIME_LONG end2 BattleScript_LocalBattleLostEnd:: printstring STRINGID_PLAYERLOSTTOENEMYTRAINER waitmessage B_WAIT_TIME_LONG - getmoneyreward printstring STRINGID_PLAYERPAIDPRIZEMONEY waitmessage B_WAIT_TIME_LONG end2 @@ -9998,7 +9997,11 @@ BattleScript_QuestionForfeitBattle:: BattleScript_ForfeitBattleGaveMoney:: getmoneyreward +.if B_WHITEOUT_MONEY >= GEN_4 printstring STRINGID_FORFEITBATTLEGAVEMONEY +.else + printstring STRINGID_PLAYERWHITEOUT2 +.endif waitmessage B_WAIT_TIME_LONG end2 diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 439299ac28..14c89c2010 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -8808,22 +8808,29 @@ static void Cmd_getmoneyreward(void) } else { - s32 i, count; - for (i = 0; i < PARTY_SIZE; i++) + if (B_WHITEOUT_MONEY <= GEN_3) { - if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_NONE - && GetMonData(&gPlayerParty[i], MON_DATA_SPECIES_OR_EGG) != SPECIES_EGG) - { - if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) > sPartyLevel) - sPartyLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); - } + money = GetMoney(&gSaveBlock1Ptr->money) / 2; } - for (count = 0, i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) + else { - if (FlagGet(gBadgeFlags[i]) == TRUE) - ++count; + s32 i, count; + 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) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_LEVEL) > sPartyLevel) + sPartyLevel = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL); + } + } + for (count = 0, i = 0; i < ARRAY_COUNT(gBadgeFlags); i++) + { + if (FlagGet(gBadgeFlags[i]) == TRUE) + ++count; + } + money = sWhiteOutBadgeMoney[count] * sPartyLevel; } - money = sWhiteOutBadgeMoney[count] * sPartyLevel; RemoveMoney(&gSaveBlock1Ptr->money, money); } diff --git a/src/overworld.c b/src/overworld.c index 33af588e2a..6ffe73c6ed 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -378,8 +378,6 @@ static void (*const sMovementStatusHandler[])(struct LinkPlayerObjectEvent *, st void DoWhiteOut(void) { RunScriptImmediately(EventScript_WhiteOut); - if (B_WHITEOUT_MONEY == GEN_3) - SetMoney(&gSaveBlock1Ptr->money, GetMoney(&gSaveBlock1Ptr->money) / 2); HealPlayerParty(); Overworld_ResetStateAfterWhiteOut(); SetWarpDestinationToLastHealLocation(); From b31a73f990fb680629e2a503d72d137bcff0872a Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 22 May 2025 14:27:52 +0200 Subject: [PATCH 122/187] Rename ItemId_GetX to GetItemX (#2116) --- include/item.h | 24 ++++---- src/apprentice.c | 2 +- src/battle_ai_script_commands.c | 4 +- src/battle_main.c | 10 ++-- src/battle_pyramid_bag.c | 20 +++---- src/battle_script_commands.c | 28 ++++----- src/battle_util.c | 22 +++---- src/data/map_group_count.h | 1 + src/item.c | 54 +++++++++--------- src/item_menu.c | 52 ++++++++--------- src/item_use.c | 18 +++--- src/lilycove_lady.c | 4 +- src/player_pc.c | 6 +- src/pokeblock.c | 2 +- src/pokemon.c | 16 +++--- src/pokemon_storage_system.c | 8 +-- src/pokemon_summary_screen.c | 2 +- src/shop.c | 10 ++-- src/tv.c | 24 ++++---- tools/mgba-rom-test-hydra/mgba-rom-test-hydra | Bin 0 -> 34992 bytes tools/patchelf/patchelf | Bin 0 -> 16272 bytes tools/trainerproc/trainerproc | Bin 0 -> 54856 bytes 22 files changed, 154 insertions(+), 153 deletions(-) create mode 100644 src/data/map_group_count.h create mode 100755 tools/mgba-rom-test-hydra/mgba-rom-test-hydra create mode 100755 tools/patchelf/patchelf create mode 100755 tools/trainerproc/trainerproc diff --git a/include/item.h b/include/item.h index a00d750deb..cf84848ae4 100644 --- a/include/item.h +++ b/include/item.h @@ -63,18 +63,18 @@ void ClearBag(void); u16 CountTotalItemQuantityInBag(u16 itemId); bool8 AddPyramidBagItem(u16 itemId, u16 count); bool8 RemovePyramidBagItem(u16 itemId, u16 count); -const u8 *ItemId_GetName(u16 itemId); -u16 ItemId_GetPrice(u16 itemId); -u8 ItemId_GetHoldEffect(u16 itemId); -u8 ItemId_GetHoldEffectParam(u16 itemId); -const u8 *ItemId_GetDescription(u16 itemId); -u8 ItemId_GetImportance(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); +const u8 *GetItemName(u16 itemId); +u16 GetItemPrice(u16 itemId); +u8 GetItemHoldEffect(u16 itemId); +u8 GetItemHoldEffectParam(u16 itemId); +const u8 *GetItemDescription(u16 itemId); +u8 GetItemImportance(u16 itemId); +u8 GetItemPocket(u16 itemId); +u8 GetItemType(u16 itemId); +ItemUseFunc GetItemFieldFunc(u16 itemId); +u8 GetItemBattleUsage(u16 itemId); +ItemUseFunc GetItemBattleFunc(u16 itemId); +u8 GetItemSecondaryId(u16 itemId); /* Expands to: * enum diff --git a/src/apprentice.c b/src/apprentice.c index 7e41ad8f40..cb2ab96bc7 100644 --- a/src/apprentice.c +++ b/src/apprentice.c @@ -1068,7 +1068,7 @@ static void ApprenticeBufferString(void) StringCopy(stringDst, gMoveNames[gApprenticeQuestionData->move2]); break; case APPRENTICE_BUFF_ITEM: - StringCopy(stringDst, ItemId_GetName(PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data)); + StringCopy(stringDst, GetItemName(PLAYER_APPRENTICE.questions[CURRENT_QUESTION_NUM].data)); break; case APPRENTICE_BUFF_NAME: TVShowConvertInternationalString(text, GetApprenticeNameInLanguage(PLAYER_APPRENTICE.id, GAME_LANGUAGE), GAME_LANGUAGE); diff --git a/src/battle_ai_script_commands.c b/src/battle_ai_script_commands.c index a1c7b57ea0..6fd3cdad8e 100644 --- a/src/battle_ai_script_commands.c +++ b/src/battle_ai_script_commands.c @@ -2030,9 +2030,9 @@ static void Cmd_get_hold_effect(void) battler = gBattlerTarget; if (gActiveBattler != battler) - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(BATTLE_HISTORY->itemEffects[battler]); + AI_THINKING_STRUCT->funcResult = GetItemHoldEffect(BATTLE_HISTORY->itemEffects[battler]); else - AI_THINKING_STRUCT->funcResult = ItemId_GetHoldEffect(gBattleMons[battler].item); + AI_THINKING_STRUCT->funcResult = GetItemHoldEffect(gBattleMons[battler].item); gAIScriptPtr += 2; } diff --git a/src/battle_main.c b/src/battle_main.c index 4c810a5a66..6aa9fc1902 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4027,7 +4027,7 @@ u8 IsRunningFromBattleImpossible(void) if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; else - holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); + holdEffect = GetItemHoldEffect(gBattleMons[gActiveBattler].item); gPotentialItemEffectBattler = gActiveBattler; @@ -4632,8 +4632,8 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler1].item); - holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler1].item); + holdEffect = GetItemHoldEffect(gBattleMons[battler1].item); + holdEffectParam = GetItemHoldEffectParam(gBattleMons[battler1].item); } // badge boost @@ -4666,8 +4666,8 @@ u8 GetWhoStrikesFirst(u8 battler1, u8 battler2, bool8 ignoreChosenMoves) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler2].item); - holdEffectParam = ItemId_GetHoldEffectParam(gBattleMons[battler2].item); + holdEffect = GetItemHoldEffect(gBattleMons[battler2].item); + holdEffectParam = GetItemHoldEffectParam(gBattleMons[battler2].item); } // badge boost diff --git a/src/battle_pyramid_bag.c b/src/battle_pyramid_bag.c index a9cbfd6821..1084dfacab 100644 --- a/src/battle_pyramid_bag.c +++ b/src/battle_pyramid_bag.c @@ -620,7 +620,7 @@ static void SetBagItemsListTemplate(void) static void CopyBagItemName(u8 *dst, u16 itemId) { - if (ItemId_GetPocket(itemId) == POCKET_BERRIES) + if (GetItemPocket(itemId) == POCKET_BERRIES) { ConvertIntToDecimalStringN(gStringVar1, ITEM_TO_BERRY(itemId), STR_CONV_MODE_LEADING_ZEROS, 2); CopyItemName(itemId, gStringVar2); @@ -681,7 +681,7 @@ static void PrintItemDescription(s32 listMenuId) const u8 *desc; if (listMenuId != LIST_CANCEL) { - desc = ItemId_GetDescription(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listMenuId]); + desc = GetItemDescription(gSaveBlock2Ptr->frontier.pyramidBag.itemId[gSaveBlock2Ptr->frontier.lvlMode][listMenuId]); } else { @@ -942,7 +942,7 @@ static void OpenContextMenu(u8 taskId) gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Field); break; case PYRAMIDBAG_LOC_BATTLE: - if (ItemId_GetBattleUsage(gSpecialVar_ItemId)) + if (GetItemBattleUsage(gSpecialVar_ItemId)) { gPyramidBagMenu->menuActionIds = sMenuActionIds_Battle; gPyramidBagMenu->menuActionsCount = ARRAY_COUNT(sMenuActionIds_Battle); @@ -1085,7 +1085,7 @@ static void CloseMenuActionWindow(void) static void BagAction_UseOnField(u8 taskId) { - u8 pocketId = ItemId_GetPocket(gSpecialVar_ItemId); + u8 pocketId = GetItemPocket(gSpecialVar_ItemId); if (pocketId == POCKET_KEY_ITEMS || pocketId == POCKET_POKE_BALLS @@ -1095,12 +1095,12 @@ static void BagAction_UseOnField(u8 taskId) CloseMenuActionWindow(); DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, Task_CloseBattlePyramidBagMessage); } - else if (ItemId_GetFieldFunc(gSpecialVar_ItemId) != NULL) + else if (GetItemFieldFunc(gSpecialVar_ItemId) != NULL) { CloseMenuActionWindow(); FillWindowPixelBuffer(WIN_INFO, PIXEL_FILL(0)); ScheduleBgCopyTilemapToVram(0); - ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); + GetItemFieldFunc(gSpecialVar_ItemId)(taskId); } } @@ -1250,7 +1250,7 @@ static void BagAction_Give(u8 taskId) { DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage); } - else if (!ItemId_GetImportance(gSpecialVar_ItemId)) + else if (!GetItemImportance(gSpecialVar_ItemId)) { gPyramidBagMenu->newScreenCallback = CB2_ChooseMonToGiveItem; CloseBattlePyramidBag(taskId); @@ -1291,7 +1291,7 @@ static void TryCloseBagToGiveItem(u8 taskId) { if (!IsWritingMailAllowed(gSpecialVar_ItemId)) DisplayItemMessageInBattlePyramid(taskId, gText_CantWriteMail, Task_WaitCloseErrorMessage); - else if (!ItemId_GetImportance(gSpecialVar_ItemId)) + else if (!GetItemImportance(gSpecialVar_ItemId)) CloseBattlePyramidBag(taskId); else ShowCantHoldMessage(taskId); @@ -1299,10 +1299,10 @@ static void TryCloseBagToGiveItem(u8 taskId) static void BagAction_UseInBattle(u8 taskId) { - if (ItemId_GetBattleFunc(gSpecialVar_ItemId) != NULL) + if (GetItemBattleFunc(gSpecialVar_ItemId) != NULL) { CloseMenuActionWindow(); - ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); + GetItemBattleFunc(gSpecialVar_ItemId)(taskId); } } diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 3bca12eb51..17486a0e9e 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -1163,8 +1163,8 @@ static void Cmd_accuracycheck(void) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + holdEffect = GetItemHoldEffect(gBattleMons[gBattlerTarget].item); + param = GetItemHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; @@ -1260,7 +1260,7 @@ static void Cmd_critcalc(void) if (item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gBattlerAttacker].holdEffect; else - holdEffect = ItemId_GetHoldEffect(item); + holdEffect = GetItemHoldEffect(item); gPotentialItemEffectBattler = gBattlerAttacker; @@ -1668,8 +1668,8 @@ static void Cmd_adjustnormaldamage(void) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + holdEffect = GetItemHoldEffect(gBattleMons[gBattlerTarget].item); + param = GetItemHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; @@ -1711,8 +1711,8 @@ static void Cmd_adjustnormaldamage2(void) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + holdEffect = GetItemHoldEffect(gBattleMons[gBattlerTarget].item); + param = GetItemHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; @@ -3301,7 +3301,7 @@ static void Cmd_getexp(void) if (item == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else - holdEffect = ItemId_GetHoldEffect(item); + holdEffect = GetItemHoldEffect(item); if (holdEffect == HOLD_EFFECT_EXP_SHARE) viaExpShare++; @@ -3340,7 +3340,7 @@ static void Cmd_getexp(void) if (item == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else - holdEffect = ItemId_GetHoldEffect(item); + holdEffect = GetItemHoldEffect(item); if (holdEffect != HOLD_EFFECT_EXP_SHARE && !(gBattleStruct->sentInPokes & 1)) { @@ -4228,7 +4228,7 @@ static void Cmd_moveend(void) if (gBattleMons[gBattlerAttacker].item == ITEM_ENIGMA_BERRY) holdEffectAtk = gEnigmaBerries[gBattlerAttacker].holdEffect; else - holdEffectAtk = ItemId_GetHoldEffect(gBattleMons[gBattlerAttacker].item); + holdEffectAtk = GetItemHoldEffect(gBattleMons[gBattlerAttacker].item); choicedMoveAtk = &gBattleStruct->choicedMove[gBattlerAttacker]; GET_MOVE_TYPE(gCurrentMove, moveType); @@ -5869,8 +5869,8 @@ static void Cmd_adjustsetdamage(void) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + holdEffect = GetItemHoldEffect(gBattleMons[gBattlerTarget].item); + param = GetItemHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; @@ -7521,8 +7521,8 @@ static void Cmd_tryKO(void) } else { - holdEffect = ItemId_GetHoldEffect(gBattleMons[gBattlerTarget].item); - param = ItemId_GetHoldEffectParam(gBattleMons[gBattlerTarget].item); + holdEffect = GetItemHoldEffect(gBattleMons[gBattlerTarget].item); + param = GetItemHoldEffectParam(gBattleMons[gBattlerTarget].item); } gPotentialItemEffectBattler = gBattlerTarget; diff --git a/src/battle_util.c b/src/battle_util.c index b32ae9d6a7..070385f0ad 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -414,7 +414,7 @@ bool8 TryRunFromBattle(u8 battler) if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[battler].holdEffect; else - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item); + holdEffect = GetItemHoldEffect(gBattleMons[battler].item); gPotentialItemEffectBattler = battler; @@ -1044,7 +1044,7 @@ u8 TrySetCantSelectMoveBattleScript(void) if (gBattleMons[gActiveBattler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[gActiveBattler].holdEffect; else - holdEffect = ItemId_GetHoldEffect(gBattleMons[gActiveBattler].item); + holdEffect = GetItemHoldEffect(gBattleMons[gActiveBattler].item); gPotentialItemEffectBattler = gActiveBattler; @@ -1088,7 +1088,7 @@ u8 CheckMoveLimitations(u8 battler, u8 unusableMoves, u8 check) if (gBattleMons[battler].item == ITEM_ENIGMA_BERRY) holdEffect = gEnigmaBerries[battler].holdEffect; else - holdEffect = ItemId_GetHoldEffect(gBattleMons[battler].item); + holdEffect = GetItemHoldEffect(gBattleMons[battler].item); gPotentialItemEffectBattler = battler; @@ -3271,8 +3271,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) } else { - battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); + battlerHoldEffect = GetItemHoldEffect(gLastUsedItem); + battlerHoldEffectParam = GetItemHoldEffectParam(gLastUsedItem); } atkItem = gBattleMons[gBattlerAttacker].item; @@ -3283,8 +3283,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) } else { - atkHoldEffect = ItemId_GetHoldEffect(atkItem); - atkHoldEffectParam = ItemId_GetHoldEffectParam(atkItem); + atkHoldEffect = GetItemHoldEffect(atkItem); + atkHoldEffectParam = GetItemHoldEffectParam(atkItem); } // def variables are unused @@ -3296,8 +3296,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) } else { - defHoldEffect = ItemId_GetHoldEffect(defItem); - defHoldEffectParam = ItemId_GetHoldEffectParam(defItem); + defHoldEffect = GetItemHoldEffect(defItem); + defHoldEffectParam = GetItemHoldEffectParam(defItem); } switch (caseID) @@ -3633,8 +3633,8 @@ u8 ItemBattleEffects(u8 caseID, u8 battler, bool8 moveTurn) } else { - battlerHoldEffect = ItemId_GetHoldEffect(gLastUsedItem); - battlerHoldEffectParam = ItemId_GetHoldEffectParam(gLastUsedItem); + battlerHoldEffect = GetItemHoldEffect(gLastUsedItem); + battlerHoldEffectParam = GetItemHoldEffectParam(gLastUsedItem); } switch (battlerHoldEffect) { diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h new file mode 100644 index 0000000000..4fe8a21b3b --- /dev/null +++ b/src/data/map_group_count.h @@ -0,0 +1 @@ +static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; diff --git a/src/item.c b/src/item.c index d4a544f11f..3921ed98ac 100644 --- a/src/item.c +++ b/src/item.c @@ -78,7 +78,7 @@ void SetBagItemsPointers(void) void CopyItemName(u16 itemId, u8 *dst) { - StringCopy(dst, ItemId_GetName(itemId)); + StringCopy(dst, GetItemName(itemId)); } void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) @@ -86,7 +86,7 @@ void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) if (itemId == ITEM_POKE_BALL) { if (quantity < 2) - StringCopy(dst, ItemId_GetName(ITEM_POKE_BALL)); + StringCopy(dst, GetItemName(ITEM_POKE_BALL)); else StringCopy(dst, gText_PokeBalls); } @@ -95,7 +95,7 @@ void CopyItemNameHandlePlural(u16 itemId, u8 *dst, u32 quantity) if (itemId >= FIRST_BERRY_INDEX && itemId <= LAST_BERRY_INDEX) GetBerryCountString(dst, gBerries[itemId - FIRST_BERRY_INDEX].name, quantity); else - StringCopy(dst, ItemId_GetName(itemId)); + StringCopy(dst, GetItemName(itemId)); } } @@ -131,11 +131,11 @@ bool8 CheckBagHasItem(u16 itemId, u16 count) u8 i; u8 pocket; - if (ItemId_GetPocket(itemId) == 0) + if (GetItemPocket(itemId) == 0) return FALSE; if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) return CheckPyramidBagHasItem(itemId, count); - pocket = ItemId_GetPocket(itemId) - 1; + pocket = GetItemPocket(itemId) - 1; // Check for item slots that contain the item for (i = 0; i < gBagPockets[pocket].capacity; i++) { @@ -178,7 +178,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) u16 slotCapacity; u16 ownedCount; - if (ItemId_GetPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) == POCKET_NONE) return FALSE; if (InBattlePyramid() || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) @@ -186,7 +186,7 @@ bool8 CheckBagHasSpace(u16 itemId, u16 count) return CheckPyramidBagHasSpace(itemId, count); } - pocket = ItemId_GetPocket(itemId) - 1; + pocket = GetItemPocket(itemId) - 1; if (pocket != BERRIES_POCKET) slotCapacity = MAX_BAG_ITEM_CAPACITY; else @@ -239,7 +239,7 @@ bool8 AddBagItem(u16 itemId, u16 count) { u8 i; - if (ItemId_GetPocket(itemId) == POCKET_NONE) + if (GetItemPocket(itemId) == POCKET_NONE) return FALSE; // check Battle Pyramid Bag @@ -253,7 +253,7 @@ bool8 AddBagItem(u16 itemId, u16 count) struct ItemSlot *newItems; u16 slotCapacity; u16 ownedCount; - u8 pocket = ItemId_GetPocket(itemId) - 1; + u8 pocket = GetItemPocket(itemId) - 1; itemPocket = &gBagPockets[pocket]; newItems = AllocZeroed(itemPocket->capacity * sizeof(struct ItemSlot)); @@ -347,7 +347,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count) u8 i; u16 totalQuantity = 0; - if (ItemId_GetPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE) + if (GetItemPocket(itemId) == POCKET_NONE || itemId == ITEM_NONE) return FALSE; // check Battle Pyramid Bag @@ -362,7 +362,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count) u16 ownedCount; struct BagPocket *itemPocket; - pocket = ItemId_GetPocket(itemId) - 1; + pocket = GetItemPocket(itemId) - 1; itemPocket = &gBagPockets[pocket]; for (i = 0; i < itemPocket->capacity; i++) @@ -432,7 +432,7 @@ bool8 RemoveBagItem(u16 itemId, u16 count) u8 GetPocketByItemId(u16 itemId) { - return ItemId_GetPocket(itemId); + return GetItemPocket(itemId); } void ClearItemSlots(struct ItemSlot *itemSlots, u8 itemCount) @@ -672,7 +672,7 @@ u16 CountTotalItemQuantityInBag(u16 itemId) { u16 i; u16 ownedCount = 0; - struct BagPocket *bagPocket = &gBagPockets[ItemId_GetPocket(itemId) - 1]; + struct BagPocket *bagPocket = &gBagPockets[GetItemPocket(itemId) - 1]; for (i = 0; i < bagPocket->capacity; i++) { @@ -871,74 +871,74 @@ static u16 SanitizeItemId(u16 itemId) return itemId; } -const u8 *ItemId_GetName(u16 itemId) +const u8 *GetItemName(u16 itemId) { return gItems[SanitizeItemId(itemId)].name; } // Unused -u16 ItemId_GetId(u16 itemId) +u16 GetItemId(u16 itemId) { return gItems[SanitizeItemId(itemId)].itemId; } -u16 ItemId_GetPrice(u16 itemId) +u16 GetItemPrice(u16 itemId) { return gItems[SanitizeItemId(itemId)].price; } -u8 ItemId_GetHoldEffect(u16 itemId) +u8 GetItemHoldEffect(u16 itemId) { return gItems[SanitizeItemId(itemId)].holdEffect; } -u8 ItemId_GetHoldEffectParam(u16 itemId) +u8 GetItemHoldEffectParam(u16 itemId) { return gItems[SanitizeItemId(itemId)].holdEffectParam; } -const u8 *ItemId_GetDescription(u16 itemId) +const u8 *GetItemDescription(u16 itemId) { return gItems[SanitizeItemId(itemId)].description; } -u8 ItemId_GetImportance(u16 itemId) +u8 GetItemImportance(u16 itemId) { return gItems[SanitizeItemId(itemId)].importance; } // Unused -u8 ItemId_GetRegistrability(u16 itemId) +u8 GetItemRegistrability(u16 itemId) { return gItems[SanitizeItemId(itemId)].registrability; } -u8 ItemId_GetPocket(u16 itemId) +u8 GetItemPocket(u16 itemId) { return gItems[SanitizeItemId(itemId)].pocket; } -u8 ItemId_GetType(u16 itemId) +u8 GetItemType(u16 itemId) { return gItems[SanitizeItemId(itemId)].type; } -ItemUseFunc ItemId_GetFieldFunc(u16 itemId) +ItemUseFunc GetItemFieldFunc(u16 itemId) { return gItems[SanitizeItemId(itemId)].fieldUseFunc; } -u8 ItemId_GetBattleUsage(u16 itemId) +u8 GetItemBattleUsage(u16 itemId) { return gItems[SanitizeItemId(itemId)].battleUsage; } -ItemUseFunc ItemId_GetBattleFunc(u16 itemId) +ItemUseFunc GetItemBattleFunc(u16 itemId) { return gItems[SanitizeItemId(itemId)].battleUseFunc; } -u8 ItemId_GetSecondaryId(u16 itemId) +u8 GetItemSecondaryId(u16 itemId) { return gItems[SanitizeItemId(itemId)].secondaryId; } diff --git a/src/item_menu.c b/src/item_menu.c index 6d52e4be1c..2c057f4447 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -138,7 +138,7 @@ static void PrepareTMHMMoveWindow(void); static bool8 IsWallysBag(void); static void Task_WallyTutorialBagMenu(u8); static void Task_BagMenu_HandleInput(u8); -static void GetItemName(u8 *, u16); +static void GetItemNameFromPocket(u8 *, u16); static void PrintItemDescription(int); static void BagMenu_PrintCursorAtPos(u8, u8); static void BagMenu_Print(u8, u8, const u8 *, u8, u8, u8, u8, u8, u8); @@ -868,7 +868,7 @@ static void LoadBagItemListBuffers(u8 pocketId) { for (i = 0; i < gBagMenu->numItemStacks[pocketId] - 1; i++) { - GetItemName(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -882,7 +882,7 @@ static void LoadBagItemListBuffers(u8 pocketId) { for (i = 0; i < gBagMenu->numItemStacks[pocketId]; i++) { - GetItemName(sListBuffer2->name[i], pocket->itemSlots[i].itemId); + GetItemNameFromPocket(sListBuffer2->name[i], pocket->itemSlots[i].itemId); subBuffer = sListBuffer1->subBuffers; subBuffer[i].name = sListBuffer2->name[i]; subBuffer[i].id = i; @@ -894,7 +894,7 @@ static void LoadBagItemListBuffers(u8 pocketId) gMultiuseListMenuTemplate.maxShowed = gBagMenu->numShownItems[pocketId]; } -static void GetItemName(u8 *dest, u16 itemId) +static void GetItemNameFromPocket(u8 *dest, u16 itemId) { switch (gBagPosition.pocket) { @@ -976,7 +976,7 @@ static void BagMenu_ItemPrintCallback(u8 windowId, u32 itemIndex, u8 y) offset = GetStringRightAlignXOffset(FONT_NARROW, gStringVar4, 119); BagMenu_Print(windowId, FONT_NARROW, gStringVar4, offset, y, 0, 0, TEXT_SKIP_DRAW, COLORID_NORMAL); } - else if (gBagPosition.pocket != KEYITEMS_POCKET && ItemId_GetImportance(itemId) == FALSE) + else if (gBagPosition.pocket != KEYITEMS_POCKET && GetItemImportance(itemId) == FALSE) { // Print item quantity ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, BAG_ITEM_CAPACITY_DIGITS); @@ -998,7 +998,7 @@ static void PrintItemDescription(int itemIndex) const u8 *str; if (itemIndex != LIST_CANCEL) { - str = ItemId_GetDescription(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex)); + str = GetItemDescription(BagGetItemIdByPocketPosition(gBagPosition.pocket + 1, itemIndex)); } else { @@ -1533,7 +1533,7 @@ static void OpenContextMenu(u8 taskId) { case ITEMMENULOCATION_BATTLE: case ITEMMENULOCATION_WALLY: - if (ItemId_GetBattleUsage(gSpecialVar_ItemId)) + if (GetItemBattleUsage(gSpecialVar_ItemId)) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_BattleUse; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BattleUse); @@ -1549,7 +1549,7 @@ static void OpenContextMenu(u8 taskId) gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_BerryBlenderCrush); break; case ITEMMENULOCATION_APPRENTICE: - if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!GetItemImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_Apprentice; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_Apprentice); @@ -1561,7 +1561,7 @@ static void OpenContextMenu(u8 taskId) } break; case ITEMMENULOCATION_FAVOR_LADY: - if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!GetItemImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_FavorLady; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_FavorLady); @@ -1573,7 +1573,7 @@ static void OpenContextMenu(u8 taskId) } break; case ITEMMENULOCATION_QUIZ_LADY: - if (!ItemId_GetImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) + if (!GetItemImportance(gSpecialVar_ItemId) && gSpecialVar_ItemId != ITEM_ENIGMA_BERRY) { gBagMenu->contextMenuItemsPtr = sContextMenuItems_QuizLady; gBagMenu->contextMenuNumItems = ARRAY_COUNT(sContextMenuItems_QuizLady); @@ -1785,10 +1785,10 @@ static void RemoveContextWindow(void) static void ItemMenu_UseOutOfBattle(u8 taskId) { - if (ItemId_GetFieldFunc(gSpecialVar_ItemId)) + if (GetItemFieldFunc(gSpecialVar_ItemId)) { RemoveContextWindow(); - if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_USE_PARTY_MENU) + if (CalculatePlayerPartyCount() == 0 && GetItemType(gSpecialVar_ItemId) == ITEM_USE_PARTY_MENU) { PrintThereIsNoPokemon(taskId); } @@ -1797,7 +1797,7 @@ static void ItemMenu_UseOutOfBattle(u8 taskId) FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); ScheduleBgCopyTilemapToVram(0); if (gBagPosition.pocket != BERRIES_POCKET) - ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); + GetItemFieldFunc(gSpecialVar_ItemId)(taskId); else ItemUseOutOfBattle_Berry(taskId); } @@ -1926,7 +1926,7 @@ static void ItemMenu_Give(u8 taskId) { DisplayItemMessage(taskId, FONT_NORMAL, gText_CantWriteMail, HandleErrorMessage); } - else if (!ItemId_GetImportance(gSpecialVar_ItemId)) + else if (!GetItemImportance(gSpecialVar_ItemId)) { if (CalculatePlayerPartyCount() == 0) { @@ -1985,10 +1985,10 @@ static void ItemMenu_Cancel(u8 taskId) static void ItemMenu_UseInBattle(u8 taskId) { - if (ItemId_GetBattleFunc(gSpecialVar_ItemId)) + if (GetItemBattleFunc(gSpecialVar_ItemId)) { RemoveContextWindow(); - ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); + GetItemBattleFunc(gSpecialVar_ItemId)(taskId); } } @@ -2009,7 +2009,7 @@ static void Task_ItemContext_GiveToParty(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_Var1CantBeHeldHere); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, HandleErrorMessage); } - else if (gBagPosition.pocket != KEYITEMS_POCKET && !ItemId_GetImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) { Task_FadeAndCloseBagMenu(taskId); } @@ -2024,7 +2024,7 @@ static void Task_ItemContext_GiveToPC(u8 taskId) { if (ItemIsMail(gSpecialVar_ItemId) == TRUE) DisplayItemMessage(taskId, FONT_NORMAL, gText_CantWriteMail, HandleErrorMessage); - else if (gBagPosition.pocket != KEYITEMS_POCKET && !ItemId_GetImportance(gSpecialVar_ItemId)) + else if (gBagPosition.pocket != KEYITEMS_POCKET && !GetItemImportance(gSpecialVar_ItemId)) gTasks[taskId].func = Task_FadeAndCloseBagMenu; else PrintItemCantBeHeld(taskId); @@ -2049,7 +2049,7 @@ bool8 UseRegisteredKeyItemOnField(void) PlayerFreeze(); StopPlayerAvatar(); gSpecialVar_ItemId = gSaveBlock1Ptr->registeredItem; - taskId = CreateTask(ItemId_GetFieldFunc(gSaveBlock1Ptr->registeredItem), 8); + taskId = CreateTask(GetItemFieldFunc(gSaveBlock1Ptr->registeredItem), 8); gTasks[taskId].tUsingRegisteredKeyItem = TRUE; return TRUE; } @@ -2068,7 +2068,7 @@ static void Task_ItemContext_Sell(u8 taskId) { s16 *data = gTasks[taskId].data; - if (ItemId_GetPrice(gSpecialVar_ItemId) == 0) + if (GetItemPrice(gSpecialVar_ItemId) == 0) { CopyItemName(gSpecialVar_ItemId, gStringVar2); StringExpandPlaceholders(gStringVar4, gText_CantBuyKeyItem); @@ -2095,7 +2095,7 @@ static void DisplaySellItemPriceAndConfirm(u8 taskId) { s16 *data = gTasks[taskId].data; - ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * tItemCount, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar1, (GetItemPrice(gSpecialVar_ItemId) / 2) * tItemCount, STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_ICanPayVar1); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, AskSellItems); } @@ -2120,7 +2120,7 @@ static void InitSellHowManyInput(u8 taskId) s16 *data = gTasks[taskId].data; u8 windowId = BagMenu_AddWindow(ITEMWIN_QUANTITY_WIDE); - PrintItemSoldAmount(windowId, 1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * tItemCount); + PrintItemSoldAmount(windowId, 1, (GetItemPrice(gSpecialVar_ItemId) / 2) * tItemCount); DisplayCurrentMoneyWindow(); gTasks[taskId].func = Task_ChooseHowManyToSell; } @@ -2131,7 +2131,7 @@ static void Task_ChooseHowManyToSell(u8 taskId) if (AdjustQuantityAccordingToDPadInput(&tItemCount, tQuantity) == TRUE) { - PrintItemSoldAmount(gBagMenu->windowIds[ITEMWIN_QUANTITY_WIDE], tItemCount, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * tItemCount); + PrintItemSoldAmount(gBagMenu->windowIds[ITEMWIN_QUANTITY_WIDE], tItemCount, (GetItemPrice(gSpecialVar_ItemId) / 2) * tItemCount); } else if (JOY_NEW(A_BUTTON)) { @@ -2155,7 +2155,7 @@ static void ConfirmSell(u8 taskId) s16 *data = gTasks[taskId].data; CopyItemName(gSpecialVar_ItemId, gStringVar2); - ConvertIntToDecimalStringN(gStringVar1, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * tItemCount, STR_CONV_MODE_LEFT_ALIGN, 6); + ConvertIntToDecimalStringN(gStringVar1, (GetItemPrice(gSpecialVar_ItemId) / 2) * tItemCount, STR_CONV_MODE_LEFT_ALIGN, 6); StringExpandPlaceholders(gStringVar4, gText_TurnedOverVar1ForVar2); DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, SellItem); } @@ -2168,7 +2168,7 @@ static void SellItem(u8 taskId) PlaySE(SE_SHOP); RemoveBagItem(gSpecialVar_ItemId, tItemCount); - AddMoney(&gSaveBlock1Ptr->money, (ItemId_GetPrice(gSpecialVar_ItemId) / 2) * tItemCount); + AddMoney(&gSaveBlock1Ptr->money, (GetItemPrice(gSpecialVar_ItemId) / 2) * tItemCount); DestroyListMenuTask(tListTaskId, scrollPos, cursorPos); UpdatePocketItemList(gBagPosition.pocket); UpdatePocketListPosition(gBagPosition.pocket); @@ -2238,7 +2238,7 @@ static void TryDepositItem(u8 taskId) s16 *data = gTasks[taskId].data; FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); - if (ItemId_GetImportance(gSpecialVar_ItemId)) + if (GetItemImportance(gSpecialVar_ItemId)) { // Can't deposit important items BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gText_CantStoreImportantItems, 3, 1, 0, 0, 0, COLORID_NORMAL); diff --git a/src/item_use.c b/src/item_use.c index 322eaf76c0..3b052293db 100755 --- a/src/item_use.c +++ b/src/item_use.c @@ -101,7 +101,7 @@ static void SetUpItemUseCallback(u8 taskId) if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY) type = gTasks[taskId].tEnigmaBerryType - 1; else - type = ItemId_GetType(gSpecialVar_ItemId) - 1; + type = GetItemType(gSpecialVar_ItemId) - 1; if (!InBattlePyramid()) { gBagMenu->newScreenCallback = sItemUseCallbacks[type]; @@ -175,9 +175,9 @@ static void Task_CloseCantUseKeyItemMessage(u8 taskId) u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId) { - if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) + if (GetItemFieldFunc(itemId) == ItemUseOutOfBattle_TMHM) return 1; - else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) + else if (GetItemFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone) return 2; else return 0; @@ -225,7 +225,7 @@ void ItemUseOutOfBattle_Bike(u8 taskId) static void ItemUseOnFieldCB_Bike(u8 taskId) { - if (ItemId_GetSecondaryId(gSpecialVar_ItemId) == MACH_BIKE) + if (GetItemSecondaryId(gSpecialVar_ItemId) == MACH_BIKE) GetOnOffBike(PLAYER_AVATAR_FLAG_MACH_BIKE); else // ACRO_BIKE GetOnOffBike(PLAYER_AVATAR_FLAG_ACRO_BIKE); @@ -279,7 +279,7 @@ void ItemUseOutOfBattle_Rod(u8 taskId) static void ItemUseOnFieldCB_Rod(u8 taskId) { - StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId)); + StartFishing(GetItemSecondaryId(gSpecialVar_ItemId)); DestroyTask(taskId); } @@ -692,7 +692,7 @@ void ItemUseOutOfBattle_Berry(u8 taskId) } else { - ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); + GetItemFieldFunc(gSpecialVar_ItemId)(taskId); } } @@ -828,8 +828,8 @@ static void RemoveUsedItem(void) StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2); if (!InBattlePyramid()) { - UpdatePocketItemList(ItemId_GetPocket(gSpecialVar_ItemId)); - UpdatePocketListPosition(ItemId_GetPocket(gSpecialVar_ItemId)); + UpdatePocketItemList(GetItemPocket(gSpecialVar_ItemId)); + UpdatePocketListPosition(GetItemPocket(gSpecialVar_ItemId)); } else { @@ -864,7 +864,7 @@ static void Task_UseRepel(u8 taskId) { if (!IsSEPlaying()) { - VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId)); + VarSet(VAR_REPEL_STEP_COUNT, GetItemHoldEffectParam(gSpecialVar_ItemId)); RemoveUsedItem(); if (!InBattlePyramid()) DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index e7a5862f07..17020d2716 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -192,7 +192,7 @@ bool8 HasAnotherPlayerGivenFavorLadyItem(void) static void BufferItemName(u8 *dest, u16 itemId) { - StringCopy(dest, ItemId_GetName(itemId)); + StringCopy(dest, GetItemName(itemId)); } void BufferFavorLadyItemName(void) @@ -451,7 +451,7 @@ static u8 GetPlayerNameLength(const u8 *playerName) void BufferQuizPrizeName(void) { - StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->prize)); + StringCopy(gStringVar1, GetItemName(sQuizLadyPtr->prize)); } bool8 BufferQuizAuthorNameAndCheckIfLady(void) diff --git a/src/player_pc.c b/src/player_pc.c index 81170a86c9..d79f74f94a 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -1051,7 +1051,7 @@ static void ItemStorage_PrintDescription(s32 id) // Get item description (or Cancel text) if (id != LIST_CANCEL) - description = (u8 *)ItemId_GetDescription(gSaveBlock1Ptr->pcItems[id].itemId); + description = (u8 *)GetItemDescription(gSaveBlock1Ptr->pcItems[id].itemId); else description = ItemStorage_GetMessage(MSG_GO_BACK_TO_PREV); @@ -1195,7 +1195,7 @@ static const u8 *ItemStorage_GetMessage(u16 itemId) string = gText_MoveVar1Where; break; default: - string = ItemId_GetDescription(itemId); + string = GetItemDescription(itemId); break; } return string; @@ -1447,7 +1447,7 @@ static void ItemStorage_DoItemToss(u8 taskId) s16 *data = gTasks[taskId].data; u16 pos = gPlayerPCItemPageInfo.cursorPos + gPlayerPCItemPageInfo.itemsAbove; - if (!ItemId_GetImportance(gSaveBlock1Ptr->pcItems[pos].itemId)) + if (!GetItemImportance(gSaveBlock1Ptr->pcItems[pos].itemId)) { // Show toss confirmation prompt CopyItemName(gSaveBlock1Ptr->pcItems[pos].itemId, gStringVar1); diff --git a/src/pokeblock.c b/src/pokeblock.c index e01e821f7e..f3d1fa446e 100644 --- a/src/pokeblock.c +++ b/src/pokeblock.c @@ -699,7 +699,7 @@ static void DrawPokeblockMenuTitleText(void) { u8 i; - const u8 *itemName = ItemId_GetName(ITEM_POKEBLOCK_CASE); + const u8 *itemName = GetItemName(ITEM_POKEBLOCK_CASE); PrintOnPokeblockWindow(WIN_TITLE, itemName, GetStringCenterAlignXOffset(FONT_NORMAL, itemName, 0x48)); PrintOnPokeblockWindow(WIN_SPICY, gText_Spicy, 0); diff --git a/src/pokemon.c b/src/pokemon.c index 7fe9f58de4..ebf36f9b90 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -3139,8 +3139,8 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de } else { - attackerHoldEffect = ItemId_GetHoldEffect(attacker->item); - attackerHoldEffectParam = ItemId_GetHoldEffectParam(attacker->item); + attackerHoldEffect = GetItemHoldEffect(attacker->item); + attackerHoldEffectParam = GetItemHoldEffectParam(attacker->item); } // Get defender hold item info @@ -3151,8 +3151,8 @@ s32 CalculateBaseDamage(struct BattlePokemon *attacker, struct BattlePokemon *de } else { - defenderHoldEffect = ItemId_GetHoldEffect(defender->item); - defenderHoldEffectParam = ItemId_GetHoldEffectParam(defender->item); + defenderHoldEffect = GetItemHoldEffect(defender->item); + defenderHoldEffectParam = GetItemHoldEffectParam(defender->item); } if (attacker->ability == ABILITY_HUGE_POWER || attacker->ability == ABILITY_PURE_POWER) @@ -4755,7 +4755,7 @@ bool8 PokemonUseItemEffects(struct Pokemon *mon, u16 item, u8 partyIndex, u8 mov } else { - holdEffect = ItemId_GetHoldEffect(heldItem); + holdEffect = GetItemHoldEffect(heldItem); } // Get battler id (if relevant) @@ -5489,7 +5489,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 mode, u16 evolutionItem) if (heldItem == ITEM_ENIGMA_BERRY) holdEffect = gSaveBlock1Ptr->enigmaBerry.holdEffect; else - holdEffect = ItemId_GetHoldEffect(heldItem); + holdEffect = GetItemHoldEffect(heldItem); // Prevent evolution with Everstone, unless we're just viewing the party menu with an evolution item if (holdEffect == HOLD_EFFECT_PREVENT_EVOLVE && mode != EVO_MODE_ITEM_CHECK) @@ -5905,7 +5905,7 @@ void AdjustFriendship(struct Pokemon *mon, u8 event) } else { - holdEffect = ItemId_GetHoldEffect(heldItem); + holdEffect = GetItemHoldEffect(heldItem); } if (species && species != SPECIES_EGG) @@ -6015,7 +6015,7 @@ void MonGainEVs(struct Pokemon *mon, u16 defeatedSpecies) } else { - holdEffect = ItemId_GetHoldEffect(heldItem); + holdEffect = GetItemHoldEffect(heldItem); } if (holdEffect == HOLD_EFFECT_MACHO_BRACE) diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 6a24f24945..233aa4a7a0 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -6983,7 +6983,7 @@ static void SetDisplayMonData(void *pokemon, u8 mode) txtPtr[1] = EOS; if (sStorage->displayMonItemId != ITEM_NONE) - StringCopyPadded(sStorage->displayMonItemName, ItemId_GetName(sStorage->displayMonItemId), CHAR_SPACE, 8); + StringCopyPadded(sStorage->displayMonItemName, GetItemName(sStorage->displayMonItemId), CHAR_SPACE, 8); else StringFill(sStorage->displayMonItemName, CHAR_SPACE, 8); } @@ -8986,7 +8986,7 @@ static bool8 IsMovingItem(void) static const u8 *GetMovingItemName(void) { - return ItemId_GetName(sStorage->movingItemId); + return GetItemName(sStorage->movingItemId); } static u16 GetMovingItemId(void) @@ -9181,9 +9181,9 @@ static void PrintItemDescription(void) const u8 *description; if (IsMovingItem()) - description = ItemId_GetDescription(sStorage->movingItemId); + description = GetItemDescription(sStorage->movingItemId); else - description = ItemId_GetDescription(sStorage->displayMonItemId); + description = GetItemDescription(sStorage->displayMonItemId); FillWindowPixelBuffer(WIN_ITEM_DESC, PIXEL_FILL(1)); AddTextPrinterParameterized5(WIN_ITEM_DESC, FONT_NORMAL, description, 4, 0, 0, NULL, 0, 1); diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index 0c23643e49..a5886fd6a9 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -3324,7 +3324,7 @@ static void PrintHeldItemName(void) && IsMultiBattle() == TRUE && (sMonSummaryScreen->curMonIndex == 1 || sMonSummaryScreen->curMonIndex == 4 || sMonSummaryScreen->curMonIndex == 5)) { - text = ItemId_GetName(ITEM_ENIGMA_BERRY); + text = GetItemName(ITEM_ENIGMA_BERRY); } else if (sMonSummaryScreen->summary.item == ITEM_NONE) { diff --git a/src/shop.c b/src/shop.c index 123a21d639..587060f024 100644 --- a/src/shop.c +++ b/src/shop.c @@ -603,7 +603,7 @@ static void BuyMenuPrintItemDescriptionAndShowItemIcon(s32 item, bool8 onInit, s if (item != LIST_CANCEL) { if (sMartInfo.martType == MART_TYPE_NORMAL) - description = ItemId_GetDescription(item); + description = GetItemDescription(item); else description = gDecorations[item].description; } @@ -626,7 +626,7 @@ static void BuyMenuPrintPriceInList(u8 windowId, u32 itemId, u8 y) { ConvertIntToDecimalStringN( gStringVar1, - ItemId_GetPrice(itemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT), + GetItemPrice(itemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT), STR_CONV_MODE_LEFT_ALIGN, 5); } @@ -985,7 +985,7 @@ static void Task_BuyMenu(u8 taskId) BuyMenuPrintCursor(tListTaskId, COLORID_GRAY_CURSOR); if (sMartInfo.martType == MART_TYPE_NORMAL) - sShopData->totalCost = (ItemId_GetPrice(itemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT)); + sShopData->totalCost = (GetItemPrice(itemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT)); else sShopData->totalCost = gDecorations[itemId].price; @@ -998,7 +998,7 @@ static void Task_BuyMenu(u8 taskId) if (sMartInfo.martType == MART_TYPE_NORMAL) { CopyItemName(itemId, gStringVar1); - if (ItemId_GetPocket(itemId) == POCKET_TM_HM) + if (GetItemPocket(itemId) == POCKET_TM_HM) { StringCopy(gStringVar2, gMoveNames[ItemIdToBattleMoveId(itemId)]); BuyMenuDisplayMessage(taskId, gText_Var1CertainlyHowMany2, Task_BuyHowManyDialogueInit); @@ -1058,7 +1058,7 @@ static void Task_BuyHowManyDialogueHandleInput(u8 taskId) if (AdjustQuantityAccordingToDPadInput(&tItemCount, sShopData->maxQuantity) == TRUE) { - sShopData->totalCost = (ItemId_GetPrice(tItemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; + sShopData->totalCost = (GetItemPrice(tItemId) >> IsPokeNewsActive(POKENEWS_SLATEPORT)) * tItemCount; BuyMenuPrintItemQuantityAndPrice(taskId); } else diff --git a/src/tv.c b/src/tv.c index dbbf64d33c..5444299ce4 100644 --- a/src/tv.c +++ b/src/tv.c @@ -2807,7 +2807,7 @@ static void SmartShopper_BufferPurchaseTotal(u8 varIdx, TVShow *show) for (i = 0; i < SMARTSHOPPER_NUM_ITEMS; i++) { if (show->smartshopperShow.itemIds[i] != ITEM_NONE) - price += ItemId_GetPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i]; + price += GetItemPrice(show->smartshopperShow.itemIds[i]) * show->smartshopperShow.itemAmounts[i]; } if (show->smartshopperShow.priceReduced == TRUE) @@ -4489,7 +4489,7 @@ static void DoTVShowTodaysSmartShopper(void) break; case SMARTSHOPPER_STATE_CLERK_NORMAL: TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); + StringCopy(gStringVar2, GetItemName(show->smartshopperShow.itemIds[0])); ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[0]); // Pick a random comment (SMARTSHOPPER_STATE_RAND_COMMENT_#) sTVShowState += SMARTSHOPPER_STATE_CLERK_NORMAL + (Random() % (SMARTSHOPPER_STATE_RAND_COMMENT_4 - SMARTSHOPPER_STATE_RAND_COMMENT_1 + 1)); @@ -4511,7 +4511,7 @@ static void DoTVShowTodaysSmartShopper(void) break; case SMARTSHOPPER_STATE_SECOND_ITEM: // Clerk describes 2nd type of item player purchased - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[1])); + StringCopy(gStringVar2, GetItemName(show->smartshopperShow.itemIds[1])); ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[1]); if (show->smartshopperShow.itemIds[2] != ITEM_NONE) sTVShowState = SMARTSHOPPER_STATE_THIRD_ITEM; @@ -4522,7 +4522,7 @@ static void DoTVShowTodaysSmartShopper(void) break; case SMARTSHOPPER_STATE_THIRD_ITEM: // Clerk describes 3rd type of item player purchased - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[2])); + StringCopy(gStringVar2, GetItemName(show->smartshopperShow.itemIds[2])); ConvertIntToDecimalString(2, show->smartshopperShow.itemAmounts[2]); if (show->smartshopperShow.priceReduced == TRUE) sTVShowState = SMARTSHOPPER_STATE_DURING_SALE; @@ -4550,7 +4550,7 @@ static void DoTVShowTodaysSmartShopper(void) case SMARTSHOPPER_STATE_CLERK_MAX: // Clerk's comments if player purchased maximum number of 1st item TVShowConvertInternationalString(gStringVar1, show->smartshopperShow.playerName, show->smartshopperShow.language); - StringCopy(gStringVar2, ItemId_GetName(show->smartshopperShow.itemIds[0])); + StringCopy(gStringVar2, GetItemName(show->smartshopperShow.itemIds[0])); if (show->smartshopperShow.priceReduced == TRUE) sTVShowState = SMARTSHOPPER_STATE_DURING_SALE; else @@ -4674,7 +4674,7 @@ static void DoTVShowPokemonTodaySuccessfulCapture(void) sTVShowState = 2; break; case 2: - StringCopy(gStringVar2, ItemId_GetName(show->pokemonToday.ball)); + StringCopy(gStringVar2, GetItemName(show->pokemonToday.ball)); ConvertIntToDecimalString(2, show->pokemonToday.nBallsUsed); if (show->pokemonToday.nBallsUsed < 4) sTVShowState = 3; @@ -5714,7 +5714,7 @@ static void DoTVShowHoennTreasureInvestigators(void) switch (state) { case 0: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + StringCopy(gStringVar1, GetItemName(show->treasureInvestigators.item)); if (show->treasureInvestigators.location == MAPSEC_DYNAMIC) { switch (show->treasureInvestigators.mapLayoutId) @@ -5735,13 +5735,13 @@ static void DoTVShowHoennTreasureInvestigators(void) } break; case 1: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + StringCopy(gStringVar1, GetItemName(show->treasureInvestigators.item)); TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); GetMapName(gStringVar3, show->treasureInvestigators.location, 0); TVShowDone(); break; case 2: - StringCopy(gStringVar1, ItemId_GetName(show->treasureInvestigators.item)); + StringCopy(gStringVar1, GetItemName(show->treasureInvestigators.item)); TVShowConvertInternationalString(gStringVar2, show->treasureInvestigators.playerName, show->treasureInvestigators.language); TVShowDone(); break; @@ -5849,7 +5849,7 @@ static void DoTVShowBreakingNewsTV(void) break; case 3: ConvertIntToDecimalString(0, show->breakingNews.balls); - StringCopy(gStringVar2, ItemId_GetName(show->breakingNews.caughtMonBall)); + StringCopy(gStringVar2, GetItemName(show->breakingNews.caughtMonBall)); sTVShowState = 4; break; case 4: @@ -6011,7 +6011,7 @@ static void DoTVShowPokemonLotteryWinnerFlashReport(void) StringCopy(gStringVar2, gText_Second); else StringCopy(gStringVar2, gText_Third); - StringCopy(gStringVar3, ItemId_GetName(show->lottoWinner.item)); + StringCopy(gStringVar3, GetItemName(show->lottoWinner.item)); TVShowDone(); ShowFieldMessage(sTVPokemonLotteryWinnerFlashReportTextGroup[state]); } @@ -6695,7 +6695,7 @@ static void DoTVShowSecretBaseSecrets(void) sTVShowState = show->secretBaseSecrets.savedState; break; case SBSECRETS_STATE_USED_BAG: - StringCopy(gStringVar2, ItemId_GetName(show->secretBaseSecrets.item)); + StringCopy(gStringVar2, GetItemName(show->secretBaseSecrets.item)); sTVShowState = show->secretBaseSecrets.savedState; break; case SBSECRETS_STATE_USED_CUSHION: diff --git a/tools/mgba-rom-test-hydra/mgba-rom-test-hydra b/tools/mgba-rom-test-hydra/mgba-rom-test-hydra new file mode 100755 index 0000000000000000000000000000000000000000..274c623b639bd630438da306e576b0b1d5ae6d4c GIT binary patch literal 34992 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 RL^k~k+oi+>844M!@n3Uq`lA2< literal 0 HcmV?d00001 diff --git a/tools/patchelf/patchelf b/tools/patchelf/patchelf new file mode 100755 index 0000000000000000000000000000000000000000..0ba2250829b181eff97c1d645e2ac07fba63fdfc GIT binary patch literal 16272 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 literal 0 HcmV?d00001 diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc new file mode 100755 index 0000000000000000000000000000000000000000..ea9d5e8949a2c0ff3e5a04c8a1aa777f6cba0d31 GIT binary patch literal 54856 zcmeIbe|%Hb{Xc#KEkwX3Xwj;mK?Af3rB!e(f;Kd1Zy<#V1yRsY(v(I@+qH>+I_TC^ zx$hXP8#ty;d2j02bQ_z>5GI7*=$tF444E6%`Qv8w2SeqDo96p`ogZm(X}9%7j7d+ueG%Tw0RWK!hSU%64CSZgImN<_ly*TfBi5~WDV!tWKz z<;noWGZ@CxOL%}(ep&mchh~8jO!=M{>Bexlpp&7LkV4AW=XHrlk)f5xDPJbt+UN(D zjr}IWHy84_43(68th^3EZwQBs;J6G^^O0_>FYj#+fb-u*YjbRs6 z1eXkDc9N0)Duq6cVF}XcDq+8hV$9be@)<+BpqC+)K^KMe_tCQyJ3F*7G^yTXo6UYd zSVQ@Y^2vCK$R|T7XQjwzeVP*(!}ml!8B!T^-Hd#s&;RQsnn9T*%j={4jtizT6wSiw zS%AXG*2-thQTnwiF_J~5n-mj^pC<(BC*m@lXtVK0%|ZEpdf$h!{G8{Hy?OO7E@-*< zq4!Fz|JkGC>jR6fpD@0@W?X%sA+&tl@}ld;u24 z5B!ln@K^f4%lnZ3e?fmG{*2cG07I2al~|0Y$bN1Sc&7o62wd5jPLE<4pCf`^_Isbe zy96%zD~(OTKtqkv>|aJfORy%;pm@D4!D`z#Y-C-g!o=g+AAUS-Va^~ehq*0Uxo;IjPT4f zMAGqe6X-tx59x=uJoNAY@}|cHmK_M3Pb1GiMErS{-e1XtAyA&sr2)9seu|Y01D70k zW&1bX%<&xI*ClQfc&-7TwwBYE81SR(IIbG-_XS>Qz^|kZg=?MxA20BQ23+!~GvGG} z`X&QjF7V|BT=Ho(;By51Y6D&^@D2km`K&kK-xTy44EQ|)-)O)kpG^jQwV>Z(z}E^q zX22z%0|xv_LEmY>e<|=I23+##GT_?;y>7tw3;ehNmwZke@HYj$vX!^Lw6|jdHyd!t z$7;Yo67)F+{EWbD23+#VHQ)mt<#H4l@CyZAWWXh#5(7R`(5nV~oWLs$xa2d>fENk+ zg$CRu@Hzu7`7{~u*@Aw#0rv{L)qqPrs||RApzko?D+IpYfJ;6b40yYs-)O)e68I(q zF8ORR;ExOXm;wK(zz-O3$*0qRZx-}N4ESz=cNy@50@n@rQGp*f;O`6kv;miVlx^wu z|GA(y8*t?@PG>dXl248Sw+MQh0l!S(xdvSFDKOwy3;H4he!aj;4EQvGs|I|Qz$*>7 zPvG+mxa70YfG-pDbq0L3z?%%XKPu>34frzxUv0p*2)x69?-clY1OBSOHyCiq zXQKf>D(E*E@DBvO#ehpbF#~>5&>t}189(Iq(`mpZpCbnRB0=9}z()&QH{g=baRWY4 z(4RKoQw6U4Hr@UuAF~0k67*IBUL)`v11|a440yAk&o$sH1zuplC7&V#zDCfO81Tmg zt{QO3r_z8wBk1QD@GSygXv81m`l>VF`vrZI0e?f_%MG}cr`3SJC+Jrj@Dl>>FyNBU zdIO#i^cxKLpvSrV8x6SRv&n#8D(JTu@LYk%47lWTzDc$~83fyeKB_FE+j|%z{1OA$vha2!m1bw9e-ze~T27I%? z7aH�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 Date: Thu, 22 May 2025 14:33:31 +0200 Subject: [PATCH 123/187] Remove files that were wrongly commited --- tools/mgba-rom-test-hydra/mgba-rom-test-hydra | Bin 34992 -> 0 bytes tools/patchelf/patchelf | Bin 16272 -> 0 bytes tools/trainerproc/trainerproc | Bin 54856 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100755 tools/mgba-rom-test-hydra/mgba-rom-test-hydra delete mode 100755 tools/patchelf/patchelf delete mode 100755 tools/trainerproc/trainerproc diff --git a/tools/mgba-rom-test-hydra/mgba-rom-test-hydra b/tools/mgba-rom-test-hydra/mgba-rom-test-hydra deleted file mode 100755 index 274c623b639bd630438da306e576b0b1d5ae6d4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34992 zcmeHwdw5jUx%ZwV12GUMC@6};s6;_cNVpYHYyu1n$|Z79TD3z+CJ@QZ%!G>-2~I|t zj-#36EM#|u)yAy^ZvZA0x*j$@ zrUR@94o!7DX@-AQDxR6N0(m?t#Mv-1^*WVaCY`M0HDwt*Ncp#S6S=dgTcBomb#;x^ zzYW$>FVjEGS13JAwVzc=Z*QFx$fONQPgCvZ&Cp{!|ItG=gRx4LXV-pSHWUs`RkMhC zvMaH#Em^VF$Z0p?^hM`842R&)0mdUo@j9QfWAVr4p#I^W9&hJM6XKDK&|ErQ=v@z8+7tCgBHvLog4lfg-GINT zmp*vO+z+CceDk00D+HVMsD<8nS#q}9;I~0Gn|!g2{L?n__uAmUv#|r%aN{rYINwJ8 zW(a2Uv&RNMZewS(4gQJ^e#XZBIvf0#Huys}_**vRzHcMXVVf-uU$L?Cm<|4p4gRE! z{l{(O7u(>cZS1t#$Zxj6U$eo#YlAPgDfb2&`AZ@1#$V>~l8yYAZ1B5aAX~dkw2^<# zM*dkF`8*qZy^WotHu$$~>|A7nZ?&;=zYYGLjh)+V@ZZ?j8EYed)CRv6cHH>OJRS#- ztzDMc;3sYDF9&{krg88mZ0!6U_!#3NBfd*2>FeQVV25~L2L6(;Q)paPEajh<#4vnI z*DUwd`dj@Q>jOc5>zd^Y8=9N^YpORi_zjh}E_F{YJna+_Isq&ImNMwAMET>x`DxnqY&`;%{wjZl!P&r32doHO)VhBf~-e@#ORt<^L)wisgpQW0-KCRet>p7@HZJ7{lS)&`dV12t~F}gTBZvGKp(9m3C)Ca1A z!R?06zpXxKG`B#rQD*pjxU$x$I5bw*H&GKcFzQsL;6}}+Rya|!t=d;t-&EaDe>du` za#6m&X^T-KjZqd=8FDz-8f#*p>YEv%nug|p9|g1pYmBYc^+8r3P`?qTg(Tv_ z`ZIWSTU+acC=G#!-Ma$KtwE!)vAV@*sc(S=L^R0ECRr*ytPYAQqEd}q9n3aZJ(*gv zZ0Ul9zUigYOJ^B6J!8gDvUH}IE+0w`rDj-?bI`|fu=2>k>L*A1=MZNiL;pD~=^<37 zMj+Q=j5KBP&6JkVl(t70=a~5z2sp5=GCoF<>o+(4+Aglg5^ID}q}FM)JpyUHzWcXF z9>wzL9ODv&1uvp}zHyb}zbf)a8Z#6>w!R)~C8u$N;-3}yd1C!Xn+F7+YphoJviuyg ze7*kH(??mmOcB#-aw2oud6u#TGAYg#?UJGVD47&zZ@XlOkCsVsu4Y+=5TA;5`=n5)0mI!MR4$$BA~C zVtgiQ5VWsdGQ=mzq&O$qB}3dTlj1zkE*avN$)q?Bwo8Wi3qHkyPqpA>7W`@pKF5MzW5Fvd__Y??Yr#t_c$Eb&wczV4 z_%sW?-h!7|@J$wcx&?2s;4>`vHVZz}g11}nSr&Y^1^cp)j=*pPh9mGl9f3c&CVu1%ozC}0oiF=pbx^4xMs#sxo}Jhxhs`vreB`LX2p3I1~O+*(O?3jSj9+)_!l3;sOv z+)7Ed2)=+kw@{Mn1)oEnTPMjX!GH7x@Z2&B=Q4)XZ>Fz?ZtYr<3Q_L~_62uO`neiR3=;9Dn71SQasQ|_pu zkUvhr*sRw`rhej$40wN2C;e7`BeapJB|+dd$evS&H01&k{cnr7B(U~ z-s$$7rn_+AZm32)1N~o&dIqlXoQ`xI`TZnE@A1J%SJZRb(Hrsn*&8if4xuPgHND3PgS9b_K7pgzq4m!wlf&zoEt< zPdqpIExM0-BdU)xRP2nQ9Ro(&WUDf-gr;(-QXbWRCo~5zb|Ru5QH5Q($Qvts7u%uW z(2ahA1{3`&@h-yLKV7S^GxvF?q8o99Nwrzenrcet`)nFGItnszjGlz+z8EH0R&}t} zdyVXxL1*GigQ?UpIqX8GDc;S45<^S2mK7|4Q3tab) zWiheBQ+Pl|;e(8+GIFgj;tIbH!^+So8bUh3K{3x2?vy4ID8m8BbvPaxTgIAb)=BHq2%hlef^QBvnADf@c zsz#0+amC63s>o#+S+(0bbFbtYs?vPjSOR+7SR{~BqNjNTDsn%YsW=oJKZprMh4B9^y{Mj<7NptH3E6D}+zL z6H%rQ7IooiY&0iB#Qy^|Z{_O_WC;#uO0kNA10rPo*Yr>IM#nX*60uPiA2uYeL1_(n zP+A-GI*`Q$sY5KN2E9{p5tR$X-ow0qrSF9wpzrDnxhw4EHB>}SUJ8Zya+JVJb7DP( zWo|y(>Kd*{5E?k|UQsM#JO|;yML?Maz#E;L^nveiTbX ztc`Z_r$OjTyVGxyP`5@1dLzyes1>HA)JhQObyQPNnuX8%;M%@ug`0gx6eVvFo+9je zp<;R+Rmz2m1Y9qm3-U%RhmyP>qpIgAska}={kZGOFn0isvT}5IFKM@@oh12xaEf}` z)jeJ|qftZHSGO)FaH}$a8+a6h{w})Z1?UUtf0IAm4654Me?7DhrfZ-0qtL$mzt!Fw z^0ae#z^IhDUWm{2w7VXxWJ`s1bQ-P>{`d^Zy-4QEl|$#*afrjf-m~GJZcm2@2Y+!N z^>m1f92N<3JUe=$23z6g?3u0?s?ODZ)y?g7-FIzvxoAb+e7Ngy-G8o~Kt78Z5KWTB z2jNbSZ0EjgURLB`@tZY+w;E!cINO&aOmjWEF?5gncW3FhsIzl5g=FiV_yapJ7wJ2C z5!(H54wXe0be2*mT6mQpc%ozd3G2iYKhJ;NP|4o20_`{C%U_%fF2{2obc+(Cusj%LB>HDk&$))!tpF4?I$AL=G)$dK;#n zs{pCB+{`D+;~|lkyA$_hVP^Bz4deSJdQ_OeZkU`XKJfxeQh^D@$9tn@mJCQY@+0AwU^jG#=alf{6KpEd`isbw zbNzd?6WdeK{B|lT#L*!kFdpvl%ELv+FO*V;sdSJ^(Qpftu%3{5mBPu&Nc=_md5{4^ zOwbJfONKWAClFo|Y4%ZNw!}1BBh3m)`0x{~47!~cqy97oN46-9n-VBK5+0BiNibwM z+R-s?r%Wttz%}86x|(c*6OnKnqM<`P8^M*Rbsy$bZ|pe=M@8m~EDA+`NS~w5FE6Dr zC02NWD1K`ESHT$87xJdSEJni@@SY6yk9N$({=X&qh2VU3JJ#}8!y*=n|kuLA?--oaP zcTN}b;>_#%z_l*Ue4d)(iKh{K3(NXI?Amz5xebP+&L(00uvq87k(HvYoa=!ipr0dA ztEfI~fYa3yGmJGzb%)opd2l4_*`m>L#WX8W>jKK#Ef#wG@iSx`*=3?~F&Hg8xdb-$ z(6YDYXWsgs3GZT;j1lDv4?}XTH|_;WW-E>N0jjjGWS3F56VbxJrJWL-#r3)qRehZf=BbVRl`8oA&#~EW!B}iF$5U#{sz!JCrmSgV~ z1iw36s~h(*F6UxlF=Sw{2QqrTNnn?gg^Wd+()5i;CHCMH3BL{lp+h{&S)^MD{|+Td z;Y%SWB@9=%2}`=ebVXbe=~^olU@EW?eSf%ADh|T8VL5 zMg(xiyaP|$D4=Wg_GH;+>rMR;boHbt?B}8|o@HTiB|O6v{*O~^GfJS%;&3-Q?#e~1 z+^m10Y%KgHW@>rQ>9kg+8ihpnuv09zx5cJxr!PsUoifv%Vm> z`L}}Hi9%zvbhEhC?UJ!Og~;PMauI6n3O`0iV$Mn`AsltclaU*Z%0OFQRahr=QD@NH zmgb$PG_N%^e|C~Rfr_ENotP$Fk|{PYA>!EtH!o8QSn7O3=pH#Z5l+a>%h{%t2VrGs zX@Er_DqQ%-D_C#m-$79CzX>vHP>}iWli-25s5E17GdkC=0iyCpWX%(zv0rhEn!hP) z{yNoArv~K7nx7|19v6U*Q8CmlGj>;0jNM2Mrmj`l1hD+aI`=cok}WzkQ#)Ss#%{#^ z;;e<2)ewpPPE-C<8&CY^r zj;OJ@t{1{N7#z4QjQ#abxRDV);pwWNA>jeSK=-1~-p|Swy&boR zp+my?d$Don+zmXshdjFe!pqodLkqnhq4=nC4@CGhNQC(y^f?c*aj&<8X^c?qPOJka z!}JhR-QjIIIG!9vg)E|SR@338d&FL>zj%YXlx>4~ke+D;bN>i?d~)}ya74EJ9{mJq zDrWA&U*C|$1VnbrHP5W0+48a5BOgLJj+n*AW~O(w0SsAjEm-=Wyf*isR-r>Y%Xz-Y z%{X=^ZbJNIFm@q@I<3l9AeOnixs4YUcEqxG*3@i**mQjjJCt(EZ`_D%BIpDn#NuA2 z12f}L6*5PQ3i)`3{2PWPP-is`wrIK&u3rv~i6xU{{WhcavVPw{%D$**(NNy#^hoyn z_3a35Zwu$(d2V!%@ZCE7q38v9q3?3;afC$G(4#38b$)Wa?9u-l4<5~Ny$==X4&MU- zB#i#M5cB_pTvR}34@WL14`NncKW^BvBh%!GF&Ql87n zFLJm7nr*Y0pT8R2$^nc8ip9yC*(X6mbEYOk64x|!OiQptxg z;j#YLvHnEU>W}G9T&XSB=zHj#S|8qXsdRWZFxkY1k%GC0vzo)05&P}9Sg%2APKOX= zYiwlIbBS3Cv*mOA@h(AJ-5ImBDA>9ZD3=DiRn*j_(N+IZcMCcSx2zeu0 zm4^#Y?|bj2qA@nEx8|7l$jN*@Pmw!fZ=MiwzUm*biSl_tP&TLi!OrG=uo()oIE*5C zh0U;WKb)IAHWjG$Tp{Ip@I29d$9>I4lusQUVfM`K@KZP=97a+`i0n{=K9|h^B19=O zLT{(lruk2(4ZHeT5qkD55h3S4Vv`Rlha!Y^k&Vsuuo()oI7EnEF+$&*lRZLS5g|&+ z2z7`56=_T5$qrTi_H1TQc}kg;he?a0+?a`Rbe~oE7v2<=&;LhkE=sfcOrM?28rTel zSsW@)uUPpfKa;)kd}caVNSWQ^i#DQFqI+;^3W*5_vm@uBsB-}nI6K~f88CE6%w288 zm?l5sPZMJEFS-Z>KMWXykjh2=&FH|%A7DZY9TIb%>!C}^zr_g)(nb&Xa11Vug|3>3a03=A!OdJ&T3i%^0{tt{ims*H2YGJe30 z$a{H2b`NcH)q3O<1~WFWyA${PJF+9VVU-dwDWQft7F5nrG%VLr7h>%|K{kB4DQ=jb z;x8p)g=;gMyhgMe%{ro@s@I8%$#w}H64wbcQvWP$%%7xcagAAvzrad&_}TPGkrk1m z5gDmFq!R@hPCSWP>PXF#W#pX|sYg(Thyw=T9@WE0u`gLNg>qtEa#4sZj6gK8B7dDO@oNh+y zN3hZzK0sj{N!h2!ib&Cjj1*p|Kqo$%;lw?trH)jQEMu-JW2jGUWT!#(IGOLE?es`Z zdBcp9nC_*7B~mZo=c%es9aY_v*P3)wjMPIEj1@XA(DE`;Z=ryYs3Rgp>(`0vh92wA zTZR2sUoK!+ucojZk>YM*9x|hQ_R{NEVPl5n9YT0FG7TYID1^yFcwdHal@Mm+AI%Ux^E3J^T3onszYr!5;YTurk3kr*+8|^)q|7ff zWWFtBZV)n@%V6hZhRiN0b1`J_;6MiN566Y=5d!N@JPnbkTDPoC;8%2G#Sc93E4oEO z@Q%S_N6-HKEhg&c$_=CZOse?D)6gX5zX33R_0O(4d<;imI0C~F7>>Yj1coCp9D(5o z3`bx%0>cp)j=*pPh9mI*N(A^eO&-^mZ8NSf4&1=gHD%k18@AnGELl)F&&{)Yk$*$m zMx=xOK+xAz-RO4*o15Kuf$YWtqplwBUIm1Ar#4yf+ltGsuD!!u9DtsB^Qs$fVa1D1 zeRxr9oxj!1H^2JD>st9*R(E~V*?ICsu~ zINAc$8~rHM-MDc>bqVxJ=(D?d!<{wFE!%0Rz*t^+lgGElvugRuwQJO?U)}N*u^FE6 z-LP(dLtS01E|@P_O-J|!)^vpC7cZ+^vf7yPg?rpnOYWRyaL1RE|GcFO||agT6be}s~`Vvj53x?L+F%XsKJ^+du+&n3@l8~Xslel zdhPNmRCUE_-%v3_1CHtECl* zZ6YjI`&lZ%Qi^LCKM``^^w4x4$V^-;CE&H*9y)p6nLZddl{Yoyy|aS^m## zT(fdb<+AMlJ0|2_*MPW;#^3H2Q>lHRiI-BT-JmBArBXehk;C}aBfPNnkkXwT?M zrKW(MI)+Vh(7msvQky`(3)%si^P^PiTc9I`XFPc~jLLJ1?$23RI3nkpC_(1m1NbrIKcANWJv0C7z^9?EM|i2$ z`nfOVP=LO@gumW+Ds^h4HUF0*b^bemzuc4EKAyT6ALDNdVm1!cw2vfhk4FqHL*80z zUQU(i+Z^QIf_x{QvzofOMji#+fYu@Zx*w-f3;C2)`|b_p=FYxY*kCa4fy^fS5czzh z^+9vYLzegs3UOlm8$O03FdTv52>kyX0sZ{|_hcCb&XYVoRte4Xn+H629TkULl0r$0 zyegT%uV=)ezf&+l@wh~ZgVQ$;{k;NS8+hpazkHHvCg00zArAh_10D(fN&&|RNz4hH zYaSk7Q2vdQtikIM4{F`(TGY$+H7?%th8*p8 zz6z9b(<~o9G7|OCqMsJRrF0o-&ORCq9ZOd#BqV5S1LMN(Z!11qG+9>TNJ%t z(MJ`1QqkuXeO1vn6@6FHGm4J5T$Qirm5R<*bg`nhC|alJ7Dew@^if5hRP=d8Usd!? zMc-BQjG`m1P~|InrJ}PHU99LWiqii7ruwwQfy_MPeeq)?s~pFJ1K$%GQ1geE_TjrDcwoz}>o0E%a{SV{*ou^Rv!+z{bvFHu%%DW4H`s zy|kd`;X^j^KefS6+2DTxUW9qO=sxYCq#xPHj~95M`8{B<2LhFIZN|~%z-d38Fy28I75?$@H2uLWLP22FsD%8w|fLHzz=eQg@#^Ve1ftNF}}Ux`f5!e)6r>x;*S=@}Uxhcq*1 ziq9RIEWO}!tTaG>e=-de4_(p_@dzai;WM%{Ks~2R!^CGA(-8SZ$TW!EG7XSlf=q+t z!=W_D=VPek$0r#Ue8w>?Uw#xa4HBQ@OheR%D$}scuY3Ax1I<1;gw&@cO>uncQGcG& z#6%BYx)P4n);Iau0(fF89xKs^IX!}u6C4Uk_YO@q{zNz*X-nNK-Wq-CfNex_mSDp3unB!qJZ^7l4*E+sHno+uv?8*t_>yX=35l7u1fMW1<&&b;7DEVb zs>WAbOKZ0`VG5Qs*eY|j;7K>0CZ#bxAQr}nI+FA{Vsjt&0rn<4d20k>yGESwUIB6Pv z&?v{RqN~hNKN&Aq%L3U>-tBO{sLuC?{8|V_d}_FA^tM;zXFUg zG52HLV0gI2+0gsGk~6n!HETSClvUsDmRXvLXQ8Gv?*-(c>0@B6`t4W9d`&~wDg{Nf zo<<)>!m6+LuQk>C+FCxd|9@NQ>-Zb%m87ElDzNp?@zdCMkzn~+U+?c|+Mop$%`E>1 z8T$DfrJ$yK=4?GO%l{!Vt>b_1CMm6{+p3IoX8CUbNj{txQ+Lzf}eaUwYm#h21pP@?;t*^g_e4rU1jxtHiv)0%2 zL*!WX_49;;(vRE3U+d=}->R?oAD+5P7ODNz4ro1-hcYqkzrIgCp!BP>prY;!zEG8) zSx>E>IezIY4=dGuSLVp`303|+-mTKzS?)GDbL&Pmh^Ewaj8sQu9h8x RL^k~k+oi+>844M!@n3Uq`lA2< diff --git a/tools/patchelf/patchelf b/tools/patchelf/patchelf deleted file mode 100755 index 0ba2250829b181eff97c1d645e2ac07fba63fdfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16272 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 diff --git a/tools/trainerproc/trainerproc b/tools/trainerproc/trainerproc deleted file mode 100755 index ea9d5e8949a2c0ff3e5a04c8a1aa777f6cba0d31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54856 zcmeIbe|%Hb{Xc#KEkwX3Xwj;mK?Af3rB!e(f;Kd1Zy<#V1yRsY(v(I@+qH>+I_TC^ zx$hXP8#ty;d2j02bQ_z>5GI7*=$tF444E6%`Qv8w2SeqDo96p`ogZm(X}9%7j7d+ueG%Tw0RWK!hSU%64CSZgImN<_ly*TfBi5~WDV!tWKz z<;noWGZ@CxOL%}(ep&mchh~8jO!=M{>Bexlpp&7LkV4AW=XHrlk)f5xDPJbt+UN(D zjr}IWHy84_43(68th^3EZwQBs;J6G^^O0_>FYj#+fb-u*YjbRs6 z1eXkDc9N0)Duq6cVF}XcDq+8hV$9be@)<+BpqC+)K^KMe_tCQyJ3F*7G^yTXo6UYd zSVQ@Y^2vCK$R|T7XQjwzeVP*(!}ml!8B!T^-Hd#s&;RQsnn9T*%j={4jtizT6wSiw zS%AXG*2-thQTnwiF_J~5n-mj^pC<(BC*m@lXtVK0%|ZEpdf$h!{G8{Hy?OO7E@-*< zq4!Fz|JkGC>jR6fpD@0@W?X%sA+&tl@}ld;u24 z5B!ln@K^f4%lnZ3e?fmG{*2cG07I2al~|0Y$bN1Sc&7o62wd5jPLE<4pCf`^_Isbe zy96%zD~(OTKtqkv>|aJfORy%;pm@D4!D`z#Y-C-g!o=g+AAUS-Va^~ehq*0Uxo;IjPT4f zMAGqe6X-tx59x=uJoNAY@}|cHmK_M3Pb1GiMErS{-e1XtAyA&sr2)9seu|Y01D70k zW&1bX%<&xI*ClQfc&-7TwwBYE81SR(IIbG-_XS>Qz^|kZg=?MxA20BQ23+!~GvGG} z`X&QjF7V|BT=Ho(;By51Y6D&^@D2km`K&kK-xTy44EQ|)-)O)kpG^jQwV>Z(z}E^q zX22z%0|xv_LEmY>e<|=I23+##GT_?;y>7tw3;ehNmwZke@HYj$vX!^Lw6|jdHyd!t z$7;Yo67)F+{EWbD23+#VHQ)mt<#H4l@CyZAWWXh#5(7R`(5nV~oWLs$xa2d>fENk+ zg$CRu@Hzu7`7{~u*@Aw#0rv{L)qqPrs||RApzko?D+IpYfJ;6b40yYs-)O)e68I(q zF8ORR;ExOXm;wK(zz-O3$*0qRZx-}N4ESz=cNy@50@n@rQGp*f;O`6kv;miVlx^wu z|GA(y8*t?@PG>dXl248Sw+MQh0l!S(xdvSFDKOwy3;H4he!aj;4EQvGs|I|Qz$*>7 zPvG+mxa70YfG-pDbq0L3z?%%XKPu>34frzxUv0p*2)x69?-clY1OBSOHyCiq zXQKf>D(E*E@DBvO#ehpbF#~>5&>t}189(Iq(`mpZpCbnRB0=9}z()&QH{g=baRWY4 z(4RKoQw6U4Hr@UuAF~0k67*IBUL)`v11|a440yAk&o$sH1zuplC7&V#zDCfO81Tmg zt{QO3r_z8wBk1QD@GSygXv81m`l>VF`vrZI0e?f_%MG}cr`3SJC+Jrj@Dl>>FyNBU zdIO#i^cxKLpvSrV8x6SRv&n#8D(JTu@LYk%47lWTzDc$~83fyeKB_FE+j|%z{1OA$vha2!m1bw9e-ze~T27I%? z7aH�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 Date: Thu, 22 May 2025 19:15:01 +0200 Subject: [PATCH 124/187] Fixes Unnerve activation not limited to 1 per switch-in (#6960) --- include/battle.h | 1 + src/battle_util.c | 6 ++++-- test/battle/ability/unnerve.c | 27 +++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/include/battle.h b/include/battle.h index 633c9da18a..10cd804931 100644 --- a/include/battle.h +++ b/include/battle.h @@ -132,6 +132,7 @@ struct DisableStruct u8 unburdenActive:1; u8 neutralizingGas:1; u8 iceFaceActivationPrevention:1; // fixes hit escape move edge case + u8 unnerveActivated:1; // Unnerve and As One (Unnerve part) activate only once per switch in u8 padding:3; }; diff --git a/src/battle_util.c b/src/battle_util.c index 640b4753af..e74bddcf54 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4847,10 +4847,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } break; case ABILITY_UNNERVE: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_UNNERVE; + gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_SwitchInAbilityMsg); effect++; @@ -4858,10 +4859,11 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 break; case ABILITY_AS_ONE_ICE_RIDER: case ABILITY_AS_ONE_SHADOW_RIDER: - if (!gSpecialStatuses[battler].switchInAbilityDone) + if (!gSpecialStatuses[battler].switchInAbilityDone && !gDisableStructs[battler].unnerveActivated) { gBattlerTarget = GetOppositeBattler(battler); gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_SWITCHIN_ASONE; + gDisableStructs[battler].unnerveActivated = TRUE; gSpecialStatuses[battler].switchInAbilityDone = TRUE; BattleScriptPushCursorAndCallback(BattleScript_ActivateAsOne); effect++; diff --git a/test/battle/ability/unnerve.c b/test/battle/ability/unnerve.c index 4547854231..9a8972eb5c 100644 --- a/test/battle/ability/unnerve.c +++ b/test/battle/ability/unnerve.c @@ -72,3 +72,30 @@ SINGLE_BATTLE_TEST("Unnerve prints the correct string (opponent)") MESSAGE("Your team is too nervous to eat Berries!"); } } + +SINGLE_BATTLE_TEST("Unnerve activates only once per switch-in") +{ + u16 mon; + u16 ability; + PARAMETRIZE { mon = SPECIES_JOLTIK, ability = ABILITY_UNNERVE; } + PARAMETRIZE { mon = SPECIES_CALYREX_ICE, ability = ABILITY_AS_ONE_ICE_RIDER; } + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WEEZING) { Ability(ABILITY_NEUTRALIZING_GAS); } + OPPONENT(mon) { Ability(ability); } + OPPONENT(mon) { Ability(ability); } + } WHEN { + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + TURN { SWITCH(player, 1); } + TURN { SWITCH(player, 0); } + TURN { SWITCH(opponent, 1); } + } SCENE { + ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + NOT ABILITY_POPUP(opponent, ability); + ABILITY_POPUP(player, ABILITY_NEUTRALIZING_GAS); + ABILITY_POPUP(opponent, ability); + + } +} From fba096a500a4843ee9d7ca9dec872e34cae7b549 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Thu, 22 May 2025 13:59:23 -0400 Subject: [PATCH 125/187] Remove map_group_count.h --- src/data/map_group_count.h | 1 - 1 file changed, 1 deletion(-) delete mode 100644 src/data/map_group_count.h diff --git a/src/data/map_group_count.h b/src/data/map_group_count.h deleted file mode 100644 index 4fe8a21b3b..0000000000 --- a/src/data/map_group_count.h +++ /dev/null @@ -1 +0,0 @@ -static const u8 MAP_GROUP_COUNT[] = {57, 5, 5, 6, 7, 8, 9, 7, 7, 14, 8, 17, 10, 23, 13, 15, 15, 2, 2, 2, 3, 1, 1, 1, 108, 61, 89, 2, 1, 13, 1, 1, 3, 1, 0}; From 0530f49fd44c6d29e87f54991ea1d1337b14329c Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Thu, 22 May 2025 15:05:02 -0400 Subject: [PATCH 126/187] Fix AI boosting stats into mon with Haze (#6894) --- src/battle_ai_util.c | 63 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 6789fa58aa..1079cd7367 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2192,6 +2192,31 @@ bool32 HasMoveWithEffect(u32 battlerId, enum BattleMoveEffects effect) return FALSE; } +bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) +{ + if (HasMoveWithEffect(battler, effect)) + return TRUE; + if (IsDoubleBattle() && HasMoveWithEffect(BATTLE_OPPOSITE(battler), effect)) + return TRUE; + return FALSE; +} + +// HasSideMoveWithMoveEffect checks if the AI knows a side has a move effect, +// while HasBattlerSideUsedMoveWithEffect checks if the side has ever used a move effect. +// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. +bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (GetMoveEffect(gBattleHistory->usedMoves[battler][i]) == effect) + return TRUE; + if (IsDoubleBattle() && GetMoveEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i]) == effect) + return TRUE; + } + return FALSE; +} + bool32 HasNonVolatileMoveEffect(u32 battlerId, u32 effect) { s32 i; @@ -2237,6 +2262,31 @@ bool32 HasMoveWithAdditionalEffect(u32 battlerId, u32 moveEffect) return FALSE; } +bool32 HasBattlerSideMoveWithAdditionalEffect(u32 battler, u32 moveEffect) +{ + if (HasMoveWithAdditionalEffect(battler, moveEffect)) + return TRUE; + if (IsDoubleBattle() && HasMoveWithAdditionalEffect(BATTLE_OPPOSITE(battler), moveEffect)) + return TRUE; + return FALSE; +} + +// HasBattlerSideMoveWithAdditionalEffect checks if the AI knows a side has a move effect, +// while HasBattlerSideUsedMoveWithAdditionalEffect checks if the side has ever used a move effect. +// The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. +bool32 HasBattlerSideUsedMoveWithAdditionalEffect(u32 battler, u32 moveEffect) +{ + u32 i; + for (i = 0; i < MAX_MON_MOVES; i++) + { + if (MoveHasAdditionalEffect(gBattleHistory->usedMoves[battler][i], moveEffect)) + return TRUE; + if (IsDoubleBattle() && MoveHasAdditionalEffect(gBattleHistory->usedMoves[BATTLE_OPPOSITE(battler)][i], moveEffect)) + return TRUE; + } + return FALSE; +} + bool32 HasMoveWithCriticalHitChance(u32 battlerId) { s32 i; @@ -4071,10 +4121,19 @@ static enum AIScore IncreaseStatUpScoreInternal(u32 battlerAtk, u32 battlerDef, return NO_INCREASE; // Don't increase stats if opposing battler has Encore - if (HasMoveWithEffect(battlerDef, EFFECT_ENCORE)) + if (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_ENCORE)) + return NO_INCREASE; + + // Don't increase stats if opposing battler has used Haze effect + if (HasBattlerSideUsedMoveWithEffect(battlerDef, EFFECT_HAZE) + || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) + || HasBattlerSideUsedMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE)) return NO_INCREASE; - if (IsDoubleBattle() && HasMoveWithEffect(GetPartnerBattler(battlerDef), EFFECT_ENCORE)) + // Don't increase if AI is at +1 and opponent has Haze effect + if (gBattleMons[battlerAtk].statStages[statId] >= MAX_STAT_STAGE - 5 && (HasBattlerSideMoveWithEffect(battlerDef, EFFECT_HAZE) + || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_CLEAR_SMOG) + || HasBattlerSideMoveWithAdditionalEffect(battlerDef, MOVE_EFFECT_HAZE))) return NO_INCREASE; // Predicting switch From 2e3ae0d1678d6f5a103741a8a15a6f273d14b4c0 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Thu, 22 May 2025 15:05:22 -0400 Subject: [PATCH 127/187] Added check for gBattleStringsTable (#6948) --- test/test_runner.c | 20 +++++++++++++++----- test/text.c | 1 + 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/test/test_runner.c b/test/test_runner.c index f279835c4b..8ca5b488e3 100644 --- a/test/test_runner.c +++ b/test/test_runner.c @@ -684,12 +684,22 @@ static s32 MgbaVPrintf_(const char *fmt, va_list va) break; case 'S': pokeS = va_arg(va, const u8 *); - while ((c = *pokeS++) != EOS) + if (pokeS == NULL) { - if ((c = gWireless_RSEtoASCIITable[c]) != '\0') - i = MgbaPutchar_(i, c); - else - i = MgbaPutchar_(i, '?'); + i = MgbaPutchar_(i, 'N'); + i = MgbaPutchar_(i, 'U'); + i = MgbaPutchar_(i, 'L'); + i = MgbaPutchar_(i, 'L'); + } + else + { + while ((c = *pokeS++) != EOS) + { + if ((c = gWireless_RSEtoASCIITable[c]) != '\0') + i = MgbaPutchar_(i, c); + else + i = MgbaPutchar_(i, '?'); + } } break; } diff --git a/test/text.c b/test/text.c index 8e9a205196..981d03fdc0 100644 --- a/test/text.c +++ b/test/text.c @@ -811,6 +811,7 @@ TEST("Battle strings fit on the battle message window") default: break; } + EXPECT(gBattleStringsTable[battleStringId] != NULL); BattleStringExpandPlaceholders(gBattleStringsTable[battleStringId], battleString, BATTLE_STRING_BUFFER_SIZE); DebugPrintf("Battle String ID %d: %S", battleStringId, battleString); for (j = 1;; j++) From b6aa0618b53a9dd1b8a01b6653f8615fbb05a56d Mon Sep 17 00:00:00 2001 From: Hedara Date: Thu, 22 May 2025 21:49:45 +0200 Subject: [PATCH 128/187] Fix unused variable --- src/battle_main.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index d9e356e555..8c809f3aba 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -5803,7 +5803,6 @@ u32 GetDynamicMoveType(struct Pokemon *mon, u32 move, u32 battler, enum MonState u32 moveType = GetMoveType(move); enum BattleMoveEffects moveEffect = GetMoveEffect(move); u32 species, heldItem, ability, type1, type2, type3; - bool32 monInBattle = gMain.inBattle && gPartyMenu.menuType != PARTY_MENU_TYPE_IN_BATTLE; enum ItemHoldEffect holdEffect; enum Gimmick gimmick = GetActiveGimmick(battler); From c3ea32290382f02a4a131063e15a81537ec0fc11 Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Thu, 22 May 2025 21:50:10 +0200 Subject: [PATCH 129/187] Update README.md Co-authored-by: kittenchilly --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05fde926b1..2cd88b4e35 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # [Credits](CREDITS.md) - [![](https://img.shields.io/github/all-contributors/rh-hideout/pokeemerald-expansion/master)](CREDITS.md) + [![](https://img.shields.io/github/all-contributors/rh-hideout/pokeemerald-expansion/upcoming)](CREDITS.md) If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. From f9400332fcd3e102390836ae7db75614b7c026b9 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 22 May 2025 22:50:13 +0200 Subject: [PATCH 130/187] Fixes AI repeated use of weather set up moves (#6963) --- include/battle_ai_util.h | 9 +++++ src/battle_ai_main.c | 8 ++-- src/battle_ai_util.c | 85 +++++++++++++++++++++++----------------- test/battle/ai/ai.c | 21 ++++++++++ 4 files changed, 84 insertions(+), 39 deletions(-) diff --git a/include/battle_ai_util.h b/include/battle_ai_util.h index 4855184fac..d8dca70130 100644 --- a/include/battle_ai_util.h +++ b/include/battle_ai_util.h @@ -22,6 +22,14 @@ enum AIPivot SHOULD_PIVOT, }; +enum WeatherState +{ + WEATHER_INACTIVE, + WEATHER_ACTIVE, + WEATHER_ACTIVE_BUT_BLOCKED, + WEATHER_INACTIVE_AND_BLOCKED, +}; + bool32 AI_IsFaster(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_IsSlower(u32 battlerAi, u32 battlerDef, u32 move); bool32 AI_RandLessThan(u32 val); @@ -58,6 +66,7 @@ s32 AI_DecideKnownAbilityForTurn(u32 battlerId); u32 AI_DecideHoldEffectForTurn(u32 battlerId); bool32 DoesBattlerIgnoreAbilityChecks(u32 battlerAtk, u32 atkAbility, u32 move); u32 AI_GetWeather(void); +enum WeatherState IsWeatherActive(u32 flags); bool32 CanAIFaintTarget(u32 battlerAtk, u32 battlerDef, u32 numHits); bool32 CanIndexMoveFaintTarget(u32 battlerAtk, u32 battlerDef, u32 index, u32 numHits); bool32 HasDamagingMove(u32 battlerId); diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index b823e6e23e..de854bc738 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -5407,19 +5407,19 @@ static s32 AI_PowerfulStatus(u32 battlerAtk, u32 battlerDef, u32 move, s32 score ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SUNNY_DAY: - if (!(AI_GetWeather() & (B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY))) + if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_RAIN_DANCE: - if (!(AI_GetWeather() & (B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY))) + if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_HAIL: - if (!(AI_GetWeather() & (B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY))) + if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); break; case EFFECT_SNOWSCAPE: - if (!(AI_GetWeather() & (B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY))) + if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) == WEATHER_INACTIVE) ADJUST_SCORE(POWERFUL_STATUS_MOVE); } diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 9a3f95674c..ce98f3b357 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -1418,6 +1418,26 @@ u32 AI_GetWeather(void) return gBattleWeather; } +enum WeatherState IsWeatherActive(u32 flags) +{ + enum WeatherState state = WEATHER_INACTIVE; + + if (gBattleWeather & flags) + state = WEATHER_ACTIVE; + else + state = WEATHER_INACTIVE; + + if (!AI_WeatherHasEffect()) + { + if (state == WEATHER_ACTIVE) + state = WEATHER_ACTIVE_BUT_BLOCKED; + else + state = WEATHER_INACTIVE_AND_BLOCKED; + } + + return state; +} + bool32 IsAromaVeilProtectedEffect(u32 moveEffect) { switch (moveEffect) @@ -1619,19 +1639,18 @@ bool32 ShouldTryOHKO(u32 battlerAtk, u32 battlerDef, u32 atkAbility, u32 defAbil bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(); - if (weather & B_WEATHER_SANDSTORM) + if (IsWeatherActive(B_WEATHER_SANDSTORM | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) return FALSE; if (ability == ABILITY_SAND_VEIL - || ability == ABILITY_SAND_RUSH - || ability == ABILITY_SAND_FORCE - || ability == ABILITY_OVERCOAT - || ability == ABILITY_MAGIC_GUARD - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) - || HasMoveEffect(battler, EFFECT_SHORE_UP) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || ability == ABILITY_SAND_RUSH + || ability == ABILITY_SAND_FORCE + || ability == ABILITY_OVERCOAT + || ability == ABILITY_MAGIC_GUARD + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES + || IS_BATTLER_ANY_TYPE(battler, TYPE_ROCK, TYPE_GROUND, TYPE_STEEL) + || HasMoveEffect(battler, EFFECT_SHORE_UP) + || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1640,21 +1659,20 @@ bool32 ShouldSetSandstorm(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(); - if (weather & (B_WEATHER_HAIL | B_WEATHER_SNOW)) + if (IsWeatherActive(B_WEATHER_HAIL | B_WEATHER_SNOW | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) return FALSE; if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || ability == ABILITY_MAGIC_GUARD - || ability == ABILITY_OVERCOAT - || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveEffect(battler, EFFECT_BLIZZARD) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || ability == ABILITY_ICE_BODY + || ability == ABILITY_FORECAST + || ability == ABILITY_SLUSH_RUSH + || ability == ABILITY_MAGIC_GUARD + || ability == ABILITY_OVERCOAT + || holdEffect == HOLD_EFFECT_SAFETY_GOGGLES + || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) + || HasMoveEffect(battler, EFFECT_BLIZZARD) + || HasMoveEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } @@ -1663,8 +1681,7 @@ bool32 ShouldSetHail(u32 battler, u32 ability, u32 holdEffect) bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(); - if (weather & B_WEATHER_RAIN) + if (IsWeatherActive(B_WEATHER_RAIN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) return FALSE; if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA @@ -1684,8 +1701,7 @@ bool32 ShouldSetRain(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) { - u32 weather = AI_GetWeather(); - if (weather & B_WEATHER_SUN) + if (IsWeatherActive(B_WEATHER_SUN | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) return FALSE; if (holdEffect != HOLD_EFFECT_UTILITY_UMBRELLA @@ -1710,18 +1726,17 @@ bool32 ShouldSetSun(u32 battlerAtk, u32 atkAbility, u32 holdEffect) bool32 ShouldSetSnow(u32 battler, u32 ability, u32 holdEffect) { - u32 weather = AI_GetWeather(); - if (weather & (B_WEATHER_SNOW | B_WEATHER_HAIL)) + if (IsWeatherActive(B_WEATHER_SNOW | B_WEATHER_HAIL | B_WEATHER_PRIMAL_ANY) != WEATHER_INACTIVE) return FALSE; if (ability == ABILITY_SNOW_CLOAK - || ability == ABILITY_ICE_BODY - || ability == ABILITY_FORECAST - || ability == ABILITY_SLUSH_RUSH - || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) - || HasMoveEffect(battler, EFFECT_BLIZZARD) - || HasMoveEffect(battler, EFFECT_AURORA_VEIL) - || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) + || ability == ABILITY_ICE_BODY + || ability == ABILITY_FORECAST + || ability == ABILITY_SLUSH_RUSH + || IS_BATTLER_OF_TYPE(battler, TYPE_ICE) + || HasMoveEffect(battler, EFFECT_BLIZZARD) + || HasMoveEffect(battler, EFFECT_AURORA_VEIL) + || HasMoveEffect(battler, EFFECT_WEATHER_BALL)) { return TRUE; } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 6b837a543c..5359ebe58f 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -914,3 +914,24 @@ SINGLE_BATTLE_TEST("AI correctly records used moves") EXPECT_EQ(BATTLE_HISTORY->usedMoves[B_POSITION_OPPONENT_LEFT][3], MOVE_EARTHQUAKE); } } + +AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") +{ + u32 ability; + + PARAMETRIZE { ability = ABILITY_CLOUD_NINE; } + PARAMETRIZE { ability = ABILITY_DAMP; } + + GIVEN { + ASSUME(GetMoveEffect(MOVE_RAIN_DANCE) == EFFECT_RAIN_DANCE); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY); + PLAYER(SPECIES_GOLDUCK) { Ability(ability); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_KABUTOPS) { Ability(ABILITY_SWIFT_SWIM); Moves(MOVE_RAIN_DANCE, MOVE_POUND); } + } WHEN { + if (ability == ABILITY_CLOUD_NINE) + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_POUND); } + else + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_RAIN_DANCE); } + } +} + From 87cbb457f1ba7b3241ccfd663fd0618b938df320 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 22 May 2025 23:25:29 +0200 Subject: [PATCH 131/187] Fixes AI not seeing primal weather and partner absorbing abilities (#6936) --- src/battle_ai_util.c | 44 ++++++++++++++++++++++++++++++++++++++++---- test/battle/ai/ai.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index ce98f3b357..13e438a5d4 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -421,19 +421,50 @@ static inline s32 DmgRoll(s32 dmg) return dmg; } -bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType) +bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveType, uq4_12_t effectiveness, u32 weather) { + u32 battlerDefAbility; + u32 partnerDefAbility; struct AiLogicData *aiData = AI_DATA; + if (effectiveness == UQ_4_12(0.0)) + return TRUE; if (gBattleStruct->battlerState[battlerDef].commandingDondozo) return TRUE; - if (CanAbilityBlockMove(battlerAtk, battlerDef, move, aiData->abilities[battlerDef], ABILITY_CHECK_TRIGGER)) + // aiData->abilities does not check for Mold Breaker since it happens during combat so it needs to be done manually + if (IsMoldBreakerTypeAbility(battlerAtk, aiData->abilities[battlerAtk]) || MoveIgnoresTargetAbility(move)) + { + battlerDefAbility = ABILITY_NONE; + partnerDefAbility = ABILITY_NONE; + } + else + { + battlerDefAbility = aiData->abilities[battlerDef]; + partnerDefAbility = aiData->abilities[BATTLE_PARTNER(battlerDef)]; + } + + if (CanAbilityBlockMove(battlerAtk, battlerDef, move, battlerDefAbility, ABILITY_CHECK_TRIGGER)) return TRUE; - if (CanAbilityAbsorbMove(battlerAtk, battlerDef, aiData->abilities[battlerDef], move, moveType, ABILITY_CHECK_TRIGGER)) + if (CanAbilityAbsorbMove(battlerAtk, battlerDef, battlerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) return TRUE; + // Limited to Lighning Rod and Storm Drain because otherwise the AI would consider Water Absorb, etc... + if (partnerDefAbility == ABILITY_LIGHTNING_ROD || partnerDefAbility == ABILITY_STORM_DRAIN) + { + if (CanAbilityAbsorbMove(battlerAtk, BATTLE_PARTNER(battlerDef), partnerDefAbility, move, moveType, ABILITY_CHECK_TRIGGER)) + return TRUE; + } + + if (HasWeatherEffect()) + { + if (weather & B_WEATHER_SUN_PRIMAL && moveType == TYPE_WATER) + return TRUE; + if (weather & B_WEATHER_RAIN_PRIMAL && moveType == TYPE_FIRE) + return TRUE; + } + switch (GetMoveEffect(move)) { case EFFECT_DREAM_EATER: @@ -469,6 +500,11 @@ bool32 IsDamageMoveUnusable(u32 battlerAtk, u32 battlerDef, u32 move, u32 moveTy if (!gDisableStructs[battlerAtk].isFirstTurn) return TRUE; break; + case EFFECT_EXPLOSION: + case EFFECT_MIND_BLOWN: + if (battlerDefAbility == ABILITY_DAMP || partnerDefAbility == ABILITY_DAMP) + return TRUE; + break; } return FALSE; @@ -658,7 +694,7 @@ struct SimulatedDamage AI_CalcDamage(u32 move, u32 battlerAtk, u32 battlerDef, u u32 movePower = GetMovePower(move); if (movePower) - isDamageMoveUnusable = IsDamageMoveUnusable(battlerAtk, battlerDef, move, moveType); + isDamageMoveUnusable = IsDamageMoveUnusable(battlerAtk, battlerDef, move, moveType, effectivenessMultiplier, weather); if (movePower && !isDamageMoveUnusable) { diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index 5359ebe58f..a22097c815 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -915,6 +915,36 @@ SINGLE_BATTLE_TEST("AI correctly records used moves") } } +AI_SINGLE_BATTLE_TEST("AI sees that Primal weather can block a move by type") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_HYDRO_PUMP) == TYPE_WATER); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_GROUDON) { Item(ITEM_RED_ORB); Moves(MOVE_SCRATCH); } + OPPONENT(SPECIES_BLASTOISE) { Moves(MOVE_HYDRO_PUMP, MOVE_POUND); } + } WHEN { + TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_POUND); } + } +} + +AI_DOUBLE_BATTLE_TEST("AI sees opposing drain ability") +{ + GIVEN { + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_RAZOR_LEAF) != TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_METAL_CLAW) != TYPE_ELECTRIC); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_RAICHU) { Ability(ABILITY_LIGHTNING_ROD); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_KRABBY) { Ability(ABILITY_VOLT_ABSORB); Moves(MOVE_CELEBRATE); } + OPPONENT(SPECIES_MAGNETON) { Moves(MOVE_THUNDERBOLT, MOVE_RAZOR_LEAF); } + OPPONENT(SPECIES_WOBBUFFET) { Moves(MOVE_THUNDERBOLT, MOVE_METAL_CLAW); } + } WHEN { + TURN { + NOT_EXPECT_MOVE(opponentLeft, MOVE_THUNDERBOLT); + NOT_EXPECT_MOVE(opponentRight, MOVE_THUNDERBOLT); } + } +} + AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") { u32 ability; @@ -934,4 +964,3 @@ AI_SINGLE_BATTLE_TEST("AI will not set up Weather if it wont have any affect") TURN { MOVE(player, MOVE_SCRATCH); EXPECT_MOVE(opponent, MOVE_RAIN_DANCE); } } } - From d3cadf093ed88e95dc29cc069952859ff4a056ee Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Fri, 23 May 2025 08:18:59 -0400 Subject: [PATCH 132/187] Fix HasBattlerSideMoveWithEffect comment (#6965) --- src/battle_ai_util.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_ai_util.c b/src/battle_ai_util.c index 1079cd7367..a07db9217a 100644 --- a/src/battle_ai_util.c +++ b/src/battle_ai_util.c @@ -2201,7 +2201,7 @@ bool32 HasBattlerSideMoveWithEffect(u32 battler, u32 effect) return FALSE; } -// HasSideMoveWithMoveEffect checks if the AI knows a side has a move effect, +// HasBattlerSideMoveWithEffect checks if the AI knows a side has a move effect, // while HasBattlerSideUsedMoveWithEffect checks if the side has ever used a move effect. // The former acts the same way as the latter if AI_FLAG_OMNISCIENT isn't used. bool32 HasBattlerSideUsedMoveWithEffect(u32 battler, u32 effect) From 71f1c97d3e4666d7c96b1c2b601f28a1146cb223 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Fri, 23 May 2025 08:20:36 -0400 Subject: [PATCH 133/187] Fix switch AI considering non-choiced SE moves when choiced (#6892) --- src/battle_ai_switch_items.c | 22 ++++++++-------------- test/battle/ai/ai_choice.c | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 2f7f74a726..74d62e6673 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -22,7 +22,7 @@ #include "constants/moves.h" // this file's functions -static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng); +static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler); static bool32 FindMonWithFlagsAndSuperEffective(u32 battler, u16 flags, u32 moduloPercent); static bool32 ShouldUseItem(u32 battler); static bool32 AiExpectsToFaintPlayer(u32 battler); @@ -463,7 +463,7 @@ static bool32 FindMonThatAbsorbsOpponentsMove(u32 battler) return FALSE; if (gBattleStruct->prevTurnSpecies[battler] != gBattleMons[battler].species && !(gAiThinkingStruct->aiFlags[battler] & AI_FLAG_PREDICT_MOVE)) // AI mon has changed, player's behaviour no longer reliable; override this if using AI_FLAG_PREDICT_MOVE return FALSE; - if (HasSuperEffectiveMoveAgainstOpponents(battler, TRUE) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || gAiLogicData->aiPredictionInProgress)) + if (CanUseSuperEffectiveMoveAgainstOpponents(battler) && (RandomPercentage(RNG_AI_SWITCH_ABSORBING_STAY_IN, STAY_IN_ABSORBING_PERCENTAGE) || gAiLogicData->aiPredictionInProgress)) return FALSE; if (AreStatsRaised(battler)) return FALSE; @@ -785,7 +785,7 @@ static bool32 ShouldSwitchIfAbilityBenefit(u32 battler) return SetSwitchinAndSwitch(battler, PARTY_SIZE); } -static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) +static bool32 CanUseSuperEffectiveMoveAgainstOpponents(u32 battler) { s32 i; u16 move; @@ -798,15 +798,12 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE) + if (move == MOVE_NONE || AI_DoesChoiceItemBlockMove(battler, move)) continue; if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { - if (noRng) - return TRUE; - if (Random() % 10 != 0) - return TRUE; + return TRUE; } } } @@ -820,15 +817,12 @@ static bool32 HasSuperEffectiveMoveAgainstOpponents(u32 battler, bool32 noRng) for (i = 0; i < MAX_MON_MOVES; i++) { move = gBattleMons[battler].moves[i]; - if (move == MOVE_NONE) + if (move == MOVE_NONE || AI_DoesChoiceItemBlockMove(battler, move)) continue; if (AI_GetMoveEffectiveness(move, battler, opposingBattler) >= UQ_4_12(2.0)) { - if (noRng) - return TRUE; - if (Random() % 10 != 0) - return TRUE; + return TRUE; } } } @@ -1174,7 +1168,7 @@ bool32 ShouldSwitch(u32 battler) // We don't use FindMonWithFlagsAndSuperEffective with AI_FLAG_SMART_SWITCHING, so we can bail early. if (gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING) return FALSE; - if (HasSuperEffectiveMoveAgainstOpponents(battler, FALSE)) + if (CanUseSuperEffectiveMoveAgainstOpponents(battler)) return FALSE; if (AreStatsRaised(battler)) return FALSE; diff --git a/test/battle/ai/ai_choice.c b/test/battle/ai/ai_choice.c index ae67b9c06a..fc3706ca29 100644 --- a/test/battle/ai/ai_choice.c +++ b/test/battle/ai/ai_choice.c @@ -230,3 +230,23 @@ AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon will only see choiced moves when conside TURN { MOVE(player, MOVE_CLOSE_COMBAT); EXPECT_SWITCH(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("Choiced PokΓ©mon will only see choiced moves when considering switching with FindMonThatAbsorbsMove") +{ + PASSES_RANDOMLY(SHOULD_SWITCH_ABSORBS_MOVE_PERCENTAGE, 100, RNG_AI_SWITCH_ABSORBING); + GIVEN { + ASSUME(gSpeciesInfo[SPECIES_SANDSHREW].types[0] == TYPE_GROUND); + ASSUME(GetMoveType(MOVE_SCRATCH) == TYPE_NORMAL); + ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); + ASSUME(GetMoveType(MOVE_WATER_GUN) == TYPE_WATER); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_OMNISCIENT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + PLAYER(SPECIES_WOOPER) { Ability(ABILITY_WATER_ABSORB); Moves(MOVE_CELEBRATE); } + PLAYER(SPECIES_DWEBBLE) { Moves(MOVE_WATER_GUN); } + OPPONENT(SPECIES_MUDKIP) { Item(ITEM_CHOICE_SCARF); Moves(MOVE_SCRATCH, MOVE_WATER_GUN); } + OPPONENT(SPECIES_WOOPER) { Ability(ABILITY_WATER_ABSORB); Moves(MOVE_SCRATCH); } + } WHEN { + TURN { SWITCH(player, 1); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_WATER_GUN); EXPECT_MOVE(opponent, MOVE_SCRATCH); } + TURN { MOVE(player, MOVE_WATER_GUN); EXPECT_SWITCH(opponent, 1); } + } +} From 10b5c3f4dafc235fa31bfe2433666fa382b5b8dd Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 23 May 2025 08:35:55 -0400 Subject: [PATCH 134/187] Documented usage of `createsprite gSparkElectricitySpriteTemplate` (#6955) --- data/battle_anim_scripts.s | 220 ++++++++++++++++++------------------- 1 file changed, 110 insertions(+), 110 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 5b4003d942..1553d102cd 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -1023,27 +1023,27 @@ gBattleAnimMove_MagnetRise:: createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), 0, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createvisualtask AnimTask_WindUpLunge, 5, ANIM_ATTACKER, -12, 4, 10, 10, 12, 6 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER delay 4 - 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0 - 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_BATTLERS), 0, 1, 0, 0, RGB(31, 31, 20) delay 20 @@ -2468,17 +2468,17 @@ gBattleAnimMove_Discharge:: delay 0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 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, 20) delay 10 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 5, 5, RGB(31, 31, 20) playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 loadspritegfx ANIM_TAG_WHITE_CIRCLE_OF_LIGHT loadspritegfx ANIM_TAG_IMPACT waitbgfadein @@ -2859,16 +2859,16 @@ gBattleAnimMove_MagnetBomb:: loadspritegfx ANIM_TAG_SPARK_2 delay 0 playsewithpan 119, 192 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 24, 190, 12, 0, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 24, 22, 12, 0, 1, 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 24, 121, 13, 0, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0 playsewithpan 119, 192 - createsprite gSparkElectricitySpriteTemplate ANIM_ATTACKER, 0, 100, 24, 60, 10, 0, 1, 0 - createsprite gSparkElectricitySpriteTemplate ANIM_ATTACKER, 0, 170, 24, 42, 11, 0, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 - createsprite gSparkElectricitySpriteTemplate ANIM_ATTACKER, 0, 238, 24, 165, 10, 0, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0 loadspritegfx ANIM_TAG_RED_ORB playsewithpan 152, SOUND_PAN_ATTACKER @@ -6460,17 +6460,17 @@ TechnoBlastElectric: end TechnoBlastCharging1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return TechnoBlastCharging2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return TechnoBlastWater: @@ -8145,16 +8145,16 @@ gBattleAnimMove_Electrify:: monbg ANIM_ATTACKER loopsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_TARGET 0xa 0x4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0x4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 delay 0x4 createsprite gElectrifyRingTemplate, ANIM_ATTACKER, 2 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish playsewithpan SE_M_THUNDER_WAVE, SOUND_PAN_ATTACKER createsprite gZapCannonSparkSpriteTemplate, ANIM_TARGET, 4, 0xa, 0x0, 0x10, 0x1e, 0x0, 0x28, 0x0 @@ -8932,16 +8932,16 @@ gBattleAnimMove_MagneticFlux:: waitforvisualfinish end MagneticFluxSparks1: - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return MagneticFluxSparks2: - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return gBattleAnimMove_HappyHour:: @@ -10412,50 +10412,50 @@ gBattleAnimMove_GearUp:: createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x0, 0x9, 0x039B createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0xF playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0xF playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER createsprite gGearUpGearsTemplate, ANIM_ATTACKER, 2, 0x0, 0xffe8, 0x8, 0x8c - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0xF playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER call GearUpSparks call GearUpSparks call GearUpSparks playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xA, F_PAL_ATTACKER, 0x2, 0x9, 0x0, 0x039B waitforvisualfinish end GearUpSparks: playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0xF playsewithpan SE_ROULETTE_BALL2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0xF return @@ -11038,102 +11038,102 @@ gBattleAnimMove_CoreEnforcer:: loopsewithpan SE_M_MEGA_KICK, SOUND_PAN_ATTACKER 0xd 0xA createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerBlueRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerYellowRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 createsprite gCoreEnforcerGreenRingTemplate, ANIM_ATTACKER, 40, 0x0, 0x0, 0x0, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 waitforvisualfinish createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 delay 0x5 createsprite gCoreEnforcerBlueSparkTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 createsprite gCoreEnforcerGreenChargeTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0x5 createsprite gCoreEnforcerCircleChargeTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x0, 0x2 waitforvisualfinish @@ -12307,17 +12307,17 @@ gBattleAnimMove_ZingZap:: end ZingZapSparks1: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return ZingZapSparks2: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return gBattleAnimMove_NaturesMadness:: @@ -12549,17 +12549,17 @@ gBattleAnimMove_PlasmaFists:: PlasmaFistSpark1: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 11, RGB(31, 31, 22) - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 return PlasmaFistSpark2: playsewithpan SE_M_CHARGE, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 return PlasmaFistsImpact: playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -13313,17 +13313,17 @@ gBattleAnimMove_BoltBeak:: end BoltBeakSparks: playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, 0x0, 0x7, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 delay 0x0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, 0x0, 0x7, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0x0 createvisualtask AnimTask_BlendColorCycle, 2, (F_PAL_BG | F_PAL_ATTACKER), -31, 1, 0, 0, RGB(31, 31, 22) delay 0xa 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 gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, 0x0, 0x7, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 7, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 createsprite gBoltBeakBlueSparkTemplate, 0x0, 0x7, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 delay 0x0 @@ -19816,19 +19816,19 @@ gBattleAnimMove_Spark:: 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 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 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 24, 165, 10, ANIM_ATTACKER, 1, 1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 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 @@ -30809,31 +30809,31 @@ gBattleAnimMove_GigavoltHavoc:: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x6, 0x0, 0x10, 0x0000 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER createsprite gGigavoltHavocChargingSpearSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x20, 0x18, 0xbe, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x50, 0x18, 0x16, 0xc, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x9c, 0x18, 0x79, 0xd, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 32, 0x18, 190, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 80, 0x18, 22, 12, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 156, 0x18, 121, 13, ANIM_ATTACKER, 1, 1 delay 0xa playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0x0 delay 0x5 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 delay 0x5 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x20, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0x60, 0x14, 0x1, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xa0, 0x14, 0x0, 0x0 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 4, 0x0, 0x0, 0x10, 0xc, 0xe0, 0x14, 0x2, 0x0 delay 0x5 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0x64, 0x18, 0x3c, 0xa, 0x0, 0x1, 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xaa, 0x18, 0x2a, 0xb, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 100, 0x18, 60, 10, ANIM_ATTACKER, 1, 0 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 170, 0x18, 42, 11, ANIM_ATTACKER, 1, 1 delay 0x0 - createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 0xee, 0x18, 0xa5, 0xa, 0x0, 0x1, 0x1 + createsprite gSparkElectricitySpriteTemplate, ANIM_ATTACKER, 0, 238, 0x18, 165, 10, ANIM_ATTACKER, 1, 1 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER monbg ANIM_ATTACKER playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER From c50ebf17d0113ec04a684b4e5aafb775a86c4256 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 23 May 2025 08:41:25 -0400 Subject: [PATCH 135/187] Documented usage of `createsprite gSlideMonToOffsetSpriteTemplate` (#6953) --- data/battle_anim_scripts.s | 224 ++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/data/battle_anim_scripts.s b/data/battle_anim_scripts.s index 1553d102cd..49563e91e2 100644 --- a/data/battle_anim_scripts.s +++ b/data/battle_anim_scripts.s @@ -106,7 +106,7 @@ gBattleAnimMove_HammerArm:: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 delay 1 createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0, 0 delay 3 @@ -132,12 +132,12 @@ gBattleAnimMove_GyroBall:: waitplaysewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER, 8 createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 18, 6, 2, 4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 @@ -856,12 +856,12 @@ gBattleAnimMove_LastResort:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 delay 3 waitforvisualfinish playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 132, -10, 0, ANIM_TARGET, 0 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 1, -32, 0, 0, 3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 1 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 1 @@ -896,7 +896,7 @@ gBattleAnimMove_WorrySeed:: gBattleAnimMove_SuckerPunch:: loadspritegfx ANIM_TAG_POISON_JAB loadspritegfx ANIM_TAG_IMPACT - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 createsprite gSuckerPunchSpriteTemplate, ANIM_TARGET, 2, -18, 5, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 @@ -1084,7 +1084,7 @@ gBattleAnimMove_FlareBlitz:: waitforvisualfinish createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 waitforvisualfinish call SetImpactBackground createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 22, 1 @@ -1784,12 +1784,12 @@ GigaImpactContinuity: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER waitforvisualfinish delay 11 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -2331,7 +2331,7 @@ gBattleAnimMove_RockClimb:: delay 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 5, -52, ANIM_TARGET, 1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 1, -25, 16, 1, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -25, 16, 1, 4 delay 4 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 delay 30 @@ -3013,7 +3013,7 @@ gBattleAnimMove_StealthRock:: gBattleAnimMove_GrassKnot:: loadspritegfx ANIM_TAG_RAZOR_LEAF loadspritegfx ANIM_TAG_IMPACT - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 createsprite gGrassKnotSpriteTemplate, ANIM_TARGET, 2, -18, 19, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 @@ -4205,7 +4205,7 @@ gBattleAnimMove_StormThrow:: call StormThorwAnim call StormThorwAnim call StormThorwAnim - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET delay 1 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 10, 3072, ANIM_TARGET, 2 @@ -4217,7 +4217,7 @@ gBattleAnimMove_StormThrow:: waitforvisualfinish end StormThorwAnim: - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET delay 6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 @@ -4298,12 +4298,12 @@ gBattleAnimMove_HeavySlam:: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER waitforvisualfinish delay 11 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -4433,7 +4433,7 @@ gBattleAnimMove_FlameCharge:: delay 0x9 call FlameChargeSwirl waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 @@ -4472,7 +4472,7 @@ gBattleAnimMove_Coil:: gBattleAnimMove_LowSweep:: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 createsprite gSlidingKickSpriteTemplate, ANIM_TARGET, 2, -24, 14, 40, 8, 160, 0 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 2, -8, 8, ANIM_TARGET, 2 @@ -4940,13 +4940,13 @@ gBattleAnimMove_CircleThrow:: playsewithpan SE_M_VITAL_THROW, SOUND_PAN_ATTACKER createvisualtask AnimTask_TranslateMonEllipticalRespectSide, 2, ANIM_ATTACKER, 12, 4, 1, 2 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x14, 0x0, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 delay 0x2 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET delay 0x1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe8, 0x0, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -24, 0, 0, 4 createsprite gCircleThrowRingTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x100, 0x0 waitforvisualfinish delay 0x3 @@ -5632,7 +5632,7 @@ gBattleAnimMove_FrostBreath:: playsewithpan SE_M_DRAGON_RAGE, SOUND_PAN_ATTACKER createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 0, 2, 40, 1 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, 0x0, 0xf, 0x0, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER, 15, 0, 0, 4 waitforvisualfinish createsprite gFrostBreathBlueBreathTemplate, ANIM_TARGET, 2, 0x1e, 0xf, 0x0, 0xa, 0xa waitforvisualfinish @@ -5670,13 +5670,13 @@ gBattleAnimMove_DragonTail:: waitforvisualfinish setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x14, 0x3, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 3, 0, 4 delay 0x1 createsprite gSlamHitSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfff4, 0xa, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x5 call TailWhackDown delay 0x3 @@ -5772,7 +5772,7 @@ gBattleAnimMove_WildCharge:: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish delay 0xb - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 0x6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 0, 3, 16, 1 @@ -5994,12 +5994,12 @@ gBattleAnimMove_Steamroller:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_TARGET setalpha 12, 8 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET, 6, 3 delay 1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 1, -28, 0, 0, 3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 3, ANIM_TARGET, 0 delay 1 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 10, 6, ANIM_TARGET, 0 @@ -6915,7 +6915,7 @@ gBattleAnimMove_BoltStrike:: waitbgfadeout waitforvisualfinish monbg ANIM_TARGET - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 0x6 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, -10, 0, ANIM_TARGET, 0 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_TARGET, 0x2, 0x0, 0x9, 0x07FE @@ -9671,8 +9671,8 @@ PrecipiceBladesContinue: createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, -25, 40, 0x0 createsprite gPrecipiceBladesLargeSpikeTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0, -25, 40, 0x0 delay 0x6 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -20, 0, 0x6, 0x1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, -20, 0, 0x6, 0x1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -20, 0, 6, 1 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, -20, 0, 6, 1 delay 0x22 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0x0, 0x6 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_TARGET, 2, ANIM_DEF_PARTNER, 0x0, 0x6 @@ -9719,7 +9719,7 @@ gBattleAnimMove_DragonAscent:: delay 1 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, -10, 0, ANIM_TARGET, 0 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x1, -32, 0, 0, 3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 6, 0, 12, 1 createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_BG | F_PAL_ANIM_1 | F_PAL_ANIM_2), 2, 16, 0, RGB(26, 31, 0) waitforvisualfinish @@ -9859,7 +9859,7 @@ gBattleAnimMove_FirstImpression:: createsprite gFirstImpressionPoundTemplate, ANIM_ATTACKER, 4, 0xfff6, 0x0, 0x1, 0x0 loopsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET 0xA 0x2 delay 0x1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe4, 0x0, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -10747,7 +10747,7 @@ gBattleAnimMove_FireLash:: createsprite gFireSpiralOutwardSpriteTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_FLAME_WHEEL, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x6 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 delay 0x4 createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 8, 1 createvisualtask AnimTask_BlendMonInAndOut, 3, ANIM_TARGET, RGB_RED, 12, 1, 1 @@ -11359,7 +11359,7 @@ gBattleAnimMove_DragonHammer:: createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, -500, 0x0, 0xffff waitbgfadein setalpha 15, 0 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 0x6 playsewithpan SE_M_SWAGGER, SOUND_PAN_TARGET createsprite gBounceBallLandSpriteTemplate, ANIM_TARGET, 3 @@ -11400,7 +11400,7 @@ gBattleAnimMove_BrutalSwing:: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 0x6, 0x1, 0x0 waitforvisualfinish delay 0xb - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1a, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 26, 0, 0, 5 delay 0x6 createsprite gBrutalSwingBasicImpactTemplate, ANIM_TARGET, 3, 0xffe0, 0xfff0, 0x1, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET @@ -13087,10 +13087,10 @@ gBattleAnimMove_DoubleIronBash:: createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0xffe7, 0x0, 0x0, 0x0, 0x0 @wing attack createsprite gGustToTargetSpriteTemplate, ANIM_ATTACKER, 2, 0x19, 0x0, 0x0, 0x0, 0x0 @wing attack delay 0x18 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x9 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 9 delay 0x11 createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 4, 0, 0, ANIM_TARGET, 1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe0, 0x0, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish playsewithpan SE_M_RAZOR_WIND, SOUND_PAN_TARGET waitforvisualfinish @@ -13610,7 +13610,7 @@ gBattleAnimMove_AuraWheel:: createsprite gAuraWheelBlueElectricityTemplate, ANIM_ATTACKER, 3, 0x0, 0x0, 0x38, 0x18 playsewithpan SE_M_THUNDERBOLT2, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x18, 0x0, 0x0, 0x6 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 6 delay 0x4 playsewithpan SE_M_TRI_ATTACK2, SOUND_PAN_TARGET createvisualtask AnimTask_ShakeMon, 2, ANIM_TARGET, 5, 0, 23, 1 @@ -13742,7 +13742,7 @@ gBattleAnimMove_GravApple:: createsprite gGravAppleLargeApple, ANIM_TARGET, 2, 0x0, 0x3c, 4, ANIM_TARGET delay 0x7 playsewithpan SE_M_STRENGTH, SOUND_PAN_TARGET - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 21, 0, 4 delay 0x30 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 waitforvisualfinish @@ -14253,12 +14253,12 @@ gBattleAnimMove_ShellSideArmPhysical:: @ Modified Body Slam, placeholder createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER waitforvisualfinish delay 11 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -14312,7 +14312,7 @@ gBattleAnimMove_GrassyGlide:: createvisualtask AnimTask_BlendColorCycle, 2, F_PAL_ATTACKER, 0, 2, 0, 8, RGB(12, 29, 0) delay 0x2 playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -120, 0, 0, 10 @;Slide off off, screen + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 10 @;Slide off off, screen waitforvisualfinish call GrassPledgeMiddleFountain waitforvisualfinish @@ -14600,7 +14600,7 @@ gBattleAnimMove_LashOut:: delay 0x8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, 10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfff4, 0xa, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 delay 0x8 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 delay 0x8 @@ -14609,7 +14609,7 @@ gBattleAnimMove_LashOut:: delay 0x8 createsprite gFoulPlayImpactTemplate, ANIM_TARGET, 3, -10, 0x0, ANIM_TARGET, 0x1 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_TARGET - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xC, 0xa, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 12, 10, 0, 3 delay 0x8 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 @@ -14827,7 +14827,7 @@ gBattleAnimMove_ScorchingSands:: splitbgprio ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0xfff6, 0x0, 0x0, 0x3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -10, 0, 0, 3 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0x2 call SandAttackDirt @@ -14936,7 +14936,7 @@ gBattleAnimMove_WickedBlow:: fadetobg BG_DARK waitbgfadeout playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x1c, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 28, 0, 0, 5 delay 0x5 createsprite gSpriteTemplate_WickedBlowFist, ANIM_TARGET, 4, ANIM_TARGET, 0, 0, 16, 32 delay 6 @@ -15074,7 +15074,7 @@ gBattleAnimMove_DragonEnergy:: waitforvisualfinish playsewithpan SE_M_DETECT, SOUND_PAN_TARGET createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_BG | F_PAL_BATTLERS_2), 0x1, 0x10, 0x0, 0x2C5E @;Regidrago Reddish Reddish, Purple - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -120, 0, 0, 1 @;Slide off off, screen + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -120, 0, 0, 1 @;Slide off off, screen waitforvisualfinish playsewithpan SE_M_SOLAR_BEAM, SOUND_PAN_TARGET call DragonEnergyShot @@ -15244,7 +15244,7 @@ gBattleAnimMove_ThunderousKick:: delay 0xA call ZingZapSparks2 delay 0x3 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x30, 0x3, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 48, 3, 0, 4 delay 0x7 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 @@ -15404,7 +15404,7 @@ gBattleAnimMove_PsyshieldBash:: createsprite gSpriteTemplate_PsyshieldBashHit, ANIM_ATTACKER, 4, -10, 0x0, 0x1, 0x0 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET delay 0x1 - createsprite gSlideMonToOffsetSpriteTemplate ANIM_TARGET, 2, ANIM_TARGET, 0xfff0, 0x0, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -15732,7 +15732,7 @@ gBattleAnimMove_HeadlongRush:: call PulverizingPancakeDiggingRun call PulverizingPancakeDiggingRun waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x2a, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 42, 0, 0, 5 createsprite gSpriteTemplate_HeadlongRushImpact, ANIM_TARGET, 4, 0xfff6, 0x0, 0x1, 0x0 delay 0x5 createvisualtask AnimTask_ShakeMon2, 5, ANIM_TARGET, 4, 0, 44, 1 @@ -16002,7 +16002,7 @@ InfernalFlames: gBattleAnimMove_CeaselessEdge:: loadspritegfx ANIM_TAG_SLASH playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x2C, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 44, 0, 0, 5 waitforvisualfinish createvisualtask AnimTask_BlendBattleAnimPal, 0xa, F_PAL_BG, 0x0, 0x10, 0x10, 0x1F @;Fully to to, Red createvisualtask AnimTask_BlendBattleAnimPal, 0xa, (F_PAL_ATTACKER | F_PAL_TARGET), 0x0, 0x10, 0x10, 0x0 @;Fully to to, Black @@ -16652,12 +16652,12 @@ RagingBullNormal: waitforvisualfinish playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER call SetImpactBackground - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 @@ -16688,13 +16688,13 @@ RagingBullShatteredWall: waitforvisualfinish playsewithpan SE_M_SWIFT, SOUND_PAN_ATTACKER call SetImpactBackground - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 delay 3 waitforvisualfinish createsprite gBrickBreakWallSpriteTemplate, ANIM_ATTACKER, 3, ANIM_TARGET, 0, 0, 90, 10 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 delay 20 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 @@ -16867,7 +16867,7 @@ gBattleAnimMove_Trailblaze:: call TrailblazeVortex call TrailblazeVortex waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x18, 0x0, 0x0, 0x5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 delay 0x3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 @@ -17469,7 +17469,7 @@ gBattleAnimMove_AxeKick:: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT playsewithpan SE_M_JUMP_KICK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 delay 7 createsprite gAxeKickSpriteTemplate, ANIM_TARGET, 3 delay 2 @@ -18465,12 +18465,12 @@ gBattleAnimMove_BodySlam:: createsprite gVerticalDipSpriteTemplate, ANIM_ATTACKER, 2, 6, 1, ANIM_ATTACKER waitforvisualfinish delay 11 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 26, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -18545,7 +18545,7 @@ gBattleAnimMove_FlameWheel:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -18630,7 +18630,7 @@ gBattleAnimMove_TakeDown:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -16, 0, 0, 4 waitforvisualfinish createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 4, 0, 12, 1 waitforvisualfinish @@ -18654,12 +18654,12 @@ gBattleAnimMove_DoubleEdge:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 0, 3 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_ATTACKER, 0 createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -256, ANIM_TARGET, 0 @@ -19356,13 +19356,13 @@ gBattleAnimMove_Slam:: monbg ANIM_TARGET setalpha 12, 8 playsewithpan SE_M_COMET_PUNCH, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 3, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 @@ -20260,7 +20260,7 @@ gBattleAnimMove_RollingKick:: delay 6 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_ATTACKER waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -20454,7 +20454,7 @@ gBattleAnimMove_Sing:: gBattleAnimMove_LowKick:: loadspritegfx ANIM_TAG_HANDS_AND_FEET loadspritegfx ANIM_TAG_IMPACT - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 20, 0, 0, 4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -23057,7 +23057,7 @@ gBattleAnimMove_SandAttack:: splitbgprio ANIM_ATTACKER setalpha 12, 8 playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -10, 0, 0, 3 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 call SandAttackDirt @@ -23082,7 +23082,7 @@ SandAttackDirt: gBattleAnimMove_MudSlap:: loadspritegfx ANIM_TAG_MUD_SAND playsewithpan SE_M_SAND_ATTACK, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -10, 0, 0, 3 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -10, 0, 0, 3 waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 2 call MudSlapMud @@ -23108,7 +23108,7 @@ gBattleAnimMove_DragonRage:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_TARGET, 2, ANIM_ATTACKER, 15, 0, 0, 4 waitforvisualfinish createsprite gDragonRageFireSpitSpriteTemplate, ANIM_TARGET, 2, 30, 15, 0, 10, 10 waitforvisualfinish @@ -23971,13 +23971,13 @@ MegahornContinue: createvisualtask AnimTask_ShakeMon, 5, ANIM_ATTACKER, 2, 0, 15, 1 waitforvisualfinish delay 10 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 24, 0, 0, 6 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -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 @@ -24029,7 +24029,7 @@ gBattleAnimMove_WingAttack:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -24123,7 +24123,7 @@ gBattleAnimMove_Crabhammer:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -24, 0, 0, 4 waitforvisualfinish delay 8 waitforvisualfinish @@ -24356,7 +24356,7 @@ gBattleAnimMove_HighJumpKick:: loadspritegfx ANIM_TAG_IMPACT monbg ANIM_DEF_PARTNER setalpha 12, 8 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, -24, 0, 0, 8 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -24, 0, 0, 8 waitforvisualfinish delay 10 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 3 @@ -24366,7 +24366,7 @@ gBattleAnimMove_HighJumpKick:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -28, 0, 0, 3 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 3, 0, 11, 1 waitforvisualfinish @@ -24465,7 +24465,7 @@ gBattleAnimMove_Counter:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 20, 0, 0, 4 delay 4 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, -15, 18, ANIM_TARGET, 0 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -24496,12 +24496,12 @@ gBattleAnimMove_VitalThrow:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -24, 0, 0, 4 waitforvisualfinish delay 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 7 @@ -24666,7 +24666,7 @@ gBattleAnimMove_PetalDance:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 24, 0, 0, 5 delay 3 playsewithpan SE_M_MEGA_KICK2, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 0 @@ -24743,7 +24743,7 @@ gBattleAnimMove_AncientPower:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 16, 0, 0, 4 delay 3 playsewithpan SE_M_SELF_DESTRUCT, SOUND_PAN_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 3, 0, 0, ANIM_TARGET, 1 @@ -25090,7 +25090,7 @@ gBattleAnimMove_SteelWing:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -25262,7 +25262,7 @@ BideUnleash: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 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 @@ -27429,7 +27429,7 @@ gBattleAnimMove_KnockOff:: 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 gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -12, 10, 0, 3 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, 5 delay 3 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 @@ -27469,7 +27469,7 @@ gBattleAnimMove_SkyUppercut:: waitbgfadein setalpha 12, 8 delay 38 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, 0, 28, 0, 0, 5 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 28, 0, 0, 5 delay 4 createvisualtask AnimTask_ShakeMon2, 2, ANIM_TARGET, 4, 0, 6, 1 playsewithpan SE_M_VITAL_THROW2, SOUND_PAN_TARGET @@ -27487,7 +27487,7 @@ gBattleAnimMove_SkyUppercut:: 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 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 delay 4 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_TARGET, 0, 3, 6, 1 delay 30 @@ -29377,7 +29377,7 @@ gBattleAnimMove_BreakneckBlitz:: delay 0x1 playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER createsprite gBreakneckBlitzHitSpriteTemplate, ANIM_TARGET, 3, 0x19, 0xffe7, 0x1, 0x1 @ +25, -25 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 waitforvisualfinish createvisualtask AnimTask_RotateMonSpriteToSide, 2, 8, -512, ANIM_TARGET, 0 createvisualtask AnimTask_ShakeMonInPlace, 2, ANIM_ATTACKER, 4, 0, 12, 1 @@ -29474,7 +29474,7 @@ gBattleAnimMove_AllOutPummeling:: playsewithpan SE_M_SWAGGER, SOUND_PAN_ATTACKER delay 0xc playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffd0, 0x0, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -48, 0, 0, 4 waitforvisualfinish delay 0x30 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x7 @@ -29544,7 +29544,7 @@ FinishSupersonicSkystrike: delay 0x10 createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 2, 0, 0, ANIM_TARGET, 0 playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 1, 14, -20, -18, 24 @ 14, -52, -18, 24 @@ -29606,7 +29606,7 @@ FinishAcidDownpour: call AcidDownpourFlare call AcidDownpourFlare delay 0x15 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfd00, 0x15, 0x0, 0x2a + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 42 delay 0x2c createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x7, 0x0, 0xd87c invisible ANIM_TARGET @@ -29672,7 +29672,7 @@ gBattleAnimMove_TectonicRage:: monbg ANIM_TARGET createsprite gBasicHitSplatSpriteTemplate, ANIM_ATTACKER, 4, 0, 0, ANIM_TARGET, 2 delay 0x1 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 delay 0xa waitforvisualfinish clearmonbg ANIM_TARGET @@ -29852,7 +29852,7 @@ FinishContinentalCrush: createvisualtask AnimTask_BlendBattleAnimPal, 0xa, 0x4, 0x2, 0x0, 0x7, 0x0000 delay 0x5 playsewithpan SE_M_EXPLOSION, SOUND_PAN_TARGET - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 1, 14, -20, -18, 24 @ 14, -52, -18, 24 @@ -30309,7 +30309,7 @@ FinishCorkscrewCrash: stopsound playsewithpan SE_M_EXPLOSION, SOUND_PAN_ATTACKER createsprite gBasicHitSplatSpriteTemplate, ANIM_TARGET, 3, 0, 0, ANIM_TARGET, 0 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0xf, 0x0, 0x4 @ shove target down a bit + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 15, 0, 4 @ shove target down a bit waitforvisualfinish createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x10 playsewithpan SE_M_DOUBLE_TEAM, SOUND_PAN_TARGET @@ -30512,7 +30512,7 @@ gBattleAnimMove_HydroVortex:: call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets call DiveSetUpWaterDroplets - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfd00, 0x15, 0x0, 0x1a + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 21, 0, 26 delay 0x1a invisible ANIM_TARGET waitforvisualfinish @@ -31042,56 +31042,56 @@ ShatteredPsycheFinish: waitforvisualfinish end ShatteredPsycheFlingOpponent: - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 @ -26, +16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @ -26, +16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1a, 0xfff0, 0x1, 0x4 @ -26,-16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x20, 0x1, 0x4 @ 0,32 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, 32, 1, 4 @ 0,32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0xffe0, 0x1, 0x1 @ 0, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0xffe0, 0x1, 0x4 @ 0,-32 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0, -32, 1, 4 @ 0,-32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x0, 0x20, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1a, 0x10, 0x1, 0x4 @ 26,16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, 16, 1, 4 @ 26,16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0xfff0, 0x1, 0x1 @ -26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0xffe0, 0x1, 0x4 @ 26,-16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, -32, 1, 4 @ 26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0x10, 0x1, 0x1 @ 0, 32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x5 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 @ -26, +16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @ -26, +16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, -16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x1a, 0xfff0, 0x1, 0x4 @ -26,-16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 26, -16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe6, 0x10, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET @@ -31100,28 +31100,28 @@ ShatteredPsycheFlingOpponent: waitforvisualfinish return ShatteredPsycheFlingPlayer: - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe6, 0x10, 0x1, 0x4 @ -26,-16 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -26, 16, 1, 4 @ -26,-16 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x1a, 0xfff0, 0x1, 0x1 @ 26, 16 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x20, 0x0, 0x1, 0x4 @ 32,0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 32, 0, 1, 4 @ 32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xffe0, 0x0, 0x1, 0x1 @ playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xffe0, 0x0, 0x1, 0x4 @ -32,0 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -32, 0, 1, 4 @ -32,0 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0x20, 0x0, 0x1, 0x1 @ 32, 0 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET delay 0x2 createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x0, 0x4 waitforvisualfinish - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xa, 0x20, 0x1, 0x4 @ 10, -32 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 10, 32, 1, 4 @ 10, -32 waitforvisualfinish createsprite gShatteredPsycheReflectHitSpriteTemplate, ANIM_TARGET, 3, 0xfff6, 0x5, 0x1, 0x1 @ 10, -32 playsewithpan SE_M_BRICK_BREAK, SOUND_PAN_TARGET @@ -31563,7 +31563,7 @@ gBattleAnimMove_BlackHoleEclipse:: unloadspritegfx ANIM_TAG_WISP_ORB createsprite gBlackHoleEclipseHoleSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 @ eclipse at target origin delay 0x10 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x35, 0xffed, 0x1, 0x2 @ target down and left (instantaneously (last arg)) + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) delay 0x2 visible ANIM_TARGET loopsewithpan SE_M_SUPERSONIC, SOUND_PAN_TARGET, 0xa, 0x5 @@ -31939,7 +31939,7 @@ CatastropikaFinish: createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xa0, 0x8, 0x0, 0x3 createsprite gSparkElectricityFlashingSpriteTemplate, ANIM_ATTACKER, 2, 0xffc0, 0xffd8, 0x25, 0x2c, 0xe0, 0x8, 0x2, 0x3 delay 0xd - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 loadspritegfx ANIM_TAG_MUD_SAND createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 12, -24, -16, 24 @ 12, -48, -16, 24 createsprite gDirtPlumeSpriteTemplate, ANIM_TARGET, 2, ANIM_TARGET, 0, 16, -38, -10, 24 @ 16, -16, -10, 24 @@ -33163,7 +33163,7 @@ gBattleAnimMove_MaliciousMoonsault:: createsprite gMaliciousMoonsaultRedBounceSpriteTemplate, ANIM_TARGET, 3 delay 0x7 createsprite gMaliciousMoonsaultRedImpactSpriteTemplate, ANIM_TARGET, 2, 0x0, 0x0, 0x1, 0x0 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xff00, 0x15, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -256, 21, 0, 4 call MaliciousMoonsaultExplosion delay 0x6 call MaliciousMoonsaultExplosion @@ -33838,7 +33838,7 @@ gBattleAnimMove_ClangorousSoulblaze:: createsprite gClangoorousSoulblazeWhiteFlySpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, 0xd, 0x150 delay 0x2 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0xFFE0, 0x1, 0xffff - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0xfd00, 0xa, 0x0, 0x2a + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, -768, 10, 0, 42 createsprite gSlideMonToOffsetPartnerSpriteTemplate, ANIM_ATTACKER, 2, ANIM_DEF_PARTNER, 0xfd00, 0xa, 0x0, 0x2a delay 0x20 createvisualtask AnimTask_StartSlidingBg, 0x5, 0x0, 0x20, 0x1, 0xffff @@ -34103,7 +34103,7 @@ gBattleAnimMove_GuardianOfAlola:: waitforvisualfinish unloadspritegfx ANIM_TAG_THIN_RING playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xff00, 0xf, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer delay 0xa createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 @@ -34111,7 +34111,7 @@ gBattleAnimMove_GuardianOfAlola:: waitforvisualfinish delay 0xa playsewithpan SE_M_TAKE_DOWN, SOUND_PAN_ATTACKER - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0xff00, 0xf, 0x0, 0x4 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, -256, 15, 0, 4 call GuardianOfAlolaRocksPlayer delay 0xa createsprite gSlideMonToOriginalPosSpriteTemplate, ANIM_ATTACKER, 2, ANIM_ATTACKER, 0x0, 0x10 @@ -34216,7 +34216,7 @@ gBattleAnimMove_SearingSunrazeSmash:: playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gSearingSunrazeSmashGrowWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 delay 0x10 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x35, 0xffed, 0x1, 0x2 + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 delay 0x2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET @@ -34445,7 +34445,7 @@ gBattleAnimMove_MenacingMoonrazeMaelstrom:: playsewithpan SE_M_NIGHTMARE, SOUND_PAN_ATTACKER createsprite gMoonrazeMaelstromWormholeSpriteTemplate, ANIM_ATTACKER, 2, 0x0, 0x0, ANIM_TARGET, 0x0 delay 0x10 - createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 0x35, 0xffed, 0x1, 0x2 @ target down and left (instantaneously (last arg)) + createsprite gSlideMonToOffsetSpriteTemplate, ANIM_ATTACKER, 2, ANIM_TARGET, 53, -19, 1, 2 @ target down and left (instantaneously (last arg)) delay 0x2 loadspritegfx ANIM_TAG_METEOR @superpower visible ANIM_TARGET From 17e570407e624d7eaa084f229c15011b5fc840a4 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Fri, 23 May 2025 16:33:12 -0400 Subject: [PATCH 136/187] Remove trailing whitespace (#6968) --- data/field_effect_scripts.s | 2 +- docs/STYLEGUIDE.md | 2 +- docs/team_procedures/expansion_versions.md | 4 ++-- docs/team_procedures/scope.md | 18 +++++++++--------- docs/tutorials/how_to_code_entry.md | 6 +++--- src/battle_controllers.c | 4 ++-- src/battle_message.c | 2 +- src/battle_setup.c | 2 +- src/battle_terastal.c | 4 ++-- src/battle_transition.c | 12 ++++++------ src/datetime.c | 2 +- src/dexnav.c | 8 ++++---- src/evolution_scene.c | 16 ++++++++-------- src/field_control_avatar.c | 6 +++--- src/field_effect_helpers.c | 6 +++--- src/follower_npc.c | 8 ++++---- src/item_use.c | 2 +- src/pokedex_area_screen.c | 2 +- src/pokedex_plus_hgss.c | 6 +++--- src/rtc.c | 2 +- src/scrcmd.c | 20 ++++++++++---------- src/wild_encounter.c | 2 +- test/battle/ability/moody.c | 6 +++--- test/battle/ability/steam_engine.c | 2 +- test/battle/ai/ai_doubles.c | 8 ++++---- test/battle/hold_effect/seeds.c | 2 +- test/battle/move_effect/pursuit.c | 2 +- test/battle/move_effect/roar.c | 2 +- 28 files changed, 79 insertions(+), 79 deletions(-) diff --git a/data/field_effect_scripts.s b/data/field_effect_scripts.s index 9b4cb5c7c0..98ed66a13d 100644 --- a/data/field_effect_scripts.s +++ b/data/field_effect_scripts.s @@ -81,7 +81,7 @@ gFieldEffectScriptPointers:: .4byte gFieldEffectScript_TracksSpot @ FLDEFF_TRACKS_SPOT .4byte gFieldEffectScript_CaveDust @ FLDEFF_CAVE_DUST .4byte gFieldEffectScript_Defog @ FLDEFF_DEFOG - + gFieldEffectScript_ExclamationMarkIcon1:: field_eff_callnative FldEff_ExclamationMarkIcon field_eff_end diff --git a/docs/STYLEGUIDE.md b/docs/STYLEGUIDE.md index bb8f715ae4..f53e1a2dcc 100644 --- a/docs/STYLEGUIDE.md +++ b/docs/STYLEGUIDE.md @@ -202,7 +202,7 @@ if (runTasks) // correct if (runTasks != 0) // incorrect RunTasks(); - + if (!PlayerIsOutside()) // correct RemoveSunglasses(); diff --git a/docs/team_procedures/expansion_versions.md b/docs/team_procedures/expansion_versions.md index b53631bfa5..5c5cfabf00 100644 --- a/docs/team_procedures/expansion_versions.md +++ b/docs/team_procedures/expansion_versions.md @@ -139,7 +139,7 @@ If the changelog you're making is for a minor version (Eg. 1.3.0), make sure to #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 2 #define EXPANSION_VERSION_PATCH 3 - + // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE @@ -164,7 +164,7 @@ If the changelog you're making is for a minor version (Eg. 1.3.0), make sure to #define EXPANSION_VERSION_MINOR 2 - #define EXPANSION_VERSION_PATCH 3 + #define EXPANSION_VERSION_PATCH 4 - + // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE diff --git a/docs/team_procedures/scope.md b/docs/team_procedures/scope.md index 3293cea6dc..70739686fc 100644 --- a/docs/team_procedures/scope.md +++ b/docs/team_procedures/scope.md @@ -5,9 +5,9 @@ This document is a guide for contributors and Senate to decide if a feature is w # Definitions * **Showdown Supported (SS)**: A core series game who's metagame can be played on Showdown. - * Includes every [core series game](https://bulbapedia.bulbagarden.net/wiki/Core_series#List_of_core_series_games) except PokΓ©mon Legends: Arceus. + * Includes every [core series game](https://bulbapedia.bulbagarden.net/wiki/Core_series#List_of_core_series_games) except PokΓ©mon Legends: Arceus. * Does not include [spin-off games](https://bulbapedia.bulbagarden.net/wiki/Spin-off_PokΓ©mon_games) such as PokΓ©mon Colosseum, PokΓ©mon XD, PokΓ©mon Trozei!, etc. -* **Base Expansion Version**: "A .gba file built from an unmodified `master` or `upcoming` branch of `pokeemerald-expansion`. +* **Base Expansion Version**: "A .gba file built from an unmodified `master` or `upcoming` branch of `pokeemerald-expansion`. * **Vanilla Emerald Version**: A .gba file built from an unmodified `master` branch of pret's `pokeemerald`. # Guidelines @@ -19,14 +19,14 @@ A pull request meets the scope criteria if: ## In Scope Categories 1. **SS Species**: Adds Species that have appeared in a Showdown-supported title. Includes follower sprites for all defined species including battle-only ones (ie. Megas) -2. **SS Moves**: Adds Moves and Move Animations that have appeared in a Showdown-supported title -3. **SS Abilities**: Adds Abilities that have appeared in a Showdown-supported title -4. **SS Items**: Adds Items that have appeared in a Showdown-supported title +2. **SS Moves**: Adds Moves and Move Animations that have appeared in a Showdown-supported title +3. **SS Abilities**: Adds Abilities that have appeared in a Showdown-supported title +4. **SS Items**: Adds Items that have appeared in a Showdown-supported title 5. **SS Gimmicks**: Adds Gimmicks that have appeared in a Showdown-supported title (Dynamax, Mega Evolution, etc.) 6. **SS Battle Types**: Adds Special Battle Types that have appeared in a Showdown-supported title (Triple battles, etc.) 7. **SS Battle Mechanics**: Adds mechanical battle changes that have appeared in a Showdown-supported title, and allow developers to choose which generation suits them where applicable 8. **Battle AI Behaviour**: Improvements towards the capability of a human competitive player, and unique or interesting behaviours otherwise -9. **Base Link Compatibility**: The ability for two Base Expansion Version's to connect, trade, and battle one another +9. **Base Link Compatibility**: The ability for two Base Expansion Version's to connect, trade, and battle one another 10. **SS Overworld Features**: Add overworld changes / additions from Showdown-supported PokΓ©mon titles (followers, raids, sideways stairs, etc.) 11. **SS Menu Features**: Add menu changes / additions from Showdown-supported PokΓ©mon titles (type effectivness indicator, PC functions, etc.) 12. **Speed Up**: Optimize code to run more efficiently, take up less space, and work better overall to improves the developer and / or player experience @@ -41,7 +41,7 @@ A pull request meets the scope criteria if: 3. **Non-SS Abilities**: Adds Abilities that have NOT appeared in a Showdown-supported title 4. **Non-SS Items**: Adds Items that have NOT appeared in a Showdown-supported title 5. **Non-SS Gimmicks**: Adds Gimmicks that have NOT appeared in a Showdown-supported title (Showdown's Other Metagames, etc.) -6. **Non-SS Battle Types**: Adds Special Battle Types that have NOT appeared in a Showdown-supported title +6. **Non-SS Battle Types**: Adds Special Battle Types that have NOT appeared in a Showdown-supported title 7. **Overworld Maps**: Adds overworld maps from either Showdown-supported titles or non-Showdown-supported titles 8. **Duplicate UIs**: Adds additional user interface that covers the same functionality of an existing feature (HGSS PokΓ©dex, BW Summary Screen, etc.) 9. **Vanilla Link Compatibility**: The ability for Base Expansion Version and Vanilla Emerald Version to connect, trade, and battle one another @@ -50,8 +50,8 @@ A pull request meets the scope criteria if: Pull Requests that fall into this category are not in scope by default and should be brought up to maintainers, who will discuss and vote as to whether or not the feature is considered in scope. Considerations for acceptance may include invasiveness of implementation, popularity, ease of maintenance, etc. -1. **Developer Ease of Use**: Lowers barrier of entry for developers to use existing behavior -2. **Fangame Features**: Adds a popular feature from other fangames +1. **Developer Ease of Use**: Lowers barrier of entry for developers to use existing behavior +2. **Fangame Features**: Adds a popular feature from other fangames 3. **Popular Non-SS Features**: Exceptions can be made for uniquely popular or requested features (Drowsy, PLA Legend Plate, etc.) 4. **External Program**: External programs like poryscript, porymoves, etc. 5. **Intergenerational Feature Compatibility**: Addresses limitations and issues resulting from including all generational behaviours in a GBA native title, and extrapolation of features no longer supported by GameFreak diff --git a/docs/tutorials/how_to_code_entry.md b/docs/tutorials/how_to_code_entry.md index 19219835d9..51fe0d6f7d 100644 --- a/docs/tutorials/how_to_code_entry.md +++ b/docs/tutorials/how_to_code_entry.md @@ -46,9 +46,9 @@ void GetCodeFeedback(void) gSpecialVar_Result = 1; + else if (!StringCompare(gStringVar2, sText_CaughtEmAll)) + { -+ // TODO ++ // TODO + gSpecialVar_Result = 2; -+ } ++ } else gSpecialVar_Result = 0; } @@ -71,7 +71,7 @@ void GetCodeFeedback(void) + GetSetPokedexFlag(i + 1, FLAG_SET_CAUGHT); + } gSpecialVar_Result = 2; - } + } else gSpecialVar_Result = 0; } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 12d44b5bba..ea7a80ebfb 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -3158,7 +3158,7 @@ bool32 TryShinyAnimAfterMonAnimUtil(u32 battler) if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy || gSprites[gBattlerSpriteIds[battler]].x2 != 0) return FALSE; - + if (!gBattleSpritesDataPtr->healthBoxesData[battler].triedShinyMonAnim) { TryShinyAnimation(battler, GetBattlerMon(battler)); @@ -3200,7 +3200,7 @@ bool32 SwitchIn_HandleSoundAndEndUtil(u32 battler) { if (gBattleSpritesDataPtr->healthBoxesData[battler].specialAnimActive || IsCryPlayingOrClearCrySongs()) return FALSE; - + if (gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy && gSprites[gBattlerSpriteIds[battler]].callback != SpriteCallbackDummy_2 && GetBattlerSide(battler) == B_SIDE_OPPONENT) diff --git a/src/battle_message.c b/src/battle_message.c index 0f239cb4e6..d46ead7669 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -3189,7 +3189,7 @@ static void IllusionNickHack(u32 battler, u32 partyId, u8 *dst) id = GetIllusionMonPartyId(gEnemyParty, mon, partnerMon); } - + if (id != PARTY_SIZE) GetMonData(&gEnemyParty[id], MON_DATA_NICKNAME, dst); else diff --git a/src/battle_setup.c b/src/battle_setup.c index 521aba74e6..52563ba3ee 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -580,7 +580,7 @@ static void CB2_EndWildBattle(void) { CpuFill16(0, (void *)(BG_PLTT), BG_PLTT_SIZE); ResetOamRange(0, 128); - + if (IsNPCFollowerWildBattle()) { RestorePartyAfterFollowerNPCBattle(); diff --git a/src/battle_terastal.c b/src/battle_terastal.c index 942d761c2b..6984f3fc6c 100644 --- a/src/battle_terastal.c +++ b/src/battle_terastal.c @@ -63,10 +63,10 @@ void ApplyBattlerVisualsForTeraAnim(u32 battler) bool32 CanTerastallize(u32 battler) { enum ItemHoldEffect holdEffect = GetBattlerHoldEffect(battler, FALSE); - + if (gBattleMons[battler].status2 & STATUS2_TRANSFORMED && GET_BASE_SPECIES_ID(gBattleMons[battler].species) == SPECIES_TERAPAGOS) return FALSE; - + // Prevents Zigzagoon from terastalizing in vanilla. if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE && !IsOnPlayerSide(battler)) return FALSE; diff --git a/src/battle_transition.c b/src/battle_transition.c index 6647c72f2b..8906365e99 100644 --- a/src/battle_transition.c +++ b/src/battle_transition.c @@ -2376,7 +2376,7 @@ static bool8 Mugshot_StartOpponentSlide(struct Task *task) sTransitionData->BG0HOFS_Upper += 8; SetTrainerPicSlideDirection(task->tOpponentSpriteAId, 0); - if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { SetTrainerPicSlideDirection(task->tOpponentSpriteBId, 0); } @@ -2391,7 +2391,7 @@ static bool8 Mugshot_StartOpponentSlide(struct Task *task) PlaySE(SE_MUGSHOT); - if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) { IncrementTrainerPicState(task->tOpponentSpriteBId); } @@ -2589,8 +2589,8 @@ static void Mugshots_CreateTrainerPics(struct Task *task) s16 opponentBRotationScales = 0; gReservedSpritePaletteCount = 10; - if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) - { + if (TRAINER_BATTLE_PARAM.opponentB != TRAINER_NONE && gBattleTypeFlags & BATTLE_TYPE_TWO_OPPONENTS) + { task->tOpponentSpriteBId = CreateTrainerSprite(trainerBPicId, gTrainerSprites[trainerBPicId].mugshotCoords.x - 240, gTrainerSprites[trainerBPicId].mugshotCoords.y + 42, @@ -2605,12 +2605,12 @@ static void Mugshots_CreateTrainerPics(struct Task *task) opponentBRotationScales = gTrainerSprites[trainerBPicId].mugshotRotation; SetOamMatrixRotationScaling(opponentSpriteB->oam.matrixNum, opponentBRotationScales, opponentBRotationScales, 0); } - + task->tOpponentSpriteAId = CreateTrainerSprite(trainerAPicId, gTrainerSprites[trainerAPicId].mugshotCoords.x - 32, gTrainerSprites[trainerAPicId].mugshotCoords.y + 42, 0, NULL); - + gReservedSpritePaletteCount = 12; if (gPartnerTrainerId != TRAINER_PARTNER(PARTNER_NONE) && gBattleTypeFlags & BATTLE_TYPE_INGAME_PARTNER) { diff --git a/src/datetime.c b/src/datetime.c index 1f02813b69..fbbb3ea6b7 100644 --- a/src/datetime.c +++ b/src/datetime.c @@ -44,7 +44,7 @@ void DateTime_AddDays(struct DateTime *dateTime, u32 days) void DateTime_AddHours(struct DateTime *dateTime, u32 hours) { u32 days = 0; - + dateTime->hour += hours; while (dateTime->hour >= HOURS_PER_DAY) { diff --git a/src/dexnav.c b/src/dexnav.c index 526dc4a177..48dd75829b 100644 --- a/src/dexnav.c +++ b/src/dexnav.c @@ -1737,7 +1737,7 @@ static bool8 CapturedAllLandMons(u32 headerId) u16 i, species; int count = 0; enum TimeOfDay timeOfDay = GetTimeOfDayForEncounters(headerId, WILD_AREA_LAND); - + const struct WildPokemonInfo *landMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].landMonsInfo; if (landMonsInfo != NULL) @@ -1807,7 +1807,7 @@ static bool8 CapturedAllHiddenMons(u32 headerId) enum TimeOfDay timeOfDay = GetTimeOfDayForEncounters(headerId, WILD_AREA_HIDDEN); const struct WildPokemonInfo *hiddenMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].hiddenMonsInfo; - + if (hiddenMonsInfo != NULL) { for (i = 0; i < HIDDEN_WILD_COUNT; ++i) @@ -1959,7 +1959,7 @@ static void DexNavLoadEncounterData(void) const struct WildPokemonInfo *waterMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].waterMonsInfo; timeOfDay = GetTimeOfDayForEncounters(headerId, WILD_AREA_HIDDEN); const struct WildPokemonInfo *hiddenMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].hiddenMonsInfo; - + // nop struct data memset(sDexNavUiDataPtr->landSpecies, 0, sizeof(sDexNavUiDataPtr->landSpecies)); memset(sDexNavUiDataPtr->waterSpecies, 0, sizeof(sDexNavUiDataPtr->waterSpecies)); @@ -2534,7 +2534,7 @@ bool8 TryFindHiddenPokemon(void) enum EncounterType environment; u8 taskId; enum TimeOfDay timeOfDay = GetTimeOfDayForEncounters(headerId, WILD_AREA_HIDDEN); - + const struct WildPokemonInfo *hiddenMonsInfo = gWildMonHeaders[headerId].encounterTypes[timeOfDay].hiddenMonsInfo; bool8 isHiddenMon = FALSE; diff --git a/src/evolution_scene.c b/src/evolution_scene.c index 70accb3f2a..d0dbb688fa 100644 --- a/src/evolution_scene.c +++ b/src/evolution_scene.c @@ -560,7 +560,7 @@ static void CreateShedinja(u32 preEvoSpecies, u32 postEvoSpecies, struct Pokemon { s32 j; struct Pokemon *shedinja = &gPlayerParty[gPlayerPartyCount]; - + CopyMon(&gPlayerParty[gPlayerPartyCount], mon, sizeof(struct Pokemon)); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_SPECIES, &evolutions[i].targetSpecies); SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_NICKNAME, GetSpeciesName(evolutions[i].targetSpecies)); @@ -571,22 +571,22 @@ static void CreateShedinja(u32 preEvoSpecies, u32 postEvoSpecies, struct Pokemon SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_POKEBALL, &ball); RemoveBagItem(ball, 1); } - + for (j = MON_DATA_COOL_RIBBON; j < MON_DATA_COOL_RIBBON + CONTEST_CATEGORIES_COUNT; j++) SetMonData(&gPlayerParty[gPlayerPartyCount], j, &data); for (j = MON_DATA_CHAMPION_RIBBON; j <= MON_DATA_WORLD_RIBBON; j++) SetMonData(&gPlayerParty[gPlayerPartyCount], j, &data); - + SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_STATUS, &data); data = MAIL_NONE; SetMonData(&gPlayerParty[gPlayerPartyCount], MON_DATA_MAIL, &data); - + CalculateMonStats(&gPlayerParty[gPlayerPartyCount]); CalculatePlayerPartyCount(); - + GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[i].targetSpecies), FLAG_SET_SEEN); GetSetPokedexFlag(SpeciesToNationalPokedexNum(evolutions[i].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) @@ -825,12 +825,12 @@ static void Task_EvolutionScene(u8 taskId) { StopMapMusic(); Overworld_PlaySpecialMapMusic(); - + } if (!gTasks[taskId].tEvoWasStopped) CreateShedinja(gTasks[taskId].tPreEvoSpecies, gTasks[taskId].tPostEvoSpecies, mon); - + DestroyTask(taskId); FreeMonSpritesGfx(); FREE_AND_SET_NULL(sEvoStructPtr); diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c index e1b9cb3a83..c671c1ca78 100644 --- a/src/field_control_avatar.c +++ b/src/field_control_avatar.c @@ -226,13 +226,13 @@ int ProcessPlayerFieldInput(struct FieldInput *input) ShowStartMenu(); return TRUE; } - + if (input->tookStep && TryFindHiddenPokemon()) return TRUE; - + if (input->pressedSelectButton && UseRegisteredKeyItemOnField() == TRUE) return TRUE; - + if (input->pressedRButton && TryStartDexNavSearch()) return TRUE; diff --git a/src/field_effect_helpers.c b/src/field_effect_helpers.c index 8174d11135..f7a6531ec2 100755 --- a/src/field_effect_helpers.c +++ b/src/field_effect_helpers.c @@ -1045,7 +1045,7 @@ u32 FldEff_ShakingGrass(void) sprite->oam.priority = gFieldEffectArguments[3]; sprite->sWaitFldEff = FLDEFF_SHAKING_GRASS; } - + return spriteId; } @@ -1062,7 +1062,7 @@ u32 FldEff_ShakingGrass2(void) sprite->oam.priority = gFieldEffectArguments[3]; sprite->sWaitFldEff = FLDEFF_SHAKING_LONG_GRASS; } - + return spriteId; } @@ -1095,7 +1095,7 @@ u32 FldEff_WaterSurfacing(void) sprite->oam.priority = gFieldEffectArguments[3]; sprite->sWaitFldEff = FLDEFF_WATER_SURFACING; } - + return spriteId; } diff --git a/src/follower_npc.c b/src/follower_npc.c index e363261d4e..3d24cb3942 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -137,7 +137,7 @@ const u8 *GetFollowerNPCScriptPointer(void) #if FNPC_ENABLE_NPC_FOLLOWERS if (PlayerHasFollowerNPC()) return gSaveBlock3Ptr->NPCfollower.script; - + #endif return NULL; } @@ -735,7 +735,7 @@ u32 DetermineFollowerNPCState(struct ObjectEvent *follower, u32 state, u32 direc follower->facingDirectionLocked = TRUE; newState = delayedState + (direction -1); - } + } // Clear ice tile stuff. follower->disableAnim = FALSE; @@ -1543,7 +1543,7 @@ void Task_MoveNPCFollowerAfterForcedMovement(u8 taskId) // Lock follower facing direction for muddy slope. if (follower->currentMetatileBehavior == MB_MUDDY_SLOPE) follower->facingDirectionLocked = TRUE; - + if (TryDoMetatileBehaviorForcedMovement() == 0) gTasks[taskId].tState = NPC_INTO_PLAYER; @@ -1576,7 +1576,7 @@ void Task_MoveNPCFollowerAfterForcedMovement(u8 taskId) void Task_HideNPCFollowerAfterMovementFinish(u8 taskId) { struct ObjectEvent *npcFollower = &gObjectEvents[GetFollowerNPCObjectId()]; - + if (ObjectEventClearHeldMovementIfFinished(npcFollower) != 0) { HideNPCFollower(); diff --git a/src/item_use.c b/src/item_use.c index 6f823aad8d..8e1130e431 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -282,7 +282,7 @@ static void ItemUseOnFieldCB_Bike(u8 taskId) GetOnOffBike(PLAYER_AVATAR_FLAG_MACH_BIKE); else // ACRO_BIKE GetOnOffBike(PLAYER_AVATAR_FLAG_ACRO_BIKE); - + FollowerNPC_HandleBike(); ScriptUnfreezeObjectEvents(); UnlockPlayerFieldControls(); diff --git a/src/pokedex_area_screen.c b/src/pokedex_area_screen.c index 1c8cebb7ea..11aff2bee8 100644 --- a/src/pokedex_area_screen.c +++ b/src/pokedex_area_screen.c @@ -921,7 +921,7 @@ static void Task_HandlePokedexAreaScreenInput(u8 taskId) ClearAreaWindowLabel(DEX_AREA_LABEL_AREA_UNKNOWN); RemoveAllWindowsOnBg(LABEL_WINDOW_BG); } - + sPokedexAreaScreen->screenSwitchState[0] = gTasks[taskId].data[1]; ResetPokedexAreaMapBg(); DestroyTask(taskId); diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index fd5cfaa71b..fee4f94b88 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6513,7 +6513,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept u32 speciesNameWidthInChars = GetSpeciesNameWidthInChars(GetSpeciesName(targetSpecies)); u32 speciesNameCharWidth = GetFontAttribute(GetSpeciesNameFontId(speciesNameWidthInChars), FONTATTR_MAX_LETTER_WIDTH); - + u32 speciesNameWidth = (speciesNameWidthInChars * speciesNameCharWidth); u32 base_x_offset = speciesNameWidth + base_x + depth_offset; // for evo method info u32 maxScreenWidth = 230 - base_x_offset; @@ -6588,7 +6588,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept { StringAppend(gStringVar4, COMPOUND_STRING(", ")); } - + switch((enum EvolutionConditions)evolutions[i].params[j].condition) { // Gen 2 @@ -6802,7 +6802,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept StringAppend(gStringVar4, COMPOUND_STRING(".")); BreakStringAutomatic(gStringVar4, maxScreenWidth, MAX_EVO_METHOD_LINES, fontId, HIDE_SCROLL_PROMPT); - + PrintInfoScreenTextSmall(gStringVar4, fontId, base_x_offset, base_y + base_y_offset*(*depth_i) + numLines); //Print actual instructions (*depth_i)++; diff --git a/src/rtc.c b/src/rtc.c index a0d85b2701..34f84183cf 100644 --- a/src/rtc.c +++ b/src/rtc.c @@ -454,7 +454,7 @@ enum Weekday GetDayOfWeek(void) return dateTime.dayOfWeek; } - + enum TimeOfDay TryIncrementTimeOfDay(enum TimeOfDay timeOfDay) { return timeOfDay == TIME_NIGHT ? TIME_MORNING : timeOfDay + 1; diff --git a/src/scrcmd.c b/src/scrcmd.c index 12f768ccf0..609355f502 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -907,7 +907,7 @@ bool8 ScrCmd_gettime(struct ScriptContext *ctx) bool8 ScrCmd_gettimeofday(struct ScriptContext *ctx) { Script_RequestEffects(SCREFF_V1); - + gSpecialVar_0x8000 = GetTimeOfDay(); return FALSE; } @@ -2421,7 +2421,7 @@ bool8 ScrCmd_updatecoinsbox(struct ScriptContext *ctx) bool8 ScrCmd_trainerbattle(struct ScriptContext *ctx) { Script_RequestEffects(SCREFF_V1 | SCREFF_TRAINERBATTLE); - + TrainerBattleLoadArgs(ctx->scriptPtr); ctx->scriptPtr = BattleSetup_ConfigureTrainerBattle(ctx->scriptPtr); return FALSE; @@ -3173,7 +3173,7 @@ bool8 ScrCmd_addtime(struct ScriptContext *ctx) u32 minutes = ScriptReadWord(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_AdvanceTimeBy(days, hours, minutes, 0); return FALSE; @@ -3184,7 +3184,7 @@ bool8 ScrCmd_adddays(struct ScriptContext *ctx) u32 days = ScriptReadWord(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_AdvanceTimeBy(days, 0, 0, 0); return FALSE; @@ -3195,7 +3195,7 @@ bool8 ScrCmd_addhours(struct ScriptContext *ctx) u32 hours = ScriptReadWord(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_AdvanceTimeBy(0, hours, 0, 0); return FALSE; @@ -3206,7 +3206,7 @@ bool8 ScrCmd_addminutes(struct ScriptContext *ctx) u32 minutes = ScriptReadWord(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_AdvanceTimeBy(0, 0, minutes, 0); return FALSE; @@ -3218,7 +3218,7 @@ bool8 ScrCmd_fwdtime(struct ScriptContext *ctx) u32 minutes = ScriptReadWord(ctx); Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_ForwardTimeTo(hours, minutes, 0); return FALSE; @@ -3227,12 +3227,12 @@ bool8 ScrCmd_fwdtime(struct ScriptContext *ctx) bool8 ScrCmd_fwdweekday(struct ScriptContext *ctx) { struct SiiRtcInfo *rtc = FakeRtc_GetCurrentTime(); - + u32 weekdayTarget = ScriptReadWord(ctx); u32 daysToAdd = ((weekdayTarget - rtc->dayOfWeek) + WEEKDAY_COUNT) % WEEKDAY_COUNT; - + Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - + FakeRtc_AdvanceTimeBy(daysToAdd, 0, 0, 0); return FALSE; } diff --git a/src/wild_encounter.c b/src/wild_encounter.c index 86923300f5..481b50bcdb 100644 --- a/src/wild_encounter.c +++ b/src/wild_encounter.c @@ -924,7 +924,7 @@ bool8 SweetScentWildEncounter(void) if (MetatileBehavior_IsLandWildEncounter(MapGridGetMetatileBehaviorAt(x, y)) == TRUE) { timeOfDay = GetTimeOfDayForEncounters(headerId, WILD_AREA_LAND); - + if (gWildMonHeaders[headerId].encounterTypes[timeOfDay].landMonsInfo == NULL) return FALSE; diff --git a/test/battle/ability/moody.c b/test/battle/ability/moody.c index 888e088f21..d52f6e9cee 100644 --- a/test/battle/ability/moody.c +++ b/test/battle/ability/moody.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the user's Attack, Defense, Sp. Atk, Sp. Def, or Speed by two stages") { u32 config, statsNum; - + PARAMETRIZE { config = GEN_8; statsNum = NUM_STATS; } PARAMETRIZE { config = GEN_7; statsNum = NUM_BATTLE_STATS; } @@ -29,7 +29,7 @@ SINGLE_BATTLE_TEST("Moody randomly raises the user's Attack, Defense, Sp. Atk, S SINGLE_BATTLE_TEST("Moody randomly lowers the user's Attack, Defense, Sp. Atk, Sp. Def, or Speed by one stage") { u32 config, statsNum; - + PARAMETRIZE { config = GEN_8; statsNum = NUM_STATS; } PARAMETRIZE { config = GEN_7; statsNum = NUM_BATTLE_STATS; } @@ -54,7 +54,7 @@ SINGLE_BATTLE_TEST("Moody randomly lowers the user's Attack, Defense, Sp. Atk, S SINGLE_BATTLE_TEST("Moody randomly raises the holder's Attack, Defense, Sp. Atk, Sp. Def, or Speed by two stages and lowers a different stat by one stage") { u32 config, statsNum; - + PARAMETRIZE { config = GEN_8; statsNum = NUM_STATS; } PARAMETRIZE { config = GEN_7; statsNum = NUM_BATTLE_STATS; } diff --git a/test/battle/ability/steam_engine.c b/test/battle/ability/steam_engine.c index bda470af2e..1f487bf6bf 100644 --- a/test/battle/ability/steam_engine.c +++ b/test/battle/ability/steam_engine.c @@ -7,7 +7,7 @@ SINGLE_BATTLE_TEST("Steam Engine raises speed when hit by a Fire or Water move") PARAMETRIZE { move = MOVE_EMBER; } PARAMETRIZE { move = MOVE_WATER_GUN; } - + GIVEN { PLAYER(SPECIES_COALOSSAL) { Ability(ABILITY_STEAM_ENGINE); } OPPONENT(SPECIES_WOBBUFFET); diff --git a/test/battle/ai/ai_doubles.c b/test/battle/ai/ai_doubles.c index b162c8c67f..5edc271fff 100644 --- a/test/battle/ai/ai_doubles.c +++ b/test/battle/ai/ai_doubles.c @@ -132,7 +132,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Bulldoze if it triggers its ally's ability ASSUME(GetMoveType(MOVE_BULLDOZE) == TYPE_GROUND); ASSUME(MoveHasAdditionalEffect(MOVE_BULLDOZE, MOVE_EFFECT_SPD_MINUS_1)); - u32 species, ability, currentHP; + u32 species, ability, currentHP; PARAMETRIZE { species = SPECIES_KINGAMBIT; ability = ABILITY_DEFIANT; currentHP = 400; } PARAMETRIZE { species = SPECIES_SHUCKLE; ability = ABILITY_CONTRARY; currentHP = 400; } @@ -206,7 +206,7 @@ AI_DOUBLE_BATTLE_TEST("AI will choose Earthquake if it kills one opposing mon an u32 currentHP; PARAMETRIZE { currentHP = 1; } PARAMETRIZE { currentHP = 200; } - + GIVEN { ASSUME(GetMoveTarget(MOVE_EARTHQUAKE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT); @@ -288,7 +288,7 @@ AI_DOUBLE_BATTLE_TEST("AI will only explode and kill everything on the field wit ASSUME(GetMoveTarget(MOVE_EXPLOSION) == MOVE_TARGET_FOES_AND_ALLY); ASSUME(GetMoveEffect(MOVE_EXPLOSION) == EFFECT_EXPLOSION); - u32 aiFlags; + u32 aiFlags; PARAMETRIZE { aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT; } PARAMETRIZE { aiFlags = AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_RISKY; } @@ -332,7 +332,7 @@ AI_DOUBLE_BATTLE_TEST("AI sees corresponding absorbing abilities on partners") PARAMETRIZE { species = SPECIES_SHELLOS; ability = ABILITY_STORM_DRAIN; move = MOVE_SURF; } PARAMETRIZE { species = SPECIES_UNOWN; ability = ABILITY_LEVITATE; move = MOVE_EARTHQUAKE; } PARAMETRIZE { species = SPECIES_ORTHWORM; ability = ABILITY_EARTH_EATER; move = MOVE_EARTHQUAKE; } - + GIVEN { ASSUME(GetMoveTarget(MOVE_DISCHARGE) == MOVE_TARGET_FOES_AND_ALLY); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_HP_AWARE); diff --git a/test/battle/hold_effect/seeds.c b/test/battle/hold_effect/seeds.c index e70d302f75..35b89c0085 100644 --- a/test/battle/hold_effect/seeds.c +++ b/test/battle/hold_effect/seeds.c @@ -11,7 +11,7 @@ ASSUMPTIONS ASSUME(gItemsInfo[ITEM_MISTY_SEED].holdEffectParam == HOLD_EFFECT_PARAM_MISTY_TERRAIN); ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffect == HOLD_EFFECT_SEEDS); ASSUME(gItemsInfo[ITEM_PSYCHIC_SEED].holdEffectParam == HOLD_EFFECT_PARAM_PSYCHIC_TERRAIN); - + } SINGLE_BATTLE_TEST("Electric Seed raises the holder's Defense on Electric Terrain") diff --git a/test/battle/move_effect/pursuit.c b/test/battle/move_effect/pursuit.c index 3b48fa4ded..649b331eec 100644 --- a/test/battle/move_effect/pursuit.c +++ b/test/battle/move_effect/pursuit.c @@ -606,7 +606,7 @@ SINGLE_BATTLE_TEST("Pursuit attacks a switching foe and switchin is correctly st case 4: SEND_IN_MESSAGE("Venipede"); break; - } + } } } diff --git a/test/battle/move_effect/roar.c b/test/battle/move_effect/roar.c index 525e75b6df..5b1230f253 100644 --- a/test/battle/move_effect/roar.c +++ b/test/battle/move_effect/roar.c @@ -78,7 +78,7 @@ SINGLE_BATTLE_TEST("Roar fails against target with Guard Dog") } WHEN { TURN { MOVE(player, MOVE_ROAR); } } SCENE { - NONE_OF { + NONE_OF { ANIMATION(ANIM_TYPE_MOVE, MOVE_ROAR, player); MESSAGE("The opposing Charmander was dragged out!"); } From 0b67aa7546526a264084c196c3991431ba2517ba Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 24 May 2025 14:13:08 +0100 Subject: [PATCH 137/187] Fixes checking wrong move's Dynamic Move Type in Summary Screen (#6975) --- src/pokemon_summary_screen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pokemon_summary_screen.c b/src/pokemon_summary_screen.c index d34b0dd40d..ea4d449ec4 100644 --- a/src/pokemon_summary_screen.c +++ b/src/pokemon_summary_screen.c @@ -4308,7 +4308,7 @@ static void SetMoveTypeIcons(void) if (P_SHOW_DYNAMIC_TYPES) { enum MonState state = gMain.inBattle ? MON_IN_BATTLE : MON_OUTSIDE_BATTLE; - type = CheckDynamicMoveType(mon, sMonSummaryScreen->newMove, 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0 + type = CheckDynamicMoveType(mon, summary->moves[i], 0, state); // Bug: in battle, this only shows the dynamic type of battler in position 0 } SetTypeSpritePosAndPal(type, 85, 32 + (i * 16), i + SPRITE_ARR_ID_TYPE); From dc6e40a8397f046d284c15721c7cf275987324d5 Mon Sep 17 00:00:00 2001 From: Hedara Date: Sat, 24 May 2025 21:57:51 +0200 Subject: [PATCH 138/187] Fix tests using old item functions --- test/battle/ability/unburden.c | 2 +- test/battle/ai/ai.c | 4 ++-- test/battle/move_effect/bestow.c | 2 +- test/battle/move_effect/hidden_power.c | 4 ++-- test/test_runner_battle.c | 14 +++++++------- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/battle/ability/unburden.c b/test/battle/ability/unburden.c index 63a72e2ace..28f867622e 100644 --- a/test/battle/ability/unburden.c +++ b/test/battle/ability/unburden.c @@ -4,7 +4,7 @@ SINGLE_BATTLE_TEST("Unburden doubles speed once user uses item") { GIVEN { - ASSUME(ItemId_GetHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_SEEDS); + ASSUME(GetItemHoldEffect(ITEM_GRASSY_SEED) == HOLD_EFFECT_SEEDS); ASSUME(GetMoveEffect(MOVE_U_TURN) == EFFECT_HIT_ESCAPE); PLAYER(SPECIES_DRIFBLIM) { Ability(ABILITY_UNBURDEN); Item(ITEM_GRASSY_SEED); Speed(5); } OPPONENT(SPECIES_WOBBUFFET) { Speed(7); } diff --git a/test/battle/ai/ai.c b/test/battle/ai/ai.c index a22097c815..dfd0e2eeda 100644 --- a/test/battle/ai/ai.c +++ b/test/battle/ai/ai.c @@ -864,7 +864,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI considers Focus Sash when det AI_SINGLE_BATTLE_TEST("AI sees popped Air Balloon") { GIVEN { - ASSUME(ItemId_GetHoldEffect(ITEM_AIR_BALLOON) == HOLD_EFFECT_AIR_BALLOON); + ASSUME(GetItemHoldEffect(ITEM_AIR_BALLOON) == HOLD_EFFECT_AIR_BALLOON); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_TORCHIC) { Item(ITEM_AIR_BALLOON); Moves(MOVE_SCRATCH); } @@ -878,7 +878,7 @@ AI_SINGLE_BATTLE_TEST("AI sees popped Air Balloon") AI_SINGLE_BATTLE_TEST("AI sees popped Air Balloon after Air Balloon mon switches out and back in") { GIVEN { - ASSUME(ItemId_GetHoldEffect(ITEM_AIR_BALLOON) == HOLD_EFFECT_AIR_BALLOON); + ASSUME(GetItemHoldEffect(ITEM_AIR_BALLOON) == HOLD_EFFECT_AIR_BALLOON); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_TRY_TO_FAINT | AI_FLAG_CHECK_VIABILITY | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_TORCHIC) { Item(ITEM_AIR_BALLOON); Moves(MOVE_SCRATCH); } diff --git a/test/battle/move_effect/bestow.c b/test/battle/move_effect/bestow.c index 4ed952be6b..4ca86119b6 100644 --- a/test/battle/move_effect/bestow.c +++ b/test/battle/move_effect/bestow.c @@ -79,7 +79,7 @@ SINGLE_BATTLE_TEST("Bestow fails if the user's held item is a Mega Stone") SINGLE_BATTLE_TEST("Bestow fails if the user's held item is a Z-Crystal") { GIVEN { - ASSUME(ItemId_GetHoldEffect(ITEM_FIGHTINIUM_Z) == HOLD_EFFECT_Z_CRYSTAL); + ASSUME(GetItemHoldEffect(ITEM_FIGHTINIUM_Z) == HOLD_EFFECT_Z_CRYSTAL); PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_FIGHTINIUM_Z); } OPPONENT(SPECIES_WOBBUFFET); } WHEN { diff --git a/test/battle/move_effect/hidden_power.c b/test/battle/move_effect/hidden_power.c index 7f2bb5f2b9..124d78c96a 100644 --- a/test/battle/move_effect/hidden_power.c +++ b/test/battle/move_effect/hidden_power.c @@ -113,8 +113,8 @@ SINGLE_BATTLE_TEST("Hidden Power's type is determined by IVs") ASSUME(gTypeEffectivenessTable[type][foeType] == UQ_4_12(2.0)); // Foe's Type resists ASSUME(gSpeciesInfo[foeSpecies].types[0] == gSpeciesInfo[foeSpecies].types[1]); // Foe's pure type ASSUME(gSpeciesInfo[foeSpecies].types[0] == foeType); // Foe is the super-effective type - ASSUME(ItemId_GetHoldEffect(foeItem) == HOLD_EFFECT_RESIST_BERRY); // Item is resist berry - ASSUME(ItemId_GetHoldEffectParam(foeItem) == type); // Resist berry of type + ASSUME(GetItemHoldEffect(foeItem) == HOLD_EFFECT_RESIST_BERRY); // Item is resist berry + ASSUME(GetItemHoldEffectParam(foeItem) == type); // Resist berry of type PLAYER(SPECIES_DUNSPARCE) { HPIV(hp); AttackIV(atk); DefenseIV(def); SpAttackIV(spAtk); SpDefenseIV(spDef); SpeedIV(speed); } } else { PLAYER(SPECIES_DUNSPARCE); diff --git a/test/test_runner_battle.c b/test/test_runner_battle.c index 098c4f4a29..cba0d95e59 100644 --- a/test/test_runner_battle.c +++ b/test/test_runner_battle.c @@ -2116,17 +2116,17 @@ void MoveGetIdAndSlot(s32 battlerId, struct MoveContext *ctx, u32 *moveId, u32 * if (ctx->explicitGimmick && ctx->gimmick != GIMMICK_NONE) { u32 item = GetMonData(mon, MON_DATA_HELD_ITEM); - u32 holdEffect = ItemId_GetHoldEffect(item); + u32 holdEffect = GetItemHoldEffect(item); u32 species = GetMonData(mon, MON_DATA_SPECIES); u32 side = battlerId & BIT_SIDE; // Check invalid item usage. INVALID_IF(ctx->gimmick == GIMMICK_MEGA && holdEffect != HOLD_EFFECT_MEGA_STONE && species != SPECIES_RAYQUAZA, "Cannot Mega Evolve without a Mega Stone"); INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && holdEffect != HOLD_EFFECT_Z_CRYSTAL, "Cannot use a Z-Move without a Z-Crystal"); - INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && ItemId_GetSecondaryId(item) != GetMoveType(*moveId) + INVALID_IF(ctx->gimmick == GIMMICK_Z_MOVE && GetItemSecondaryId(item) != GetMoveType(*moveId) && GetSignatureZMove(*moveId, species, item) == MOVE_NONE && *moveId != MOVE_PHOTON_GEYSER, // exception because test won't recognize Ultra Necrozma pre-Burst - "Cannot turn %S into a Z-Move with %S", GetMoveName(ctx->move), ItemId_GetName(item)); + "Cannot turn %S into a Z-Move with %S", GetMoveName(ctx->move), GetItemName(item)); INVALID_IF(ctx->gimmick != GIMMICK_MEGA && holdEffect == HOLD_EFFECT_MEGA_STONE, "Cannot use another gimmick while holding a Mega Stone"); INVALID_IF(ctx->gimmick != GIMMICK_Z_MOVE && ctx->gimmick != GIMMICK_ULTRA_BURST && holdEffect == HOLD_EFFECT_Z_CRYSTAL, "Cannot use another gimmick while holding a Z-Crystal"); @@ -2464,19 +2464,19 @@ void UseItem(u32 sourceLine, struct BattlePokemon *battler, struct ItemContext c { s32 i; s32 battlerId = battler - gBattleMons; - bool32 requirePartyIndex = ItemId_GetType(ctx.itemId) == ITEM_USE_PARTY_MENU || ItemId_GetType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES; + bool32 requirePartyIndex = GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU || GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES; // Check general bad use. INVALID_IF(DATA.turnState == TURN_CLOSED, "USE_ITEM outside TURN"); INVALID_IF(DATA.actionBattlers & (1 << battlerId), "Multiple battler actions"); INVALID_IF(ctx.itemId >= ITEMS_COUNT, "Illegal item: %d", ctx.itemId); // Check party menu items. - INVALID_IF(requirePartyIndex && !ctx.explicitPartyIndex, "%S requires explicit party index", ItemId_GetName(ctx.itemId)); + INVALID_IF(requirePartyIndex && !ctx.explicitPartyIndex, "%S requires explicit party index", GetItemName(ctx.itemId)); INVALID_IF(requirePartyIndex && ctx.partyIndex >= ((battlerId & BIT_SIDE) == B_SIDE_PLAYER ? DATA.playerPartySize : DATA.opponentPartySize), \ "USE_ITEM to invalid party index"); // Check move slot items. - if (ItemId_GetType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES) + if (GetItemType(ctx.itemId) == ITEM_USE_PARTY_MENU_MOVES) { - INVALID_IF(!ctx.explicitMove, "%S requires an explicit move", ItemId_GetName(ctx.itemId)); + INVALID_IF(!ctx.explicitMove, "%S requires an explicit move", GetItemName(ctx.itemId)); for (i = 0; i < MAX_MON_MOVES; i++) { if (GetMonData(CurrentMon(battlerId), MON_DATA_MOVE1 + i, NULL) == ctx.move) From d0313ff3236e88e43049205bd551d99f89ebfe83 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sat, 24 May 2025 23:12:48 +0200 Subject: [PATCH 139/187] Rename AI test (#6977) --- test/battle/ai/ai_calc_best_move_score.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/ai/ai_calc_best_move_score.c b/test/battle/ai/ai_calc_best_move_score.c index f3b339deba..a4a13c283f 100644 --- a/test/battle/ai/ai_calc_best_move_score.c +++ b/test/battle/ai/ai_calc_best_move_score.c @@ -54,7 +54,7 @@ AI_SINGLE_BATTLE_TEST("AI will increase speed if it is slower") } } -AI_SINGLE_BATTLE_TEST("AI will correctly predict what move the opposing mon going to use") +AI_SINGLE_BATTLE_TEST("AI will not waste a turn setting up if it knows target can faint it") { u16 move; From 8a960e77f77097d24afe1fb72cd00c377857d618 Mon Sep 17 00:00:00 2001 From: surskitty Date: Sat, 24 May 2025 23:06:51 -0400 Subject: [PATCH 140/187] Beefing up the DNS tutorial for some of the common questions/errors. (#6922) --- docs/tutorials/dns.md | 39 ++++++++++++++++++++++- docs/tutorials/img/dns/window_lights.png | Bin 0 -> 8283 bytes docs/tutorials/img/dns/with_lamp.png | Bin 0 -> 10857 bytes docs/tutorials/img/dns/without_lamp.png | Bin 0 -> 8014 bytes 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 docs/tutorials/img/dns/window_lights.png create mode 100644 docs/tutorials/img/dns/with_lamp.png create mode 100644 docs/tutorials/img/dns/without_lamp.png diff --git a/docs/tutorials/dns.md b/docs/tutorials/dns.md index 41d306c500..6fb5e92c7e 100644 --- a/docs/tutorials/dns.md +++ b/docs/tutorials/dns.md @@ -3,8 +3,32 @@ ### Q: How do I disable DNS? A: Set `OW_ENABLE_DNS` to `FALSE` in `include/config/overworld.h`. +### Q: What map changes should be made for DNS? +A: By default, the only Hoenn map changes that need to be made are to edit the Lavaridge Town map to change the metatiles the two old ladies are on in the hot springs to be the normal hot spring water tile. This is to avoid a visual bug from when `OW_OBJECT_VANILLA_SHADOWS` is FALSE. + +However, by default no maps have lighting effects of any kind. The rest of this tutorial is to aid in adding lighting effects. + +If you intend to use vanilla maps and have not already edited them, revert commit [a5b079d833f18f66ebd53ac77f00227ae4a1f389](https://github.com/rh-hideout/pokeemerald-expansion/pull/6562/commits/a5b079d833f18f66ebd53ac77f00227ae4a1f389). This commit includes a lot of tileset, metatile, and palette changes to accommodate light-blending, and applies `OBJ_EVENT_GFX_LIGHT_SPRITE` where they make sense. + +If you _have_ edited vanilla maps, the merge conflicts from reverting that commit will cause problems. If you are using vanilla maps, manually copy some of the tileset changes, `.pal`, and `.pla` files in your branch, and begin rebuilding your metatiles to have windows use the palettes that have a `.pla` for light blending the correct color slots. [Triple-layer metatiles](https://github.com/pret/pokeemerald/wiki/Triple-layer-metatiles) are highly recommended. + +You will also want to add the lighting object events from that commit. + +If you are not using Hoenn maps, the primary concern is that you do not use the exact same palette indices for colors you want to be darkened during night time and colors you want to light up. Err towards not light blending a color if you aren't sure how to avoid conflicts. + +When writing map scripts, `fadescreenswapbuffers` should be preferred over `fadescreen`. This is to avoid odd behavior from the GBA's limitations in alpha blending. + +### Q: How do I make lightbulbs glow? + +![Rustboro before adding lamp object events](/docs/tutorials/img/dns/without_lamp.png) +![Rustboro after adding lamp object events](/docs/tutorials/img/dns/with_lamp.png) + +A: Making lamps glow is not part of the tileset itself. Instead, place certain object events on top of where you desire a glowing effect. + +These object events should use `OBJ_EVENT_GFX_LIGHT_SPRITE` and then as their `trainer_sight_or_berry_tree_id` (called Sight Radius/Berry Tree ID in porymap), use `LIGHT_TYPE_BALL` for round lights (such as candles or gas lamps), `LIGHT_TYPE_PKMN_CENTER_SIGN` over a Pokémon Center sign, or `LIGHT_TYPE_POKE_MART_SIGN` over a Pokémart sign. + ### Q: How do I mark certain colors in a palette as light-blended? -A: Create a `.pla` file in the same folder as the `.pal` with the same name. +A: Create a `.pla` file in the same folder as the `.pal` with the same name. This can be done on any kind of palette; the commit to revert listed up above only applies it to tilesets, but you could easily do it for object events as well. Of note, there is a [commit reverted for being out of scope](https://github.com/rh-hideout/pokeemerald-expansion/pull/6562/commits/348f5967ac8d383c827b415e1040234a3f28626f) to make a follower Ampharos's tail glow. In this file you can enter color indices [0,15] on separate lines to mark those colors as being light-blended, i.e: @@ -18,8 +42,21 @@ on separate lines to mark those colors as being light-blended, i.e: 10 ``` +During the day time, these color indices appear as normal, but will be blended with either yellow or the 0 index at night. These indices should only be used for things you expect to light up. If you are using [porytiles](https://github.com/grunt-lucas/porytiles/wiki), palette overrides and using slight alterations to a color will aid you in avoiding color conflicts where the wrong index is assigned. + +![Rustboro gym after light-blending the windows](/docs/tutorials/img/dns/window_lights.png) + +The windows appear as normal during the day time (blue) and light up in the night. These use the default color. + ### Q: How do I return to using regular shadows? A: Set `OW_OBJECT_VANILLA_SHADOWS` to `TRUE` in `include/config/overworld.h`. +### Q: What graphical errors are likely to occur while using DNS? +A: If you have `OW_POPUP_GENERATION` set to `GEN_5` and `OW_POPUP_BW_ALPHA_BLEND` set to `TRUE`, you may have color errors during map popups. This is due to the GBA being severely limited in use of color blending and having both the overworld blended and the popup blended is difficult. + +If you have `OW_OBJECT_VANILLA_SHADOWS` set to `TRUE`, this will also cause visual errors. + +Any other graphical error should be reported. + ### Q: How do I disable shadows for certain locations? A: Shadows can be disabled for certain locations by modifying the `CurrentMapHasShadows` function in `src/overworld.c`. diff --git a/docs/tutorials/img/dns/window_lights.png b/docs/tutorials/img/dns/window_lights.png new file mode 100644 index 0000000000000000000000000000000000000000..0bb3979c260a6a43259a972779c3ef7a6dd37a87 GIT binary patch literal 8283 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 literal 0 HcmV?d00001 diff --git a/docs/tutorials/img/dns/with_lamp.png b/docs/tutorials/img/dns/with_lamp.png new file mode 100644 index 0000000000000000000000000000000000000000..4c97f76b597c6bc61a2b2e96c0256428033e55e0 GIT binary patch literal 10857 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 qTl0;8hCIl;oOfV*0Ko|N*yIRxg?f(Glvq8oH literal 0 HcmV?d00001 From f8b3a02f6c4f7c5671571a21801b663c4b4d8229 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Sun, 25 May 2025 04:06:49 -0400 Subject: [PATCH 141/187] Backport #6712 Fix party data assignment (#6980) --- src/battle_ai_main.c | 4 ++-- test/battle/ai/ai_switching.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/battle_ai_main.c b/src/battle_ai_main.c index de854bc738..18dd355ef4 100644 --- a/src/battle_ai_main.c +++ b/src/battle_ai_main.c @@ -310,8 +310,8 @@ void Ai_InitPartyStruct(void) bool32 isOmniscient = (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_LEFT] & AI_FLAG_OMNISCIENT) || (AI_THINKING_STRUCT->aiFlags[B_POSITION_OPPONENT_RIGHT] & AI_FLAG_OMNISCIENT); struct Pokemon *mon; - AI_PARTY->count[B_SIDE_PLAYER] = gPlayerPartyCount; - AI_PARTY->count[B_SIDE_OPPONENT] = gEnemyPartyCount; + AI_PARTY->count[B_SIDE_PLAYER] = CalculatePlayerPartyCount(); + AI_PARTY->count[B_SIDE_OPPONENT] = CalculateEnemyPartyCount(); // Save first 2 or 4(in doubles) mons CopyBattlerDataToAIParty(B_POSITION_PLAYER_LEFT, B_SIDE_PLAYER); diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index e20dd5bf61..a4ddef6735 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -540,7 +540,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI will switch out if mon would ASSUME(GetMoveType(MOVE_THUNDERBOLT) == TYPE_ELECTRIC); ASSUME(GetMoveType(MOVE_EARTHQUAKE) == TYPE_GROUND); - AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES); + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); PLAYER(SPECIES_ELECTRODE) { Moves(MOVE_THUNDERBOLT, MOVE_THUNDER_WAVE, MOVE_THUNDER_SHOCK); } OPPONENT(SPECIES_PELIPPER) { Moves(MOVE_EARTHQUAKE); }; OPPONENT(SPECIES_RHYDON) { Moves(MOVE_EARTHQUAKE); Ability(ABILITY_ROCK_HEAD); } From 7b686b6749a23729e4d3b61ac0a3ad1ef152b84b Mon Sep 17 00:00:00 2001 From: Vex Date: Sun, 25 May 2025 14:01:11 -0700 Subject: [PATCH 142/187] Fix Wish healing even if the target is Heal Blocked (#6979) Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- asm/macros/battle_script.inc | 3 ++- data/battle_scripts_1.s | 12 +++++++++-- src/battle_script_commands.c | 6 ++++-- test/battle/move_effect/wish.c | 37 ++++++++++++++++++++++++++++++++++ 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 0b7a765f6c..6926173dbb 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1140,10 +1140,11 @@ .4byte \failInstr .endm - .macro trywish turnNumber:req, failInstr:req + .macro trywish turnNumber:req, failInstr:req, blockedInstr:req .byte 0xd4 .byte \turnNumber .4byte \failInstr + .4byte \blockedInstr .endm .macro settoxicspikes failInstr:req diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 7abff820b9..41afb65a5d 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5033,7 +5033,7 @@ BattleScript_EffectWish:: attackcanceler attackstring ppreduce - trywish 0, BattleScript_ButItFailed + trywish 0, BattleScript_ButItFailed, BattleScript_ButItFailed attackanimation waitanimation goto BattleScript_MoveEnd @@ -6675,7 +6675,7 @@ BattleScript_SelectingNotAllowedCurrentMoveInPalace:: goto BattleScript_SelectingUnusableMoveInPalace BattleScript_WishComesTrue:: - trywish 1, BattleScript_WishButFullHp + trywish 1, BattleScript_WishButFullHp, BattleScript_WishButHealBlocked playanimation BS_TARGET, B_ANIM_WISH_HEAL printstring STRINGID_PKMNWISHCAMETRUE waitmessage B_WAIT_TIME_LONG @@ -6694,6 +6694,14 @@ BattleScript_WishButFullHp:: waitmessage B_WAIT_TIME_LONG end2 +BattleScript_WishButHealBlocked:: + printstring STRINGID_PKMNWISHCAMETRUE + waitmessage B_WAIT_TIME_LONG + pause B_WAIT_TIME_SHORT + printstring STRINGID_HEALBLOCKPREVENTSUSAGE + waitmessage B_WAIT_TIME_LONG + end2 + BattleScript_IngrainTurnHeal:: playanimation BS_ATTACKER, B_ANIM_INGRAIN_HEAL printstring STRINGID_PKMNABSORBEDNUTRIENTS diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 407d87a017..2d301679be 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -15150,7 +15150,7 @@ static void Cmd_trycopyability(void) static void Cmd_trywish(void) { - CMD_ARGS(u8 turnNumber, const u8 *failInstr); + CMD_ARGS(u8 turnNumber, const u8 *failInstr, const u8 *healBlockedInstr); switch (cmd->turnNumber) { @@ -15174,7 +15174,9 @@ static void Cmd_trywish(void) gBattleStruct->moveDamage[gBattlerTarget] = max(1, GetNonDynamaxMaxHP(gBattlerAttacker) / 2); gBattleStruct->moveDamage[gBattlerTarget] *= -1; - if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) + if (gStatuses3[gBattlerTarget] & STATUS3_HEAL_BLOCK) + gBattlescriptCurrInstr = cmd->healBlockedInstr; + else if (gBattleMons[gBattlerTarget].hp == gBattleMons[gBattlerTarget].maxHP) gBattlescriptCurrInstr = cmd->failInstr; else gBattlescriptCurrInstr = cmd->nextInstr; diff --git a/test/battle/move_effect/wish.c b/test/battle/move_effect/wish.c index e96a3e1b11..a38529d792 100644 --- a/test/battle/move_effect/wish.c +++ b/test/battle/move_effect/wish.c @@ -1,4 +1,41 @@ #include "global.h" #include "test/battle.h" +SINGLE_BATTLE_TEST("Wish heals the user at the end of the next turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); MOVE(opponent, MOVE_POUND); } + TURN { } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + MESSAGE("Wobbuffet's wish came true!"); + HP_BAR(player); + } +} + +SINGLE_BATTLE_TEST("Wish is blocked by Heal Block") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET); + } WHEN { + TURN { MOVE(player, MOVE_WISH); MOVE(opponent, MOVE_POUND); } + TURN { MOVE(opponent, MOVE_HEAL_BLOCK); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_WISH, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_POUND, opponent); + HP_BAR(player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAL_BLOCK, opponent); + MESSAGE("Wobbuffet was prevented from healing!"); + NOT HP_BAR(player); + } +} TO_DO_BATTLE_TEST("TODO: Write Wish (Move Effect) test titles") From 08f10d9f1a3d0ce15f98639ae9f0f356ac0e6190 Mon Sep 17 00:00:00 2001 From: Philipp AUER Date: Mon, 26 May 2025 09:13:33 +0200 Subject: [PATCH 143/187] Fix OW_POPUP_BW_TIME_MODE burning a lot of cycles due to RTC queries. (#6974) Co-authored-by: sbird --- src/map_name_popup.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/map_name_popup.c b/src/map_name_popup.c index fe10073fc8..3dfa583caa 100644 --- a/src/map_name_popup.c +++ b/src/map_name_popup.c @@ -424,7 +424,6 @@ static void Task_MapNamePopUpWindow(u8 taskId) break; case STATE_WAIT: // Wait while the window is fully onscreen. - UpdateSecondaryPopUpWindow(GetSecondaryPopUpWindowId()); if (++task->tOnscreenTimer > 120) { task->tOnscreenTimer = 0; From 372553b319eb8ad0b1273cc061b13c18c6c7906a Mon Sep 17 00:00:00 2001 From: Martin Griffin Date: Mon, 26 May 2025 08:33:17 +0100 Subject: [PATCH 144/187] Explicit -std=gnu17 in CPPFLAGS to mirror CFLAGS (#6839) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f2128cc25d..224f6ada29 100644 --- a/Makefile +++ b/Makefile @@ -117,7 +117,7 @@ O_LEVEL ?= g else O_LEVEL ?= 2 endif -CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) +CPPFLAGS := $(INCLUDE_CPP_ARGS) -Wno-trigraphs -DMODERN=1 -DTESTING=$(TEST) -std=gnu17 ARMCC := $(PREFIX)gcc PATH_ARMCC := PATH="$(PATH)" $(ARMCC) CC1 := $(shell $(PATH_ARMCC) --print-prog-name=cc1) -quiet From 5648792cbf44e060dae168bc156542463e652278 Mon Sep 17 00:00:00 2001 From: AlexOn1ine Date: Mon, 26 May 2025 12:16:31 +0200 Subject: [PATCH 145/187] Add missing IsBattleMoveStatus --- src/battle_util.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/battle_util.c b/src/battle_util.c index 9e18d7ae00..a3b58e3ea7 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -2973,6 +2973,7 @@ bool32 CanAbilityBlockMove(u32 battlerAtk, u32 battlerDef, u32 abilityAtk, u32 a { // Prankster check if (battleScriptBlocksMove == NULL + && IsBattleMoveStatus(move) && BlocksPrankster(move, battlerAtk, battlerDef, TRUE) && !(IsBattleMoveStatus(move) && (abilityDef == ABILITY_MAGIC_BOUNCE || gProtectStructs[battlerDef].bounceMove))) { From 803bd2dfbf0f092d5157c6fd870826349c24606f Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 26 May 2025 13:06:19 +0200 Subject: [PATCH 146/187] Prankster block check was missng the IsStatusMove check (#6987) --- src/battle_util.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/battle_util.c b/src/battle_util.c index 3f2c5f4492..ee08535a9d 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -5616,7 +5616,8 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 // prankster check if (effect == 0 - && GetChosenMovePriority(gBattlerAttacker) > 0 + && IsBattleMoveStatus(move) + && GetChosenMovePriority(gBattlerAttacker) > 0 && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) && !(IsBattleMoveStatus(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) { From de463af0dfa6e580a7fff674acbd3c1d5da469eb Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 26 May 2025 13:22:05 +0200 Subject: [PATCH 147/187] Fixes weather anim damage being applied to the wrong mon (#6973) --- data/battle_scripts_1.s | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e14cc21475..e38f7ba6f1 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5636,7 +5636,7 @@ BattleScript_DamagingWeather:: printfromtable gSandStormHailDmgStringIds waitmessage B_WAIT_TIME_LONG effectivenesssound - hitanimation BS_SCRIPTING + hitanimation BS_ATTACKER goto BattleScript_DoTurnDmg BattleScript_FogEnded_Ret:: From 99073dc9f2674d23b7b18be3c2aac1ce1a2d62d1 Mon Sep 17 00:00:00 2001 From: Pawkkie <61265402+Pawkkie@users.noreply.github.com> Date: Mon, 26 May 2025 10:59:25 -0400 Subject: [PATCH 148/187] Fix bad odds / defensive switchin double switch cases (#6927) --- src/battle_ai_switch_items.c | 30 +++++++++-------- test/battle/ai/ai_switching.c | 61 ++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/src/battle_ai_switch_items.c b/src/battle_ai_switch_items.c index 848302db25..60030acef5 100644 --- a/src/battle_ai_switch_items.c +++ b/src/battle_ai_switch_items.c @@ -180,6 +180,7 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) bool32 getsOneShot = FALSE, hasStatusMove = FALSE, hasSuperEffectiveMove = FALSE; u16 typeEffectiveness = UQ_4_12(1.0); //baseline typing damage enum BattleMoveEffects aiMoveEffect; + u32 hitsToKoPlayer = 0, hitsToKoAI = 0; // Only use this if AI_FLAG_SMART_SWITCHING is set for the trainer if (!(gAiThinkingStruct->aiFlags[GetThinkingBattler(battler)] & AI_FLAG_SMART_SWITCHING)) @@ -238,6 +239,8 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } } + hitsToKoPlayer = GetNoOfHitsToKOBattlerDmg(maxDamageDealt, opposingBattler); + // Calculate type advantage typeEffectiveness = uq4_12_multiply(typeEffectiveness, (GetTypeModifier(atkType1, defType1))); if (atkType2 != atkType1) @@ -266,6 +269,8 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) } } + hitsToKoAI = GetNoOfHitsToKOBattlerDmg(maxDamageTaken, battler); + // Check if mon gets one shot if(maxDamageTaken > gBattleMons[battler].hp && !(gItemsInfo[gBattleMons[battler].item].holdEffect == HOLD_EFFECT_FOCUS_SASH || (!IsMoldBreakerTypeAbility(opposingBattler, gBattleMons[opposingBattler].ability) && B_STURDY >= GEN_5 && aiAbility == ABILITY_STURDY))) @@ -273,12 +278,9 @@ static bool32 ShouldSwitchIfHasBadOdds(u32 battler) getsOneShot = TRUE; } - // Check if current mon can outspeed and KO in spite of bad matchup, and don't switch out if it can - if(damageDealt > gBattleMons[opposingBattler].hp) - { - if (AI_IsFaster(battler, opposingBattler, aiBestMove)) - return FALSE; - } + // Check if current mon can 1v1 in spite of bad matchup, and don't switch out if it can + if(hitsToKoPlayer < hitsToKoAI || (hitsToKoPlayer == hitsToKoAI && AI_IsFaster(battler, opposingBattler, aiBestMove))) + return FALSE; // If we don't have any other viable options, don't switch out if (gAiLogicData->mostSuitableMonId[battler] == PARTY_SIZE) @@ -2063,14 +2065,6 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, hitsToKOAI = GetSwitchinHitsToKO(GetMaxDamagePlayerCouldDealToSwitchin(battler, opposingBattler, gAiLogicData->switchinCandidate.battleMon), battler); typeMatchup = GetSwitchinTypeMatchup(opposingBattler, gAiLogicData->switchinCandidate.battleMon); - // Track max hits to KO and set defensive mon - if(hitsToKOAI > maxHitsToKO) - { - maxHitsToKO = hitsToKOAI; - if(maxHitsToKO > defensiveMonHitKOThreshold) - defensiveMonId = i; - } - // Check through current mon's moves for (j = 0; j < MAX_MON_MOVES; j++) { @@ -2100,6 +2094,14 @@ static u32 GetBestMonIntegrated(struct Pokemon *party, int firstId, int lastId, } } + // Track max hits to KO and set defensive mon + if(hitsToKOAI > maxHitsToKO && (canSwitchinWin1v1 || gAiThinkingStruct->aiFlags[battler] & AI_FLAG_STALL)) + { + maxHitsToKO = hitsToKOAI; + if(maxHitsToKO > defensiveMonHitKOThreshold) + defensiveMonId = i; + } + // Check for mon with resistance and super effective move for best type matchup mon with effective move if (aiMove != MOVE_NONE && !IsBattleMoveStatus(aiMove)) { diff --git a/test/battle/ai/ai_switching.c b/test/battle/ai/ai_switching.c index c5205ecdc6..46c419f211 100644 --- a/test/battle/ai/ai_switching.c +++ b/test/battle/ai/ai_switching.c @@ -296,7 +296,7 @@ AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_MON_CHOICES: Mid-battle switches prioritize PARAMETRIZE { expectedIndex = 3; move1 = MOVE_SCRATCH; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = 0; } // When not smart, AI will only switch in a defensive mon if it has a SE move, otherwise will just default to damage PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = 0; } - PARAMETRIZE { expectedIndex = 2; move1 = MOVE_SCRATCH; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } // When smart, AI will prioritize SE move, but still switch in good type matchup without SE move + PARAMETRIZE { expectedIndex = 2; move1 = MOVE_SCRATCH; move2 = MOVE_WATER_PULSE; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } // When smart, AI will prioritize SE move, but still switch in good type matchup without SE move PARAMETRIZE { expectedIndex = 1; move1 = MOVE_GIGA_DRAIN; move2 = MOVE_SCRATCH; aiSmartSwitchFlags = AI_FLAG_SMART_MON_CHOICES; } GIVEN { @@ -1180,3 +1180,62 @@ AI_SINGLE_BATTLE_TEST("Switch AI: AI will use pivot move to activate Palafin's Z TURN { MOVE(player, MOVE_CELEBRATE); EXPECT_MOVE(opponent, MOVE_FLIP_TURN); EXPECT_SEND_OUT(opponent, 1); } } } + +AI_SINGLE_BATTLE_TEST("AI_FLAG_SMART_SWITCHING: AI won't send out defensive mon that can lose 1v1, or switch out a mon that can win 1v1 even with bad type matchup") +{ + PASSES_RANDOMLY(100, 100, RNG_AI_SWITCH_HASBADODDS); + GIVEN { + AI_FLAGS(AI_FLAG_CHECK_BAD_MOVE | AI_FLAG_CHECK_VIABILITY | AI_FLAG_TRY_TO_FAINT | AI_FLAG_SMART_SWITCHING | AI_FLAG_SMART_MON_CHOICES | AI_FLAG_OMNISCIENT); + PLAYER(SPECIES_PANPOUR) { + Level(15); + Moves(MOVE_WATER_PULSE, MOVE_PLAY_NICE, MOVE_FURY_SWIPES, MOVE_LICK); + Item(ITEM_MYSTIC_WATER); + Ability(ABILITY_GLUTTONY); + Nature(NATURE_MODEST); + HPIV(31); + AttackIV(31); + DefenseIV(31); + SpAttackIV(31); + SpDefenseIV(31); + SpeedIV(31); } + OPPONENT(SPECIES_RHYHORN) { + Level(14); + Moves(MOVE_ROCK_TOMB, MOVE_HORN_ATTACK, MOVE_BULLDOZE, MOVE_ROCK_SMASH); + Item(ITEM_RINDO_BERRY); + Ability(ABILITY_LIGHTNING_ROD); + Nature(NATURE_ADAMANT); + HPIV(31); + AttackIV(31); + DefenseIV(31); + SpAttackIV(31); + SpDefenseIV(31); + SpeedIV(31); } + OPPONENT(SPECIES_GLIGAR) { + Level(15); + Moves(MOVE_WING_ATTACK, MOVE_QUICK_ATTACK, MOVE_BULLDOZE); + Item(ITEM_ORAN_BERRY); + Ability(ABILITY_SAND_VEIL); + Nature(NATURE_ADAMANT); + HPIV(31); + AttackIV(31); + DefenseIV(31); + SpAttackIV(31); + SpDefenseIV(31); + SpeedIV(31); } + OPPONENT(SPECIES_WOOPER_PALDEA) { + Level(15); + Moves(MOVE_MUD_SHOT, MOVE_ACID_SPRAY, MOVE_YAWN, MOVE_SANDSTORM); + Item(ITEM_ORAN_BERRY); + Ability(ABILITY_WATER_ABSORB); + Nature(NATURE_MODEST); + HPIV(31); + AttackIV(31); + DefenseIV(31); + SpAttackIV(31); + SpDefenseIV(31); + SpeedIV(31); } + } WHEN { + TURN { MOVE(player, MOVE_WATER_PULSE); EXPECT_MOVE(opponent, MOVE_BULLDOZE); EXPECT_SEND_OUT(opponent, 1); } + TURN { MOVE(player, MOVE_WATER_PULSE); EXPECT_MOVE(opponent, MOVE_BULLDOZE); } + } +} From 494a04cd765cf63f7e7dfca5899ea511a87f02af Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Mon, 26 May 2025 10:05:54 -0500 Subject: [PATCH 149/187] Add follower NPC documentation (#6704) --- docs/tutorials/how_to_follower_npc.md | 58 ++++++++++++++++++ .../img/follower_npc/follower-npc.gif | Bin 0 -> 3602471 bytes 2 files changed, 58 insertions(+) create mode 100644 docs/tutorials/how_to_follower_npc.md create mode 100644 docs/tutorials/img/follower_npc/follower-npc.gif diff --git a/docs/tutorials/how_to_follower_npc.md b/docs/tutorials/how_to_follower_npc.md new file mode 100644 index 0000000000..e55e6d8149 --- /dev/null +++ b/docs/tutorials/how_to_follower_npc.md @@ -0,0 +1,58 @@ +# How to Use Follower NPCs +*Written by Bivurnum* +*gif by ghoulslash* + +![follower-npc](/docs/tutorials/img/follower_npc/follower-npc.gif) + +## Configs +The configs for follower NPCs can be found in [include/config/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/config/follower_npc.h). + +* `FNPC_ENABLE_NPC_FOLLOWERS`: This must be set to `TRUE` in order to enable follower NPCs. It is `FALSE` by default as it adds some size to the save block. +* `FNPC_FLAG_HEAL_AFTER_FOLLOWER_BATTLE`: The player's party can be automatically healed after every partner battle. Set it to a flag to toggle it on/off with scripts, or set it to `FNPC_ALWAYS` to have it happen every time. +* `FNPC_FLAG_PARTNER_WILD_BATTLES`: The battle partner can join the player for wild battles. Set it to a flag to toggle it on/off with scripts, or set it to `FNPC_ALWAYS` to have it happen every time. +* `FNPC_NPC_FOLLOWER_WILD_BATTLE_VS_2`: Wild battles with a battle partner default to two wild PokΓ©mon appearing. You can set this to `FALSE` to make only one wild PokΓ©mon appear. +* `FNPC_NPC_FOLLOWER_PARTY_PREVIEW`: By default, a preview of the player's and partner's teams will be shown at the start of every trainer battle. Set this to `FALSE` to disable this feature. +* `FNPC_FACE_NPC_FOLLOWER_ON_DOOR_EXIT`: If `TRUE` the player will turn to face the follower when they exit a doorway. +* `FNPC_NPC_FOLLOWER_SHOW_AFTER_LEAVE_ROUTE`: If `TRUE` the follower will walk out of the player automatically after using Fly, Teleport, or Escape Rope. + +## Set the Follower +The `setfollowernpc` macro will turn the specified object into an NPC follower. It requires the object id, the [follower flags](#follower-flags), and optionally a custom script and a [battle partner](#battle-partner). If you do not include a custom script name (or you set it to `0`), the NPC follower will default to their normal interaction script. If there is a follower PokΓ©mon present, it will be returned to its Pokeball until the NPC follower is destroyed. + +Here's an example: +`setfollowernpc 3, FNPC_ALL, MyScript_Eventscript_CustomFollowerScript, PARTNER_STEVEN` +This would turn object number 3 on the current map into an NPC follower, give them access to all following behaviors, run that custom script when the player interacts with them, and adds the Steven battle partner to the follower ([more on this later](#battle-partner)). + +The object ***MUST*** have an event flag or the NPC follower will not be created! + +## Follower Flags +These are required to tell the game what behavior you want the NPC follower to have. They are defined in [include/constants/follower_npc.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/constants/follower_npc.h). The second list of flags is the same as the first, but with shortened names to make them easier to type when scripting. The first 7 flags in the list are individual behaviors, whereas the remaining three are bundles of flags. For example, if you use `FNPC_SURF` in `setfollowernpc`, the NPC follower will be able to Surf behind the player. If you use `FNPC_ALL_WATER` instead, the NPC follower will be able to Dive and go up Waterfalls in addition to being able to Surf. Feel free to add your own custom bundles of flags to the file to meet your needs. + +If the NPC doesn't have unique running frames, you should not use the `FOLLOWER_NPC_FLAG_HAS_RUNNING_FRAMES`(`FNPC_RUNNING`) flag for them, as this will cause visual glitching. If the flag is not used, the follower will simply use their regular walking animation frames, just sped up. The only objects currently in the game that have unique running frames are the player and rival characters, so the running frames flag should be used for those. + +To make sure the NPC follower uses the correct animation frames, you should add an entry to `gFollowerAlternateSprites` in [include/follower_npc_alternate_sprites.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/follower_npc_alternate_sprites.h). Only do this if your object has distinct animation frames for different behaviors (running, biking, surfing, etc). Follow the templates for Rival May and Rival Brendan that already exist there. + +## Follower Movements +You can use the `applymovement` macro on an NPC follower by using `OBJ_EVENT_ID_NPC_FOLLOWER` for the object id. This is convenient for making the NPC follower walk off-screen before destroying them. If an NPC follower is not immediately next to the player while the controls aren't locked, it will try to take steps to get back into position as the player moves, sometimes walking through impassable areas (like through the middle of buildings). + +You can also use `facefollowernpc` to make both the player and the NPC follower face each other. + +> [!NOTE] +> The existing vanilla movement scripts do not take NPC followers into account. Other NPCs may walk into the follower or the follower may get left behind. If you want follower NPCs to work with these existing scripts, you will need to add your own handling for them. The `hidefollowernpc` macro can be particularly useful for this. + +## Check for Follower +You can use the `checkfollowernpc` macro to check whether or not an NPC follower currently exists. It will set `VAR_RESULT` to `TRUE` if an NPC follower exists, otherwise it will be set to `FALSE`. + +## Hide the Follower +The `hidefollowernpc` macro makes the NPC follower walk into the player and be hidden. The game will wait until the movement is finished before continuing with the script. There is an optional parameter that can be used to set the desired walk speed for the movement. It can be from `0` (slowest) to `3` (fastest). If a walk speed is not specified, it will default to the normal walk speed. The NPC follower will reappear the next time the player takes a step (outside of scripts). + +## Destroy the Follower +The `destroyfollowernpc` macro acts similarly to `removeobject`. It removes the NPC follower object instantly and sets their flag. If you have PokΓ©mon followers enabled, the PokΓ©mon will reappear the next time the player takes a step. + +## Battle Partner +If you assign a battle partner to the NPC follower, that partner will fight alongside the player in all trainer battles while the follower is present. This turns all battles into multi battles, whether against one opponent or two. + +You can use any battle partner that has been defined in [include/constants/battle_partner.h](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/include/constants/battle_partner.h). The partners' information and PokΓ©mon teams can be set in [src/data/battle_partners.party](https://github.com/rh-hideout/pokeemerald-expansion/blob/upcoming/src/data/battle_partners.party). + +To change the battle partner of an existing NPC follower, you can use the `changefollowerbattler` macro with the desired partner ID. If you change the ID to `0`, the NPC follower will not participate in any battles until you change it back to a valid partner ID. + +Keep in mind that only the first 3 PokΓ©mon in the player's party will participate in multi battles. The other three party members are temporarily replaced with the partner's PokΓ©mon. This means the last three PokΓ©mon in the player's party will not receive any experience points (even from the EXP Share). diff --git a/docs/tutorials/img/follower_npc/follower-npc.gif b/docs/tutorials/img/follower_npc/follower-npc.gif new file mode 100644 index 0000000000000000000000000000000000000000..ca2261bf503c27e1b8ef047fddf7664e3ddd0cc8 GIT binary patch literal 3602471 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�mQp0j;kq{ZR*DfdpuX;l@bD$@3Sx6rot-3Ko8# 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 Hj-GV6k3?_v~ z_&E;hV(01=lcrvBTY2<7_{iH@N@g9(N-fEBiHX-Z4o+Rl)RiVMkxq6Flp7|O-Q1R! zTEv#QcVn3eP&$r81&nmSSHi>?3Z|v}TBih-$9kpEM8XFHbH~V2%a#>;;zAiE)0#Wn z1$Dm4>gJYzI{^P3mhQWf=`Edhm>x~;4Ojjxg$|e^fS0PXpcp$u8~@B)VaPA;u9z7< zRXkKTbt!8m)INneI@v230uPDbk|^^-_O|E^Wl~xS7lHvHl#%|j;~rQVal<7W3aVE% z;v3SZK(w=?np0}zU{Y$v<;2aY{-JmH-jo<8?)_ucfH$_oKKY@Vxa52juVY^ND>d?f zpUQHy%2V%$zeiIpt+F_!;-2TsZG&j{mju$?^jyV^{mqPQTvc28%CAWu5d&52q9YOW zA`!v!h|+a^)$_~!x3q`Z$fWNH|Bwdh0P*l6mMZK@P_>PTAZ)MRQX(g-EUgPw05e^9(a zoCL0=lKiOQ({uv`F8ljK;*Ye$UfbEy57r7QK8l_&`g1Jd3uv8oXLdbV}-i zeM`6zjj8Nxv&D_skVW>9j#bs9oN2=wdq=4Acq)2i!Xa=CETX-!@G&SJctkB|bxN8{~6VIFN2GBrUZHAhA*FyojPgEXS}sHj7M{e6pwMXY|G)?#o?hp7ggr|Osc z72Unaw!M#L;0W`G#m@*Uu6;}1;E&d2at`V|xh0gAmXjW&s`8=K*z4NP!W~I)YS>nb zwuCx*d(nJaP&1xI%$Ip;8Ym8ePE3R@%u8v(4%n)hS~U7hJ4l>f9-y`ItF6K>y95pz zd>k#mpoR3Ncw99!*Y?1Xe_!lEDP06`hZbgPbT_w_R^jAk|73yp@MwrsOSfB`U`}_ z$%8zc5fi8v`Q&$u=gvMvFOft!);TGY1Ef)cEIg z*KJ^_+wMwFhnBNCt=%(NxR=){k$QXR-#LEO>~U0{OC*u-sr$uDoyxZd+?+o@_l7NC zE!IlCPrvqRs=t@l^}TI*?>I;%&b<7&JFU@jxAsr__8o39l7#;IkFibX?^v1g!L3hU zNW#AH%VnxUDG}D);#P1|)bUO{C?mP`>smZNZ5W7goGB8=VJ!M_rl5*=x~j!e58R9+wQ;HOM^j=+Ic#1<8ao*)+U%yCKYKa!(6lIgd%T%p8JR)9W z%WgALc^g#Q;CyI4sAEUl*((Q)*RZPUAlo(JayslaBotfWw%(tquCFPMsrGZhhe=b4 zOU2~UWX9*p83>@)DrUnCaNCis{@ggis_w`!Mnp$y4Ej~3P@fvO2vC@4nkDu${x+Fi z*c<4@!ZZyd^V?!3l?D{Aj}-@&ZQ$PmTNgzI1IjZq^-Ipn?Yy4zIH==^7-0| zkwzWor0!;QTaw|Q$hM@X$Uv9AFt8F?3DAh#>g1DzLh4Bz=eVA?_mZsBFd7ES?{-5< zP-|t`@EN(kmYO75A_<;+?4dVN(A~;U)_%7&f0{???r%inXVVmnk(9sY`M;C?hDyr^ zMy7HKd0f~P&kFCmh(CzRD@S6W!ecp_P=jd)@)z`&F>785AIuOKU|Xi3p%ZTazfL-mQ;TYS}7br zx^Z;W*xZ2kNw%@9W@Iy*(`i=&6RrLa9O*ThNjA>k5DWjK#Dw`r4k+2ha(PAS4D+Oq;HRQx~aG*nAdGCij5j8+(_H6=6$S(&C&(OUil+a`7l3 z*{7Ek*hr39Ydj?B(30hIK1`6%oU3eY`n)aQr1I$!%&(as(F7|J!=huRn&MC5 z&eDOIe7X2lgf;0!QdXKM`*rMUSeia+zD^uPN)KS%B0gHWwN_f57JjATtr5K?^*Qno zxnUztj`RjcEBj}g1W#hfRRW`*na`3)v9Q=#924o(CL zSYo*>)Q&!t2s_yXfhjF9yDE>$$VRZ`LUybg8z@bE$)Lg5uQmD0ygC4%ZB25Caf4gO z1yp1EPG7X@Wf_0AcTM(@K!8Q>PQl2p&cOg>^B6{`EfhmTr>z(}J`!3{$|6C-Z+4*` zzkqF#sjgy!(Usw||F%BOBag4t16(eyVV7PZI-4%vUi+9N;XIWNO6MD|OZk%+C(I_e zLV|xcxd7TV`-#QkKc!;#K#W{F#vNA zD|T-3mu$o2T@)TZUF1TXF`*VA2_8B}lpyJ@XlUoqkEaq|d;U3CW6k zoaqGZhU%_L(=f0!i#=srUTl{oa@%!Ytwk5Ees%dzAJONb9a4;_74?wAlFPFdZT)Z@n9pv5i`TbGg*wg8BDf2!qZfTjB(V$A&jr7CylATWd|Xo!FlZj7#C{kK$X{qSt^2e5a_Rx6fP= zD+c-n43{Nx>FqRv^7}QPMseE78nxSYVn0H%P%#%6%p+dnFwS!%h4clw|>yM z%CS8ExzjR%=ho>{8#+WX85vQ5#m)EADaoYcpZ!0rwHu-IED`^t*AuA4wcn0(_fX8( zvOK_g)21pe_=Tj2t%_RZ_w+YX$e-Ibi;N07zsFqL^HlD=`^gzPdGNb(j^Vs1=n}}j zG%bm6DCy9T>v%1dv(p>+C9C+k1WJCF78-dIrSk89#N=^~PlP+A;opfM>}g)KU!Q~W zuYm;#ZWSHEg;mqt5((*mA^{PM7T5kHQX-A^_@vU3UY`ggpz@OK`|X*{4`3tp>F+dM z(Cg1PPb9iaR2hu?PB*X)-v}NYSg{uP-o}%E#Sh+AM*@McO`K9~R1?~yxmKj9Y!yOW zNx4ReIg1%e^;X*XKTnhy%GepoOmFdy5aqob4{cOnm3J@?Bp40C2~UWE8Lfi>wqB6b zy`T-Bkqj4y>PS#xD!e6%pyA4o;Xqq}x-B5%ErGNLs7eB8=|;Svq&JRa`W6VJi~8^6P#on@FmzGaGJWJaos+E1i2Wa%!rJE2ou6cOSwo3sKvK^0winZLP#V= zG@yhqswTtxXG>rmFNnS=td20aYc*zy&r8NyW)w@^s1VLDorZqi3GT_JH$@kHSol z;(e4jky#0 z1JgWx(!4X$eB0AJGZIZ)QbzUI?8}n}Xa#$R1>|t;KW7M-+9brvN9&Cyn68AGJtSDr zC)(%hUVg-KB1lsqKqNNEcUZs?R*ypJA+V4L)% z?9PYul=LuT{+xY!Z`@Yuk!*|bKn*7aTuX9tA&IRCEc#?TbUl>gRpfoGg0T;e6FWfTCFY`vJ?zOG{g8P+` z&GIxO@X=TDG~fDIi;@B>G9TIf4cu`q^@f)Ec9i-vGB=M9WA_zBKV&1?h7CM~X+prm zqiRX7?%%N@)k*Vcmd!rT);0ii*weWxX`C^aeZ&6{7O_w z;+A?0_l}B%ii(j0jAi}Ix{6rMwoIbOu;lbI2w~wQRQF(sqAU!_p)78yyd=ps;#~&P zJN~MIRWCX|oP6vO6_lEL_>NoPf zqBMTyBtiWP>P7_jj%IeBBqX$fy%)ht`SgUH^?Z!^uZRu(j16~VUK*86Is|sL^mrUm zjVkZ)Jl2|x|2CVVwCJPIY_vB59+QF{^UHRR$;w(a=Q+1VEoMAIDdJMnkeMDh_)~Z$?#0!?z!eqesz(rM7(_U z#9f^r6~%ge`V0s(Oa@%3Dru7t(go|RH(cvt^G>5OfaVKy7ujX8M6uR+v%;T|#kkOy zJ#~NVWcvD5;Ghy@&d_vnR;`Da!2uD5NH~HND3oFOxX2Owwmq=3`lres|COFHXN)p- z0h#rxt`Ii8GxB*z@5d;*#6i0^EU0bu$I0K=WQL|orXToS!jkoU#Qwg8XB`X6S;>O^ z#RU29z5D62`r(9I0GI-WYIU53)lK8wM{B+BgENs7lMV2ju%jxM2qNPo2W7g_6gIN_ zKc)E-jCcUM)h06J6o$M*8oBHm{ZX^M=fEguL)Jt�ohV*29k(IqzSKhKVPJXV2nX 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

Y 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Μ9nQfXimBFa0 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

!#f!G2=@8NtPV}T{%sfAK5k~4nknb{* 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

G6axYb(U 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

  • V@)1S+bRCu<^>IY!4lL>0w; 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

    {m4nNUgQiwLJG+Nb3buXejOquTYX< zpQ*?mq-CT)Ji>?UlV%F^=j*~JNZCGsU`qPfIj?x7PoIO-EyVQ5vP7q0_mz8OP#mcO zw={;#tNjCH_gW#v+KIM7M+$7ewn%x0_GbW{d)h@t(X+FdpZ+zjIY+OHl}^}nqNq}d zImD0rs?>tNqMT}Tu3i9M@%jEt@~zFkGRm(huQ?cgb1#kdoyu#gwfE-j9}8v5fsdW# zh68%`3S>4=+Gi6V(l18}pY^Zmc%^^LyG%u?9;|+dA&p+_enfp}F8RP&qKo>+)p^zK zV>z83jCZc=%zwpjoc#m5f;4(zU26CX^tL`%vO+?))O00XziCFd!ed&;d{jfYXp!CxXp@|M=NM-n)GV3EF12509>a1o5+jW7-_GAdU@Zv8(7cn_B zc~I+WT5dlGkVdgTH%<6Fj)@O!wwQTMO^cG zjThdtV0xNG9Ak`)XAeC|)klur&3t}IRE7ZqRn8_o6`piO^-w|p>DW~X4UmgWdi zN9%4A!!_wvqOfRC+WPDzBP;GI?{-K$!s3c3tns>;bGVwk<***U`Itw{ZK-jdtQ6DA z0TvB?@z;_u4Eybo_7l)m2TL!md#%DYJaOi|gDhxRhe*~=pqu{!XD_x>?6O)upx6Aq z8n#P{%QY^=f02D%rt39tO-e}Lr-xebPTTkbU`msoa4V$OkoPI<)|~Yu7}wXVh=$R} zF7KB3^g5WKO{e0PM0(-n?#wlr^9n2STPMAOO4ZqtO@E#xV1I^7Nf5&*GYPM_*?%Q? z?&scD1ghG~48baD^F_;7UnB4>*_U66m4(;dr<{&Fcva`6&uONMksGbD@$gmST-PU6 zX?UA?IIfm0ntZ?xwjN4W5aX;YSrB-6DbJdui_cHj+40{P-KyYkmQ1+35hC@6!0LWY zN3RL^#Nk%`*J(#m^HSQplNjcPucIs4?>9jN(=ffU@pyRZ_aXSGaj@Ll2V*>Yz`NJH z!m#biflmLW;EnMDzKP&&nxFFbZhz?XI{Gd8&#hLOZ{lWJaVtafTu`1a=}Q+-ipe7H zTfQF2iromW^F@*CHeD<&?_-~*=1H*tH8nuLGLf|_kDF!Hbvxlg!); zMNL;_ynIJ;l=fqiJ<7BSO5UMoMoab6)-4WB$I$GaRaPW4L$sUxaq3ZvG2L*sJ;Tq> zeCT_1SeaPxcxJWasB?F^+H=cqj$GNW-5FBtBkli3)Y!X&yQL;}++pzs@o24`y>{kD zlex%2sZD=@V?f==z0=TBYx>t@QUvj|+Fpw`UBUEx1Zdz(!`{*>B_Y zk!|a(fOUD_Idi$=B59=^o$~W}`PTieB1zQ4|HUo%UpoZ7G&;=e#7$w z(qPgPI`O_xI(^>ZPn^vjZ+{lf^N?aq{NX>$upr6igBmV+m#3NepKiglBe%c9nKqfZ zZ>DM=|N9pF51UUfhQtg9Q_^!?!#lqH_I`ZryP&_TUF4foAe{R8l*?iC|gW3Ps zd>U$jHtX6i6pDTCuaD7w`1b$Yg2LZ=FSaC|16zW&ri7c^LKeE{neHVvsgN!Ar@c_S zRA|^=9?cW&R8l-ST%14z70qy-952i_L*F_F2AnLcWVW_41_t^cZciJxI?rD0u97QY zIEm!sm(DyYtv6To zQ`qfAU|jYL`3BGT2eix;_syq{6b^n_RW=_?yAdVJj+17QgiBwps?)O?q!MA{8!_{#M8jq7(${$s7x%#?;N+$%5AGKzt#zV zDx<>4#T0t`y9K2r{{D5%FX5ao?~{{xlTqFiBc~N>BWG+=VQxqa5lg+#Ko0oE((xry zGIgGT9QNYg?z?EE5lbdx*vp5zi7_(g^NdKDmz1|%K#Fm>Hxp=79}qQNVsx7xup**W zAKCqiG2H*dj8cC^^EN;^X~? zoYz-7U#?Y0#C^|uaD-RWPa zTi--Od-HjvkSAS^+GxbUxs6zXPyd&Wo8*MWhj)KkBjvo9VKR788;hPC|4 zyMDp{O3|(}iM=+T^Ph-M!~3-K{Ve`WJ}vXf0a&|Rp+E#s%R}>n=cGiYOd3kfOYUP1 z^JuZ!RlE1j4Ic}nB=cWH2e(B8L|l#(DKM0%|2Wlk_pK|n^bjzJ z^3|&^JSey3B;A5Nx|p%FGWP?ZiM`yn!htW9zE{f(&l*NrPt&S2Bpobo{5SUADk{!? zP5VTGLkJ-Rmk4elxRVep1PKIpE!?H>f&vOBxI=*8?rtHt26uONhx#7gw|9TN_wJFC znK_s~r93Z&F5G6n>&M41b_BgiH^URkh;z zV5uK%$TE)kRi!fyn~50q3SLs}Z#oLgpq5_!vf`-@hA`XU@z46i?cmPh0oGtk^~Lp_ z+VTgKlW=?NrMaim-C`U25i!YzTd~evA85+KesgO(JI~5A-S=a@Ca%AFgZ2Pj9s zhG#VOw==Sk{0ZB5{gZ%s`;B;FP;53wHffP5sj)gN{NW5+bihY3PpiL&T7Nci{^@2-U6G6}jDL1roSSD{P}U}Ac7E62xuJ*LTF3ZX1_H3l zcd9kyAzHbJ+f>tnLSYm1GC31x{IZQ8>?@R;Z26_pl{j^(4Mc;p^VPjsXHMcusE+39 zy9=BCNcN)7azfg=0s4rsViiNq$(>acP-GXBp`Fmh5yI<;(p7#yD9cg*F8Xj9cO zd3z9qI&GAxjy@&GB8q#(4YRxm!cwae$_tZWU2ouBE|bA{4(x5z9g!l`?4Dq=krTwL zL9=&luh{WZF^X%Sqg8i2NKF(+q`?V-R9=MIJwTeL7XP88UhBHQ#CFaAR^SUsEM2c? zQRC8?Z`j@+8`t0-dKlxhJ1A-krj%=LyguC;EzlWizSoR9z-I^-wh{91{&Tpy2!yNw zb4Kc_ECiML6V(S)3e`opASTz=5)1mL_*UO1&z`+P!l060_9Id-Ne8Ykx^x(!ajjn9 zTOaUB07junMgVy=-AXW-ES*8%tBLs6{=6CB%%FEOTl(QlPwVtU#8KI-L6H|un*&Y)tZ?rQ`JZ@zg5Fvc~W7+GQ;PR z(x&=g){>Ka(!+++2Mz0H_<>tV8`3IiVe`>@veI@;15(?1e7Azq4sW_*@}KP+S`g@_FYYmAqnI? zyO0IDZigmW=fdJ}8DTZfae0jt&WU|H!IDYE3UJkwM$~-Ov`*Ch$rw$EWyvh4n%TMc zZHr({ClgfDdCsAIf4!T6QOkD8hZG0Ar4fiO$T_uHVUlHrMYKSwGb8z4&NZ_q`g+e7UZE^I-R2;$raju$dpz zJ@*%y+}%+pVL1Qk5aXi2S(TzN&q|bNnDa%1!C}+IB-9#wxf0%Tf4P?9<#{cX+0uNo z+-~i8msl-#c7NU%(voqp+0wFdbDD;5O(=r&P-25DtqaHI0R{%-z3B>4yE9bYW8Rp% z;z#SEaDqQz*&Tq%*Ot)miCCV6z4Kvyy?pXM{ud3N2qI=cWTfE}QDPxrxX4f;LYqjG z{B@bgFOG|a3 z{ZNQDc)Lyx^tP!M+r<_aW)bR{_G)YqMnm@tkksuWXcX*0#gzIe8QJV_6R zk<^3AT#=4#X>0Y-pY<x>FaTRoF$JnJdCJl|w(Mr)KdSHP<;gQEAz- zWc7f%Eg}qEHe53wxp98(EIgUa#Cf?3C3auL;HUZps(Rd+p)UkVl8TaNYt zw>@JymXOn2d=WnNo588fx1nI3gnP1qtC}UuI(c<*1i11ij>G)O3@LG^y9JF|BH}`T z)4s0f%OFtP!=%L^UDvDHTpnA{u-@&OP_Bi_9@lkeG^n1?ug}5`R@pPEOs#FP5Ml{g zC)?!g12;K#o~FzvfrJj#S_!RAllQ;q@xiZKEyjx8v?rMqvD^fQ`onFgh{-i1CMRAzC9Zp*^>MzDn(vlV5`zM9v!WuZD2eD%;%N^+fuAAIu~BhOs2 zfi0qGg0qyI-a;FnKfImmZFy+Xo(?-{XrHk`X{J`EDZj={*JDZiK#wJN!)&vEb#=Rp zgxT#(QV-b%`>2+Tm9~At!30fXOWuL0ll{V;I5+3Hhqd7W=_35Xxn+{v#s?^g?`+H! zyLTCOeNUEwDY4Z~OJWOSk6yvox$59#`5LD3ZG{xgrAzF=HaMItRhl~g3(R#aCarS) zqlb&U;#2#?p}Aac=N&n zF(r-mduknwSIIgysRI+qASOprQm6K?`@KPGe%+2#r%JSmeG9ph7>Qf8@r;QbdzJU| zRjHQ^)^&$YxB?TGo*Rs?|K^eGpYFIU1O#7mwoP?<;Go;=H2;^I4t^L77%C?^oBqD+ z4*%~RcmJOz=Ke44xCTPtDQ&P9xZ^5@CMJi+x~HaQ78ZZctqd(KuTHOT?^JJY?zZg{ z9-f{RAJ3ov+Z~6`@C|%813ab0aXJ7`X=1AQ^xAW(Y;X9&{^gDvF<_5v)(m>Qty_ILVX&R=dYIks*Bl_p#Mx(yC1?V*S! zMI>$K=II5TL)r88Y&-MyZtPD>MXZ+lf9udvCb_epZUhs*@%OB)JlM(A(zB|sKh#+} z#AkwsmGjx4rwtrZv{16?*O=*b5gLhZbIvK9l~p3Z4H}m(6Eq*#rqaCN=bUp8Q8t4Z zdC)-I4=F6J_(gqu5%l@M7c5H)=J8t35ZDt@F48~Kgw^Vr;``PnnPj}0h|_U*1h@I0 z40K1DG)&hnhAjuG%!fxSO{5#6>l=nf5OPkhxxiAUW}n16=B^lakV_cFT$uQ-i)!)J zQoF8sIK7OCuR~o+XzxKEOT@~X(sQ8gG*u5Nk04&u5`DEa&uDfM_#J_v7nLrk8s{?z z*5T;5r1ivs0RageytO4Jk4G;89ahRAbxJJjPRUDg4T2zNgpqvpJ|YHddle|;k*gIV z(I5b;m$&pq)jmH7ykp403^qf|-zT+O%K0qdWvFjInKM^3Nr;@Oks4>?{9k`rLzu+h@P7Q+bV= z<;9XA$V7+1B8XLdn&0c6iIT0>gM$hQJLwK*%ev4Ux9on2-Uk(Q5N0OZJffOovCk)5W-(Bof1gMeK}7hS zb3&#oS9X#@xFT<=3s21+0W{mlHZPT__H;~}8~M28r9nsyGRdKa6QciS)5-7?;xDH? zm4oWFo%^z>XDcDNKMz(D)5#E4qOALE;f!g}rwq$DAc{X5*Mnv?8Y~S0(tG((U*#>5 zaBY73vcBfq!&WrbyQANP)_2F4yHZ$%1h_)5sA{>HXfq;Z| zC43L8NMrX?-citrz@>&E=M}n$^x#%hSsQPXFI4DwTdjDm&!Bj7KQLIk+pt%LJP)GM zu&-%Ful`v3KPh~Leb3!a)H~!awD$_vyIYhPH6noL=Q6Hy{O>pK@nEuzuU^2eKE2wJ z4^q~A{W4UtgLy+f_`})?LHkt)9QjLW!2Rjs6JkjbB9=e?AAz=RBwQJ2f5#=9iZY4lr!7 zTw!XGKYkaZ8E3!gxHxa*VTtg_OiI5kF|ow2kxusMPv?vt6c`3#c246-ztICLFr%@9 zW7(Wa#S zbKUKokFCJi4`8y?!D~?MScxeM57m+0ylLz4wDbJkSZKr@IIU*JRgpZuN5a3`HRK9Z z@sbyrFao=vsmfJFF%}kW>dLj%Rr%G9=9bQG8Z#G8h4uH$Hnx4UOC)i%zvfMBfwG)M zF6Y|8rc680&sy6;mGy8?a(Kr5v-}+eJjo8Co{J~)S}wK(WwKaK7tTv zv?Aethdg=TxJm&6R;DQIpuu|vR9FeX%9I^6;%*IiC+d;%e;;0^xlV0;-7TwJ9+!28 zz!03!qdQn0(;~3`&OD*t*poeO$bFr|nRvib`80krc^Oj@p-1YWEUJ$QQ5adh+b66X z1@j(6g_hXs%LT8@#KYMZlXmS2rKrpz4c-293Lb?GR%Q^Bo5@Ke0)9)5JX+=*xsv+P z7*EH1pf^^np?)G-nX_0!X6uXMbr(UYNGWvRoEBMQs++~>d${197}m{Xw^emH>AZ!$ z@a)td*^8>U6iajAq}g$&i<-QYeN%Rg*;S#M8o?qf+lq$S1AnL50UT>xm8FH?htsA@ zatpmf{>6ulnx^AW6VFxtrQZ`ZZD^@BzLc6vC^|g95Uq|pMKza^(!jsjJ#AqccZ;O( znoc&BlQ5O!$=}D^)!+6ZUYH0R$k+rd0~-n z3U9iMz+ugY8LPKjAFS&}vM3z$Rpxi(y6XQ_r8*Y3YwqZz@lCW3Iut~aZ>tOQ|H;#K z$l>+?=B`}k<~E3NRF2EJoFgSFbXm38R z91=XBwssX3raErgWIOU2+*&+My=ta>Sc&qwTgPg-ZuM$TOBn=j!#wVyzW;R zg>U9^nlICb+;)T0t}maK4^*^RpTm>yw{wK<7?(UVhFTtET3YTH!{GJ1UiWu3UZ_A~ zZfg>V%UM66^FT$1AcG-TSDy9GZqIXF8@RnIRJ>o9cqbEj6Hj>)26$6$d6T01yvg;> zBLsFqeO`lo7~*}ZLEv{+u54F6z}yc9;Gu*;t!kjQIZ(lPs7N=|g&X?e3i@%%4ZRjB zCIOj=^Zhvqk=yc>yn=Mo`YB2J^@04<0{j*wygsA*DH3^o?e<%XGmNV-ZU*^t!~6xZ z{r5MGOt--1=rBtksIJA z=>_8n_^t|5RyNji3bd>>G|mo;n+i0)2uvUfQbr9jP!7rj2PMY`iTMY?r8WYK=?qJ2 zgGwZWD(Ql&<3Y8#LG`tPMZnw-kx^M~V1u#Qk502rI`cYl^W5r?nu(A`r;yTY^WpfA z4kGhO$e7Zv!VX=^2J_k$d)pRu`Y|#0Mk0c-%ND~lg4o55 zpeKS*&5ktB?p0s}u9}kwy1f-FQXd9oFpZ?YhB5~_aq(D));i`&L~#>Gsc=W}nMRos zx|wZ88K40@ysjUn9feJ!#kL)#6QXG(p^z?TmlWWhJuw`=niwsd4Sp{UsL0j_r$!fm_j&*1LwSpQF zBGT)PF^u5N@+WxD?|!0in202NLU}Ed&mqEuh(RYWxx8qjY8E; zm1PkkvSwS#IlF~c7WmB%B}Qdal^RR5Qj~YPZAb;kRAg41gso%Qrd2^=vnnD8jnar- zTJQ9bG-`d8Wg(C$8_h!fbAOqn`V+%OC?`Jo@U;yBdhM%W3Xj?&eFW7UaozbFkXe73 z(c%{iKJJ70AY>*8|5f?XL{~e-P@%hveusYwAw{TLy{SrUO!mU;B>478PeW$%0qIB3 zNnQIUw?#a&`mU=K>I>~QC2C4(EV}F@xJOD`N1D&=@#La*8wz?f`?vdV%I;{1(Mvv; z)Lh=s!5F$_q`fNRX%s{r=(G-b{wMtaj4-Y?Se-X&qMqAv)}%k7Av&e5xYiSOD~^r0 zRp%v{$xOp2%YX!L%j2~Wu`ln{wDqVDxV()>Gl-^bI%K5QRg?$u@#3(}OjE%rF`QXO zh1Vv=Ht)oh3_sCXU1`U*%?lmX7%()Pu($h#F6VIbX{)K`KX=rvv%STo)A$n<&+J6 zey)rpt4x*G%vsZ_<#L?JQ2L7mVgfHjAtE(XmM?~B`tXUP73I%*6N@PRj*Tg*CMyd{ zag`J_%P%pW*j33%NljvHsMH3TG%j99uzJT&VA15H6!(>gq0E|RM_+KQ+aNvt7Q%{z z(p_)!ag%HAD0pk(noXM^E(Ca8X02TAMMdr~FTz*UEbmFp4v9=|d3jUP&VH#`F+iU{ zK&+#vY+*bk>6TA7+`C8I588HtD*1tWzG3*`rme8nlBR; zNZ0)dX7?Db`);6YhY+9`W()5uf>5~T_%aq=izm-wna^7kHJ&h)m&it{W$1jV-zV<{ zvR?lrL+(!c&1b=Xa9jf`lA&I^}81~_7CJs+7|TZ&mb>8 zE#1EZi(mo1IRXnRG(x(MC?89Gsm7L`@CW?DcC~@tv{T+~Nr=M#$O9ptbVO@9QG^K_ zf8Ztgnb(%+tDEosq8u4dEs1_pu&@Qnj=g$ePuKBUJR(5g=j)eAxnghC%YymWR-QG* zcfi^Fj}Zt2R^SM#AJBkEl+5o}c*_Bu9D{fPmfu!Ur%fbSN7%xh*D}fO1Gb9->?%A>AHsh>y(wkRSg z#H4@8qW=*1S+YJd=I%`vEhta=>xo@Vg9SCS&UK&aj9t77$2yZi-WR?16)}CEjM%*s zI!*l}qXrr`XfhMNnD8kkE&y=9DNn{cmOXj$i4j*?ovaOj@oRi(->*;iIZT`;pA;Gk zodeqszfMz!_Gm@g=;du!?12eFBQyikPf*NJKkWTGW8&ah7H7w{OhTQa>BYBftjfP-$jk8@ zQODdbSovdST;l;>LK!}y?R?AIuuq5oWcZeIGe&_~nMR*QtJO5zEo)XCn>=3#;-BptLVEv~43UMQz!2=#dXA zu;xm8)ka!u0|L1ZgLxZp12LEF%%yH!Hx+79}#6Mr4DVOBKWe#M6q zQD6~-%b9o3K-)g`@NNTrh_}t{se>1m;L@i_mtnX^^I68_?beO#&9Kg(L%!Vnj!Kv7 zSXG!qvGx4!`yAJ)g5vWse)3&o6~4()D~AF~@*O$r`Z17@bM59Wkh8rVT9tKdywo~` z)bP(Are0RV=Z_p&??zFq9bUVobcg7;uN@wMi$x!fVDk# zC^mD@9{t0PziK>B+`Zg)(MqnT+ZWEuy_)u&OWb-hDTZ-X?+!hf?tbv|T{UwH9R)95 zt<$z#|MqG=%EUFv1_*H*e^JNjP=k_hd?V7V^Gc4qE|1#G@>K8dcH*oeqK$4*^;`8spqvbh|dG zcvm@lzYOqB<@P4M@+QvpeueHsP6zaLco%T{Fo1pD#``eU`qaX}?}^;li5_JLS3I;b z2Wm43weNxo*FryT0exLiQ6k?@S8kY7PzexZuEsa}67m(@59sggmGDzB@f(2oY2^AX zgS@`b`6=;uDQ@{~)EFjA8n?pyd2{@QI{gpPjLp$q9%YCm%y!Da{>sHF*VNPm<_X9U zFw7l2z^2yIKj3kG)H@!wClTP)9RM@&3RDe<1jAIFj16J~t)~o4Is+4~0xe$#CGiBQ z(gYbf1!cttrPc<)C9;F0QG-e)4a=v3%1nZ)C4*~gLG|51jZ=XoKxZe9QN>hXlfPNU zhFQ0yd4sWe{zORKMM!gONO`CENNq?LkNLDoXij$McW5tq*eYGvxT@KOvh}>N z)mU}dVQkpuM%W2z_H`t^5w`Uq-J1oNgXR$v5af*s-ZqaGpev3mnFce*%zq_elli8RcCG6hC568o~| zIq|4kh)p@>gQ9qOqtsNQ1OlVXx!o+#qK#;y#iw0GuN^-GMoVBg$<#&DnLvFuodcc0 zob)jS^gJ=Vz$8c>R8uWR*Ck5b)R*gjl*qprTk0Qy$WZT}=Ap5Hk;$pf@ma#@h4Q)a z#nrXy<+1hE&Ef6+?cIrkg`@eCzgs8%+1LV92%BS49m92eHuZ*@gtyncHn1&jp8a%ZAS=R24} zRDtjMj~^VlV@$crSHb|d}OEx&|DU?_vBNGif z9r>WBpoxgg1+gIH%Z^)-Cry+<5L^;4of>q1`BvLvbfqA?I@YUG>pCDPP_8oSb-}WZ zPJpz&A0ZDn;Qs3;P(A#}$h^FuDh)*Vg!&6X`*b zc%bAM75(e*SpRkL3}5Yotpqh??Fo|aCYZFDiT6~~K|$mnomap=wJudGjDCRtIpWZj zBZ-ttl=MUEWg-an+t%^NKY++pu9z$yJtV+p!#G!a&k|&ollpoIlAHPQ+mah<;$&LB zvN88WeliKwUQWeC?^op~3QkLT7rZqH+J(j-pkNB!908tL@luy5PhF-*+YXx{kf<^t zh2Gdtw#O{CdRBbR%xRaJGtaj*!}L(@hmU%C^ZrawO2&x~mS&TerCCXQnoqA)3l_0E zYogM^?pQkpkFISq`U?@p_9y8{v>meZB$@3AY8H0Qr1lo_FeXau=#tlp7AO68`ApAK zP-roa03||}KR}&At)`=_9s(#4*v=NrlPko+*3%NqHu5b^ph)(#OiI2x?>dMq;w7Ox z=lJKYfO9)_tjfH}PCT{aLW9x5vYxV(P$wBw-o1i;8=VlgTs^|?tn~s zAa>tyckT*VIrPGCzooB;v9nyQ5}VI`MnJK63Wj&aXgFLqm5|+}G<+@Fl(!txA z+TKjITQpmId(e1!@Lzz)vJ7Q7o?NeWw9_dbHSYb{n2I$3M5IOKE(ZC3H;KLQz!ef$ ziL-vVu73B!6L}9{AvcdK*2~A=!P0VBY;erJriW3bOGbDx|t!%MrS)d*;PrNO`A? z-bz$1@5O47eruT9PPXzL#^a!e>n$ltba3P^M)vx-Y3^_0_s1~lvviykx{fyrUjyVD z^>K=(M44pEf;9wMk)iRz@O!~$-Ux=vct%^IoI$oBmSfArJ*pqrf8hmNB^!|KcZ&=3 z9*3FU8BikkNN}vMhC=`)f}_^S`Mx|X?B|=;%kjb#sS%+uhRf9OxE>^ha-Z17wL8AN zR=Hl*XxF#vG!ht}Wr7qUayhc@1p<4N9|sAUjF{!Ndmn*F>E1fohv{CW=TUK;0!D0N zE?>05$`X<)*Vr=EdW@bbCUhIpaHY`8SSa8pF3uTqaPkfq#wsRll7X1U>AyHF*d-rg z)AFbB%DGNdr0j%%-XG@4S)N2CofLwEK`w1dNO(UQKc#=L4v_cR8BNC#G!df4lnYWA z&A?L1rDLoA>Msi)%OpTC<-*Nx)tD&xIVg}P2y^)ml`)*fEVC_bM51Ug5uLzoWQwR) zub6l-_6S7e@OnqQo}VX3pk#cFV;J^)9g}y;WFnN3KbB2%?tj;~DLJ1vUgXJ9px%^^ z-N2w+;{T%1gn&+MvR>A%87~c4lU{I>R>ib=JPTe>pm9zzS$#oJ%&=yzd(WrZx)D+kt|5gF}~1-MzJ`%>8|T;~dn`TM2;AX1(swr?Vnq~28> zTcBrTuAa%DQPp`-UEybG)nYa~e-c|=yI*AEy*nF>8duvsZfWOLFvm+$lR4~o@G+CW zbMrHxL<~|69BVYR_MHeDwAZu2MYmc9#)OTlIJxGRdFo!(mx+Z&hpzMdI#Q{f#i)arbcBElhG0t6wmxAc@;k7%!4M44MUmt2CGb4*rk?wNZBOJ& z+JEFHdZ&jfG4+d_hArrWd&_fC)!+11$3ZgK1~=5INVq&@C`?BP7?MAJaSz)1J@zQj z@^tfUl!bfG8N8y6@0J#_i;B`Tq*;yc{VH@411mIqV?N!33n`C_=wD}$cIlHlD357l z+Tb*B=~ra2kL^h|X7{=tASi}B3D8_4XXNdFKFprxvA0R1K{f2QVVjnYZSsLJaX3T> z03z1OTf)+Of1+79!dL~jK9iFCNttlSWNR{!hTi;1T{z2QC*M|zyBUr0tjagQF;yJp z8;2BgL_2FDVx84b)+@g+@sQcmy#!CS2vw#z%j_AF^8e{Uy(ssa-_w`7of?n5C@&+o zG_oe08TaHWFS_5iHP;y3xZtXTDVSa*vkv{$Y7K)2yd z+CS#ZB60+VS;Bexzp|Xhw9IXAhS#-%4i1xc$rc3`Ylcjl?UM=bH!q*^HNjyEr_rSI z+cJO~Cac*YA8UR`sf({KrTIKZv1wN_j&CZ^>bwk@eCLCT>qz+ESuBtG}(Z%%XXTcl*jsdCCO%EvXnrIUCp0`m;;;^BDVY=NK8~frd$5zU<1o|7ZXWS z19TYp%HM$q=9CLFQ}u+}d0^N3I5|P>x zP#XG3>N+UBl+*hwb78RKPqZlZ=}5)PNG|#)qe)leoG6{HC=nM|!30Ns`sfdNjuL9o zuhF6IFlQ(sn6)SR%~UiyeT=*m6kGW^TAeuR8;0+@{}CYnB0ze76aF=hPS`irI5ILm zJ<~8bKQ+5lvhZhlePeZNbYp3IaQAR#fAVN=`|PjUyMGoSjy=-drF!pOcE~;_Phq_V zYVRzW`~R-J`!CM=9q5#-5p(RY<}Zuw_Y?i`^wt@pu_6!zZ@&3FY(7>EA9M`Yk&|nD z?cqf1@YgaVRI!jJFX*T&F{{kE5b?5authF%Acg8V%ICdYlMuw>g~1(+SgVl+yuoao zq-gWmmLk-`M-<|d51^2z*o2U8*(MeKf_*9?kcQ8QZ~%q;nyK+wd_*Dd<_h#qeZ&A1 zvep3Qbo&<+qLKxmkovz+h^WjzPzd;M6w>x@C?qO-qVI1MlJs9t2zXy@*F|b$RIBYP zb=v3uKp{P)Ou|gF-l<2|DB%|AazZ_hbG-Avz%p-m#>i*Xvj0 z;L&rsX+u(dW2y*R<~l$ig~>xlAWl)@x$#&Y)x9OfN&kEe?%GYAYv9luS+5m`_->t1ZB)T6B5x|s`CG=16~2uI z4=q>I+SA0{9Y;uUlBL(dbGq#YEp=DZx{J?etc?cZ7_5ruv`ek+C$HrZ3Q$O29JHae z&=n^WFP>M-;L-)h;Oh(nId+)r#CF#p|scYZl}^?xhDrG+=oE z8M~DgFk^KsdfwmEq_y0gRZt?pYlIPRN)S=8b>T;_)(83{&jWKRgln`9NQ2=%$kDop zghXvm^p7AE98}1n-5;=o-a+3M{y=3l5xyzI^?Wx*i9Ju-LWF7K&$6b2t%EL1a$*DH zJ4=76cP092M&4hre;F@0_Y>*+GJjcYeSGf#Q91>-K;^d?FDk&IOb_zGN_YB%xX;?) zuMWb!@V@;((2D;=f)o*I$h1o85--lK{VddO>^0dgkAy(|*KmjaRTAXut`9d~LvLm? zsqm#FKc$w1hBdxefE|`&ZY0$uSXP;#pIX<+RUE6~u6Qik@?zH@y zb^Y#u00A6Xf``{b>c*upA7A9MDg_LaF^v7V^W74~ua^tz9nF~dZ6Zqi`E#ffd@P*+ zWm`-kRpQU|vG!w+Fm&<*Bo+mw!E_|w{0Jf_tcs0+UQt`RHB$A-;4MBlAhS@}Q z^=Pu~7zk0rZ0P1sOrouyDZ(M9O7q}(kyi{O)}sIc99eFh7W#PR01CPAU<@@!do$Z} zg;7x+J@C`WAaJ@5aAcXzF;V_4Kq`Nv?3pTQsE-xDEH63VQJt@!$Qy|*su-}eG-{YF zU8$~Vt}3$fk_PNM+?nm1R<{*w)}1lBHSn6sYcFMk{kWSh^=YF|yLG#@t=m>j$5+(*X60Vu=`?@DKMB(9YX zkg^o5zn*j109|*l?x@^9K4XY)BcNFJdy}k-=_TJz@lp?sJ9!xoHr0mTc?6Rw)W_RA z{QaEfI7nws|3%-FCsu4LvVsL7mH^PeS8EgI?7mC^=jq0xcpvV8ZTJcv-;Kou2oS)L zMLFHWSA7y4mAw9%ow!HS{{;CbwlTHab?>(WyXck>Betlz0d*Gpn4v}^_7dU&y|7b1 zMk>TNlyzNSC@P*@?SZI}Z+c!5Iiz{qf#|US0rKd`!pGSrW91u;)~?LLEn59Tcry~9 ze3rv|Zz2OU;AMny+u*2gD>|^O zn4MmvsR2H--mbLuL+68+CEh8AZl@ZHXVo?7=az?FSfqJjgIM<16V$j!RKwHFEoAE_O}6q@?&|k-qg_}<;~FC+M?Wp_V~jSgvvpk$ zfMkynkp(sdCToUnaU7B^H8&-2U7O)BtHTVq`?@6TW;9F4F`s*W=Tq0sc-4VjuCw5d zGQ55ykHsm|plR=8+|6)8^Vv`S`*mxOThnB*Q_W%HzI=|`!v3IhUAxDDqulKR3gu-h z>-^zIwDJk>kgIlX&x4>YzEwg>mjXHMlbD>pP)L=t&|zA*%a*B-Ycr|#i8`A54rTad zN6y1xte4=f(&5c`-@`>UOkn%^4$^+8-PL?pm*H08wtOmd6)5a^9EE$ge%pNQZd|{T z4!_>U7rtp}@jQox-))-f+{`&QALQYBu20@}akO|g|5>y@Pt&{{FjNMxbu+qW}RMS@8zewJv5RrbcuyS3rOOj;wB&1=!O^66Sja^H7Ct zp#``F1VHJ${D=a=cwpbSjCGU)&EpLX{R3la15GCa5U^ZU8y{Gp8r*ngSP~ytCvKLSZT1`8yoSa+J2s@MI;37X zq}bnl5FFBeWj0P1nrR$53e?^Ogm!j^E^dYXAu>C8X+2G2HS83&s~onP9d^(ewhgvA z+zQ(OddsJ*F43*`{}Ld8BkOo8ywBKZ@o@sTf=ZQ>ZF&j3#fC zGQIEn|Ir}-szLhtD+vEe_Y(d;n(pPrej}|#-qZAx+Lop|{=Ma|{Jc?(t|v%O+;^{g zslS5o@IOf+aA?XSN@TuQtdIT=2vYhYf2^bffFL9s5VhQYKoFI`AP82jYQvYmAPAFU ziFNo>6D-}<{{lhe{u6?Dqtev>1wqjM4T4};r}F-92vVlkiBSFsK{(|fA&Bw+h9GhO z2|=#=YU^-W!B+7OSBrKUTE_W_C5x+v_;i=rkvG=psRO%0cba$0)qg>d504P!EQ@0S z4t|6n;NbJkMK5;@Ze97IZz$1fr_?+n;D+T*H7KqSXvO!S&Izz%2}BX=Qe=F~fUZVx zAqLd@y`0f=Kd&N$5t`8HgwXqClZM`|=cUG)g_3hA80@os(=5@-X zI_GudUJaAS@Z9%=An12;Z3R}v#M1r;3Gsc5hB(mCi^*ZoLt<~4U2?VeEpyCrGXN5j zm&5ms${p3ehBBZ;KS#av1D{4wfw&r;spJ&ELQpVek`N{u(LUgZ5OpJi>V$7D2YT6=)8X5Ns1 zU$!hD%?;;ZBoSvd%Zcr^cH9AKr1&Y;Z084p>xlTxY%N{HzlCzWS9C@pv~9 zDeYPZimDdpD68if?bkHp9IiGOEi%Xyhxr}X2*}vMNsg){rF51PWKn>O@}l*y$8nZ? z`zzXIfAnniO-h-X&uwUBuPoZ{;+2GyxuVsds0+$95m7r30D>qw)HQqQ%zy4BIW(d~oJ{~dy)eV^#Gc5pr+U>*_>>lSAH2LxH%lfCe_9=iX8<$-%I_y|EhVEbzF4796deU}MOS z$wCL)KA@cxARo+Y%ebJckK{Ao13n6@U`NrlQ{Tu33Kr_&XPW$`M?DTy{;5ac0v4mU z`x=a9L-p)9P8g0xapc9wp^xnr-}x>mB9xb7m55%olUuti)Xvv{d=lKnGlLiEx%P(Y z65M&ad>rl%T!lTkonj+p5%vOWq{lU)?8On0jFms(@1$C#6iOpwqbX_ew|cI;--l<8 z{iG94=#i%Zc9aTrXjyxD)vU^6fBwv(*9iQqnST<~7`;lXme;FyP#&NC)|f6dL7MHo zVpI$V4F^5o%%VAs?`t$>&vY3u6&g*N@inH&3jAVcJes`XYs3ewlhp_sOuz! zIP2vDo#4?KlpWb0@J*y|A}SMTigMmDtB&ATM`zJFntst!|B}cun$1YPB<;wjm^v|* z!@a)!L1kwsoo_T(m?>WYxpyd&MJe@32S_oh_uJ1Io3x7;ru-H8O5ysP1Sms2yRpBsvW4$7@cdL?Ms_|IEU`sr?UyYk{fCL>mJHFkZj@WcTo5clr%;K$g?90E(zud}KXRs@CS zVvOGml9Z=rl&ecRid4)CX6FYlsvB_*tliANE0>2j+|GVXB~R9 zCrRHOa5tf>9h$6?E0^!u-;TsFSE;AI>yc_>l! zy8yvPU38WB_BTSuuziUYG#F6_ld^4~j)3qJ=_N#(Y6uDi6(WZGR3}e%X_(8N!4qWO zF8+h#a2GPeC%9@o;>PbI0~^;!<%oO5flVo(RE~-J8d2`xB%cE-+6y;; z&~vXLP`&*})0nj(;TOU8*6)FZt8bxdNG=QZ;kW&USP1Gv{2QlHaI&pWxUPTvt>BfR zc>9}@Z(K)wo6E9LWVSz2CXOZ;pJfqfZOif3k0x?)X1^*jQ*cusDVF6dq}19`%e)zi z_AC!$)J4=j<(rgRa4do0SWsZiPWm5I6vIOI^xu$7wlmQP`iiM?c z(#)WcQ&ki5fd#03ZeEDHdbG*H3g$N7Pz-6rDFV67CQUX~b2puO9D;}3hA&gOTf6|1 z({0icG9kDHh=O<@@-JO!gWGQRZTuBAS1`hBo0*FbgX9`liC|Z4lnY1SNy%1R#9cZS zS?r>b>(`%oUH2Fi+r>>LZ@j~;?Z34=Ow^w==fI7uj9& z2lhj^v$Ic~>ypS1y__2sBbqPMF0Xb3Sp=2|a4*|c1djup@5Wxi!95ZwCs8$b)121M zgAH@1Y-k<}Xz;6o%lWgA68;sLq062Mq4OLa!5tmB+i7m0GZ#;UWm~V+`Q5wW`j-1c z`$M;OAkEx)D0t#rawkB0e>AWua0WeeUr^M!X=N2UErH+dvBEF@96lVc53I&3E-tK3 zUSIdX@6J`I?uDI&?;=>>7ozSDHYF|Bht_b&s@L7tq}Szz7kq#aa=Yn;WCGbyaVwvM zWP#kCZn-|Yg5ZH&uqC~T=)CcBy@^e{f$D7nNmnvJeN1`3R`q#HnOFFZ3L;0qlwcHRcbO*SK$EPb7^ju#l9$!ozcNug)ITQD< zl75Q09)~KA%SwA)zA9H9pJ-f+W8L)V>6_4EjU`Jo3K(gt|e2G|f8>2?}L2KbA=G>)MQj5je( zlnhKJGD_MqdR$Nf1Ix*VnUaPH@j-&sLGbL{ptP%?BBEdiuHY=y;Mjnm^7!B{ok6iC z=IPa@IWI$s#LY{%9#bLRVDn$KW`GR&jUG}+6FP+c$Uy)CGR_k+4WvT0LQ*fR4vZ}q zCoI+itX9yiHfyc6O~TeX!*+SXfYR+9@$miZu+xC>^W5;ut+3kwi#J`im^HSP+~48K z-$|Um6BB+%@A;0kZHsGaM=0?fPb%UyS_C0|1QjTPx+?-d@4Iddlrhff&9o!CYUC@a zNWOqb143x?22`2bm6bk+nc+Z6NkK2-1Fkz`rL8R`#C0`HgxXz{I{edl1e1K^1M%3%mmHD2XYQoGsPw%Y}bFef0F?_(pE`!XDRqci%6| zo0hxNf`n6~{&o=Y(N)Fg2P6i{@#iq?nJ-HI0mu6|p#3^DQ+2kX|j+Z{Ug+|%NnfrjFn zAiCORg)t`(&T0*AjY(NP0sJ9-biq+Nn!DU-#mjAC!-+L;61M(J0-;Q8!9UPs-_+x};xG%cyt;b5%0`F_HbX0#6+)8}Vt% z=EvG6c6f$&cGf`f;v{jlbjeD~<*m}J7U5`#wL1RUJcSIU@U*adkJi)X`0wIb3(Ul* zf^`elldGT9`!~Y&UzZhDua5{8N!|sXKfZ6>7#TJqRB@V%p;>WS(e>frp7b$2$x30MW#N4JFA(6_2+Bh zz0OxlP02SG+p}g3SLdU%eDJfcvzIpl4G7hRj(2NkuP`ckkLe{{(3X-B9-}s*Tok%r zMk6ml~Q| z<##wf;Mr4VUVQj%>?4ZvtH4iOWcb5pEw5WF0?nV25p8F+zVUwLY}p0eA7=uLVZ|Y) zT-x||V)@U99|h=GYon3+@(NuPhGICrcrmWmj;Lwr6qleyN!{KqDsCAL?C&XOZQBLo zN+Kg2(`d#t91y05<4 zb?NYz#E0iVAG}M+Cd1LA5``5t^&ykB(^nK+F_^eQkom?7t=CSxG-+5l zlXJUW7&Yv*&v~8>DjcoJ^~5R(g@uZ5xvI~awJa8se2tF{_mdxXL@LNepFbU~5Ai#E zz=?>PLU6WS1l5_@laeJ{@Dm_-yctOU;b|ar9sN13Vkm?0hk>XGUSHTkX=dA9Lkt(; zA*TtZtdBaGyvue&sdzG3FY_q5IP80}KR^5WIgv(MPJcLGRpzS#`X*0}u&gB*D{y~_ zSZK1nzMKIopYlhtQtunN^0?sw140dzV|%&!6`6wD^v@)o{P#GCH2riEO={nI<=5ci z5Mw$T;?1$Pch~`8iDWvIMnL-Kq{Q#oSfArkp`U1^OlH_n;YZHUaF9%Sk&cO>j{orJ zKt)A*BP?F zE|s@r<*LV*3wR_%di!SvYy0R-?AjevPclGtrrlc()A+O7J)i5333uUJljFxbryeMf z#yk9NZ;|fDG?H@7x^Y9kAz;RQ!?S+rj##VyfWPuPZd!^bX`aSIko-5y3Ui+PalzdLY$Bx^l1;NiUJ zb*nf^LnkzN$NOdwTF;#RmfqlF_{3n0E_04R{>BHF>ftXvrC-BE7w^kAj#MNahZs3+ zs%}oS)V8ps?22xxKDZop#|9Vp)){GC#*H_EPfC1&K2H1tpoy?r>)XpBy zz-k}d>^hK5&0*-BHG;&=po5q5=na+4&xrOsi5(Xa zSZ1`X>NxE_aAjCrysP6!>ZxLtf z9J0D~SQ`SdbGn# ze~@kJDEBH`&_y78$M$mQU!`y#fEi=@Qhj;84Ys@AIx7T(i(N}df{ zl)Cv@21wsz-F^nK)0zn5#ZXQCvCr&P0`Z*fcx&YeGbZ!4R`TWeBGF#`D)*il?6F}a%<6?HTM(J|#Bl!BDkk}DC30dy(IXyKXa^9tExO#@;($in) zoLUOMx^LDnF^hR~*5opKuv>q&OT2qU3@B)PT&_@D;Y+9XdA6>}C=RGl`};Aj4{+@6 zt+_sFb43?)!$Ng?26e++v%?;9!-KdHoVgKI+B?X(r|G%B_=%*`LG0<-!7uf}j8q;B z@*c0&zyN7*%chUIyv(vXKXv4Zu|onnu45i|#~cKJ`vcVxxHiNDoz_o1K0-ZL^gKVs zIPtVV)L9*r+ALLYwA84arB=K=P`q`hy!8aVU+Q{?fxH7-ybN%B^v8e_khc}P_e`{p zQKb)9(8u`9$(G8;CCg{M6(H21hLzfix;g<=-h350!EMkmRNaU*XjG+kBvdC33fv#Q zNm*KnYg*y#er&RSDT02${gDaaAf_X?_eThoUmm+Zzph^hs!_bGL28A6=89qVh(TkU z;ddOPT6x1l*?{^i|BRM^_AG<$tbl&hz}_+cLE!j+2E;^}uH7>k2OG~&nNDSy%*&fD zq6W?A1}%>Tt^@O{m7rDrplzz)UBTdeXwWg0F`=HtT{#QfQNZaO{1g;|1q((p2toF> zKtr>9yc+yqJ%k`LL=3eRTAvtPC z-5y5KZcTL_M!Rm4acaZlYr_&7o}w52Ss|?tde|s1J zrqiEA2y#Tyj7M<9xFh{KJO1<8qxN=s)!PZ29ff_PWBvc4(EI*ZDD;m;ScNK6kbk1k zzuwBQg8q`ZC$^+~N>p>cO$x87b6#BQ+byM&6anip(dxQ*S4;4=SC;OrDC;K7% z^VuWsmi=hJ>-#CgD!7$lJySuDj?bBX!;e=!DpBDRjM&%ReY|-CGL%MxYR&(D8p#=)3&LlMWP-f1%L#ZYgy00DwZb z_?<$3KlE1$J@4NsblOA~1vMF2$KNUR$*pk_w>OmKe^BV{FQmn*QgZPM+aLc%p<4&s z$yNxRC|AFKV)5Zm3SA$m8T>&U=JX#Fx+Ra3$D6-W=!pP@ZuB<_okQ>^g>Ld2g>E|V z8--r_PZT;EugGGLN15#r0U*N~VNm%g!`i(*C9Jx0BYqmd`1$=xGNUs3VIHf*NUuBxQlqq3AcoNbMd8D6?mJe4DXY>XHV?_v|B_ zKI~HfN)gEuL>#^cJbSK8)|wdpIIYY%p+Rr07x6g8S~#7HgY28Nh*!^Axh@_DdB1q^ z9Ob+Pj(89fB&tm|PSq-OP#osqxI~D^{(-G0G@R)u4e@PzqnKq;c+wCtHJN_LRqE@I z+^6X@z)x#w{)0$B`$)|z)Tt6w5}mh{PHTiFqTX>3)jYIFZ9v_rgHak=psh=jh%3tS zSt=sYnu3*sT1{4W*x3@4hglK!KAf>OqSy+ z3FiT(q%+S9-aB|bZb3}RS1+;{xT!kHh^%86jk7R`tNUDKBfelD>+|nc^_zg<(qA5n zEem{n^C>VY;wvR`=6kX=k(=VOIEL-a*W6pg zEmOJtiQ@uD6|jbJhUG1an%Q=9s_rGp)uHC+^JytbUf5ez97dWs9XqI99vqilFYmex z;)^0+ve%=(*fTtgpToX=0fDC8Cr8ylYbbJlrmKMl0O{yoLz=L`=H5bQ^N*7yJxNYp z`iXIAJOn&#w9fm!*R2Z=GI3g%qb&T*YI#wC7Z8TuUqH;qTKQIrLVS(2QOP*k-ZLD8 z`X*?jGAeY4X8`Cq*D|pgZm0N3N!Zt^rI&K&h;j^v;jLZEbpGQV+B*lagLJEmxeA@e z_YULcr*xSnW1D~%kg!;~C91CqNNz;dp%27#9*`*Zy{CX5MPeqd2{PIb1QnD8lbWoF zzPBF?xGBzj*1gWp3v{D0jxx!o*QJ!IhrWPWvR=^}$;K-VRs^vWFivl%G+p#1)R%++ zFCdy&oMWGez{Syl#?NUd$ATEjilWiCb>HJnv_^qTvb&8J>#0#;ZE$&jW8rWSry%8QSCD;v2P_JYi6mq=RAniy60BRB~b-MsDEfM<^w zvg#F_hVxD<2CMkfgjIHl%AN;1hbeG}H6+H19=O+yRR;d_tl%tcz!&2%O~oPTiL{~dn4?_uWH z%A|JQ!^m^w!+6anaJ@fF$$b)T=Coj?cG+gebKKx^y(a-b9cP3e9*Zp{Sk2CEgDx(| zU9QjNNNxmRyf>)@@Cz+RIAqji=hOv$6K#%A>AWZB3J1FmN4o;`(fezz2cr(va&Gyn z4%qq*I1o47GrOm4ZX{W5_&{-V&5caoov_XRMdhs$3wZXRi*fK}^C%IxU0<<7Jl@DV zaN^kV2-@?sdSWqddaOhDztei zQ8}NEdP?bg9SL};L7YW1>`bv84YI6^&a_NWT{K#}Lsz}6P%VYcl&}z# z(U9k-A*9hEkAy<8fcKAeOXAiL-1bl!pHSlLP^#5XdVw%}>QH?)PbQEptpb>HEDSh4 z-l2vYMSHa9daAXZ>ez7ZO$5u&l~Z0r!1 zObApj93++PE}b2&U>C_b7AcDx#aJ25*~KRrJ? zy|}ctUc9<7xYED9zcF=i{5KB$t=sMsRra{a0Y2 znH6sO!9Zl0B?>{gz_Uu6f-8cRbRch?&J6*PL1V=cW;N*r+#+Ypr&v@KUnFBm|7FCY zA^FXSb&Z>1Ecd$+Ydi0!5o`JXtr3d{(c!-vv33dm!H6~S69Z}bCnHt@h4Pd)h@FuO zuXeXGpN>|n4psd^06@!cosqM2@xK88iHh;O&spC0{E}9obS^hVT35syuVv7M*_KU z8r!hRzP`W$#Ju>1`7lk-Vb^fnm>jcidh_VqF+v&ycyS96J|ALxT->vWEmGKAsE?R` zY^=t;zKDuR@aChuv3#GW=~vhGD|I}+G&$9m)&8_ad_A-UE+?=3%-nR>JM$Y*Z0z@9 zKQBxUHDO5S0YLuH(P^EoAwE`_0OX703#L(V8l92@|$jZ8f|=#MeQO@`PGl% z!W`-Ksi;*q$!|ui+gl{~LSKm~^n-ejla4;Xp~oB3tJ8d}W@!9@2%I4@Qu)lfj`oo@ z0*RWL6^#%X0=}`=T2~eQ`f(n)~^ZHuL;(# z3D&O()~^ZHuL;(#3D*Bj;O+VUZv$^-|9coZ;K6Du8ioNLto!klKo~^jDWl;O&L-)< z-5)^U%`$vcoSZ4DPx^brYRO_(43*i$Vld-Fyf>O-akNB#kQRE|Ux~FEzF&8_g*B*p+d1hKuaJ zefcP+aG>%nwgzL)m>t1$@{z7TtEl`d*WAx!dAieB$2w!hM$Z`nFDrJM5wUBZ8FR23 zEvg4MSTZ7D{ ze?$);`7X;6!}ZLzqf?wO_cKA}2p2o%9sIlhFAE}ok$TX@_BA2~daTPwvRwxE*BAq^uB~HvrwR(}m5$9j%v`(bL zLs~?bNP=d*U<8R`pG-0_q)L#zJMghF4LCR&y*(A1r9+UY#uBVyGPVkS;}&nI(^1)7 z4Kg01jm@|&t%D3BM!m=l)sP;kHx@+ZbZqd;AyeVHC7!fQA%W**aAkN(*{|QdIFw$W1?&y zwRX)MJoWj&5-wVqIc%sLf&tnq8+>0QFEYH*EWr9Y)KE-0gcfCwrSoyk^hn{oeC@kKb7$YzF-wCw657a~sE{2J%~^kD6`ty)43o{e|ce(2#P?mrm# z>A}(~bb3W^GRq}4BZ29B_Q*!!=6vn4r||;43>af=-j1<$TNxVw4n)G`W@{0sgB)Kb z!;e6XH!LZx2uriq7;O!ACkmY&Ud`SRvGbjaNxD9Mk%B}DZG3=NxFm51eqC@mc^S7W4DR;qp!7 z14X`k+6$OwXU){li~ZgQJjXVHd?eNl1>Qmy5J{*$z^}J4-O(PZKL}-SA}+89(6(O0 z=$Gezkn}1@!I6w`8PdwSVi5$9CL_6~YU9axfO_J(dv?@#M*Rf6W$N3EbK{gb3itCF)D$DBoVE8DwW614-DO)T(^X>8ZQ2HC0 zZ1ycm9-)h#e9LEPiqkZ*dTYbQ&N68lVw-%O9kSpktf2E3BqEza4OQY;1&qikDznvc zRn^0V7AhLI2*~$)vV~s2gVko7d`q=Ny7@ARHV0aR`e(p5n@2~-Xf)oXi5(a>P4*K3 zaX%>yV=*xla!?%R87WtJW~4MsGdx}(Q&E|2Vr=tZWb&W_R^FX&=7T>qt0`UigM7y{ z^1;;dzSbo2+ zv9Mc;gXp^e>zcy1cQY2jF1M{Wg>N4L1SAoVU$Jqt%0#^mD;5QabU=RP%oov+u*9Hb z*P-lP5?x5J@~V`hQ#+$1wp>}4B^kHNyaHHbNotcFLfSQ>8j~)s7I`_xk=$3Tg0Bgd z`2YmO%M{N1g*Z^_;~o0}zk;$?Z-zo{m@_}+8wiz745ef+ z=gHA;3MN;NF5EZSby{_p zIcBh~-`w6+pLLi+V1s-^yD@VktDUuDtB-T-B_VbP!ugu)+qb>Ov7ebXjyTJIZ~^4Jt5a)ytpEbD zDQ2CVd$o2u!2&S!3^}JYIhg&3(v5Y&`??KPiHo5o)uY^S?zK+luZ0&aqv4*<7zt z0Arf#maRkCscWW>!y{COCpd0cF?JaGZg_%j&)VGZp>Bkz?jU`8A|MHJ<_1i#DA*l5 zM&0vP-RS@X1kmxG*|SuF+1J2qSstuo9vu3%FV{S{&OEB+T-m9t5g|_eIQIA3JVoR^ zAIdvQ0B<2sN8sf{rp;;J))Rn2c2+$VaGd%1?er@gv;?hmVzl(KoRxIF{e8Smvb@dO zyxCX0t_1_X-GV#SV3D^Rb3F16wQ~D(Jod)O8GM$*!Zhq7#wj zEy$`HE$ABu)lJa%O=8zcMAiL*>X#Pdn?a?WuCE;rOt5%I{Ic5ofVYrBc7L$!?ORAp zmS0(=zxaw@4AkiBh(R`MK%uTtvFxppwh7d%D;IoC?Uk^bCwphNFxOyR22B9w~LvaBX#3z(;HS}3~h~}sVJq%2K zZo>izBQpr&$_mqA^Ju*1DKBULN+_H`$mXS8IFkXmz!uDj2Ij_%$XX3oYz==;9iikC z!O!9TYRuM70OF1kE+*tIE)*_>8;QXJiIl90e60}q7U$O!$ln{&&9_e={R5z`;p)M` zk%`I5v6=Cy`TW^|g_ZfG^&y}!-Mh6nyfgOS8q;_Fp)vjVZ;k18OEm#YdZTWC>P?+D zamCmG%Pp$0Y3CJY7Ige*Xt@ZBG6 z!qT5@LTsQ-82htLr~tGH-T$*qnEYp(ko6gt&3|nZ23Y-dj`drcFy(fRMfm^RCe;12 zP3Zh@bFAOngl~Vg3G@G)CCaQ2ig;gs!)3LXH2@CanB>oA5w8JQVRC+JprJ zE5++^hdn=C$62gFGl;0XjTML!>zN@+v(({GzBf&5%xlhr8ImNc9Xd-@I7WC@Gq zyEdVI=N?jlQy2TrxLbrq!e2T2p`Uget(Ka1cA})ByEs!v@yKdh>E?&Of zG)E?^(3*0=uJ^G8%knn&x=%+ST$)~ zN8LVA{|>5tlu)UZUJ;Y5SA+7ojwWxp$*It5auDMQLIGBdWkkG{{ZaDl$EMphp#jh) zob7rwE&LVj(WD74)~h0r9?&MlKm6Gy?6%}lDYY~2rWzGCn#ZpZsT%NqPv2J^Via{7 z1?jPXx86oUvOGES&OanD=sV1nHiXZ-x$km$*`fZq${ z=eP+8G#Hx0+Z_ABvCtpn5THf8+a|#Fq2ph!w!V7}6dR<;2*|Qqg;t6~ZI09) zjpGQ2wSDz_&{ zLOQJzTBqWDtl;zra=LKbE}fFkv68j64DM8bHSIbcv?o!quG zC#=LS6BYjSVOiz$v&5HaVQdjTcvF^Rk1nUl|IHd)r+NFi<5 z6u6YWRZYV`# zNZ1fpAbhJqbSdA&hy6N~(0GX$#jfom_CY9Nf;JTsFvpU$jBrTMp=FBg6a@MpK#&kc z+OA6sqco}z=!5v%b?WdiCDa7y(&dhK8h{Vu+C}xy<@k_<0FETtSQqVzqwhUYSp>bh zJ|Bugp9};1D3utPV=>teaDkaq8MoI&X{%ck_{%at)B2xW6bBN$k1|BW)<1c~4JTDF z=gEi}iVj{3R}>uOSZ!~-Gpg?3D{w{jq~B8GtC#l%FaW_*%@4Zy3{ZGvm2XPj-zemLzwP->9QbeU83yUjE( z<7Y2!Y#VkHcR!qR<0M)MJX9dr=b1-(h2K!Xn!9xa3@TK+OJw9QbL#d$oYD%HGJ9 zv>)m)wSZoD)-2Iu?hhYdCU)WIP%&MLRjOT~Z{X+x{JV*hS99#d?7c2CyD4`Z*Emq@ zd*PAd*3S6cvx1=N&S)N+Y@kgj=VLz-TyK+a%e^9n!Z}>ZaFU@`w#~t zCy1=;psg#Spet${z@<7=vbp89Iy@D0z?OFdjoCfPawCGe;i9?|x4DrDy5ncrKaT-U z5O=CdAPwT+1M(=MytVPN0&^^O2aYo^7nLpNn#UU)Pwp&RW-3oUcF+1~S1x^P z#oFy0i;Kc1Y1BK`+uLT$$2#VAj^%RZy&(s+g+Sd=p^!>vk2N2Eedw_d)Dy=S4AIf0 z(2ZI176t3ZLw%FlbW^eb3SB2vP&Y%+FKf&An&pL^H6Uo^iqhweUyK0 zrGLVjU*(zqXA1v>Hls{z!+b!+n_*NQW!MEZ>KQX?!!fGC4(!kmC;`HR`i4Lk1W@r# z#sth#1qsz5jX|U&CawMD$xrAm<#t zE8+ueZ9;^%7PK|Iojf{|GL}jyh$pOsbhnXovsLUQPQ>pE&DOA}ZIP&L!$$4P9hNS; z4cA`3JA7m4^I(G?P{KQ7hAi%zqkM8k87h;MT0^zAm!<^j-;|qT{TpP7@b^|$dT`mq z2?#CLr$;{3JPC0sSKFP|^YAg?X7}t}wF@6jX5XJI->w4w{yp@_B>vlu%afxn$9!JHV{DSpug#P~8 zgxXsMIURAimN0D(B?{_kz0dVHjWKOvLIeR9dl3|LR5xcDz9LakD(a=5G6>uxNcU8D zWp~E?5U6@i^y1yct27W=>|{t(e~Y9)TwmjtKn6@$7rty%YCAs!)PHY+$TF*2;w9am zhtvR^hhhD_kFJQ#&TowJNlauEjA2N_@t(cwKQ_P~_g?~$^p<;)2qk#bO0j;O zgU8=b6)&`!C4NTIS36(kW8jxDHa}{JDM;_0@ZWDg2Xt8Pcq0~qlN9q1;B>g^!n+Cm&NgYqO_Gp+&&i}EPq<;iM<149r z+!kbYC!0Y=(>kfq_Bi|sOC3!D*KtX(i z^m`wEvFZPXO|P;E7XBNXjw<_}>L1v2H4TH$e`C|XTQ3RyV$*>_`hMF}?2?xAKiPDS z=}+SAe`V7*_R7jXwf+a2?hX{viERFpO+R>T%*5T<_$r)$HqT2f&vcoeafkigDu01O zJ0giH2fPIr_N00(@kznn3W1F&W1bDH{GcOvu;-1CUZAtZI?Uru&2}9M$m|Np zf)w5=u^P-5dq6*Ijt1UKa0`y8{lTUaaNNBS{tze;ezubA`IAkrFaE`*|6&Vt@nLfBz z`NWXQ3cD+qMXlm)EWn27vL!Bem4|Enktkg3PL(tx{20f~M~8?;CCN9z{2QBojGMA0 z@jIJtlK+!UA7(P1PJ@u8$k4JH$iYldif$8yNV!0w(3Az#D4k(Y?)Pz0jt`+$7}4dw zv+3{uBT*=y`DdbV^`F>uM?1|Q-iaWhK!<7rxv21rnaST0gcCz~GY_ThEJ<8aX^IeFh2G4*k8Dt=aF3#rcv>{p=L3-F6BoRvc_@JB5&-+fLyz&?$6n0Xl_B&*VXfF+V$n6!t$mg(UH_3O=!Z z6JCA>8K~@i*_n^g*NEJfw|(NXH#9(q1<`nOxfuoD?>~`65|>TMs%L>Us@Sa?<{;cX zGjvTYz$V#(XDYm{BC?9U-s89E3z9Wa`7JX-oQle~y2+>*A zfwUa^ys0p^!V5~?5frzPSsA_-GQY<~)$pJxue6IPT3c4zQHgI$?|K3Q~ zGYjOLu=*f%O85-f`NKf~&`4h^Z2HB9{9;3Xu_3?MkY8-bFE->C8}f?{`JZ@#G=aKq zE9sz)!TSFGp|SDdk*U6k*^=p*xuxa&g|z{olHPq=Ngw$ymGoOYeJ`Qb0-a1a;n;kp z*&jr!+SK;y3%?%Wzg5z6lyXHtx{|P7s8|M;6sc9Y881Y0B}& zn36f6>kEJIJt#Q|BJzEHWajBOF+R^Mo;%QCnmL-0EUBuTIu>=;+=^0r`$&f}Q_m8; z2BP8W3bR~91H^~&Md}*}s9x}DBg9Nj4|ck@N^#rF7{WhIe`s1s?&#M0G@6^L;>LGrU0H^hOW$UX1I`l ztSZh>wr%qLK^!K=b=~R0?6Ab*aMCr4ZOnkf`!P`>w)vGgv`qSV=epkNMxkROk$Ep$ z948Yu9~`*z`MM9t-1gHP7SpFs6eF&8->}WSK9QCh4IuxXP*8`pRf}p^?BAgp%f0zBpCdoe~J3H&k(X49KGK@eaSrwLrP&Q$2gn+zc|0Jz{8CzSUQIS8v3z5o( z4qnocq%G}LF@L%dJ$E8)kUkt1pDz^1f}7|(dxOj1sudW&RYmUAsa+{t7w>xKD#)J? zF>}D7zh>m!#!k%@1(#_flEhK^=h4&*GZi#BW7DP==cX8T~(P*F<&D$$_n}1hF=rL9+Sp)KzGE*n@N5 zx<^8S{!feRukNK3HAEt*G**5(J$oq589wytM@Cdfd4r}?H%kX;O+w!|8d(iE9T{Qj zeu=5=b>S4Dml92z!>0Zjop&ob6;2`zQpGT!3>o z1b7o6E3Dn`kua-0>STjEo{UK~Tpy!57S7 z&CSA{&M!vcJQoL>$(JiA4XZ4Lkam%|qbHEsWomPWhg|B%Poa%VEJZ+za1NO=hVLPe zC3{eoa`)}px5qq1o)}!I_rzkpp=K0$J$KYVk)wK#+VaSQ$(j_y1cGpE5n?|qHG5WJ z%lDY|rN_suRLoHMx1=|ZoZl(~vBI?v6#V;8DdR6seX~B&S?>G2Pat{*qiTUOct3{n zbCEqAJZpZ%5NZ#4y6|`&!pC7495m-ZcC|nyusUDtXm3nJoO>p~d0`Q3v!#WLg4?#X zY!L(n{Jdmnf`a#7hkB-^k%D}MD0d!*dIL4<_tb)tC!ZoBk4R~@aRferluji7a(orm-;)ksaxeOuMT~@3k(%k6jwx8j;2r+1{y@GZ5SBN%7jhUG%eXXRVA86!9?yK0grZ-m zW0)rqpA>bUzWrxsL_+mAfk;&X+cPSB^5ACL5V8_+#Vq1Bgt4?r^SB`i9&OyphbH;k-7otk2t-vYa$# z;ie|J1hYA9mEUa&ET27B$<-gNUN|nW@1|8kFK?qAL# z?#kICsG7N;1*qRafqd&FE4)iYqW(aB4)I9{f+M-8#+f2c6CMSl53S?;Lo=KvLW*4< zF*?ns;W*8dNqhbZbegyhmCd9D7JkG<3k1PuEiX-r17!jhadsu(gA~9WxrcAN34_DAS z$2-k24rBI}^_Y9dyDVl(;|`7W-VVlgd*3Tdn$BB$$7J8_<_u>}g*{w-rc{Z9-N>9l ztFj=XcQKgIQk2O;ze1;UF_?zI5-U_^AZ3d;oB}S-(wH`s>Wv#tuQ<-p$lv(XsyJF- zV3X(pL?s8S$1+=N3WJ^2@3Sj)$$~4&UL_hBysw!UG(9P8;M&&Hav1F2si^pNZDOVu zKe+(JLTbdet$a8qH~86Vr&V^qN=h>$L8mo`VrJlAhw1elSmn5ij{9iM+zkbLG*-`! z7iR7JJvm4-Y0sW1C)ebY!m~0))9nD>sRb;Qs+RQbeLV+)#k-hx9iQqgqhM1@jJuF7 z4W2`f%&8R`7mgl*nS(?Zt`(lyvkneb%P{||B~$_Xet4qTEgiGKFJU*Besh$=$h|IV zTiuskZJ$f;HzaHu**bL2-+-$yr*}TL)_gynF|U`q z-ZV zuJD_Kj6%!y)+GDd()z=kR<13T-t)e%&L_Er*XxwC7gNDA<2a`5Tj_+3{+PsPxxCKE zehn7OOvy_<5;gTrLK7S&v;LuC^o`F0*%Uj>~tQ_VIZSf+Sq#$P1l+l)7AR zCv#rROSqgi%-$SF!>^BtT^bkR@T+K-8;~m;VGN>T>+0>}dN0QHVWlfZ3~m@ekC9m%#j^n5x=%vx-)w$}W2=Nvj)8z8jG8OcEKB5J%A=XsdU{t`(t7)61 z1%wHm*?nBwG+ae_Yt#^I!4Te2 z*SHL~*Qd5XAp~{Z@;+`TI+`^UWc@7L3RD&9?i0!k;34gyERn>F5A@o&Ym^k4y3gHjW!|*Fz|H-rK0UQ7cR#sMZr*#nlGv(<$J#{lPBd4dkr>Cdz ze|n*~3zuvY%B^GH?5=^UQ~e(^Sm7chCMBn&e)*b~o{^cAos*lFUr<<7TvA$AUIDAD zs;)^xt8Zxh_8qPEM@~~yOGjr`TTgpee`4?Vfsy{9@#fLaiH51UA2V(9(-X^UKtynB zduR90h~Um*-}&`T;bq%3zF?m;pEEKR&0X_HW8Zxq0VjfB@gEUE3zheVgm4k3qi2>c zfX1L`*izO2Zbt--NX5gG&k^l$>{c67?WLK$$$TDwdbcdA|Epj)jY>yZ_F$$Yps9yg zZS+LR+GuvimC}qBsyF!&id5u{m+BAZsB~83Pr}R>I}&qkUI-Vyg_#aLh%n=C;N9OT z7l9ScH$kyzRl6#S7h6NfM3O|SUN2Zg?QVA}n=!50#qjzQiB*@a51Q1any%W}RF4$& zX9tPZoRlC|qOD;(LO4Z0x&yhqsjIQwnQO5EouVtVA1=2h(o&Mt*;y_Og)0#kaB^BL zO{K!`!KWOKHm7sLlM7VeoSdxvFk{5ztv%oW?zXtnJ%lDV^VuoDIH#IMFgYFdAWl#PIJ5)L&ki#!|``HCvEfbr$)nL55qNW|c&BADGf4ZEGocmkwqRxAYs!14ca!OR$Xyw#r&91NK`$pe*C!{R2PC zj_srX%XWl=C&PNFI=2A}k*i z5K&7K2V~qYk-O zB|U5|57~QMKtz?ZJ}^o~Pf1Qu_)PUiW)0D0sUxL7TWL*n4s56Dkf?UI4s)AzzX>0c^GhpjFsDst zCpy>B5wav7;@OYr>ErRqR{Yb$Vmr1OoM=$Z57hS~a)+3<$?tCJeF zsjHbLKp=nqH5u;tf3bI;QBA06zwi@!vm#xJpmY%nB?yQpT@XQf5e>a6NEZy91VSi* z6nYQ6_by76UIWslOB3m6-Z*>q%%0gZb7r3NocB5Ftep=oR@TxlEZ4g3-~WH#mx~PP zr4(N(IXNJm8DxiH8?vA_OTy;SK*_D?NB4S`rgZYqiXKcpbaYSqZC?aRc=tEnWSOHK~ zb1r&`PzWFI6F;?YDfFqK3IYV%5}2{@EJHk1n-J_3j6xWEsa;t?sPF>Z=nj~%bEQqB z^d{U@dVy(IvRyp51mSU-&a}$kaaZb9ILD(|;Q8VX1@4OhF!PM7oHfnL;-#=hk20>_ zQ0Wvh9gM;Re&*$4=~9ijh{W7k956L-}@2n(I|F8;Cq*>B1Hbo{qz zVVYpUI~Y0!Yxy%$1Hp{Dgw%K8EAm?^Pa+(L(>cj)6cuQmL`Mu~9DlY}y(>5vYj`O` zB$i(Vyrzkey_C*WfKxoE(N3V)C7u>m@4Iw8NnzB%Denn9e#<(H%fx!B#74)HUy6gRKcl zaI|55q|mD&?-`|#e&IU?C^>rV`5D}JpyADuU{~Q6Y(^uU#Kqm=4f!u_hdm58j4iYK zE^L0cZhRnkzXUmzZzB_C*u%1$)dPK?MTn{=cL^xwTzW@KHm%7TkJ+RA`a^37@WKY zj7;|`QS~k+MQ>)hrw<3+8zDitzPq(Er(X}6ew-0~Mjk#yvW0A>M6!iW zHvcv4spfLD+dIbwN8+S$THKd@aUpxO>eA@T5cj(0^mT6j&kL@+cz#)v zg)OqJN?|U%#1PCrgKh_j%trLtf^W8sw<~UzM817wes#g4QiI|a5|!|oYbdT$DeG&D z58EQI-BCN&n>m`+Hw!fHB8j80%b6kRC9wd_p6hR1;uq|fK=(9z=^x%sV!oXmH{ zCvPW)GkGgAo;29%xYxoPzgP&Ebaood+!`$^uMl}R{H(fFuZ|8L@ zg-_X8Jkv^A|Cl8;CE#GCbvJQTk*~a{!NH+wXman)a(Ro)ribt3r#WA%n$;S|S5_yP zG^2bPi#=MvA-3sVjqL^tnps8h>I~;S_vQokL0|gIv$v;&)GthH1>LPLq`hbJ?#hps zNZmK{+j~V?aMqFReWQh)DUas+o3DT|^$Yxjst)!qGgQB9WTpTR0Kz|cbQ_QY_C!lbS!xHcWT^lQC)F_hXXi-;YVk zxpNW`1q5mNGXAeT9Z#<*X+5ghxOyv&>RR0E8k#K8|HYV;$oiUBCrP+y^JA_~_DJDB z9+TAE^OR9HlbxsdHP=kxKHsNhFja-W8c+MeAgJIMpFFZZt83ixGA!i{;UO*wL| zyB0pnGrC^4zw*bJ^v9U=$C&iTnDob(^v9U=$C&h=j!ESIU`)~qZv$segA2C)j+M4X zd;d~uk}e6aZBBj>`atsS&-<88K3D?) zq%@b6i&I(xsEC1cb+KRTPfdE$QT(eWm82^L&=VeLoGO=QbjI*&=NfmGW_F`Q!CeU| zWm!G(f7YbO@!SDgr>okyfvATn91Pgk%Y)eu;++FowQMzV9~Zd2r+KojQ+U7OA8C?W zRpC^f$L`uxcU93$6NHqO<54wHlPsgSO%qB57utE*A0&Nwa&xg8ecNvOV@=s|U&@0& zYZ6X7&$Op@&!YJ3<5tI6H#hsiN}IAC6Ri6rzVvw=hemz%&O%3w(6iq9n%(98bhTuS zhFaJ6%|*$34TgUHq_gMvMa^ctJ+`O&5I5d(G5gK2$pxDq!e!$a+2&F7H&@&cbD zwU#{0V-9_!33mr}sGEtrR@rLik0o$ksmDBr}|6&3%;waPC$8)jD$xi4T}$}TdQPAKh= zowP51zs71`LP@qQTsdoF#9f7V^iHl4_E*~sUxH0e*GOlbY*eo$wL79W<7l_)*4x;o z>+8GnoN#%$f-kd4NsV8oJ+H@__dpFCa3hHNc*SUrkJJp+r1K7cDLZCtn0hI4-P(U^hvR?iwr2; zZYUqTf0tFP|1FjoQrZ7PePtxLE4O0Au`r@tcg|*) zm~H=MkR&Wc*=cw# zM?1-`C&z)$fL4=|MUFq`O86eFchoa@M%96`xL9KlUzf>TV@m zNbPj9jj~UAw4I6g7-5q{)0@4aXE!SM8l94T4mu_Bd=3Zh6}>qq6r>eySfibCJn7VE z@;&b9y&-fuIZr6~vG^5HNZ86tJ{jk0J_JTWtZ$hCqjc|y<~)X!kVKKP9hN?SB5K7H z&PDd>T8pylOMlL9W)z_6`_Ej@2k;G>k;m@yKZet2*GVC1t@vA6&%%Nw%Acq1-{EeU z>j*I+Ny7$q@N&<0hEf|(o{MFE$a{7Gst`DTArt*jZ7&k0cNJMa+9oVQaC{Q>?9LOW z7JY#maZ%x@TVU3K4nDEUD7c?9`0`wbq!h>5@Z_`?Z0BN?m~TZOAjVI*+{fGH&)$0C zYnm8XDz4zx=@9WTUWC+2vH+w0Dnd1C@hYE0MNY3%rAxwCIbLcJRAxU|W+_z1 z_wj4zW7W0Y*V<174fRlaP`91 zMQT&sreihupiQ@Iw&}G9rh2^CmU~IO=~hHl-RLzZ?}aea;XzcxzRV5ZiaOK7HN6^I zs+Sh@Y_lXcP&MQnqW)*-%z$d6%_OG9F4V*g#*g*iU9j8^5E6b){@}2gHA^($ZvEVa z5aw1cjh9gRM=vgv9lqzREDizDEzrDWE|E~Y83BH?(EjzXRkreGq{}BT_qn6?^Ji}b zgoT@v3V~W4F*--Xr5Aab4m(LAzD7GevJi2?cR!j13r%5Vi`8f zGqDCa$fVa<1bdrX;N!tW#@%cgc3V+|;c#Z9OD=808b=jtN0DNAhKz%y;+WS^VB_lo zrt51a3lpQYjTJ>9*X=c0SxZ91+@i0?+rNK-AAFGbtt7qRiz<)NM0cZGMW(ug)#EyR zUa)v|a*w^eQQhR6$U!9>?&xecIf>ugCyA!{Y{`V4R;hG{>};6(^qt^;EFHv>p4~o2 zd)h}O^5kuGo&V$1?1xMQ#F>gkB?j5D; zG%iO6NH2=IgSsi%zhc`jFV+N?_qz1Dm~DMpmRT0-4SYe{_Fyor+c_=u@nC4zlEn^&kblhwB7 zTrl+&F z-yZe!8SNTo+Un)3Jsn7nCEmDMTbZ-<%1KN5mN#R!9(#O@&zAj`drxNFW$So~DQ>?J zWw&L~=RHeLIH%z7K(c=xb))UirFRf3&zkF#Mqe)=XZU{Pt5WKJ(WKXGnmub|H|QuYsz3D zet(ujONDH(2XBDA;_Ew90k_ewCHSrGR|PyD{rMQ7y1V7QG2;qFD~n*uy5PWvmtfMNOA5y-C1qZ2*1!=Yi@lysX@CO^}zqUjNc{2h5SB}U4e>3U^ z5@k>T1O};kgXOjCTi}G$rVn_&dtviPTeb5SY2B!Sdyh%-}yRD zw<)uGctpD|ef(qn)a|LZ++PP`!{*D|88?aXD)$GQJ&sYis^+wI1V?7Y5dQ*OM+`p$ zL4;qaR3RTJ3Kk5_%xB3DpmP2-UiITBKcb-@&|{~jAjYc#L;gaDh=i-L=~~(PWm4Dp zO9e-Ahb~#OtLS~zkLSWEWw|SJA}*sj3WPB;3Zw_xgcgs++6Tw zx0SgNu3-Lo;sbcr^HBaQ+&oOUa%DbDw2glu{LZNL0-RJ5k!Ua) zc7}p^8}P6uP~oc8DEYQ|l=X;KK=e6bDCu>3brlv@;Q85WRAwz$27 z>L-5*K|5(soRzqBX}g)+yObIu?yALW?tGuvU`q58aQ)`9?xBC&grDS6-M3t78mvwc~J*JPXxJ`%P; zN?txGbe8nGxnl|Cu-z80$8q~hy^$Ch8!hQ2O@}(K#=AE9^gEM`}>O!=ty$H8Ih z`*_P_lS-g%OrqQ5^RhDsV@|Cm?vw6$i4qgeeH+cwjt4Rlvv!m}AfHrZVT&^=g3xLp z%&OBPI;5Tbh&1M|;}Ln7L?LJaWkr0DVkJRs^JoQ%ia1(Dg!CRSB}zm{ea;P=_Sz_l z;kdh4we`but+8*j78oTMv6!Cuz_DP*fO|_a`Gbq^o6lWJkB^duA0WQ(^>P-dHAx@M-Fqv0uw-Go%Y)5-4Sw}(*y!{k>*kHPvM>E8?PtkuGT;AVa^8Q+g^T>Qbqlp_e*o{*D>R%Q@)w*% z1KG%~klY)8$BbQj`es7A$jh~reC=fj*=4SC@s#hmHbq0^rC(h1seX7_R3N)0S$yX6Nc01uB|A3w|PRnEf`6@F`~kN8PqNqj=e6n zDhoc=dN%MnOCjGzNe8CQwN{=Xvax#ht=EtgBSR*LLGUr$>#=6nZesguOYKbT<6J4% z+_idJowD4KLc_g0<1<1s4a9bOTrA3*T}XdY;G?H}MeNIpOe5kPRn;|8=$a{X6JI-4 zGp$q9@;UEe2#wzTwc+&pBUz7W>-0Zd94%4%z6`#`hHuf0OOL6re<4t3(9?CP^uEv1 z9u+LpB7!j`vtq&K9Lg{@jaR7-qR}OwzA(|21K(V)J#$QxhLkJvaQ`rd!#t$*KmbUS)98v(?V@ zOB_?frh1Xb*va&kmR{oqxsy+OH*p|lYWmTzC0~;F_-Nu%J-NoJ`%$N195-{r*+x@; zp72cS)^9Cm8jAz3K#95%D{iiXMvzZec4Z|3E_31hM^xL7v+PIQq^!9WoFexkgM zZf`prY+t}WQ{663!5?8IWuDH+lBtwMoQ)IAIjW*M)p(te43i7bx|lmCd*WjA=yU>{ zFfL?KI$Nux6gq}Jowbvps=x|DcezbtzbKnfP(%&_lxO3jqn}(F&~2#CT(6WuDANZJJmHJGq21r<5c7c)XkC!%E>m!)9=$QO2^Hd;J`{ zx#w8?^t{G_lD6t_#;uAHWpYWi@9f(j-yvs7nTSiY9kl~*e40IDb*ORoWV>7O@;rT? zc$JvOMuhj|g3pwA2Wj^XB3}A4_dQUjcEr~x+RDl6dPm)A9J|<}%SBfxzkGbv=$v>W zR`m9aRDVd4ODfaU z{f29=UsIp)#5X1FmGFK4^8DU$`xfyZydkq?(sVpTNjM-b2-+}mI+?d?Cc%tJf7T&* z&`RGsj!AA@0h#%%D48B77ya04O8&m>^7b_BKz6Th>-#smY;IDbAW|LfNNoKykVaQ;`v{e+YQBoF)^iS5U0ZskCl*7 ziBL=ZP#=#_h;nEcE;QI9C{!{i{4i9V8LBA>g;GJ`I4H6sFb*Av=7;)LL(}sP`@l*5Ntpac5Qm@!yP6?}p!qHP?WcL<+Wj>xf&SPYHG#zm}l zL^Mz#KJp_1l@TGUiIvE3 zrl`nqpY!-ghNH+!op4rY)MZc<2TK&!(VOIPIFA5=*E8y>K$IXfnz1H|8y|h`DEbOM zk`ENa4h@WU4;AbTyh{z0$%(nff@Ix}iB(1_u0oYTNJ})btr{tfM?Ufl(!j*Xf?^5k z`msEou}@TD^*dwbY9gsXaVH&-<|>hv260ySh!;6=j?g$8YLruF+$$B7T@Jz-gK`6* zJZey0o{?kBXn+730zwBHphH2C(4(+$f$*?ZG>ioU&j}9{z(j&DXECwiHc*|KXsiLk zlp33i!I)v9(rvJrol)62*c|E@g&It%3RYeKTVN1_4T-2eh^&H!)^vK*t;S?$$Io=c zx2(puQYVD*C2WqzuZF~bz$d)NB(&8e^c}@Z86>uQCJs_3cGScSttL#`Bq~4?hgp)^ zI=vdRJy%xa6ZE{+p-G$6Z}ORv+a!|94wCkBlD^`T4r-EXvy=BalL-J@&m)lMp+E}7 zTJkC;1$dlHrcKC})`b(_^NZJO-um;}iN|)l#xQ|U&fMv+xG9FN6 zsH|nE(PXNtW;|K*^W+aPV-9geXX;dEz8ueV^2jt5%zCaGV$l`ifXlSX&GN9$a)4#I zb!2%HSJu#ERWf7z4#Pa9!k{(T?z!2KtJyUk=u66&d^92mhVzHP0&8(0xnU$VVF=Z* zD8rmn{+vRp9F%QNQAZBe3l+oy?+JyED&taNs5BTZ+c5Vmv?e#>I5!xZ8*706N8Q~Z z;t}-x70@rIP;Ytp-yTHU}N{Q^IHku?GB?)9Lgw zu@C(B2h^Y4nE$;G1wjt>QdyW4(UIZYX)l%Bk9)0JU|2Ms@7BHH)ihh|@kk`TZ>8L; z$FXi^yZVhr(d5=)y>H*v2?65g9}pN691;qJg@wZ-5Rp;QG050B6dHs5`=jjdn!@!B ze`*T*sZ-LP%bi6yUV@8{^-z-EWsC? zSfNL33RCX)3M!sFdAHE*CDd-Qww7$!jebz}y`F{fagV=3p7GnyC|t3c56AI zP#Klca{~O-S1g$RMV-xJarRrrChrfkX4}Qef{%(8sm16nuW*QFemUXA( z<0DbLbGqeviQwwH+e2CLlpcV8(2Q~ZFn$v$?a8ke~0M=8x^ zPZ^HsB<`+ohXVYlK0YvOTuo*}A?PX1o$jCDTYG(+Kl+}lrI-r?d_P)JB2-j^x9aswL_gfP3Bji>VWePusklvXERw2Jw>KTL560WlYUJBvQ$tycPT<0waGb3AIYE^E#8T}-jN)pW6gHybbRRT9Q2eU2W z6s3{~0}&Q)crFV;+Qrr`MEE>R=e)k%mSLh{!#E2bMCvM&UDmRLJz~8wb=dKc*z-k_ z0l9ggDhj&MF)`mVc&~VNYO*>bO^m`?RUEo9}>Oko#+PLpUY zRK=;q(phN7=uPLBt;6OwIafQ@FKFAfUA=mXJo}OLEf;KG#u9%#=8=l+F1j~=Ng|U) z!$~nFe)!I^Sa;1whZouj%Wtx!raCq32Fv0%$cU3JwT6T2MVCTa+&v}gembghR{|aG zK5=@l6!?}x<+>t&g|)|D>rN`Y1;0G?u_jy*iDhB`q5{ zf&06)nh~XRFil}rQS0Sx3U}>!y~DWIImHYAvjdR&=>$zjnye z+`l4h* zjKN6?o3G$T28-gTniyBd*Qs?zYgwbUuRd&=R@mup9*@?wl5g1~)F#FitLm$Q2pgU% z@uqY8;x#Mq8{UhwGqXEl!GUyJZnr}K-`!A6Kfa4VHtJ?hFCI2g^nUUw8k-@dm24UP z;1s}MJWH*FZUK(o2xO8rqv08UcUj{lg|F2(H7VkKqu9>6rnE5w;;>P~^40bWI&f-N zbt_-tO${gEd4~1sEa|Kr(;(v)Yy`>n2U#~fm%Be7OL=xab}Wp}{AA8=gz3_0`x-mO zM$C3RtF-q^5|8iMcN@g9Z#o1RP0TP#)VB9*IA`CT?6o|o zsrbI>7;iN7El#3w!Qr`$5PItN=zf!Wg2O3R>H`Ur#JdL2b`VeL+;xq^7M|XhLE5Kt zjORQ)@DUeHxfl<#QA&2mhbwza?;;t{s9J{$Y2Xz{jXO^QkHC>8kf(rIi>kLy`* z(mDL{H3~0Skj5_Q=IP>X1ZWUp>hhrJO@*+MmtO_tUUnJgovzaB(QFZdE17mfpV5KW z80V>L0V;7_58*XYFm3us57pq%?wK6Jc97AOxcRd0?({*Ual?W5cp$m7EqRgUyK_tv zO&{Fm&)hR=lSr&nL~YJqd*;!_X}V+O_U1FD&TQFqd^d6V&5FdK=YSK_w`>U?_a{wW zBX3cAMeaTx&+mETd6K@RC(BGNI35jc{W$1eZ15;KbGl4JIQ)<-vQ=ikbl{6WGM9Bh zWfI;}`Jy<7}sK1}l8{fD{aWD84hwoR!%;usJ;i&H1{8oJO$rVRJ$Ops%7aOP( zs1j~i_%80yb+_{M$T|5k_p9cHUHZULUb0Rs8~H#-8n z;{xQW1MKu5DoobH7J(2;Yg#H7W#vF6T;K)$Kur%woMI4?G3YVQ=7zW(dp|HK&Yr42 z=vhaQDbChhGB|}X*n;2AhCkSHJlM|KzG*4g-rDXpe~5}p$os5dYwM6#)gfL~!G0dW zxuZdx{XoxgAg>t-`!B{(=V)V4Ylei&-P423E~BZ#M2ey9l!8s`BGK|{l(B5$YOLMw>t6?CW;XQC$5-c6Nq9rh~n{#x+W0K293Uw6D34VJjX^c+eF_0 z#R%p^h_6OVVxpxwqpl0YNOwkF6-AC!hd=N{o>`4lGC-TlRR9~Wf{i8~Wue$NtC+kaOa>l{7Qhy(V6s5*k<{3z91O-2lYmDxxs66Pu0_Fr5jJtD(5n&{2cLNtT3h8|(xoaYh9@N1e1F zfL&BcT8752dnRlgp|%9jJ2?r%)JeG2gadqH8z%7ppYR!1M*IFZUv zlP1`eN+p;k0!w{>5A`=lQ?f}9gQknoq)DriNYP;Kv1VXE8M3T#4_Olwz0#GvGPE!m zcd+RiFr?;Ms#aIVW2sEN+H?x36jR$|%HvD|OO}~n)(Sq;0-FU^&9ckQvg*omvd!AV zXT4_4c9hC?Gt4FtOngI}ziP96S#c04+z%C8ttYO*1_w37g~MypA2<8Q-&I9&^HGFdow#HhtI8nGFShQ~#wntNRP+JtG zTofT$^qsZ%NVSlxyXe@fm>^ZWTw6@-T}UZ__!5e^xQ-yFj{N3PLW(J&0+pOvM_x86 zxiE>~p)K7}F1->~%4b)4DX;W;cPZydgxpaKA9W0eK^X{Cb`x4Aol_=Z6eH7Jc89k7 zL0yc(ddyw5auvIBwXpJg-Q_GQD2JL@dur5E+F0GXIQ_ght@sL)?g}UBN_S|Sj!>nO z#a-0%uu3o+%E}JqpjK(b79ZY)s#U2fRKd9kRk_yTJk{d;k0TLY*l*O;0h3kfM^(W> z)fM>U%AD$=&gw|-WOzI_OsFO*4~sIYai+n2geDBJB);vgaha$I5UNd4!)2Y+!&Q0_LA|{NE_Kp&B?mtD{L`)z?-T&}%@qd96CEkJV*Z68=>NST=>BR5s=pY*h5yJ9uKqNHyuTU( z)t?NZt1gYF@gME9ng3 z@6#Wn9eq4`;_T%$0ch)B^7Ho)9u%4h&wYq!Kz6B^H}38`Xto~7tI-ad<8VnL8f9wq-$O zE|otl)~jp832;A}KQPHxz!u=;D`1n6y|!xSz_-ft#aT$^!~$0#avoREWjeW1)-R~= zIMJ`i{CYtJ4TSKef=)Ctzif8;DhH1n#@jLdQ{wRwD#Mn)xq<`|A6s9@ev4C$#Cx5; z@aQwKA&{j0WRUC?YsnAEpd-Pv`M#7 zf&K0JJMQE>9}TXidd68B`(34;?m{q<`J-ySk@h5w*J?YX4-L&C(W%iE2}PP%E`~1%ZIz`y2M=z z0@A#W^q4A61Xb(WD>d(s`Q|0IP)1cHuI8yT_qQxFzi}W>JK{g~(6!c%1Wx!_O}lvn zDb0aan9TqLxBP6EidxG0U0=D0nyT7!m(<5h>qsh}UC3MYu+wh;}%@%;kp9=Z)Qcmeq4O*-c)v$8mi7SP3fV!4(=IZNz%6t#ZF7;ER9hh0yi zX;MD(+`t1BrJQ5n?=yI>vvg@_e2vL?njvr-s;UetjZOHL!K2O6sS`06TN!8}U}2zQ z{PiL-_w?HJXBbHT^-{a!+ZI<#+#eNP+l_+Vw&aTv=(JERi-zV|-YJ9jSaCbY_k7H{ z)dEttvW>wkUgEnmfbVfJjlnLM^GS~#X}GkNC9R!iNpGk;cI?$oo=09?k%9pI1w}9< zV%GO*Sv9rKzD}i7Sow6xwm(?oQW~8C?tuXI3DlB4{lebT1EJi3FsdPeY>H;sNh&3=*R8R5s2@k8(S#Y%#M?98vJ>33<2mO8}RTVAlkcez!T zB$GQ>OXQ9BM(>v*Wj0<2+|_SmEvm?u$v1y~*9b2qUKlB3YOhCp-e!8VqIS>0@s-`= z><_o9BJx5ri*dY&?`TbrMWIFNU6a+)(b}>Po5mG(dYdA8HDP;>9xd_4UsLq1O4BW%z1yAB%ndz@C7*Y7{%t*T2ETG}}blL2lqHUD5I_Cv#`e%wMg z1AlBe^W@J`^Bp!b`fmGQyKG7Wu5M*=eCY=|ouLJ%c=(GI?`YQRGmJ%iD01C_9tnY& zIg8rvi08s(>gO+0y0-KBmLNQ7%r8%lbO?;@M0&q5KMi(k+*a6hNtCwuu6xw^)bvJN zLH^=(@1riW%~JIG$>L2l{Ktmtw=u0>rsoDFx(eaD4l}}560M%S?v*ZyVUw1!Lo9vX zjE>2Ck3LJDb8F{h{Ob1B-dgcSZ9l^D7UT-?mrg%1$e#5rlflGB!^x{Hit*NKLW#j_ z;Z4*qP<+qi30zsHXnZ(FV?M8L+}5Cpd9;E5{$ygb?W|jg z!F78xdN%w=5mUN*P<5rV)g!p~`xQA;Vs=|hlV!vERW%!8#7Cwl7A+?#2d;0rSWSLf z^{pauf}=-3-Nde&d-aC;rdzxB%+U`C;(=k~d+$lxoOm^?WokyZN^)-1S5lloWT)_n zblZ7%$u>TY9k@~b0@ZSL+k+oFQQ3x{Derl9YWKeUf~j9*LcDq_^l2W$ciblKwB2qa z;__wZ^0I7`C&WbqoW_Y?5m5B%2`F^QJor?gZsj$Q*=U_i>b`VeX?wrWk+8?lS-q|^ zSE{>8AbHs}L~TSWkR!{$J0v|)O6t<=47zUQ0EPVYh8$@fkl%F~$x(`V*< zquZql(oPIBmTi<{JDS;!^Vga@x+I9}H{0KQZcx+fa5vpewi5A66?#DwjBnXZcB@Zj zOopnG_GW^7!0{IZJ_wc(Os)(e4TaEpfT=qmlq--k9biHdg&&&NkN7On z#F!78z7NNt59f;2CnkUYQ9mvZe{SNYYJGn}wEtB}>*-~GA*ujg{s8d~e@|Y2Kg9r0 zhyUF}D=!LbdFH@}xPS-NfiqSnp;>|OI6sN1z>v{Erb8D^Nx#SZK@1(Z8r*S*4(2z$%ADUj~P-gjz8}WAve54=92did#ctLZM(PSi(3I zeh7_bh9yeEa;u?fXc#dB&t8F+QH2%ohh-{dqZsh;Vdf~-qo~VAa88@3E6^yOnkWH$ln_x8R-^f-qi@h|#alxyoP!@DhCpyd%t&c%J#iJuvkhn`Iz`P8!U>Lo#QcSAT%)x zS2>Dr6i7g@BxFDndU6u_Z4%ylCUoNC`)m?F7$hbOB*v*g3ss<>Y7*x>6Q(<{vqy=G zIoM^Jq*W+(Jtt{nHGT)5uxo(cgQ5?p6DMqv3RM!ngOWZT5&ukF1Em1gl1Yw}DQZ(_ zRFe*=;jG1pgmV+27g;gW%&BK>Q_mZwPSvEcOr%~qPQA#Q)=!01*$qSOm*=3U8W4713+vMga)o1iSa<1CxptXDMI z4uaXPU0ElfY%j0u*VybgwZu|KqCaa&04pxg3m1&Vk>%o=@wnDb9HJH%y@u;Hz{RlU zAdgcFCvYg6OySy`{i95xAz)dvSXFbgZFAXS#5;PqH*GT#h^io!k-nBIUJG5tgq?@w z5uiDF@Q%EDFjyT;QiEWAlWKlTS7_^TQe$pJjctCfVSbla{zsaE=Gyd8SpK+F!2mX2 zTD73Bt6(brh~17q*PUzIug!Qw`hpDq5E++JqII)`p$f z{xk#>t_X=PBK0mNWPRSWC`L7M_73zOEpc)gozaB9F&QsExf6 zuFkc~3I1o8K*cPedJ|-L^X5%E5b;NWn}#>Fyj8VS!9-Zl(lP}9{CK-~BX8bpP?gWL z(<(3ohueX*kXnXFL+=Wg2BckPpf^z%yuAZey)#w43$(&3ki_T+U_k=1A%WPV zPiXj)HB?j-6cjX6R1m?T;lDr!zyB-5LPEswi*60Q?yfM*e~c)qjHtY`?>V z$lqW>JOoHW#00+IVuC~q*>5pH97x0j<$r()XMVv1z~5kkIDm}vcbG5^08woFk^c@8 z%z!bB{}2;I{}vMrlO6%#0bV#1X`h#b{lFoBHvS4<$~2`_G@`YR@ILCF3N6WIP4Cb0d2 z3B3Oh6By*~lmEm7ELRZApD=;!Z!p0E_&ZE!r4{`>CgA=#CPe)P6G(o82{eDjgo{5h zftuvMgb6wSXD~tTve-|b^`vVjHz=S_A;h$nc7J%4H_%CC^MbTjHe&E}2Am2+8 zb}ka`|5KQtPs05xCUF0X34H(Em~idoe={ar`vVjHeN15gZ^i_}KQQ4BO!(i!g!5OJ zuYhh|5s()kQi6ag2;?mwAYe%RLiGwrOF$lcQ_JqAmJ7&`SX+=cRF#)kHB{BovNP0@ z_m)@nRt19%?S6`b9r5F02lghqgSU4A=w_gye7LGs0`bPaw;|Hb4vaKR2((KG3`{^0 zuj(U_$OPi&_c-vMenZ5BkpFp1IP>pd0^R=t6DWRS!dUa4Za3We3nm!-3ry%}{=3@^ zw|>P0kzX)@=0Cy&#-Et5PVy@zfXV-a2~jQoJ|;AX`Po({Ki5(0yldxwsqsO2zHma) z@KhPS^1X=DgWc9|rY((UP0GJr63_@`x?uux|DyJ+UHZn|JN{%;&E1@DxsNRNi4_Hz zdv^gIG?)67lC2M4DRya(F(}=q0g!|?2h0P_IQ_<+EUJj>GwA69&$%5E%mBay03o)KQ3jVJPlM1qNIVkq>&B8$Malu6Yq3Bujz2pJ zMoFWVNoGK<<=2A@=K+a8=}^8D6KZoV9^a)h?sNlc!Nfom$4dYbz@-Tw57WXjcpX<$ z04RbO9NDKhY6%0sA%XPDuOo~jw=H}{{dS$2RaM)UBzZ|V)cnMe(v2M0J|kYXg$%q7JJiFR6Y*QF zT1dL9pegzNWa~WOZBSwUmP|F(IC#eWYuAmpee|RcImLn5YED72@6QyCkmIXv_%F8J zK%LwA{6Mbxdms4bVC9BR6g) zScZaO~+T$#xAOUS{xc4Dol|mjy(+ z34i9g0BV0IFBhpU#6Er&e<%C?ARwBK?OObPhx7|A(wO{=Ycd!WDtl)nQg~6|E=E<; zRtuRQo*|@8-K~~e8kdodWA~-9ItbNQ_y(0;M zlzu4)rvPHrf(O%Qu!t=y5T8LuI1i^2_X&}w+w2tjn{o~ z2^1~b;_d~CyIXOmxCf`W7MI|j;1XPmyVS7a?(SBgrFc%>ckR8-oO9MXbM~h_bEcW( znI|)ue8?nE?*DaP*YEm=P36-Ukh_!rN3>AOvqILHStib549c2OA#K8{Q|hl%g_cpJ z=~boKls#L^-%@SxbgWavI$s<`RB2_yYBZ)i-(uQQs~1#dv_rmd1)Qt&K4Ud4@zF28 z(uG&LIGVr!b3K6hh9Ff|i#U)$KkH3Hs4BZA$*bA##Qcqk-yCiEMh(VY=9|3coa|{% zmc}z%8_VUK9TeD>rW7 z(gqJ;ivRTFW#4+Ca63TR`!j+s*Ayqb{VP?STewo-Ca!wFAIR(HwYjJv87%R8Tgzn} zW{uTrnfgId@2VtK(H&|guOZIfPbsk=YwCx&VQ%6pc(;!=Lb-R}ZRELEZMO}g&)tY| zJ{P!$eV;q$Zq%N$Df=N{pU-h=?3*)h&WzK>-j%>;>)5sHMU9;ZoR0tT#-kwTy`A(m z*<`q$OOe2jT~RLYAtt>m-=tG}W%bUftTLW3?jE2j@A3@8{;zTv13br&FUGMpCc8T^= z6RH5;IW_OrdWthk+^*=keD97D@VUEy$l{pk@%gk*-|>szUWn?qeXpKJA{8FD&^OHN z73MEHBSqaA%rH>x!yHd6 z%uE*+@^22lJ^6cWn67_Z`E!6KPGk864t3TwS?!g@MZ@9P?2 zy3XCgJ`|j}8(YDZxE;I*I)4xvXXSUl*N(TiNxD6>BXN(3rTTdPe({+t3SN~|@Uiq_ z1NPJwd=+iUGjFY>XOl^6gK1!eUJ+6Z=NJx!U}1#92yd<6wgg=JP$EU^vZ&C)vQV<2 z&~5!-y2T(y-(V(t``xTCkX{(`Z5V5N*qg;L9@233cKdz1aNd}3&Wdnx#qiLwu-Nb6 zQi|a+zV=~J_R3&*P(MQDFyi3AB$+WXgE&k=ATmiWlFHZ9pgmN-B9cNe(8NAc2kcNW z?=xeIKx~d!8|CaU6xG4#r^__`mFI2n=bXB6C);0lh-S&VhOjm=^PQerlS-V%v3g^RBppmUd%KW zU>a9!s?bp??@}tGQkoc9x?pUQ>~NaAUz%cNst9Jfa%IXZyo^0?f~H}{tKk$~p$r3H zh6YQOrBl57?Zs} zT>NlXOubzEO1OmkzKFiFnE$v~u&S6CP$KG3tl1HpEL5Va1cd;hGRMWrorsFZ5Y>BV zIa%qu`%JC-Tpc5*o>8f}U#YY|)Yu`zbfnn43T{y-v&n|OBrkGOE+kqmdvRap0w}-f zDD&_ycV{j41C@JKl?N%8BX^dE-IoW#oe9Dfcz}FRc41t0Mf`n5B6%e?Yvqt(<)~6+ zmT+aZL*>j;MNW2Qu78oGQDwnV>09BdXTP#aP*rhu8SO|_{c#lopt^~*TId)Gt*WZ+ zgu<#Fs>Ovtmt^szfSMGRnheDn1wh;vQ2w{7n!%BpVddCS|AOzVNdw0<^UF2U_cgPi z+96@+I-qv5vv!HRRu*niP_ElJhHfp_9^cor_{Nuz)(;wi>J;lQ{p*Jf;_mO`A4lSD z@9VES>u&%JC?fI5C-rbcLIHC_E@=bSLjyWnJwbH?#`{k%UVZwV{fXp#JrQQ|y?rwE zXfokZGLm5N!K1tS7K|?S7|YHY*DRlVPXLXKr;Q0vMf(BBCK<= zY~!-b16m!c;TDC~NMM!~R-4Bwu&ZO6`$LwO3OInR4fv3gT?HOuY42vKjKFFS=N z%S~QR$ur79I&M$tYX7vtE-N!vU#Pm{h___q%!fpb15KTz?B737E)4DZc_Lu9{iL=h=zrRn+DEP zV4-2*W`P?RxVeRdgp^51jc91JxLLGVxTU$djf8~YN`#P+kdZRCmb4Hl_kRcxM#{?4 zTK`HATFP(@0xm)*8)?ChT1H0y9*m6sSJi|6m)FB14+;PKg$45e55mIP<-vvd)y>W? z(?1VOclVD7C3hzT4TVji#@OVt?Wjgk|Fd9CE^d<4*3bJ>37h~}0Brt@4<}+%%O$33 z5x|Mqgt~Rs1TWx3Y%-M86{gD&I5y!w3fAm3V;|fQBkcbvSW}}xsv-JGGh1y?FODr( zZ5~x){)J#{m`_jYll=@Ov;9rYa+?83FAqlBxpqfg_wrgm`q^r!*&P~RgU`uqpJ*-M z8Q71q)v0wi&?%tV5IUMbv629E{h*Q?$d&VkyV&z+G})b89J~NIjtRgdrGC@ddW4@e z*PFOnGiNs!h#X(1v2}Ac+htRH|03HJmGEmUA=s2$^1Q7}-%(Ka`nP2Pa#>sfC3Qar zLR^~Nuk_jjpJrrQUodWAchIkk0ovLq;H#O(pJOB;=p?f~R3R3Z->Dc@nWM}NF6Hq0 zQBh6t5D{+0z!~0H@<=c>b8_2AiwOL5gKY$|s0t$Sp*>{pbbmy`5 z$suT^n}vxw+J?{=0GV|@sWgIAJVgGU(C!Ft`G;IFWipGcVR1}R#yk<8LlwGlvnkyV z6VOqWHlu%eO;Z^;fn(h6v1wHj8VkKG5951;+7fT*D$V!LXwHog{x}Zk_EVd^2HWy>i$ahHon{Na$kQOOM`0*ZOMM|t`d0k%rMd<;v3k_&mq=J|3P06gz#GYs zsH-1sa_N~QFVUIHoto4s=r(zfa0DfG^RAq%UN{1wKropZ#MZcTnHChMy#E`G%r$_7y8Ub7Qc8qN2$_}fPta2 z8G`B&jr~bYO{1o5ozT2rfbZh|NqfbxjYD8LEps^nAtfglVJX$j;^nv zB|dLT{~_TIaoGKOnSR{QS)7LR0Cf5Hy_}zvF_IAuTNM%mh&o?^ye}xQagesCJtdod zP7{2LxctskA9$qmwl82BCx#jcnf4u5^9rYx#G|*8+eXhYBiBT#BZVQ3&c%LQ2;W2O z!&2L(9o$Xe77XXWK6#c)6bVubFiaSFKreSw{8Xp?63(1G9zDh{^tk z^t|-##Vh$A=GpFGQf9{W2&Es^j5A;n$1 z3^fQSX>~6aJ^i+fv$j&g6)+QaoL(TBSE=q!u9Jh)QvUE*$(zJF`wtRZK7mE6lw7y! ze6~vWTa`*_=UllZQH2?*qd}LjZf%rqjTu9=c4?J%skBS2Tn3BI9$=xZv8B$}i_PTs zvR>8A@4DMvHdADg#la`Oy5A2D=tMaNHJtOG5?YSo1VF<+z0BIIQlM=RTrIIWHb9&w$SnGo2%5x=<37$+dkM@eej=QGlT;DeniHfA$D=^(GKPZ@bsL* z86M363X7izzq>`5ytjB^2L3{&=Nx0>xJ3}K_?4QoMoa&-epgldw@Mp#M=NYAvOeGM z{B>suJ~ca(bZy;i^T41lCmU->hD`wZtCR%e-3`vAVby2%^p2HvY9`3AuHIF8#;XmK zvNr2Q)ayUeWVT#wBtN=|uCqj9WcdmpW7d?s*(*-_x8p+Nj+u2iXV?c~X+mRO&%Ak5 zZ1$pkh7+N^O$9_0!f8R=>1y=OIa7i_C5cY!6qj@8fdNp}Y$chfz4NBtEk(7?P98an!!B>zSD{z9sXDETXN{iYP;{r< zy3qEutxx6MbpLj~xZ8f!2YYtypAh-^oA`14>fEQ>Ec+t-L1YUOBIPof~8#bHB8?giC1Ia1YkhQBrJcc~Rcb5f7XVvC6P zc;;G@9eRM(w_fkYwzX4Ng@Dz$XR+3WwKJdSfc3p#AF$clslcBAAT05w|5g5{F!jeR znrh#dX}4dK)!ldHPHzWQp0Cmiy7zc-w@<gWRZx1K*&@CDeT7`wkhp`IU!-EgB?O|MtVNterZ!yBS55qoqhr{&*c5pZ! zI7~7ooT)urW-(lWG>oPnQCg7vH69WTLb&o!#GAti4dzI7#Yh_aNKMi(?ZpVjpAja9 zkt!HbmNAhw29XxNk*45C+o34yipbafk@n2do{Ley_DDy;D6@(vyO?P2_Gqu$sKCRh zV2tRXis+9+i1c_!YRpkBDUpnLNN{X|25GE{U~C3yRI+`f2b`ZU6q|Jzn@tK*CI!Le zg&bcHxB^tR7+Yxo%8UV}Vt|?!L5<9yW^in4MI5YsF|I}t)Q=I@(hmAM6!%>a^r<3V zPmml=Hki1LuUL$qG)R~>cr{C!FejMcco;t~7`wQbu;H7qcpI@^k+5o?xPy_nM+#b2 zOa%KTu8<}k-zJ`tCY^v2&uOj zC6r2Im`1LYnlO~cv6RL?oR&_SPA`-$Vwf(@lCBh+E^C+~PnM#*l#X?mjzgBAaFnhR zo1s;itmBughnXP?$*{o8v{K5nIm&?98D;=uGac{JERHfQ{W9G;GHish^dXtvLK#*{ z879LSMt2#KnBX8_av&U=Fq{rYC`49*qnE(pWZ(!O*nb$D#sW?q&PWo<&}h%p07Jk> zkcbWla0!yjl5O{I>cIvs7gS~k9A$$rbEH{vgg|c9UcU47Dc141JMUrr3 z9BbvBQe~(^WeT7$8B~!!QdtNpC=iZx9*T4ZN0xU+SB{jM##Dv0S6MDrRRXHrnX5Gv ztJ{yOU}g7JHRRR3!qxp%F&)A+9=FwPZCV3RupDyY&VZ~_$x$dbQrvL$O4 zf8VS%0_RpFbV9NmmNNT?n-$rz)J0lUR9e*Dw-^MpaCd?;F-w$;ph?3mTI8*|fL2@% zm)7AM;7^@cwy_lEUw#+<16G@F(!mpPQ5$ zt_8q-2BdJa0bB!sI}BLhA^=n<|XP0vq3|BXkzrO!@ z7>3X0gV>ALOi1REI7mDAy9!~*pF{7?W8K<|EWd@F(Jnih7lwXGA{L;x{^MeX5RLO1 z7J#|}|Dsuw>b%l1Z;+iIi6=z@? zft2%Ykg~1=v~CMe)E93vY#s|2K@xT41;Kk4hi{2_4+sOxZP%1rwPmf6h{zbbiO&8$ z7rbpzd5E{~k)%TU5$%c9y0N)!Y~tirXS>a%3=v-734#NK3fHHH?#U6%efUlaNy3!n zP43=0w`3##(tTLuKJ0CNSmLbpzCK2cFudl3Z+J9rebue!EbJ0QM(YX{QC}GHbN^l~ zLvj(=)c@yfmBiT&hq7(|>U64Hfxh6*@+a-%G8grRXVLTE;-9==B!2Y5kAbh--@!t$ z9m)%Nd_{-eg(F=t(eNr`7k-T-)Uv0JCMDsR%)0N|Zr~MNjvYjr+lj z7wY$|mU#g5cAofa3_WXzY|=1uLkSYzAv~8LBHT}#g7J*Eizq#g!GH*O*S`&Vr<@#$ zLIC|mpCXOjP>h5zWdAi|Fdk@yV#>PNk3t;3w3B3q7S*5Z#QJ47)k1if5s&^DvY)Sa zqtu^D^wuae#XI#V9048b*N+f=wRC`z=v`$~ARZ59O!j9SVJs)|g@huJiIP`Bg)!bB zluGK6gDdsb3PaHd>>F6Y=Do^0IE^Dl)wMAMMTgwE=T)I8{pS_-HBIENtYGnQ669$y zj~5mr`sa1OaD-i>0FG8^r<{1y*9Mz)s60YY1k~es4bF}OQ%7KL*5@IvKDy@z*M6h} z_}2OYWxQJ-7Srj)X8_%6_W?pI=|r$U z#M73aHV(fjsks_`YBlB^=iYedG0t=G=rO@-X4EwPbminR#g3l$Yf=Tv`R$~*x~k_G zFcEtP!pH{KusB!RQau2&LsK1J2BTU?za8fx@nQ@ZB09VWZ5O&?MwOB-N7K4anC|WxjE;2 z$3<4>_s7sSPT@oIzF_~;mWgry^ZJ=}zl$!IxbXSsjYRLu2CDk|J%4}I(xOmqs;8w% zt3=!DSsAXUg9*ovPrue)b@p6u2$+fA%_SA|+#b}s_THW=Yy{t4SgH3t{@id4dfwY{ z{Rpe8rfmGG-y>66AA;;eiG+nAiR|DSivE%sndVj!Qy$MBGoBI^(|!P8=@v$@yNS+a zAc>o)5y7Nm4$y4>jFveWNo`z&W+Ny={y8~<18VWY#`g=p%Va1GN--{Snv@trLyYX} zVuBQASw_ms2z7Rgmmd#h8OR+#@FXq~q+O1a9REGftUl>LyEKd&URTBP7G76{A;+&g zm4FdZg0L4OCG4FNW%{-lCldT!Y+o};_|b|0`Djp@;40botu<{dSjx%dIL_lW5&a3X zl01Bd%7oH0a(F4dv-uF0u?uAsV^P*{nNCQgXJG9s8gZiCpm@F`dRcQ+~Na;)S z-TdTC(4w;Bf9-L+VtHpy@Cp32CZAiTW7JyO71H`x%KHLU)fzCF-J!GpHpfp@E@~>r z2E~pF|4#Ko)J*P8K~aAqeNE~v=% ztX+t~a41D2tP#$iUI5@IeYw~wY1>+!jY0H zKsmimC)-wZv4XNy<>S~dW4<|(FP087d8wLZ;&Q|qM42->)4#IB7+AHus%GCa{;p87 zVbzHio-5z>td#F@&}r(dPsNYdG5LKwPI}i|4`Quhc*SOvggOs_%%!=Akr_wc=r#Jo zaRfw;(^uK^J#{U0AHO-8&ynl5jHjDt3ZHN%Wf+)1T*amvM!t%D=PcjnQfhU9 z^&l(%zAn?>a6111pN;>ph}m_NK&c}(l=^IOnj609@4H$bf_S=tKu8*9)M6f{&~6^X zPnwKNX&q6nqVQgI@w0=qTNFjN1%{8oXR5LW;+A7&-n!|p42(Omy1ACtwTs_4$`}j{ zMHOByfWLb+yC=G@%29sQ92ASXq>>37&YS-<$1l2xwrZvB!wc zcOJ3o+{r4jS8D^?kyeeKTFA9noL?2$RjWO4eLC7vEROOMLJC4OU5wI2BwukA7^ zwR6^f+4G~WsYv23mkzx3EW*sQmxnD){m_ALZsR}MD=Qe4MBiMOcD>%`aO^0^f95Gy zpg2|wzn{gI^QzK!p43V+n#0>`thRgMC^^zOkLqPF?KL)OGI+nxisoGxu6kd7^baCPmPv%L?0+%*!{c=Je466va^ z7$u&44ZlEefGyZPUL|*%;KKL2l*?th#p*VBlJAh}`DJ=m_bv+6-FJOTkMuO-UH$^0 zAL`HUc{|+)tQ&r#uHzpd=uZcn2fkAusKGlCrPCudtZWf69 zekL(JispLQAlmTxezA7>&zO#H<~yYRd zKLICdKL2h=>N&Mje^_35zGDD*F4)u0q`t=kb=dvN z#?z1hY^R{_ap0if>8Q>3aWHWDiNqJ?6Owe`?j+!&A>eJi5CR(XzykZ=fkTLfLUa#8 zbbLZzfGe__Zg-gPB|Jy^|6@0y-eRS=;^z9>k1|$8V zBbh29O_-z14kHaoy=@eu>=eDNVxk-|d@K&5_UuBC4?lV-Mo%e(_}fSO4Mn3ehXnb4 z3=@orFn|;JV`9KDp!S&f#h5G-r2i)!3;_d%fQa$>KU++P8jAjHF@={l{huwSgGtmf zpw~+OlXU%GmY7cbj~$zesS?FBR(NL*l$gd4vYGyX zgRTdY=~VLHbu|9>C8jMW3k_DI`Kn#5XDjUUHW%j zy8icC`geNzJCOeTJCIhJj&=TBMEzYv!Og>em8ic;)L(J0ZmrAr`gm=$t$w2~1R0C+ zU3R)(l30L}Qi9<%9}}ej6O#l7 zgBTZ+1RsZ(0G9+GpO}Dv#DALM{__MCX09tXZOLe#or~p=U)QCGZ?kc0qOAsfj48ys zeBWc7L|^^ep*A(iW*ePexUQd_ucBSJS$+|T)tNTq2eIzJZ-?0TY?)8trSFtt73rrg zU?D;HZqhEE00AdAR<(CLR@}e^vDbPCJ)>nBc$;d^pk`bc zi%TFG!Pg-=G63z?k_-}FBnA#M%z0N41E-JgBD*`r%R1+W*^zN?{1+Rh46p!jIg}|a zO|1Y>>ILBqHyj3J+=Am4$6_=Sa<%ZJ^-yOW;KWER(Pswn-48A|2U#V|?oNat) zc5zwmG_o&ts|Ikc7$^(eO786x){fKgYmmR#rmqvuvMPI)64h&@mB$>f znsXp)kb)Gc?hp~!UQA5|sNl9PS>~;J)@sv5%*fDMex10FZ{*nBE$m`F{}D7ivP4gj zVZW<}BS^32%$aF*qIfZ6gW{?Jtajmp3heo{U7LK^4!AW*6p^CgDZ%~LFv%hZw(qkz z%MAhx=m1{O`)J#0yrr9hQPKaJ8WKTqkb4<{JeR&o*JUhN6m??byA?`qX}=XM;2uLw z`NU8}Elam}K z1jF$#VfiKc42@@B8$qRG&BO#_;=9r~dF8idZryKZ&BP4u4<|Ei{5$B#Dd&dFKwL3l z+gbJ~o|fcjiS7q1FBpBx-Ci6Cp%n)`8`^UQbB>gM>=0!Ilx)7sh8D4yjxc?MY-tvJ zOl2jnEFB5Vj>AS%i#$|K$kzgpSI_%JSLa`qTgsY!R<2}jdIrcfs16y`G#JuWkfl~0 zcb-CRgE7^zNrrt3VW0eHPs*5SAA!}__$k8QTX;df?5xPo%o&hPLAttj$kcvyH;)w1 zrDredGF?y;Oa9F8Z4!hu4z+Zc_N}gY{)AHS79O3G zdAjKc`&9I+-~O3eu#p5Ggc)Yx+hEqtKYF}7oR2jUU~KR`Odz~FE7_u88h=5T*(6pc zw?R%*w!^uOAq;~+&R+N-7dkLJOW73t;nyw$Z1j_&H z3pgn{ctCsfEE~;oQ8@dIJdwWvk(w2zOo>;$q@W#`jN?p7cf_9@lWFeZpZeI>H0wz| zCeHd6t@+)x^-KZx+r)+o71iUxq|HYng!jj$4d^)*<<7zP(bG6g&8cg4wu^qRuF4pT zF_qthu2hggDYvnOE~~;7t75ixrJ4y@l5K)m&A*TraiwY~x>IYLyR;WUc9p)da2eAK zvNku9-s40%d;lC~qKf#$e(?_ET@-!0Snf8v%Ne2+`(l%Xxwx4lJo}XrubUewK*K$j zAq;={tGyh|kTeqD$CkO{X(y3Eb3_qlG5TFP^Lt+<9@>$?7b4ngRDMznX9Ldy&c<)p z<8Ggl(4?ry(wM&h2+End-9rx2W&8NXIkdlMs(Oj1$?d8VxCL8`Q_{V`$WONSM?X!h z&mQ_ZmCc-^WiVoG~tE(cP$}M z%Q?I=jRQk>3l@zj2OZURRwc-?f=mOzW7B^2D^e;$=WzNM#f|5&W4 z_j*khy;`XD?Yqs)oILt|F77g)lMk5*4Wa!KO(=HrB3m1W<-Dcor`7|6>A5KTy~|s} zR>bchy{A>U)02amv@>f9xx8iQnP+y%FvvY;k()}w#R(?<>NJBlE)h64c<4S2{8nx7T=}QbWJfW)rkHzi|&*aga(Z5?Y zk^JDZOJ+GRxpDW+M?WfWejfI#Rf6{s>E#~lN(w=5$P_JwlElcGW5%RO?0bu*)QDib zoO74R{O=dXi1&eIE2{^JJJVCqx6S1=CRhWq1Yhzv`DmTqj0O49g6ikFQH@?;sjpgA zV$ZvA2ydmvI{3}hqIfq%KE3BUxhHKybMOKcIT_m$EzQL5R~fPcjp?XaQP3tNO-d-Z zw71B+pK;PCdXg9?;pOvrb>Q;R_n$=dK(5|@l%S*yDzbwrTF^$YZuhWa9drZuBoMTz zH9uAMp2dD|yOS@MFcn-5vd|dw+~RO+>Mz24j9K#TW4ttVq#yg)E35S3r)26W6W)Xt zYH3!yS)}=EM&zaTu`NnAdYn8}+5>2RKpZN`e_;|X1 zyTUs!>#D}f;dhxq8lSZ%UTS0D(AEIHDsfdRQ_}}gA|VUX#x1Au0vkma>R3OGz5a!O zZZTCWqPagl`OW2L5kxv{3Nv5W(^RItkEm9d0fQXRe@fc&y&M*61*6nw*59kbEF?Rc zLZPt_`yn%FtMm*^3H?PeF}4E37n1@MZ%a8$Sf0=7Kc+sCK_%orGJa!+K}+b!ZRi9` z8HF?GpUc$|FvK+EbYi8^@O;Td=BS+J^pdo7GCnhZ=Fzj3B&0E5K2PQ-anoVM2>Zkn zl)a4rmd5#<5~@ANQkhDPbERii8de*^(vr$qRH|RJ%~2K37R|uXjTFIF@ouR&z~zHs zCQ(G-T!co9;aAJB;m;gfS`qYL*s)^_9{7xuH4OVd>#re&R{!?;7RL3}BTD-NPrH}a z?`@+$sc$^M90VS3ykeri6LD?v%C_xAyD$qQf58%p;R5W)N>%tT$_c)i5qH>;JRrjG zXqNGb@ks|qXI98&kirv`oFrCCryqDUo0zqj`AHku{CLD^@$nhbqhJzEpw4TxT3@f3 zF9Lekeyxi#E%vc_ih+AOp0{*-77B4Zgp$I)WF&l$%x}?@`v`zxM}!PSXxW%VJ|DWuo|W(}}puVBjf=c=D)x zClsSF6rCg#@I&BJmr-I^LT@EVMSzH6v54c(bAZ5N_o-rwEu#B`Y0*{yP^0+MwTM^; zmc+1x$dSazW_-r1{DisSJ+C6JR=Q8K4QfQKgT*eQFDtPk5t*?cV4!t`5c?3*)gj#x2>_v# zTsE~3ZSLbqxfTzkq%ImOutCqXKU^MFUo}PlIYn>S4RtBgOlX_E_j82qVt9)t2F)_yO23Fwn1P3< zTnedFi%3&t3+i^S&S_AtffP00s64zKVP&9~j824)P)=nN5qfVN?!aGCs1Ru(+Ky;- zO^g+}1&A_;uI3^01(cg;=uN&Yu92(?87bOHt%AvdPzi{t)P$=Dyin=Bq2Wp@Yid+_ z$Hd-DJMx8mAh>+LH>dg7jNjH-(b!Lm|0Wiw>=?^vq96sPO!Im{NEe|6rPhU-zF|^Y z4x^}I3Ch-8aqnuRUJxd)~BN|iy5?)%Xe6D$O}`?il* zA6+`zipv~mA)@W2)Q0+w8MYQPDCEizrngGswZyNi6sYw@ZRPS zD`F#NS^GKS>t8iyeJIDQ#zw$HK%DHX$LhL5*DzFJ_Ec`_*6!5&*^M#fW#e7NM^=yz z4mSS6lTreh7(lieAbF;vhA2sCL>t3KncNQ%L@fk4(c+*OCs4AH9_-bgh*w>zx(zGJ z%+*G26d+mc=$G+~=s~|q5dp-wI>yYjSSGVw&>}ncO`^L?quqS_s0C}IwJ z=t{rfYXm&@I>MTMGT|?LtAM>mC!U+nvQg-gXn~~Km`eR^;$Ecr0|XgU_9q(gZbJli z(XaTVzWROD!#9TZP}7BucACU}Fe2EDiWN z>r)@`nu@^Ev!!H)=3CGw?;~3Z+)32eBaO7mUE;Yd2nbz~qdle%Lr$eb0uN3JfepOd zl#%gyb^KJH5b_7ROdq(}89EVQ5}5>u#r|`%{`sHt>jSx7BQ?YXjF$IzreJp=7k=Rm z0HDW@ngs+rbdWp`t08n|@nkdSeMm&jW+k>^q`QO6v;LS594p3aLT(sasriEP2B9y0 zY@7W@WjEs-;n@BH)n0c<%C!iKc{pV|3lp)}MPR47W3S?Ui$-S;_sT?g*VxwSkc$5V zO3=WLR!jx$ga~4X&DDw5 zM!i&^X>#XY)~AZOMj;2^$Xr^ZWWY?^kVj+-XJ`fYvRyCHW0AyJkyOyY{1w6@_9Qpf zG~L-m#*bmlcU|gdv#(70VIjgXlMK=Kv@sL9G2@3K^MKf53=C6~i8Vm$CTPm+Jr1|Z z@XF}?lkqfS(6p`C0#GbUeba1OSuxCKq4Y4`j`wAcV(Rvr`PSFpZ;fYf0v9p5=7ru3 zubxh5h)sgT=CB;uKO02T5gNGy-FUbco5GPa%>_^omo5a~po&f2W4Au7F1ox}y2)K` zNLaS(kKbcv*%pjU>ZcC(L_@(8;@q8!790QUJp24(xz}m>OWx{h|71BP9g@h@T8lUC zj=an-JG`}1{FM4fde$`hXPwuUhsM^n^HQbm+xr#Q2ec)dWB{QQ`3GQrYt^N@_~l<` zMe9Ku$rP(s&YhAbU9daeblzVQ!L{i!EEx;P%SEWt40e+19vbOu(;tGS@YR-XgErWH zZ;~ZU5%d<}jc?^5XU*nFcQF zd0ZCLU!)9T%5rUbiq|0t+o`!^lWtb5EPUPaOlVp4huQ^AzjH3n%+*!TpY{xbvf?So zy@^ad>7)E?V)(COyJk+gO7lJPreVGj1mW#w z4Q`I-8Gqr)Ee|X*2%4~dxJ}Vo9o$lj^J94=u&`Ba(uoRH*paifor_!x?2-s2vK%wq$bw-cMju>Pm_%o-He|#|Gc;l-g@lailF@o z$K*6CmqFz!RxFu?3+)2Rke?beuh&`YI5i!Op{ODayuCXPiRCY_ewv+Liq`FLiCh`1 zT#l-}(H7HdMVm{yaPH_ovs3~>55YQtbe{13+$10ZP;Y} zqJV4QiDw2w<2AegCij-hu#X05S67jnIKVUb0tM>^Sc6bAa%q{=WH&KHU(jNmWN6!W zWA^wPS>(6{EzvA+K_&~kt5#?_U^c^l<=9%FVJ3;RvTryoijyj@P< z*Nh26u@mDbhDG6w^xoxe+~vdW3O}BPW}2r-4IbIF4TZR=w*o~bkt<0EkWczsgz2LFh#c6)OYjPJ^IoG*fgDKty z=qm5O+4|u}*-ts;a?mPtE9Yhh_s=?4@n%v{Bce>-x4|N50~8no>|C zk{{*uklp<%?H!G1qVEnMuY^o_K?_HnDxD<`g8QCe>$WcFWXI4LDXpkdE*T3anot<{j*IprC|A#Xwe zNeJ5n`>G zDX4s`+kYj&CS6Mv{}IiOLGUHALc9Bp5jaiGQJvEJ?8lnFxms9QM2|hS(beX6McX?y znAV+?27^jECu-)Y{)c@P%fK7z$wuYea)96TH&%jQP<79v?bF=Psn%muu9=nq{3IXEd9lnuRV>u*drZ*keqv;Cj_0Nyo5KEsT z)Ek!<*@;V7^e++AZ5CYvkGuLvScBajsWtiK2kUz7Jw>wU+Gfl!VM0D}A(M!{Fcsi| zIXB4VPH@rO>8LcVU#EM^TRoyjYO%Uax}q(B4|bi?Mp=d$B%iW`{D+D$%DtbHrK-aeZdq5EG~6XP|7J;-3@N*|sXp zq6+RXjltvxMyIG{ckDtKGus*6_f9`$YLCW*TB5pz1fV$XSd7Iua{Gw8z zjzxNa5o&sgFAw=qz8wLHeNM!EEK5%GGffKnR-~W4q`Vk_B`Q49LA9zPF$;BAFX-N=e2*<$S4L>x1^}%{P>2%+?L*@vXC=gzv9KFR8 zLh<0&+5qccgt3B8ky z9?GxuYRnSCb$JEPBXn@`^dRR{e3J^DTyRn~N8wnH@rTnm+W|}*13W2Id;{}&%v(EH zu)9ae3!i};1Vk+RexxfGA1uLsL=c?>@$5zL-K$|i+XGSPQh(*_eYYKs?0!WRq*TIx{A(`^)i=8Y#`4DzE>bm0YVEEuynA|2pT zm>fbukYpf%#fpoX?;(j4k`;<+%pGU2T1@QMCh75VDptuDhC|4qfyi_<5r)gWMaH6$ z_o%}tG8?)>J{t3tCPgz|%{UatM>EX5TSot!6pW%_u1LDw5Ev~w6Dn^_eV}13nS+@O ziZ_sY&7+C>yX1?IZ2vdx5T5j6ls#e+a|8<6sCUnmyNpSsG4IL>Gg4mSr@U4g1^k%K ztVW4ocW)1qQHGOfavAEf)3Ho$ud=*+)yBX&VHV`^kPt~ImN8ijF|;2ML$M!G{z%o8 z#|;s`yh+8_5swE2U%0xavM8dTvikN;%Jmym_F;Xv8_m! ztOkP^ZyxMr1pjZh5cEJoWP%raNLJisK;diRVI4a$7}h;bm~xXWIuTH8VM(2gJRaCR zJzuz;qS(qpNW#_+5h;OG60y%F^R`O~lJo;m-!znC9cpJg$@Ati5<-|&E2!<4eKD90kls4uKQ@oZgKJ^rjgh~KXQ6L zO%K2fuy1{Bq)X3lHKf+**XmHza*U-fVkDDE+*GmV)T+0_Ho5LldlOO1^ILeua-P4f zZEX&#ncT=tY~~$e2|1@>$QMHT#^!I|w%i9ZV8$02j;ca|=k}#JsymzlRU>0{@_7Mc z=O3~X^3?C+nf%|?oO`w%%R15r=Se0g;HlE?lJ z=FXxkt}lAiP*maWPT}tE1;O223U_yRx5Ay^5Ik7$;1CD|cL;6)f`=axI^Bbw{QCp+ z9h`O79^Bzs=brsO&vuI-xk!Cy@E=5PY7R&0oO>IP9!#%v4`nY>01zpTU^QJsZVC-} z6Y@r!A6gPnf<6Qn)Q<7WE{d!>FtW#qyn~*rhLgt_mvsyHg|oWmwA#Yq_LztX6%-QTvDLa#;@lC-Y)Q=$AVLIed3X_t)@}h;Y-UJ8=dcSf$BePS?|XB zRcA*BhKn6pZ;U!Fo%{TR>xx8>)L!79zMo63M+=+A|CN;W@AbR+{psCdxb+)+Fm(_8 z$3x%F-WDRSyBDG^>=cCvjUfHUmn2GlKveTI%5LV7u)1oOR&%W?(SH z){^t{<%sR0u#p9aKKFFrF`p#9-cg9x#}6H=Qa^X*eiya1Q@*{QNPldYzf170VJ$vY z3G2};G<#@&MEzx0L*Vp#%crp|>zDDz<+XJ-@76eq%W%NU##o7O8=mQ9hvm!G*p6r2 z#KV=~$Do;qt3Lw>B`0A-!Mn?Wf6`{qZxZF5_DQ}zr3g#h!anvviGDsjj*GPo7e5_G zq5a#FcRGvSUpslQp3N*I?u+#=&$V}+XA*br>?oUa=H<=8w|5>pYQ%Fqz6M?VrMzoH z3jOV49=wBP{^X?hmtvCO^*mH(SXQ9!kkw5CG?Mq6Wq$Ec_3^D-@8b)7^~s;8z7V*e zk1ZQt{{HudYV#2F^^IRv^1nT|(8q(1fB#7pt!+eB-bX$zD!k{wso}we5-Z^BK5zeg ztNIARDS^s9#^iXiN8%~m8L6%CbeZBEm zOHC0=N-i==wi8Y^Rra`M(O9)dab-dN3^|2rQ$Ci}UKTuZ=`a#6&>aG_D~-D%jN6N4 z(J?G(kHHK|t8_XvJuZdx0~$})>9n4fbcwP|k^9{t@0;`)~Lih3!u5ald6P!CYA%g-n(zJja_kFdFU4t~9o4ZP6|uv_^FAK24Z4C}6Q z4}IVo$QtjD!idQE_9n#Y#78?`m6oQ13Lio}Dx?Xm-69NR7tFaS!T6zv z7_pTy!`KS@xrzn&N;KI@h{Vb{l?o+vD%F)LO?0ZAm8t`DihwN1{uK-fTKvD2>W_5l zm`64QRdSsKngdxH993FZgxV5S+G^Q43{{!}NL9LWM>a8V|C4+ESNoSc`KMm`Ct3P8 zze$)JU6vA49vAlmKE5m%TagA=nGRo-fl!^DT#b`bgIidM8?41kqr*?9C&*wR%w#0W zVj|9FCeClhzyM`ov1Vhl<>0WFX)203kf|&!$6?tX`R;6jwHjCYyArVO|p@$Q{Lg zx!kiJr^tK|mqrYk#v(@Z8=o*VXK*NAJd#c~%Tkt}DMyY_s#XX&GRhNQr9g^#+NSuO zpZ#ZpGhL=_X(66x3A*)}TC^^;Kx*Q7dUk<{Y-Sb{{IOa7N6GcI;Wb-)99<)b2Da^K zG6@nb#^6!+NoF>GiNS!0m9;Tdk61o;A=(;;xl3@|?L#377jVc^)wjo5rViFNQXN_p z=z(%TV2t6Qbep?iE}`?68i5&oRF9*4`;o+9QA(BB?Cjhkzf{f4FiPS4*f7@cax)~i zd@H2#i``ZV9x|hvNg!`m;cYAqgR`S8A()tXjbsZVWA*vRVd5;TyHIy4#Y0nB?pwxU z@`TRN$Dm}(qbXh775`WE4yvG~74$}kAAF7k~}++1|>y_cGdfkDK3L5Kp| z39&eUdP!D(H^!YP9<8qIBd22g=?{HB>J0gyAM2;eNhK*`sQ?~59-|cgM+>=BnI^vs zz|Jn-P&9S$5~*J~q&pQyE_4}{Op+lzA|!78b3BB!QCddFB(ioe_aFw8Rlt883S~@=uH(BR86K`1uZ!x-nnJ1b|Q_Cm6Vi0cW zG@Jm(F$YwYM+2zNY8^h4FL4a~M39T?QEgZxv3xE^U~sK~wmNyvQl|?@s;`ZaR%ERj zlRG*k^UQLTQfYHV{na?3rR&^8I0+A`OrNrllCDaGN_Fm}PR9f7h7sOfDi*d#@X%&0 zMO~Q>jNFxw_flDrIFIGRn_4pzaNK*~o1K84_APrkzpi&mx%J;A24S!e*CAZn63BaT zcfCFrviGBjvV9(Sd3)cdv1gYH8rt=JjlZViv->=i)Z$JG!x#jPg z=6f-A{qmCY;cijv-L#`gOx+Pyw<4`J2Z4yXqR!DR!FBVifw$ftm$m$QV>bb!NXI@}u?XOi`=FF?qIR0w_eOI z)R=nPaH4@#=Y`1rw*38rqj70ldavln;+W((S_$3AT#0ZDYV2hwy`_8i!|~$09Oxc? zS&-{$OEx{aN@bTP5Yr#}DJ)AjqMHNR9b1wZbQJE)=k-I`C`LYrG% zM2qZ^H!?=@!@ogw%&>I9sI4!@YbNRdgTPJ|w4s917sbF7%H0{l+y*A!Wx|owkj2N1 z*5OTAV5;267xcjKoA3g>en0D8yHxMM7Ji>GioH?B?!ONH(_X?azS^e{FmDDB)+937 zq#wR4Pfoi&51tlUZ5K$VU;ZzNv}hsrQ)F`mP>SXqTqNxu!KrisiHoHAlzYscYCX^E zh7mptn_N4_a==Lm!ck6XGHPzW?ydTdAvTBI*@o3z;d9vFs3l{UL5O51rH6-Micm2; z2W`L{anF2)&J17KBpqE0RSgdMPlRvB%yY`HLZ$r>{z6(cH5c+ZI66if_9lB+2!MRT z)9fw^h{&9hUKWGtYy%YJ7$RC=E9IYtpLNCLc}e~Q^zj9J1HsS~eTP$!tA>=uvfObh zl1FRgT&3@&+RNL>EAtNlC~i8R?%&t^zO$47zu9ug5RYn*l2S_{WCE#St0(&+w@x^w zYf4BLucTbih~;MY4ghpp3VY$Xpp%2A#5dBh%X*zXbQcKX8tqWPgT?2tS)yU1NVxwc zMWe8PY%80|{OQa3k@~N>L|DiHrV4}uk7+3X>_fz2*E2LBnGLB$U$#Z$s>i5JS9~cl zhAfws=k_l`|K%k)D;OQd4>J=`1mDO2`tXO0e1^VgrJ8PbBcM)5_Y1?rV>A7NrY`Q( zww<_rmvE`v0e3kG{dMi46GN}xk)Djwg|}me1fJm?G6`z{(th`lcY1`^RZx)mWz(B1 zQB(nM6*;uZE|gThd;_MIybn~`i4&^fGW1b)YE2;$dg@PP8EKe!H`Sy8C=5gk#^8_# zi-R#bX-k$q8TjCsPzdIBC2TV8J{UASV=cJq$JKo zA;C|~?4*zl1TgHPZ_>n!FKfP!Pq%8RO!vi%bUJc!)zfO~JzzBu@xMUR`4r~9GKc>9 zRRqbe@pGK(*p(l=USm^*VNJgS1LxEkngkTuvfS;d*r|=6|HdMaiYr=IPAO-oV8GiRs;12bTAAF1({+Dp2)^F)cq!$ z;wfT+DDt`n)Cj{CuqPRUhEXAf|EC}H_fOPYoSjL!?Gu<4oetB*Gn$Esf@Lz2{VANX zD{}NRQ7kTjJsh2!Kk?-_I%j+cVoRjL3L$S9#sD0;!)I`$2F0-jo`8jA?RbpoQ_KuQ zY>8&9x+e9bKD7xvDR|IH+~4kfHH=6DAl>COGiRSXM;4b(#a~9Y5P_(85^G=!cb*&K zX&)dTN$fj_iZF?kJ4n^zYptMX3*t(|fFxW@goJs-+WX^sTHq;j6aC8@+CnWW?GtN- zi0W#Qv@Ox!zgB|;5lJ1=340$w0mq=86?mdK_!xiqgcUf2iP*>Scz$kNMWUom?xfbd zNL7PG+P#mFaQxH!n!&ME+8$U zG%eGf{I3F8wMQEJQwqgtBsnwuSgqaBT0D~lnGrT(@=%JoJ?!^dYTv1o70f!4o2>cN zdFC1^ni1_3=99MP{QEQlE6>_WBfWHpV93C(S0KAzARFTwY%4u^)&O?)g>x-EHW*BV zkDch~&EhYaT?m3&?^gpf%>uv-}r%x|-U~jb>De4uj7= zEp7vrCzQV1h@x+0Mbbk> zH+d4Qd3Jl%_WKFmr^2XM^Nf;Z=r-SwY;D~~NK%{Eko+TXVOc~;3m+eS>x@Vwp*HKUr%8@`)tsl1q_~V-Y z4U76WUXY+C zCM*Izi7;^Aoly}iY2xE7y!0Uw52M~9-GJH6#}Iua9AvvMp9nO>@l&a4Esa?3~n z7BE7Pg4!rfdSh@b0+wiisRC#LitaRMhz~2w3@>hd84w&s54KH7j%h*eX#h22(9yM% zpmM92U#qw=%U@cLa|TD(D9#!Hdy{ATIINvbTa{E6k|k@3F~W7hqxv48frGDMa}S42 z+or*Lrw55swM5hR8f?Mv^$DQH^Xu&tTj~g?;XI3S^+eP6t`~mu{4zg>LBxxW*V-wq z&54%H&sL}o3ihxC1x`ep77Ud2{a@1 zRvZfV?P?!Mca5xy{#X_L{Ty7v$R8+Z-ytf}B`VUVEhtDUV2;o$8PysnD04py-{#e= zEE6JNCD;LIW(yY-y0^S!(PK*Db7|x6KlH|;=h(&*)_O46`z5hRJ5X8C^l=gGrw_k7 z-dC?u;X5bQFwj?#O31-2ZZAmp)QJUuWT5ebAwUL_C?mQ8$MX)S^0lD@=SWKp6-^u@ z1#t2Ga2I6U%?F?PApVnAo2F&x(#i=nX!s7nnD0P>&Dq3_L9Q5Y1oeK{gx8d&L6VnW z2A)shB}%};TJc4$SHWuJQ41kVKwK4S988a-fN#yPPKZU(Xn zJL-3}aeil&T)L|(MJ<5#X}1!NEM#ivzglnLS=40?(Q!$iB3kj{Te~EWvUd*mO6wNk zjhl6hGg!;KL@DI?2o%>fy~xO0uzlbrmxrmC$ZSnkD)Xki4mq-Yb0cim@SP+il6gL8 zw_h|kv>YmWwfgsKPoAvQyI|POH>&-8Dvew|OAZ2MfV`6iizn;oev*-|;2X;{5g&3k zf|`79L$^+DSN=*q-I+DzGS&*`Jv|Yvl0h(`v8wU_l1ppQ#1oVjSZb*DHr=O1x^Pt9 zGm)?*9N%ca>oqRD z5`M9}lzXv^bH}qVQFS^3ir=Y>%`Zygn9k)aYpz?GPmkHQ<_!DDO!{A}b?ORvmaoCs zt@mwKzKE?U=&XSvO!=zx?V@G@rbjJ6@cV{^Dn`tmqH$E8m1Kb#^~+ zlpaG~=q5uO$HL?=0$$hBDa_Cgc&rH~3ooRSOysBpq#~wg8Sy1}m-(@5HX&`RQG`}^ z&ab~;!Lm9>xC1aPV=5n|P3sRq=oa)e!kW^O+B1{QsGIMsvJU7_1OA$;DfS|x zp9#G3H+{m{S<@aW+qZ`rngqJd2W;pVyYGYayKCMufj~1)E&&@aq7spD9CWGe@k*j{ z8a8glQeTsVF)Pyh zd}^V;*fb@=>bM3ov{5tKc%A_C_d3Vj-p5#X?%7&|+u>fJP`5H%f+0M54JfD5SesBq zoA`u4X(S_NSzcW==DY@HdI^8l4l9gGR&dJeLn(P(0lMN>^y81T|_Q@1nwQrlY?oVI5HJ~8m5${Jeyx< z^MhR31G?E)XE?iE-~OHoBAjvG(1mLA4@-#Xu68>LGVF2(#awrP=3&}UT-Q?C(W`>bNw)J@@94k_w@q* zC@7^>RHFoPw9p$j>%E~EmEsx(N6RjK6O?_UVLOEvJJ%}@2G{3Vp44GrN$r(dNtM<8 z9(p8L9YD_2fDbLbiI4LadB;wMUUvh8rc>{7p~$js_X=O{Vg@mIaS$~l8=j{*({Y86 zPMOYQXe{vv^4C#C1U=Q=Jl{p$?diS(io7Fz!E|pou)(rYvHOa+z0f*&&4lSQA$iQA zD`u;TYkm1k!iqCrPCtD2c(a1GxFPk2O(J$z$qHy#Yi>Tj@KdG~RZ%@Ec#a`IS~Q%u zup`{Phk-bG3Mrgt&*>Wb33`Dm$-g{sm-OZv8-9-}c~fxJouScL*PPezQz9`(Vv6e- zvO%Qy)a0gyzUtu4ZwJ@+6^WvZ+1Q(iv;3=x7KH#(c-%KUK1U*-h$@d(D*|^XpXR)1 zMiZg=Gr`}#Q;q-1eMR1BzON(vi_1kkZ-7Ex4O|a<3qC~BvDihS4u3=fRxQX_atSfu zAw_o^eKshwm(gsLV|hn)wEh!K1DD{d=sV?0+;qJgFgMC@L?Q76AfJ0zs zK}KU`!p0*YBEi6e2V>APVt^2sN!Igb1w@Y~&#yXPCmW_%q_vD?WQ&%NyAQkRldaN^S}t5R6KVqZDbyJ3x|ReD zF6nl^_>8VzWNI{KP%Mpsk^Jv1YE%v!-Eg=B6IF%efA_PwT5~-@&THF-nWa{3GSqQ_ z4SGyK*@$Knl;ro}NEk1J79>1Ae6CzN82#p&gg?%l*_rr;;3(P}07BCHY#ewMR#-EuW^y z+@&(^-{jvO5~O`a>n5y9*2W2DAyj_~dDOktiC0B(KvC=;N973UzhM_w@2F@K=sikr zz!ON$yI>DEN3hG!d3J087!xbf;2bfT%rcLg>>tva?THvR-a=gQl67B?)PivxM53FmCMvh5x3 zguKH$5puE9D#}-dpj1Cr_Vz(#foQSbxhy(jixXQ>C#M1*LkF-&l6;1c=}`4^r= zMo-zR(2OJHLKi?pZ4K%zXw=5_zA6J(0eMo`j-84ayjudyCxK<(6&n^R)aa5NLukSk z0I>dR09rZ-Ctm@lAmf3s^>3#vN`EV4as0bc8+!~s9m$Q2X+gk~`QhXLr%lL9YXblgk4PSToRCvq`;{x7@ z@Cozw);l%x?)aOsv-wwD>B+>?1H%_S=sS;Dxvoc|2*G;o`+rY`obD2vO?cG2v%>X} z!vm2a{~B3XCjN)wY295}Sxuu3yD@%6fATrs0asnZX&XmADN>+P9knSjg8rGb(pXZX zTKEv3RS=LxuR0@AETRq@@w3MufShX=9>*Vo3vLM?<~1I8ifxABV7m+BA>EY_3Bh5* z!n=cZ_t49TzNof@qwrB95&92;R7%lOg5v)xM~q#Wll851FZ(Z^OY%8=Hh*L15@h9 ziAWDax7NAJ$YGsS2G?y&u#}d|(J}1Bt6r2`qY6l~wx%QO&sh`k8?;&DvSWYe+vT?E z45!CQ%I;-Zy}(C|Jz2wreTgm{m$@s{R|2t^dBuPfxMn4XaZiE!fE`wbOY z%Jzx)gp`>rkP8$^R03Dg<=L_0)QV(u43juOO41 zRwC)%$;K#DnKD`|gJFc*tmcR)Rx28LeaMUhJi#C;X=qoI&*jCo?R!@^t%OGqq|w1=-*NHWTOH6p@{8ZYDPrK( z2fL+z_951YZyB^~a>Q#<&n?zv!`g_+94_7n3_;1Evyrp(RtKR>? z01k%n5&?Cc3U3x8uBfA?(Lfwjv#6h3`bIjNzSxmfN#Qhb|JneG^@*Ep)wE7zGZVUJ zOh0fuyp!#=@WOr^nL>jgpGH<+q7N0Lb@be4ZxB z>dNX+8!Q`QvhCQ@^8Ov}g#_IcWs+MXDVdVfK5J7lWT#D89CDNwk!o?q-!9ueQKl|r z547j;G@kV-8JQO&9;Tv=W$^nXm7~&1iNPlrCB4&uC!%LlEN~l>ZNdk`qU~kJE&JF1 z9%IgeKk?;W8lx1QBLpq=)Krj$*V?~ z=p1Nl&(aA9!aUe)hMx$WAw=E-U@$=tkX>j5xw;8|J$ytKvMQt>W{8lm$J z2k^yZnY`t=-|4CCa+t#?EGauq=C+QD>y&4|UYM8szQg833iOGQxGPXT!{Ge3_0Xlr z_vzg2K>9R%f(-i+@LhPg{j~7idX>cc((xTPX-yD!4cGgQAA*86nLzTA;#bwZ&F+Il zhfWXiqubiH)sZRKE56Jbn4mcKY8F+-g(=4q2>rV7pbv-!M}H36Iw%x`82b9|JyE#14{(aM_X@5QY{nWSncj5QaESN!{{J*7Pp3@34uJ;UDuIQk%r)nq+R&?HFIxBSZ0x&|Y3QTXdZ}GbTj%!r; ze`_g1r#pgjsc!k4#2gfuc8N5vB9)ki?C*vwkBw-0y`}-iRNqA(<3w78Vc1+RPR=cg z%_uE!IgWE&49>zsTv7Z-RJ<)#A-ibV5hVBk%(Y0g&+fQBK#80P6z}Af)IkiB3-kwd ztfScniS*s?*qh(EFf|8(47-8nrAGyzCN;m7@xi&24v8-mF$2lAgWJFc0QEWLR z?DuGLxPXj<0LB~Cnr2;&_kB@Ub|om63QaWf71s4>i}G^|B{n>PHV%$~CQjw&MSwc~ zDi+x^3i&n{IZ6}qkSoy_bV%R_qSz)tv9sADkR2j5EK-WV;r`r%{aBqgmx>NSALI(X z+I_CptdzxpKmj7)Yv-0CDApsfIug#_k=8s=1&pJyOOBgCN4UU6j!UDjPD8;1w|Py2 zr6qMi1H`|5$aC(+Opaz^!X$E&SE}aQCO4IH4m1gGd43S|^dJY7P z95_H90%KY!gWr1vLZFmDB0UoVV1ECA$IWGo=mk}-=1^yV3R|Cg9=LKvRpjI(d8=fkGirt4sZ8Sy*X2TY3 zCM~1oj*sFfn7O7=1Fl{RFhh8H7g*7LSDVEOzNE2-E?!k0eDTg)YvG^`PA6T9yrYAl zHM#@unPQuqtPtxf|4zK@(y}IhN6z>Tj~dQPK+Td+-N}Oy`813*f6FbI&cmvmzlE2f zLnAToF0ssuv!wK&E5(Cw2hOlXvXj89Z}dFM^HWq3w(OSj&M|;B}{(Ju^5i0C3R*ffh8Cb z^>o>J5K%)HC8*C?s{5GTWShA>==)`Zpo8Y{gic@uk50y=c%2k5zpYXIi1oA(F=A*r z13;!!t4enSrfXDI3&lh2^5*SAjDX@j?vtNcrhRk3mort*Hh=fAd3!KpokrB*uR1?5 z^Fg*%gflxkAuw4XfOhC@o>j6Xr4iQ{;KdsWtJFxG<`Eu4%{{EPmi*Qx?cJ6VGCG5D zR%CC+p{fdwvH}rcfK6Gs-4OxHen+ckCt^7oi@QKoc#g}@WtYtyml>9===YT_cgGg% zFc6P=+-b;TTi z?6z|}_c}e*6A|>1_HG5fRx@fTDlYyNps_;MQoPKX%9`0|(B?$(#Zj`L^#SM+n7KWA z?GaX4ulS6zc>O~1_nGwHCJczk*@7u73S`^Mve%S07Af2Z^a=!i{u0=z@3+0&8mu2+ zj^V1TWFaINFtX~GCb$K~sF!ikZX@!j`6FEIt?~0q=t-`!X07KBqL2dt|F~TL%-k?3 zztCEzMy*_Lk1w(|tM1<%0=-yvas3^!{KsWxTI{DiC)rD$bHh>ugIV9FouD=CdQt)E ziCf2=(KCYHKN5TF{UQkM_sEe;Fu&OUPV~iLD&aueApaI4$QFw>{cj>K7T|J~QIUN4z#8;k>Rc zNsoxcOVu$v0-0qHEiazP%WDOu>=>?&8d}QopofT-eC!=}@9Xm}Z@(6gJRDwl3-853 z@X@ozJ)IMYgPiV=~a zj7uPLo+-3QxU(+K*1oPJ{apNn0Wx7-f-r=Sdu+WbT;?#5_@7<9!63l4hWD?0BHjj! zB!&2V%q&AK@e0MTK`{Rp(?`Rsie|QPi9jpyjYg3IvdE#_;ecTFXY2o@EL+OY#57iW z*v-HUK$de0f05`KA)f^#`nnTkD{qzTPq^5F!4hCczTHpa;5uV-5gvk^$$-8c4Y@D+th-$wz}?$1*qBgs7GqG~OYe{|NDB-S1A};= z^;o-bO+np-FWnVEtJP$t-*hc!2@I?VbQ50MiNgh#nsd0v96cginNsf$YH`TgYTWUmq=`A4P0TJ9td-Rmx0k z+#EVy6GY-mFb1z@o@5M^5F35-84Xz;%{Ce9EgCBh{@11?bcP?PDkTj4L^BAw9L}V| zZ5*N}rxtLZb&9wzg--uRZP0AYQrGumhG6b}`K5eotlP5tqsBNE4XUN=q%IVZE@Xi@ zWFdhZ&`CxR*)fMuZjMnri1!8}e48_eo0Bq`dp7|CLVh5bE~9OuD7>j&70ptK&Hni? zKWNi#k0gLK%oGwLPa5)r8GUY>T-^EH)a*a_nE>iLlfhNx@I#FXRLs(aPsJOHWB}>G z?lfZ-SU-)g^?FR{dPu+SbMTsO|C-gFanJV4`4)V!>B}{6HHew8bw4+pi7|6i745&3lq$^oS3q}vlzDEz;?%$qO9t06m z?jV&czO+)tyzvuU?#h=O@V5MXe;Zot&(*0KHVX{V0nMA-_+1wX@>m?>Fjxk&RSvhPPdJquG+o${^;_uF4$Z3H1iC5sS z#Ston*bC;@V;uI?ozaV)A15>Kp=F{`mz$I)zjiKN`v2k2muCZ)UISNqF&7q}2xdcn zE&jdwYAT1WxEe)yzAnz$TR%%hwS{MX6SR{^_I|`jB~C*nA@FmXHEfuW>aO4Hj^OJZ zt)v{wjq3NeoFlUz>hCBU#aD}J;+`SAf$ZY@MZ*WOv%l%?AaI;6L&sl!&m_=YLI?h& zhw(bTJ)J%Oi2*+;r#{{BSbCe6XTLu#R{R(8&iPg2sjT=h<^4JH=i|?kKavN0v8_bT zVb!Z!U#f=1GD4nlEZ^o|iEFU>Y5 zV$yWQ6|Fq6)NkKu1Ogk)KE4~dehb2=nI54DG_jTJ7WRq25g!}7xy&aSkHDr;GxU)X z`5Yo^gd4-=E23wswi01xtHj(2ZzjHyZ`r8PSwd=QTTWW16iMUSQ__?oyRwslA^-S{ z2`@-Z`h!83k(8db28Dlgd+oNxEM24~CC=HPy90}w2+7_9bj53u};%x^$m4$Md^z*ItJG;4RnP`bI zrTcTOTH|lt%OZE@Iymo;F_sxef`*M+HM>9xS5_)ZV+R!u#s$a5+a@&npvVNG|Cbow**y7-Eixr;l6RzYtZpRm-X^cVYjqU#W zeY+c*|8L+grI6TT*~XajxrA=W-gQ#(qNHU1>+`S4JsO|b;H3wnm|8Bn?ilgzgsxmA9!#2>EX>R%K2)ZR~%Ge(P{uc2+9E8$>sQvwmL-11#$`e8p z?5X2f0n0RT@?-YzYstcikn#jEz0=G@q1LYX*e#!@Z6E$DgQ$2W%KUvzP@O5PL54MMaFQ z8y55wF4b2`rr4y&_5#n!=cbGtyOuMOE*ozJoL1VJLJj8iyBK<7v%C|hnu=2jP=9}A zyF}B}`I~C|&fMOl^{aO1fQF6e>uKsk^9UB1QcE1($!4=Mu}jtGGIFe~+DHl<<@)}C z4Fi{^VN{3fDf$ldi|Nw8EMC=og0^0D$X@53Rh6Mdbuekf?dusjqQ<-VOVZOC{viRf zo&3J)^^^3I{K@EL2k1=W%J{93PYyJW@o~et#^Q3tWJ2t5VWs1>)h(Q!AUA@1KD2@~4Pct7HjDA@-kauOvBhw`)B8Bf++MHeSh}`20UT0r@2# zuJRAd3uSwh^OAO-^6Vuy{S)+=(Ldr2e$S&vqG2oPY8SV0_%Bv)EEnk-4^{p3csw`p zHGS$%?LGDPy7{U8{g|<1@q@+4m*C&C6;oS(7LBLUAgJ3Tm!C0L9U8qEdcLX&-LyHD zmpvFKaXz7qzmyC~zWYq6!L^eP-Tpy+!l?{1(k?AP7DDEbp$)Y~Be+66sxDKE#v~Eb z&k>sBWeJ&!pb&zPh~l_ z!#lC8Qbc-aI|4Zg&*Tz81`te4PsG3lFL2d@fL}Yz#Qk|nlTwx`B!C3z!oSuiv0gJV zfu2>d8>C&Hk=E>7g&#}uk5z2d=<2JY!04Rjy3Zh>hqI;9C7H2oz5O>VzLH&k^?R)N z9r8Te5p%upcTG#Y9F=ujjGQx7-0Sp|>LNyv2waS=rA1c#A%?AyRfN$>t3pRZnmQ~h zJ4lYYgd(qo`B%bR@J{B(%^OBY+^R4pwhj={boc|o)EtVCcebnjkwoTV;di#`a==(^ zoB(NLYWZyi_1FpCy&`-Ew{19~}D&|fQ1;rsA# z4J12UBSC3VAdgRa%aFygz%jpOhqsRY$wA}AURMf8Q?IyP=ht)ov3UjmqY0Q*cgASR zhx|bn-jX$Da3ls(VHZF|JOq`Wn_wk}=U|yHv6R}U@m7nh^)|4AA{noZs8N4T@5!_6 zs1lzXmTt`iH9%2B0V7w~pE->hl1Qi5QNw*}U0$7RRFjMhh05BT{2QGjq~aEgR@zJ9 z;7h?7#=dZgRHrIc7L1~+yNG^WV?IBXsmH1q*mBcme69@2SWUJhEP8+quAV zUv?-Oyc?ai2wZ}IzYMt2Evhqyj-0@QJIlW2^zeAc0P(EDOfB#x-AL9)A z{sCYP_tksOEiz`$+yG9fKeLh3g4P+jMU(fH(2S1GU}zl8dpEIW%+2vKLCt;Xek{~^ zj40mm2U<>EI+LCUR?wQI<#1QFdEO0zi`b#6gwzD{@o-{@2@=uEmvIP#r(|-nm0?~N zf~c)$+J8^hU@O}34+3(m>s_M@o?RnGYL^<{*bdP}S4)OQ%L`qCkB2=CTAV1ylIU-a z=Nt`YLn?X6FE6ykKKTDAYivtKc-1HS^7+Rv;;MYCVq5--ydTMwUfBN+Kq>Zr14`J; z|A$VJ{>L8?6510JJCc$*lasshlKSwI`w3D82!n$}X+p&5!alHs$g+h=Ygzq!yu7@E zf`TL&BE-e>LC8Wnk)l*r1K%FCA<88w)gG?|&T_?ngaL(4;)o5EaM+}&F}J=?v#JAHk- zQhb^s+*_kO+he>t)BIZEe7h3-d(s11GlSZ*LppQAy7D7>3JO|_irPy`I!jBt{wK%u z|7`{7JzQ9rnu$0T0|Pxio`eJ=H7$i0Ju4HPn23>4sHnK4xKN0ak*Er-rWP$WH#Uca zhMFcNJ-rQsn7X?@53Q=YpK_>rWT1vfM|Sjw0~@Hc)c+v z3q9pCv&fkU^Xa)rqRHf z>A&0DG3{8M>Phfqv9`~(26B0v8~k|Y*ZWH{!BpK?eP7b zcLtVtW<076Y*P#yA-ZcTGmi$9V|o<$;b~0o&+9W!ew?ui;CCKn(&3R^%NQ(1%9SMU zb${kc5scy}7eglyDANiYrQND?D8r-Ojaqup8HqfEa0I{iO9u@fKL=UrbMt!ksHr`H zKxda8YYNE(p?>-G*|aP}+-z{p-AP`b;zVef$W7fuWQPb@n#OSTFPTx+XrtPB5RcJF zyAlckcYIYtjw$kQ?r0cFV?ZmFI~x89)ME_tg+y_kWSGh&_EkSo=76BWz#Wf3E+hIA z@oJI~kzVZ{h^ia#_PK2Uo5=iuB z)ZWqY2=EDTPCC>k3wmrcmDuj0BEi-ga-u87(=-Wmpn4Ii&v(+n@V|}q-oJLC4L|F4aN{eTY*@2hbgZIQ)TXpF%zGpxK{uOHhi@3i$YyQ zt(vJGVu#eL#Qa>+II*Nq0}^hqgkQ^uUmjaIMbMz48s+DABrdorCQ+0qA|0?}j8`E7 zCCUdy04^-DkBC|x5-HlFfj|d2Vxi`i^Qi>mRJO{!F(?f24{N5oY{5~S)qb~G@yMjI z-qK!yR|y!(h}9OQC(HjdDeS48pJ-BXbsm>_tiwWdb$Y-cx&FIK_?^<@aA6Us&53epfDW~G%dY8jlX+(__IAq^MOTmPUF@(+1 zs0(RK9}}bFJyTT4z|@J1^0FbJ9ZG}>quY&6mr|rns@dCKr@9#b#HzCG=3xOCO`;r2 zQ^7C5I@60aUk>!qMRFFrtH=?kH~(;~eHR+QDXMu_Ip^YJ>iPwqD)xj>zkxE^o#BdOv|pEJBPVYs8@|F}P93d!sDcH1kY^)8UOb9jd1up0tCjE&&`vHi4x znAvvROyLGI;#ra{XJRtGC1~kUSTPzlo`~tPXU!qgm%8-Qb(pJwkn3&kk zt@Ir3_?n)^tpvRPcn$1!v}4^nl_A9jRVv_6XgTQdq!4y;r%qb%{kTig39^Kj)c?{J zYF>^eg)@Cy+#;|^|4`ZY7km`I+fSPeDJeb$=B9^^(Es2X`r3ACiJ8%Go0nceD0x=+ zUyl;g4zGDwfsU82d^05~h*hOt)fnOk!1_1-Vy#-C zf5seF+F98%^IPil%}MUbc`D5Vx{fl+e22a14BN9``=JtnVmzqa8o)}S%^3%(?KV>I zC2HrYp~OAwDAYQIO5?Z?4*i`_C;w46mHNZ4jG~6x06Z=0Mwqo6w1w+WNwzkP^BBY3 z05bo3e2g!$`id|lUa@Q~C8OFMk1s1_Oy&?M6bIm=lp_(?hr9CTFiy}VjzyhJ9fA`_ zN6m>aHK`p0uW>^nE?_G*R$a4=Jh2OOGDQhl@ys546a9LJQXFshdcvqvehM5#H3h!b zAdSl6V6B_K=lk9Q)KpybNKLkOMv;+cPzD*4i9a*`rs_{-qCQ|dNr))~$YKyqN&w!{ zE8TRUA7zAW5G7CDX|8wT6rbf6F@BpD@@M$r=k$nm$M&?GTb6NiROvm^$ zc_H%NYDraCFXsajxqCf&7wIraTAC|ZB05?CvnytwtgEl+{=@Abu^Qu;RWd{6RW?~) zlD04>+p758m_+YLz$lXL+hcSb5I*=d@G1(6 z+#0%>rRF&vIyIpP3le4%3E^}`QJ9IU?2dN75J}^g@Q|0>?gTQaxWzDncy&;iM}Rce ze$-&x83@(ua`WU$7oIoT?I$991lZ=&z=-%rFEEkM47-k#;3vlL>kgr_bCH4(KiNDw zm!~+IyC4y3lzVih`!Xzna`@({uq(g%y&Y~yJWiMiIo@HMJ1lHcm-?_ZI`zAB+la_F zeoHrf5ye1nwC-N~J*z*LyXie(xN&7?}$1#l$YxT{kq5dsH{c9!}{4*J& z7dfe|+1SgxNYMixFG zTNIkzAd?*w3-lfH^UZ)9=7n=mfV?qsnXOUOpl}u$g0&vsQF~@$TL#PN?D?l`s-Ic9 z39KaTT>KaT!{y{ZWuNhCBYj1t{cE1G$ZBH&C`@d|em@6n&7#eM-lIx@`TZ0T!^egFaxr5>eI}Ei2t?GvF4VH6EJ$@ zl@NbrCR-{QOGob1r@saQd*eXkVD|`ql z<9RDH+i|dem5?_ixjUn1uJ}=Zi#9_C{({h08J9E9RbxP?VFh?a0D|-K%Fn%c;ZP=a z-CC-ZESHc(H_UR+Ul<(u-Y(lrF;^I>!e!w6^!hCXZyTY)Or3Xa-XVT{&>TZZL$w9v zTl5^lJ zhJEaNZb;27S?r5iZ@>?t=R&R&QmtUYl*8_fY1~|ChGo*HeO&T*(lI8RTjm&q&|7xU zgZ&etKA1t;E-=Vq-20+PYv}Qcj*8A~XkPdFi{@hf_yv2bOOHuHb-7Gf4FGz&po|lc z*;0g*_qj(q31uQV!D6%k^>XM=)+RyVNNmehfaZ`Mt^q@NHJ}w4kMO4efqfa_a!^Go zyrBs*<~TAZTc6PB;$JiVmVqq=(aaybl@<axZ<0=VXv^Rl3mlaYSM~MmK*Uq102`tEbFWDm6&2egcXoHTl>sB zUY_1xmtK~@(q!$dDHAhY=me4zz(W3CJM zq$xc8DFS^fAnO)BJmtDU&*=fTIo#9{Lq#K5b{=IED2~nd7y_3Xh%F82q5s==VmXzaWw~L*FiAF^)?A>v@yegOAcks!}M=J1O-=z*O0O;PSVDkuDR?PQ_O$+78{} zAG>k|xx=wU;xicpuJoZp_@jh2V*fcvbLOaEQfoI78G76C_3#ir`p{GYpx6Y@*m!ml zG97lGTjhFC!!xT#rXL8H?D%ec@jWu|xY{BGt|^;s!R-7f_O;`sJxWsZ4%ZVPxjis5 zh);nL^PwBV#N@5|^`vm4kf;Wa>#9&WJYonMRSxFv{>F!S6k+{`5PC=8^UB*`Q>jcL znkh&-21FPHd>xk2PT>ut_ZEa6ituHM5TFT&PTJ53MS0v$>jlYK#E`XEL!-;d=xiu1 z+h-`sWi~S<^7X~yCPK5ZLGMv#b}DCo@rkYF>6RARUPI<6%SAT7&(sb$VisB6!PQ@k zABrWRw^G7A~AwVa9$Tut$#Y zK?d`bSAQ*GuS1T8-es+0x*Jth=>3YKur~`6K98b={iZDSgbVqgLy3X~)`G%H;70>{ zo`Z+g4L`#K`yuW%7aniRRK#k5-Ebd~({-itD5GZuVm-;;|6k5}2AcV!|8SCkmH?`% zJed#qA8&z_ZZ}QICS?UO#WkbBsS0AXnRTJX`|&pho35|r86nR)+a!Vy01+9yb@59^^+Z) zr;J?)AHIF%YKkUjqQ4~CxpM!0FK#o`yi4Q12|2=barvreqjZwP7ES+zEC*~MwM>Vj zn%Dcf{BAoqI{?KadrmW@W~(>%^T#*aauKJ09U~$H59w-8#(&E~OT>RG&Z-Sf>m8_a zMX0lJ8Z#)lRz!a+@2_Jzp=zV{qI#Jjw$yW$(qcoQqIqK!ds`w4v?X#s+aS{09TrOafrcD z8tvvlgkhYPu9JXLEXcDp^|d#x?k?xi=wgV8(iI)kvj{0QhD>fSUbE)Af4f72dzAAl z2E_iyU%ZYLJ~s>iLCrT2lQ-2libLB7#m-fc<*y{qaxYl{PepSET)w!Dx`+=h7HB@C z|JgE0+qL7k_O9DMbbJ6;oxK&ZU)eBhq1hwNw%v`#wF(#@r5M9z>vKG=EJ9O&CO8xgPZ5AfA)R(>{P;SI)Skr0Nsb>!!7@o zs~=g5G1*&;#;}+|lwH`pji9FFS`3^{wchS$^@(Bn9w=*f<-d8;IbWhA07@U!g-Xd8 z;3DPB%cCCEON#x1fLM#Goi(iXT$|dz$qhGYdyLX)IJ)gREvXAtx7$ zWn^V&Y7vcw4T-=CpyN=HsRCG&C~I`jb8H1eRZU$3qgWH`5VC^|xm!p^hINE}hJ#(j z@L_gmxhiSBF0uMkC4zz+yW`uwjo!YL(sPfY5ohkQoFkz`5f|Y#PJC!*a$rp~9mvmoaake!Mr< z)N9!Ep#=h8G_3i(s9R;fUIwu!xoP`~RQPcQ%YwbYp&Bs*SA{~b5M@PUqQbz;*^gB- zJm_7>rO~oG_`NGV@0QS3g`!@(;0R5dp}ge8GlUPnubvsVv5;lm+eJNE6jF+QbTr;8qHiuYJ-nlI5X0=Xz;y#^y)oYhm_k#L}%V z+ppWl2~Bb&+4_5cf1p*U(}N|mZD7nnm7aVEC$Zw%qtr7gdybun`{HaIu1X93?NZ1T~0I^8CFE+6@+>C8_kr zhXH`7eD*HUC>8}>1|fpy;|8u;g#KAl#6sCXfq+*A#HchAtQSRxWjX20FvB=P78tI= zio9nC;G)Qg4gbOtL+&|fw?f3oki|puo61U>`jq25kEtVtQ+ZqgVodPM&$YT3@|PfG z)(iZzGZZ5^{1|L=-}=a0;07BDNKKTjOqz71hCbK>jTnkbJs%9yC{x|6wP7|g0JmoA z2)MUd;JTVg_c`W$mfAbG(iVB!I|kD3UkhaA&DV2tD5`m_L>Z}Z^8>GdLZmDaq~j=l z_6j>Oy9`}Fb-Z%8>s4M&6`}9$h+M$y&Es)g<17Xy9Q}E3W&*Dah@K^y;GLULxvASg z`=1kaOo<}7FU~_xdh^wLtm|dfQwk5phW&yLv<+@@2_N(RqxF;1`PUBp9(5Q$&e@{f z&|4@^;`HZk9ANM~sG3M28?Mr^N1yk`ZF8;;L(g7IMU6k}N{%(`F8HZHk9*Z!!-S&5 zc(Fi|(Wqp<(=5PRYMe%dVtGG!$;E{CoHANEK>3>!W1z<-S*bD9SP(#9k1JC~sBbYV zsq-Jnoiz%EaE~`#bUfs!K{i7UO;?xgciL@lF2*Q%*&!k3pB0Y1rh~*k5+q~!)|rsj!7qmU<7Guj{`=OO8wzf1+)X>D-`uhf#$NwfV;vgGn;&;4RNsiRk ztjZ_7{GxZjDy?QXy|a#VT&4--oYd?Vu2Hvcmk^INC#G;hQm(Z8A7W& zu<^4ZJ36%Z6c6i5jM(In4i_}1*wB#ywN1kbAQZ>ZZURj!>TpPC&n!C*!*DzT42&gh2{KZ9jb0JL8Odi7_HcAy%N}YfJEXUkS)# zq_)EVNL8Fx(s1Icy&_uB;($vy8fOePb^D)DjbgT@oQW!T`?yXj$7l*va6F3(X|GMMKT zy>zk~ctJc4g9q<`A)2UBexI#r!mji?R%LZ=t2Z%|BT=2TIttdYV+2Znj+tVp%0ZNo zB!b6dJR*LHg3y;K{30kiwV;Z$WxkLI(Vf0(iRG1jTLJHY&GImJM+3f7;bwt?i&@&GEF{B&qpp~{nN*SGm?60 zyctXiJ8sQp)XY*oBr%V^f4_$%oz!2zf00DGdtu>>)sKJ+_k_@^AZiz){YS1dix>3f+S zd1ve`Gce4HacH{l?FTUA>3yiPwNupySw>oa)b=9)4FylSnNibmt<+pY`ge=iFV{z( zQERBjkAF*UG+&~WDSP>vuPoO3mSeC{$a)}Ft5c4_j~@87j!Qy%$+fn>$#DK&h_cC% zq2&3yY&d$bgk?CnKjntS@|aH&S-aTawvX^f2%}Wi01s*dkBr@R1KddN7>VJG8bFNO zbgV1}bF3~0N$Y4X5tpuW09vhG{YaS3cj6E^ErtL~vKpH`QWq@|6b$lM11I<%zqTrQ zFt<}Q+KlrM3p`Ob_|ckY@4d{WH!b3hpbTnW$r5o#`s|IX1H|Q_6lzm+JOwJ)>;Got zlD;75IFFVgcS(deX&XxFk6R)-$yZsN26G(s$YZyOu<U>NK8m zjQE;730Zj@>#8SlO@OzvTL}|&Qw6}bLq*6Rr!9xCp2xdV`HjmIoDmw-f6w4c2qW}~ zH!Zg_3rtE0GPU#}9=KHMxi?LKB#%GY^$R%(tf|>7v*80Y4%B8D{TuPga;523iUgQ3tAe}9Z=zTv%)Z}0^T_f`)DFajE^L;POFbe z8>~yq+)9HyCZ8Gy-wAN8k0qk&ivU0hvoGh!tlv|~$kX1N0LLM??_li6Dhz->%3V2V z+8^_aQPQnYTG9+pcb3=`pWrtpFy1sWmmEn90W$Cad0j-Ne3b=yb%hf$wd+i!DYAIv z;xa&7oJ3BwW$CV)=_HXLGV7Ex7(4N-#&jf^vLJ)FjkW%EOk|KV`6`B5Ff#V??W9mL zSxu%m1_sfRk_&5A`lYBxy+6+ekF#kmv95^hvi>bHqvO%}_9@)?2TH3Rv#~F8BLnHD zCqnl&!fr$BAMJr&&ThxCgw3b9AN_J?Z7nce+-JM;#aV%btu(}dEHzQ-vRRG_)u?LY zoVU~YZ?+3cw;39EjpNd(>Ue^0MV>t*ApcA6@sNO&*+jx#n%ptVFUzY+<6V4iAHP}YoKJ2wDwG@IgF+|+-0m&*J1#!l*4p7ONiZy#H7x$r zOLkLVeEYMw6P2fw-WtC`INsYj=?*jBwg}@6fE|)*V?ZqENBU8f()!%>hmZxCPmTw? z*qaaL(_ReODen}}COwLTUzo0s=F&odbiTkkRUqvS5Yku7z$VHRLZs#I!P-#HJyuSG zU&-H4EZBz;)27{84KoB{T#PWjB@oXi1YzJ;<4{&x$Yr#B%?4Hb<)njh4NUGP3ih^v zEY=*dS0ya?_^f;+_CC*AljSv2HX?+ON^Y?lKfRhi!8J#{Qo$27A-}4(S)p(GN@dw< ziXc2Jl_@00kn{>#!EDx6!fLFLqH|{$&7A_u16>O#Ne*ACK5G8hH~Q#rl`f){cuT9H%=;pMRC&bu>L(DgF1W`TMWR9hcONG1>ApN>T&jJULYzCQ@VH)Nf`e z%fDJDT~JJ+d|Pv9+_Qw+pzm z(}-uXekg{pRpVd+@pzO_)LXBk$e=oHBuO$F_G-qWFy_Nn{NJrPYD_^sz*JM%sBDXC zeKIq9U5r`Fz)ZpHOq*#^^K4IhfLiC9`cA&t&g-jAzTWn9%=$muic>qxG2i&qLuDnX zpsHAHsUdAf`H-0>-3Be< zsd-sg(NaFw`0>@)QC2R>OMRta*p2D`u!1r0x&JL?*4Xc+d)I+TH+A;%fxdnWmZe6# z5!T6e`3(~o?VN0xIX@>sjEp|608F6GN5<}|uAo8|*NoY}CuujGp-VS5y^`j!HFGHtUrF}6db89=KznNvsdspA0v_pxLFpGb_lrxEgJxuD~ zBR;u)Ydq1=(@dH17%GTV^r- z4nCW%Gsgh6{LV*Vj;dOi(Lt!*MhyWq#yZ$JxPPboDMiixS}B)pAF9)0eF!m7GE#4h_R zmi3jM`V>fWNss_Rl|u$1a~!!L9ti+cS#PYKL(xqKIq5qPTQpXl4%REa1YBi!95gIf z#aYyG!q$P9f^xMIBKI8WwS2g=;I!(=vT_+~Robx%(gl|suJLIu9nCu{{e`dQtOn?U z^~+Z{ZjAGge6skc2v$@ZNt9qxRPnDUvJh0K08E?LD?I>ITr^Y;4+9zR&0c&IX$U2` z4HjU_XEE90=G+G@&SE4$@2#Y}rw`FeBwJ+40uy8lf>^r~B)jU+P53+4a&2*yotqGB z5fknm8*bsryXk*}6^MfxJh^A+~m?qhHuemD*dETto-0bz< z94rROEbVUckU6;9#swzDXxd@W!{Z<3aD0fIMC@u5F?G=FOBUSZg5J#0?0-<+NBtXE zxxT+U=ytwfBbH;-bhj&wzc-14I$Rv#a0b(5Gqb+q5C} z6kd&R{a{$KJLpL7v1AT)ip#;LPjS2qw_mB>N8TKwZF*o!9VO`;<(b&g4IR1uIAl3M zb`LtdvfP#41pVcl|6Pob&i(IzEL7OiRVd=5J@#E_)r@Alu6jPT42j}^; zp&eW&ElvUGU(VxxUgnepes#|Br@eZobyd?G5JGW%EO9*-aW-lhWjFMB!16ON;#{EQ zbME5joRtd7fgM5r4Z!Djq@THSOYNIC?-LU9V z6g-0H!=s3$znVEk1$}X*c)N~Unt+ez^&gp+1lP^0=M&Tbi;ftq0Atr+J`K{_L4N9+{%_x7_%9y;~1es~ov!lO2TnQEi}A z^MCqN-z7@Ek4uQN+TEl}Iq+DY|HcVLMx0bxPMQWd2W*6;1+2k^B4M{@U(rB$KL~b; z4eTWf=>9r}SS2XsJB@NZX+R6v!G7GWKRl#wP^Cj{guYAYe)4$x!}-gPHmT5A|L_Z* zU+0D%eZm)dTETaB7yAL+HJz{?dc&Gq!@A+KNXy?>2YY(2o-wPR?@tCXKP$O88sD@$ z{^;kSl*|>fLGYO)%rl1^CQAAA1279&5NAlioWtL^^i~R6{)-;&wS=-HEBJ8aU+OLJ z9^UIu5p(@5!&}dy7cDMgKA6rAf3mc0BwPQ?T4DVIf<>c6VKA|{I0kNsGz%iz2!Sj8YCzj+Qaot^)N+)GMpBArGyA!bk5(g*pc|4u*=}@f1T6vE z?CZCs!gyFcuY2$bWQD{4CpgMVTQ72R*dLMK?@#Nl@#1l&>-vtSyl(Ru( zOKR{tAJ)?7XfeNjCcSfuCx)dasJN-YQ?=1a8g!1vl=k}tE!Ldd0=<%kA+8ipltwW1 zcECb~;fF3Ve2AF2;$T5G;bwL0jzxIVMVeRgg7}J!Rvm}&)#D0Cml_TTVVnr4 zhpf|MF8_mHzS;;Jijg_MWQxTlcJ!;f8!fuV^PUO!{(dg+1BSrB%$pvZ6H%t29`9Ra zOTuud1Xtd9$)13)u+gwNybgZ$cG0c$7uP-iJGp+io_VOj9}tsh>BL|&5MwrulG=)JlmLz~;Bb8~1FJRjo_E?O z06bOf5B{Ms0bg7Up6DN)(=_;vauuFDZoR$#io=B_E6%+k97kzQ2cBc$*~?5I&?*B8 z`wy&Il`ch?$K)r<^XWX3SSc1BG%OYZ{*gFY&u16hv8&YPG0M-4ogtMCwPGj)4fU~giEQaHRSnm* z^K)13jRi(*wzcIuXoZz5l*09WZ6S=~1NR%|p4Feut()Syvt8MA0gr`T@9t7(YzM`+ z-qoXXAiNWRL%-OrCx$6?0BF#v{QZ$qQVv@YF#8`~_w{S@tEpR>SnqoGs~}YybPoxI6rbk1grqw>S*wDf297 zaL6^j^-DJ?8mb(n)(1U(n$Pom)*fDsb-zBmnfo_}?f+5#WFVmCJL&7&%L5+7MC-`+C}>rc~&q;xdpBFj{NcQqE=QZ0->yF@kY>$;xMB9&9K z$VGSX(BljruH4Vr>h>Wv#+L8zoRiY9_89_mhm(lb|3&bJ4zP3K?H?{l=K?JD_WJ9AjVBm2TF>}e*~_20MjkKv+~w?^D|I|0LJTI)ujw72*0 zI;+1XQ^OsDN^d{!><;`v7Y3|oM;7gFJuf=8qR?Jje$6a>qy@{OXz@g)yOksWh@)l8 z&O)KYbKp#6xxA)$OA#KR8+jM&Pmelyv`G0^v!KHJ*J*L*$AvZaCd8Cz>92(a%Bxti z<*23R!ezpaP!hH%rYY{8b=l^R2wf(|p*isiY#heIJlXVb&k(QUwh}3z!VHY<&dF_j zvgob|(97l_iCOHVd(EU_Z>u@Qt%EV?R7F`fr!8%Js}j8NG|hm<7sFe`i2a#-SpJ+h zo%7^`naXrBUl2cP@pr`yCB<}TwpSDuQ{_J7=j`W{6;C(*DAr8G+$1EF)vy#uyWZ})4oRo|+YN(D8A{%uje&?WfUNn@{o9qnpi!#(|< z9#u_m%jKfLtlew2Ph))!c7@#^@?Uj~H@lx_yjJwNxVXEJ@0d(1>8U)Qai9J`IH+Hs z@fj-lysaLJ`@UH8dDlt8r&}npWd3!`o!#Qfh4QKYM@mf2Y39$tRLPifmC%z*QsbW4 zq6C4;Jb^k@*(}jqv#07dAJ8`~ss6+PLO> zeYc~GIm5o8^+q2Yb__qzP*a#K2~sE49Fr>1*rY~&{t1pS(AOJB9JeKN)a{O6qM zL3@$pv-*YNmgs`R27kd%4F~CNiY4!Zc0m8N6Hgk&e9B=PK!2y5On7Y3VW^{SlG;^C zTy7PF?OL1Z{z)&5ayd!Jzb1cA*3j>oqAc~{-SoAqpnCAewYs1>H1;!V|F5-Jac;9? zHtl;4-dS$sw>b3_mjlgwn)Dzg%Iq8aEsSKJZnW0-wc($v%=^)|hQ4*BbzJ`l|Lr|N zDx5xhb2F*PKS|r%0_AcI#J=e&4%F8(U*>2DSH%77k&G=NsnFq zuRqV^gi?OudMYn1z6lKwkKCjkBCKBGEU!4=w{8WKBO^CMN`>>KxxYQ!WRLJW%$ZA8 z2P=D*%#?aP6)WEUw9*d?spS^C=K2^y-9PlbZTkB)k>;<76p2Z5*}q?a@L(1%+NUzQ zh!W{EaG9AezIH;lxVL2VQs~f*euBbb<}=slw=-7T|K0tdS&sRFSBiRgtNL+O!(3@8Fe`AZO;ZG1 zC>T>?y>t;2b}g@UoXH8v)8m)A`%OY&M#46lTi{e;@_FJ0zVtm`Vuy2L*OSX~u4C~f zPBsigvjnV!sTY^iE%4K5RugG#f|!;PCX`X=g-OhS5E5UM*`DMD80aHR;&=&XHQvK6 zAm#KtcqiT~8Q=T>oN_diJYtf1%9t{*oMJzny4{oVjhyOUh5I-t?LTtSUr)wYFvou) z;X5h`zVDN14uLdFlmhm|0}#@IbdfLKDVtm2C689=lUSsp+zYUDBGdGbLFwG->2hu9 z*E}e+swfcEOues;uYE9?G16hG>7)q)e|5}w@=f?nGZ|bcn0hlocAKSzPtR z)U27bE?IiAaW7zqS_jE{pUlf|x?%V>XWd33%1UgO@}r7?X>azAt?a$K?9OVdk`aY6 znVbgeoEm(Frt%!K*=)Z198Q!RO4Z!BGb_f(-0HGimu+FUPq~&9c|H_5@B~6cF!(+r zn^^~iw=6$PMRdKBSHe!m2?*iK>c{n90_ zujk3D&o9C#w12};rAqZ)wBX-{SXUcP9ff>@DEHu}f?|rIQqjUcdWGY&G-72rL!Szm zz12Aw3descOB1ukFzS3`P~YD!O71Nl`c%v(S8$XsZLLtE?e|>5hb$53$iME*|I!OP z&6jfGFa6r9CLdGcSI6^fw)oGi#!KV)H;htTS8iUOaw0Pn7M-{nRDR1U4M73%v-Uy( z`8eXfe6n9ce&dqjSwsMOSloYk_O zQAl@+!}SFs`~*&)q@d&?hX8rbmdMgsEqAnt$eC$qF|_35UVe|s?rXrPuNMWnyD%J zRclh8UnW+U&)0w?ddGqf{=dC?|EsOylZ(>xs`1L%shRoF)5DpWdhV+EnZq} z-rDUxIvsv`oqx;IktW3v8ionIiiH|2E$0NtZBg-Vk$;rkc zCE?|jDk&{1EtaC?C8@=#Z@@z2Bl5@~bdXHkl(ZDGcv8B-rh*rtb(D6pZhEYqWRkXS zxFx5pqqCd5w||gsm}GQzVrp+@{KH}6QqD422fxaVs(^rs>WxbDj~_+6`wjCmrF-W~ z+lh{!M;WonWq9UJuT)@k(GsHf%PtHu2AIUC`WrZgG488uymFV9!1&B|GgCseR^v9j zamrQ=!(>pLBS75ucV0@4ia8Tbg+_vEjc_ilHHv^(;|oor(WjUbI*EpasJ1&+8*3x6 zWq*xvK0WzvNk=Ls_4OfLGPqu6KU)U>4Y^fGZsC(sxR3IQR(d7sk2pEQ+TW4S)M*HR zm_IwtCt}$<#m_rCbWh^6kfHu;@93;A9TZf=@$GbOI@(6aAaKgKS;c~G_Ol?D{4^po z$h8Zzc+QW+Y`a}>ot8edLPFwn&^0Q0h5~9r8t{eiLgL5A z11p!u{r!GnhjZsDB0FAgVALgv|KO^rMm_Dd_PJ>A^n7R8f4gZj3v-TR#-HQJc$aS zpBz^$K|CkP3(3uW#amLh{ESjE;cdf~TP1=U)N=2ehSZEcwvR!~GM&Y336>p(?w7^w zhcro%6c9JpH6}EeV=e0+%>JSpvsuUGlJ*XD+kKr_N}UtD^(78X623 z3ecMk%vj-gKQUmIL$3Vn^*MX7SK7ORGIF^$1m`fx9|mS*rLiWpD!Ct1XY$Mwr$XwP zlN6}90t@QbTpABc+&pv7x&pt{7uGYMGv`enn^_u3xi&>)FG9Sl_x6E)M?qZ^ z$8Mc;_7$5Pka->6XYre&H60;khP_s#0E1B2Sj`ul=8QyDTwf@GzqfzDGAkUJeueO!@@G{17<72yW%F~G_daN0{zwFxagaN!XibmI;^1=|%0uF)r1 zR(&)n5S`tDME0%G+`eg*pOu{w?!$7n_DFL3?{1?jyMbiMd3bK0;7>=_)WS!fuj2Hm z_O)2w480;ZddiL!%0|CpEQQe#=U1j4j-2r7*u;wz|2an=0#1#^ztx9>#^S`>;AtUW z{OC{_@PTNq*72$Q^f>K$pa5*$h}7{y^CIPhC0Kewtslb`DZ22QhcyTXUIso?BE->P zNOc#OAwOBhjh~IA5dbjGokl4VxjZ>H35O~Kc@f0`j3VxPg%9+Rf6LHEh>6G zsz}YqbDYt<_w(sK;DQB zG=i5RYie|$fLdn31O*GPzsEy4Hrg#gSNif$F3#O5Mqew*GX z^Mm$s+(`#6KhcTCrAQZ=qEQ)&Rni!#?;fAR&gAo5KBNm}iasSq&Nzu5u(h`prXW?{p0=K4I%E*a*#&EEObvJWYpl zZ$NSr=Us%`>OM^6>ma?bN_a?s&FY#DD4zOmdTzhw(_CtR+S%*w*Ca_tB67|6)zuu@ z1&dC!sPw)LWh4Z%*^E8so$EX9xnl2Ir~gnQa5x z7VVY)$gYBmB3hzAcPZQsM!($J#fwcyxwm74vZD;Z81wsD>_xR6Y-Mt8+}u+a`^e01SRHsm(fHk(*7d`Mv7+qXC$lHMy#Bw_8Evt$1;fg0Y$iiaMe5ESUI$d7l zR#xn{Hu$=chRkG3HdswPQ;#>N4Yk^pkvdw%`H-Lszksj?t1ti-<)Q-i{oSZ`8h=1G zTPop9`IEhWvrUss4i|GnrZ!5kM{!27aTHB~!*(oUod&))hh39wseG5a;5lUXqpn-T zL1=4~wGPOdjW4B~#Y?n%a|!N9j_QfJ&+lTYPjN8StKn;bq?RaHY3`B8&M2Wl>d=ww zO=fT{pL~XW0nd{l{8zv9GtYLpY?9TRZ=xT&W2K5U{lsj2b|9~avpvyopPhJv*G87p zaj97Xd{o)FJWE?>T@*6^sCjpNHVPo5=fpqS)lDVLhk0BQH$5#2a3xpoRZja{$rbh` zixb}8H1LyM&9NEj762Mw^=eZz&07nN2a40gpLN5jb`3D5S=tD(S%-&KxYmEaONhYoA?C78T)aZhLdbZJ;@&@=I95zVQ|j1Ci(=AzZ!VqZfyM#fK=R!HXX~b!rPqox z^m14yEC{Y@fDzW8Tcx948Qj>JliSuTmH z#0zJzb}dhtrPGf$_5Ts~9p0aFb5d?t;f#MJD${>8-xtqm&YN>8cuTm~QI5d_;Y+tc zQykNSGEZ@C;0XOuEi{qZKJ&aK-U0sS&yT64Fv%0&BWdoIVBR>k4gqMPezy4-dC7qx zfn|*lMG=Z2#xRXB>@^FQ=R_Zu3c~vbp?IN4ZhRA! zfEb(^;Kxy*cxvL4{U7-JtTf3MLStqe$Xors@$44KOZ=4u?w}!d)b`$3E5- z7AMm|5hH`JoC&lcr?4}@41dD-<-}P>ih^K9A;4E}VS;-xp-7g+;W`tMKxlqC(c!H4 zCHTmtd`HY=*-sOply*?oj$qg5CJMq8Bgvo#tw^1!=DA>UV?Z=;xsGpVu2#t1Y!x5BG>0Ka-GRopMYzR z$luQJm8e7!pCm}Re1{B@Qc+4OTWnxD@Yf7Ltv)MblwNAvcUF-aU!U8sg7$%d@~|zF zo}2bFd1shhxCMujU9_NpT7XMEb2aR%#8g1(FtP7Hl; z44088i6c3-S#S31pV=*BIcqjDd$QnggJ;&DPk^v!neC`7Y$QOvH!EHh7szTzL=UPo z_TB{IFZ<+~e+sd5$+Mm%B*sYI;3Wu%B12}-&G3d+Zh^RT3cZ8V{63+)2`(hD4J%az z+pf|S9&?uc4E`uvU~ZaU8=Rk?4?{mC`4!1DfF!H61>@8K>VAe`;75NL!O4CR=WM_g zhb;d?+*w4`)r8yj7|sdq5}bnucXxLS?iSqL-QC?aAwX~l?(XgmNw5UTAI{~q-?;5t zt=+3ejoqmF)?Aa014pqev&1`iGd2%rzVPv}utAI}dmlBJ!#`Mq(&;&}vlIM!QOpVe z4?ZTaHDO)z`K@hu7GaamrlMYc%==-NtAtYgZ$0>I;X{9J;OGr4LK#La!0(H0AatTI zDLM&#k)~`6Iv<+Ej-5rKL0)#@L&;c9b4jIw0)H>S>tC=B4j3yh+edlVQ9gu(ih&FU zUgo!5fHoP3dd4Z}sQf-mmVKO{{Gd?DyqNO&%qQ!)=s1u3`$^Ph5(Yc>j_?aI`FylvDG!E^Kq0XnerK_-w*l*{iCUC91h%Jtu zzhVwGRKTwoDpwnFnTg3j_O~CKNFCT614m_ws~%7w8hRlcQ7ErwEd7fNPT7RQus<^j z0O5f5?1!XdjHT~#0dubP)oNeDlJc=|Do2ozF>AXi*q^CFM2Wur$I2c}b`&+nYByq|%6u{o+6d zd6S)}5#0+0Ig)v&RdaFkq4-8=aY9 z{x9)QQ+0J-sd!7h#(P`i!Jtd}8ea5r$}q-(^&uqS@cZ9`syd>*X&94c;XE5DL<_zD zF|sA8nQX{N!%P)jaRdsM(7f40nI*`nn`q+8P^!wLD%-7`A`HBy#eA4qdI4Ca{U|Q- zY1r%&-t4`2_rnR6nkSWVQQCMqJ**~+Ej`5J6@rct7MNoZ<5~{}^kyO>Wn<^cCIL!5T*Y)rS5C+ety99Sd!Os|w619wq;ZrK;DNXL!|YAR0bBxA>FEoPI6QW&hor|GSs4tPo}T`g4f$eWvS?_$T%fp`fVojXu;mb4XqpsA zIJ@02jXyMPm_GaEKJH*SDvm3%_!$32jjQy{Y3?(}iv_Nt);-G9I%f+@^IUvWU1ZQS`V&=-icyywDR&cZ-B^j)~%W2zVh8}SR(;>P@tFIe!% zLTEW%X$M)6HF3f2*dGN~qAZn%@d!vw!zMt+M{y%e_wSuppksc5<$)#mrDCzx9hm5D zy#WL%%p?VSV5>l-F@MX*{x&eR1XDGsx@vL69uU=lIIgt~e<^ao%7w54B#LrWt8uLV z;I7RVgi!9o(?o06H(_Y71HiPTh*HE#RE$6bRJ`~>o?U*;qIJEjoM2gz9dBu^5eF3f zgHNtXE~HQ*5e$6R&XBHHKi6DqW|I(JcAn%?h@?>-lf?dXuLa6RhH_%;TF4n3d&s%y z1ywFi)2#V$$uRygp`m>J%2xAJqLR_|_A{ig@Rm{|yTh=rhnH9*in_b(k7zx0zQqgJW=EPIUUKMMP)E4RsQ24n+_gjI2K!hFT zzZ~F6}G>IG^29P;#8z#iq5@1 zUy+r7vmXsL3HIv?^u%zC(}MQPt**#!)MAs)d|yG`PFIh#`lu&XmonGuIEIp=Y9uA_ zYmAd?ALFySw}@tUvQqe!jEPaIDzEskZ%x58Mwr zZwtDZA-@6Z{q%^^+|x3q;=cMFdEEIMG(URQ9%7Yv{kk`tyR7A8c(#|yMkH_afcwfMdzrv_8)#kM9it$9yk>JPD zZO83gcU|N_ub*MePs)lPR0KjCluf*=R#Z09g>`3jY>G~HjPK@u{yLcb4do88`TUy> z&&>rQxYF`0&$?f1;!|pJ>lySwkMTUu{d}VJtSRe>H^%*Bv3P%fRCpd6<*hg;a^Eor zQCd-@7}BUcQZBF#`BtGF8T5i%cymy#nFW^~mehsU2cU8Ppj>%It9(&4e)S@im5}Z^ zHhFD{I--75==(geBRbFe{TCSoSx%0VLQWx?hlB(xJ|Qj<3yYWplQ@APCs{zTfVc<) zgMfhWT}fsUl|lhSTq+jkm$a;+jLgQ*abyeyJ&Mua6}bDODG3QGD={#u+mhk&ap_r8 z%_K!xvx(SAv(>9pQ>%od??w-a_hyol7QQsKW>PgIGw>)X_4W)6yvWOkz5e_2uX$h+ zkJ@W#*DmHPp{SR3R3?;)Tb&dUi}KwH<^f99n8JQTA(*K4fYszXgiO5IErl|eGtSH> z#i5J?ol3T^j)$Y7-R{!mR_Lr>JRA)_2`>^;owP;+Us-sZ9|}_SAXATR>IyAN^n2E5 zCcV;#6{Y$2QmULE5w$_=!e6wtaci&|X@KX8z{F@5UV%Si1i+$_+9G-lMCHQ#o)w(!4%kfda05T5O(t{lw5flVi~%txa-zVj{>I%zb&<27 zMysvq2qiMkJ7?gdR@Bz0;3xk3~}Bd`|=s)rnDf?lnSZCi;vau4O(lpwJlRTc@@yCe%a)>*3L{p_GMF1cVK`sOk zhRlTvmQXK!j@kl2x$Mpgm4iyEiu~$6>IK+;p4cu4#&5I94g3s$wkdgkvr&VjbQo(> z9Du054z`ag3yrIZxgg86j>`HQEz$>V2#YaL+H4CS2PvPI{>^pC*! zyt{GU5J)xPY`XxuF2G*m-geH^=CKpcNF2e4M%TABE}{mZuYn{q;0@lGYD-O z0^xJYs7li)nBXHD0}nKVNWK-~i(PaMYfJL8A|w8_IiFdO>F)d*65K1WUnIM63<_Cd zrO0qaY*Rx{RTbfnNF*k|i)Xg@cUdpn8uxVl&EMtkA^!Ql8>`=Tgw?+&#C-WrHOY6u z!`b2677?RQl?}h!HtO%Ax)AE<`WiMT#5>MWS&GZ0EtDHNo_Q5w{@$ePr}K%?GRiwj z^%6-tXK+(Jh$n~kGesn%0KOiHUx!Umn?6;nmSarADFo}vG{Naeg#t2*+5L~uU zl!yIDHnkA+e_0KE4^e^CqzB`dnfY5ZqriyRxj8*v;5)+G7&%L_&ROmce%hbi9?jDR z|2v_l)K83&I|iWPnM%PtKS;=d19CMKQEfysbJ(AYC)6i{C7Lj0jMRfjbHosv`9xz6 z96dF!i{~DsErTACzl=8#g*GJ<$^TN>9MZRwMohY$2zu z>97j~Zu3Ma^~rW|MVB|TnEnLM_O&j?_t@fjQ)NV_(D;wcM^wOPZ1WaLou`_KQ48}K zp6-hjDcD{2{YG@D3MiL5vU>iDM=-SUF7a^k6$-Dg( z1xsuBn#1B(iea(cbp@F{akLNh<+=3owf^G*wvvHOy?S(ryki|=(rhu=wMxYZHUb#dPRR(Cx?@o@YN0GtwkPG&^64^^oDTb3mu@H}m4 z#JvGHv*CzTnJ9kk4)L@eE-N)Y)sp=OFGHuG14lJ4SY8jA6$H8GSuksG3go9-8*L0e zq$kRA3K#Tw$&CKmP_+{*GyxUELE-g`)ZaHV$T_O~j&y3%$7TTzS z&IPW0F;uCh3?J||`&}^@HxJVNQ*+?3RCCx#R7*z7PNS}9QY4P0svgG#|H*Xj0;B){ z**MbD1FFST?PCyvJYZ;7D}2RR#iT|g&9AjuY(uEI)%w3OS_x=%-w0u9MIF^M8Vi2` zB{68miHs|_S2~U0TYD_FVzK%VQ|$?Dc0Hn@ai)o#{V0gAbn&3I^r9XI=8i=|dbd?AvsasYA#3lW zK#MLA*RpnvhV8WjtdS6DeCNG zNf0~#i4bb<{m$5bYiRGP(<4lP5$-Y2{}hOyHVA?X?$di_>mz;M%NY_n9pT2A9u^NL zp5J${!d4s46uG353$exBx6+3z6A4~ovsbZJ*@1EZE^m%4Dd6f2@oGNl(G_urni;Y?9Hm>**eP&0W z;5S53fu#YHVJxLcpzILIEu$Yej|8Tm5Ar*&>ero6t&hvR92GAug(y=JDh2HGb9(po zDF=yWJJ2V8rh>oC=3a}Ku8fRFw#JM_S|2g;O^f~iQ+8-$61}k0ntSWM-nUL?9_`L6 ztFMSPWh8jk6dha&;n?}{iTFhtYAi{jiEBl9soLu;!iP-EmnGZtahg}+R>jLM1aD=G zwaOhUoIRi_ouMLK0CvWTM#)LQ#_28%z=nms$^gM^x*)y~Dzy;MxmUQjcKFwjm9vn4 z?X2*2Ag}|E6bQW2MJFy{pb8}~VdLkcqHbz4*2iW$*+=U$B{(ZV*ULuzu15V{OV*Q1 zoI?Y3nu6pu1V!a3LRIcf^^HNs7kJ(5esU)|tQ|&W3Rd>9?Zk`f<_196bQ#1Vb!{UR zTXa7X!rcweBh?6_RbY`eFqE4nEbgKA^$X;@6?9>ku0*}`fwj#?FiVmfXBq5$yE$MLB} zb!x{QL&CHnap%=072}xIKCvn}v1+z>%zQ)x2ZCV-vMCVhU_LMfI}w8^%2o+-zZe)b z47WrbcLC(;4RPb-i2Zqko(c%D$%&_vQ#nn8F%G%QEd^J`#G1lF-B;rHUBG}4u-Q5* zgEnjKpu68)$mM#3YE0Mx9}E~vbv}U0+ag9Q<#*xbDyv5$Mg@voM^0{1v^ykWuz&+) zfYSIpOo+|+gD%L5YM8W?sX(F+MB}6m;~zx5{Xi4(HMZXFcz_$iWOwQ0&dju~b`^ss z6;}Sps-r;qkGO$AVqS=%a3tr!0ofc7?J@*9U!rJUCMIELq9BVOWs2W_llp*(n<0kc zbKn*1Ef4`zy?O8gMYG111zfwu77(Tn<0tb{B!k%i{FqVZwQkoLSqd##ZsW05b_~Ta z8kQ)^sLk}>jwPQ;nFw!FiPgbL`>2|F(CQLJdA0=FcHAHswH`lu0pLw}lscz|Ho!;3 zQSN1N;iX`~#%`k!%0cMAkp>^nnoczsjsg!O0(jN3J1g@T#`2J#@}{xi(RqZ?AiX@Z z=WK-~;=u#g+%jMQ3^lP7uhu4}#}u64QkcaT=_#IjltLo=mC}BZXp0@4hXNh4fY#oG zYViINHc0yjcPOWh4}lK=arqBWdM9~;)k7b(XGG9yd}5tnolMb+U{ zAY}`=tga*^7oYE77OE91EoGkJ@fP;HdjQ>3DRE=0e?-HPjs#^8@mP3>ce%6W3Q z21{TUY@6=WXD*u+3s*wUBI1RF^L_NMm_V;K;V>_9-dJ0MmwaC~ zvyRz)$&L7;q@(+1^~+a=1{=9AFzydI74kz`7Tc{Bl(cZ)gVeWw8xLYuw@!r8h%I;G zCug%tv(96kmkOyxBABf~-YkLAZ)St-qgR9v@O$n;dix7rTwv?;<}%h>|oWM?@g zUll1Lxz*&DmL*so%!SfFW3@OzkD>=|h%W(XsbVn3H68CML+8Kpp%QVKb+JYD&LwCa zBV1jdHM^R8qiVXn>!#Wywz_VPRMU`n^3s}LH{g*Fb|Qs&u;4!EZT^vBV1d0=7fW4} z17yMB0&}Jk|7CAHeK5dtks@m9g-ik2_j`-WRj#T;BakwdZ3;f&i8@yGZpTaQZCOuM zi4H}2Te$bFGO4al^=)1C?QiLz&2yI$QgY>RRkOkV-N=mQ1JIlL&+M(#@9f0ydzjrL zRtBhT%oP>2+D9_vNgKXz=L4m=fCpQmsu3j*L~-RUZFlLtlnGMrr+X=d2EX$NoaJP@ z>JBmri7{^v$UF>gkqo^b;r0eI3u7y*S>i$?xL0pw1XBPi)BP&Uk~HyrN{@QO_jb-N=JCD;cXDvCEhW@cnpACnBR8f4Na9#5TWRC33)0r3wxkOo%T0Tqz zNcSgthy~h_?Rw)r(t5bn&t;rfLv6|^2zvB8B zo{?ms&qG|masSV`t>6eLxyWO%Fu-X&%T9A}z%+7#duyPrTmGp|ezTy#hotXJYG!ZR zay>y_czfh=b4IbML6T{9m05H+W9D3_iOBTxuomz>(t>xy=50=yOv+@wB5^i3!&)+p zXw<{D4`Ks=XA{H$GwM8}BM>@xE6`)s=)ciR!(og$sNCEs*}0Y5Z^D z{=Wg$>3*Dk0B_dZwxsI6>3MXh@%vR9ynY4JeGo$6JmSB(z6|x$Zs`My#bcpGydMK1 zhE3vABd5#@Ib5x$0So>K%U)N@;a2+3ek&R*3tRPXKDqDrk(!zulEcS}@C1u(3n`Jn z`RMC;r4`|15)(nh*)uI$rS4wzre%Xh&9x@TNzVB-f|l}2v|MVd2HB|Q$1KvX&zGFq zIDy)hU4i^WZBG_8QVXNI+k&;%!xPs&4AOJElMC-oT~umUe&)w4YDV6xYY&d01xhKf z^(G%B`?=OsuSv<4$OVJvo}dgx8Ce20X}i1GzgQLKKCArcYbdLsQ)ux*p33_7S>sp0 z=%aDhvoQ>54*u(#Em!C?%_mN=`x9W~S3e&t1oeG9H9c@M45R`;aB%Zr74gkH0xHi# z$fb}|I2gkbIUQuPsss!2`R+cM7qGr=4q(Gl(ij>w`Nb+&4s7mOV(&BS?uG58U$Q=k z6~j1H1-SQqVAMUx6DJ8e!x)lznSb4>ATbO85Y$pScrXzx_adnP2!m>1HB5wC0D-0R zo#P?oJr`JI{|YeEr_3{i1`sPzBWhfRk>=ubVK-JA1-$d`nc zsw1&{Dw!^DOUYS8K}g63UQzu~HC|5t@!$4`r&>wr7F~asC-5xz*{JlDej`Limu3tD zSye@uf>T9BPDM6GMNLgXF;$(1M?Ffp}niCwQZ29Ww57%gn@W!>Mf#6Otmoh{d-T}N-x#7p|6xfW1U0Ids{;r zooh|!y$dx-WpAqJ+f=peItA|Ax~zhFI1Pf~AfsuVB9-yRAVnhaXV11WWs7KLX^uEN z_y_&gj!>c&Bw~Bz0GNcqQ0jG>T}2It0dLgOYAP3ly7eS9lkxel?#+7!wf~+f>v&zx zXzAqAsc1VGr6I^Pkt19iP@QS_6`fPRfp1K@nIwZ==vTKZ%XJzH)=P0y^}21ewfeo0 zJZ1Xv>UVE?5BXY+swW9rc?pZAnm}5|ZBbS$VT`P@e1Y~@1 zWWrr}EYl}k-lttJoHkRey{YxxPLjq9@UUt$|D!LUCC` zvAwvM(F=P^%9GRKgt~7!nr0)GqzTm3l9cLeaIrZ4nW{aX)~|1@T(w@Phf~L`XwqeF z#xMkg(T3KvM$N35i{&=uOth^T55@&$yFh>t;)MEnK1ya{5OS_r_^D*Agw|s2Mgngh zl-zeYh4->KKd+l_Q1Dm(W`u<)w?ZDh;`bk$5zHS+mP=S*VjFVX*o#!`>!l0JkajHdx$XK4cFHQTe_9UaOFczsy|59$7c@`Iq5NYdH`R9%x|td_th7+;I@M z*7LI_0qw|#S9bv~e&xNM+S6tDCu2V3=%s6ZWF|p?hTK4*xwnwzRJ&9evA>Yy4RN>_ zc=OX2mT>ggclZ*&UQ$><&}ECJ=95sHz5bPW>YpFF_sjcUu3~w&ccwFRgZNL|ygqw8 z9km$09-aBWhd&K>edqpflb2!$9Z<2m9Y$5)qm=A7q-n5{MGt;I-VY{^358hfhoef| z1aq3c8NT%hrDE+JUP`2~3qnI5J_0<;x&V!q(Ss|#`(Vt3Qglk6Z*{J7{$*hZAfd%D zZ1a8y9c%zqi%kkUV?TzTO&mqnB@|EZCx|uT0NqAUa%LtOu4OAeb80#|xF*dWh5gVE zqROEHNGxfsr~bQ=k9}2L72-gs+edAmL<~9lUyTf13$OK1Lg0a43y1Wd`G` zhJ;brm2^laenC;b>Ay2193Yao0|%3?fJVk(AFtKGEPMkf`fqafyk=w;7zjbYf6EiBvAgJR3a`%0MQZ~;Pb zqUggFgG_zJk!@-7#Rh^9f!XZH65OKu5Tcx=;$LtfiGz18K=hhLWM;N78E$vQ8tk zt+j+rx<dCF{Np5B(Fm2!*)2j*IU=xj5A? z{%Im)Dl8XA2^GqT#gG>YWLaAY<1>Y+h(m5<@7{V7JU_K)g(jDGrdD_frjb-yrN~+# z%vd#SAE}hgkQoUF<>_s8doHyI`jFSzjov1?R%`8ABq*aAHnF;wK8()$=%cDmgQa# z|5Vhfux*U;XMcn(iQTha(OkNzr4DzsG1j%=z)m={aIw-9!2%sZq`3w*``15-p0fAf zpT~(8ZZRM;CU{<;b?ohu7T-dwLq$SVkJoVPrCwms`%}*s;SYPt$fgzbm|nw$)UNjz zX7SdjhWv4yJBS6~h-{n?ab<v2+9A>iNbw%C~bCI1y0@IRzuq>hE=}#8~?cn=BJ;yrr&1s;_8 z@5zGuU+_7<%nbOMdx~)T2IKm!U+JxczZb8!{7$WBb`2(sz?q;_XPLRntwD>_X7Cy(jTrw^T@7e`tSduz2V=7_iTEf)LG&GsP~REyuEhUg8JHn-?#Gsp4_eJT~Op~ zQECD)&VA8*oS-qbSTJt_n16&!D7H=LO?A+Xw>b`<<5_#qiH>uPwO8?~@w*kz$v?pl z(X#w9hA=%_#`Q4f@t_~0<^x`Sbb8t}9ZtM34;DU~7%z7bzHsrJFiyD$0X=OLDSuuc zmnv^hEuU~A%Rtr|A@vTPPF@?`bqimcK+c>3~WSfFi=Iq#oH z7=DxvED${d)+{FM+zN~A7i*2yRHtQh%@C8LU<|WW?8<^gA&bfN$N0y<0)0?jEMvmX zBO`28l96M{9~2|n;j-yDF_D1Sv>2U?4!Pi%*k`)9NWHisxw!cAIIXqVRJr(onz(Gj zn8uFSUPydQO-$*NYJ|A(tGUuPCMbqVjHgAen3}~^io5<^DK=Vs7$jC+#t!mG_>GG; zRio5$kZ@Z8TOU_i9*+!>V>}s$jpV52Vv+9hx$X0z9U_C~^^(-AWbJa2%A1omZ4-Xw zBft5hk8KDa%s4FSZb3AC$XZhe1%#vXH5pF?suG;x4uLepazI&&zE03qosU z@QG3t*ix77-#$Qu3?dOWiew)-DNxX;_!((XQeVB&M$}Rv8)-{~+H4<<$>o(6B-5kW z(=a+&`D5W}LcXa)>8X6*Qe(XdMLpBP)xkqx(k(SY6fW>sxd)s}$Q_4tSt8RB7d1mn zOdEw)Zv)oTlIgscwBGYaMvGoUF}Z&%Ln;y_kjdQV9zds(J{8tJ-R z5p!E1%~*L?QN9pvV;f#!o#U*J8mqfeIfYW$%TsA?UzuoK^)W8V{)Nh+i^|D9b~&sV zr`q(5CmpN&7#k2~T4+2#> z)iUvAHGfgPBG11#f}4H`H2qR9M?^z)_WP1O-gN%bbVdC27PIN5j=GQk%lB}Y7h#}* zHZnD_#Nh@rZ9eF{6B>$|n2=V-@Yi=@s98cE?SsKrK8}_c%KA9B7Q*b7mUcLgkYK5Z z0R~$-A&fk z=|Q)RA|GQ&9CNL?Y#GFRoE3Z?9o50pexBRr-Cgc`)n>rm=Bj9B{kO=ozD?1k!x7OF z0BiTPv%kK&{ z=v?*dG*|^6oY^=ag>Y6o`=Vkt#&ax4uvo8Kb;oyEbUO_AHxB;Akep&46SSPz>ZTd* zY5&_pkAu1Jsb{acTe!cwrMss;zjt;Dw;2t5VB_A4WMhyC(cEGYD1nm}02p!%#F%7s zF1q{b&bsN4zuym_+@rB3YkXB_Bt(^RVXNx9U+d$_5&}4Mib#AvFz9)bJ0B3w$ zab_i@v@VDT_7ErYTdHq}-*6Cpdx)fcFcLQWMSqwk3{BQ>=(J*(t!hX)U}ykwqyRSZ z!J!PO3GS-zqfr_p?*|@2ynS&+(`gtJIe5+%&@xJ(rGUI7E)mE7%;^e7Nt;F;No_x5 zB)gFce*>Un?QaKHAfgnY;kFly)KcwRDzBhl3wt_MNNND73T)e^iFry%X$sSFN;GzA zwR5Ut0@~Ljpi8SVNIKPW?KQ@%(@r`zC4|=V-*hC-%)o!8Q(}o$n z1rRpGsW-Ud=-TFzDMFp7Od#642U3bS>A(>wyFAj*fjD=^JZIxD7m;m-Bn zSqB!2B3%`inGiQ&ODdza1OK&8JFAC}s}uNZAl|i5qc!iuwW!`Ta^(>5s{X_FKDMS+ zN#XT_tFfh%A#opP2OD>Zsy^M{es~cZc{?^iqun8+L-e}NWh}u`Hk-H+n~rB=^^R+W zjorm$TP}iIC%Ris-dnTTn_Yz)4Le(3pqnv*TjT_Tlm8~~{#(y8np+<6#Pr@wB(vb_ z8QLJ**%MwicHGHL+zHd&0Lrd${Mi8&?z&Xb_8l87oc6AMf$oKl?tp&m&`p2eG%~t_ zF0UxBp9Sv0cU)h{{x@=;Qi6eBpI^b9p1y^Nshx$TlbyX+<5Pq#>yRPmxGC?nrQp1^ z@S?5gvc34Klk}#K>XM7>cA(a}qa)nY6YlK|_w|MQ`@@5S;h}olk%s%x#)q+{$MNQ; z$<~*tw%1vXw|TC=i#(r8y#JQ@{;TkZ*961e6W&<-#;h!OP7XXT4_;6JuM34Yr~cQT z1@F#-e=mX$l)#6|;3F0Ai5mD+9ek-7zTOVs?uPGwhmVeq?(Xi6jlm}-;8RoZnHl)u z0Q`6eemVlb7>8d@z^|v^Kc?Zg^YHsc`0r)-<0|~`Cj8$v{NF$L+xkD`^#A{@-^hJI zL23>X5>hBSG(Mh;>>cSlC@EyN)9rV#dQW?fVqEUMvlZ8C$qJlbX~d3kzGj+D-l6Gdxa z?4NpHP9jA~K^up4_PN3p--pYIoEnVn%5r8P;&jA?VZ8!6Y~^tNCX<550RH15q+4<{ zCQg9Is-Q`XS~Rz|ZjJlnRxrH3@m#wrTCi;k9?6Jypy%DhD_!NeR_Uiwr zjKheuk7mDc^=M4t3${Yj*mW^v_^E&2t`U(eI_Wvy{5o(=+SA(YVRw#$j(p>#igNJc zq{+^AQm9QEqL(YACgYigB5f6gUP9x$l@(ZCa-BhbIIKh;w6h&tMI?``Tp@o#t2&Ltz$uFy82uSXU9=l{D~8MUXZ_>+8XMyQ=3hm^E zH!~arjSr1zscIm33Qnci`QJC#u9Gq?Jr7G{*`_nI*RrDq9ZU$sV_3HlQSKn>7L0EcS)RF=Juh z9m9}H{8RW?$b7EmTxS5RuPoc-FK1tD+mA;`*nEYb#(4D`UL5mFkry82<(@*tu7J6rd>9ke?+3Bav zkxqenbj}x|4H1YSi}C7@h{9P|pVu>>?>SPpEm(A9llG1&5G)>e!i+bOXG ztMm^nTY5gXBuVO~9|@U2lS}&|kmapcIyu90RV|TY^)=nrL5QhKK{LoSbN4@aR&N4T=Q>)f*!_Ow`LcZ8 z&?+;B^m?w^4W0JM6-K+ldW3&`;l<4(S$hm)ZMb2xXNjxX-_aYmKh%iHAFJsPVM8XC z&D%T{Z|ZuP8&OomhGid=BR)h9(~|)?e8$dJA}ABjpqBvqoZ1Gxh7*dSO<8idy*rTf}^27r=C;9F;P)| zq8W>mU?yGv@SKi~P{16kMUa|${z+aIdlvCMUu{k`(Fo4>wO(;+B%GOO%=h`nH2Q6X zbJIEn%sd{#D44u7}RFq&VPT^Vcwh6B@vDUgBCl)YQ64fI5a zmKjoM?}n|EiAN8RyG&ppj|Z2-+(yeI!FK*+UT!$u4 zKNay9(#lMc&iV~=Gxd78j*%Xox2K-=(f^VG%?&cZA=R+Zr-Dx>Ep2D(iLF_bp2CGf z+EMU?8nfAITjZVoqGIayH>MnsYR-5|Xx`(K5f%URzQo$TEh7G)ze6=Ml(+W+XuJI@ zGtNm4hxBI-R@u?ter-hq1@+NPDJVLhf%Bad5QyeotO9mt`vQTi%=sq6BMG$aa ziiY6tAaBS=`Re1+ob5|O&QRO=WP2PI!(4}Vr3@t0%qvk(_J1g$N~aGxIkI!S6vv#l z5h$j`VAo0r$PX@|Dr<7V1>XfuxAORDM&B$O@T1%~ZeH2sJsQbpadbHro>tRwh9av) zaU8j*(Cgf7AQrGJ`22aWlYF$@)<(f~jt0Kledis(R?9TAo^>%3^`f=AQ`~S?OT!k5 zy5bQeP?w6w_9BjMaDwLAeZq1$QZQCOZo%YtDTNF>dhTttdw(i6Y=U5aWb)?^L?&kT zO!U2Z;R_AoD25DXK>w?Ew9|B`53hND(Vw@(3DP0SGa%TSGWfwe7&RxjuQhlq zgWu7#OS1t>8 z*2Nip46nkBknCWQ_Ti(|R><}Kq_`YG#tHUVprMzGR%hQBNbmBPS2#`ecfpuF)qeFDM9qu5ix1LvNFB{;eBXmPHJFD;_K zEQVDLk?#w z?7dJ?ArJbxc`EEDU*=qZ#)WSQK{^94S*-?-COj}W&F;5YOpyy^s+_+N3h3M?>1#AC zyBaLzR^Uf!22F@+bW?`JdIsn@qwp+QBNw2RoA?g&VHYU-5lFx?fbY~vM%tf_)t@aQ z56?_fPZ+``#l`~rc{-1qk_SF#Fm+}pT;#myrAS?1Vv56h1~ZwWF+ec?TKOzo-=q&N zNlgqP26SW(5CKPZGpFZK zF{vDh*-&BT)QorD-uz@fCV*LsF&OM2NE}%W8+oU;No+SDOBArt zSHKe=GdC6e`p1CHw<>_npxq5$cr5xC34TNM;#W*sVi$^+d4kc$!tLku*-px!3tXi| zIzMqDw0_SV%7RgXl%7rk%sOK1E`kr845tjWz71N_Q>98u>7HM zH=u1f|7G3>woInl%Bviz#!y`A$->_QRMmtj4ye>l0%Qi0IR&vblqumwDHvjLs4DzG zWH(f{X3y-+N+HJDzif3SHsn|xrN!CkO0MX2&FCi!z5#YM`SN5c>M<^BWyL93d;%d( z^r+AM^#8-$T?NGvaBTvHnE?iOx53@r2X}%)AQ0RM?j*R|;O?#&EO>&uJ3)gJNYDfc z$t>S~TmN3|{oeLXSG81ipL3q~*u*7Az3jktPi@1fqX>%^PA#>dsPE^k$I`7IcCVM7 z$W44r*v*f4nN4O`4~!!DMzo)bU;RBD0w+yluR6h~KQ66Xuf@nBV^#C`cp#qH{k6${ z5^^??=P|}Iss7l}Riv`%;y zvO@}a@n;rmXD#UxHd;yJf)~FPLsjF*)LOp`kl_I6XiHl)HzN=a0k<2iOJPYlVQmGL zhI#W4z(&TLSgJuz^KCb7Yg%!3i;)ke4@>>0;O0_S^`P3Ea+?jt9;#|3jt_I$Z)ESt^l(bHq=ce-<=_*vE$ zL?VgN4|-k!TUE3PnEsvkMm!Z=vK0@DcOshk@A`52i52M>`0a9NA!$7vQw47VX|ATo zZk*jt^}l@c`VwPH!TK28(ec^iYp!lCKD|6}mce6x$rVcEGCv<*R*hSH(oKHdJ?@U6 zPM~v4nMbBGa=7|5_(7>_@FAq-q(|&~wL%N+j4rWZvmyO24TzVt)#O$j+>$18S* z%bK{3k|EU zVoTELUR#ykP&@D<$b<`eOO965O>poFF+pD|>iY_lY0?i_cj^hmhw*m)@q+}$I-gOZ zwBiWBL|-*{{|ps1iuxez>l}V0z#cv2Z5jIq9{qETmLF-_et>`2Mci;f(V_woX~AmN zCW$%sj1Ser|2bC1yZ0f`a|TQ>O)o#~x-{eC;B0Xkhi3uESwg;o@?8Rn zJsFkMl=?L>8t0&lBG-eK(Q@4hCDaGPK<7t%uUlz1ujxTs`+(6{=6+=nB>+dTh*3mh zHD5O46+^7Yf`sKu2}M-2O(DwKgx1W8UQ?7&6M9W=%KG;uUq(a*0O7_asA5>6N)m

    E2>(cxgkmdW2`on)1Zk}fkt=}2xRfd*#NzNj+ytS6#VE6v%m=Lf zw}xZOwrtJ?&CP}bJ%^~r(^XnB6OFvY425N^6%t;yum06b@Y$Zv@j?hSd71h}5c9)V z)z(&Z6%v9EEg}z;A2rNFGt&9m*JuaUr|3c4-ueR3s(u+tp9w`gZ^=m`xL4<;J?~WL z2>H8FjD)4s?#31Wl&f<{O0qWFezkUC@K#whP#G08wD#;(mQ23dBw;WW1#ZR; z2~RIeYl?2LRcdPbi-s=i_6-HjVsFPW=KO$bRoUv4eKJ@C*&!;nq7Nm^j&1l@otua@ znu!#HDr|mMZIuW6j%Ezpa!vLMYRnSu*~RF9{smnXD$NTx9iUitN9|&N3S-RF3?j1J zQm_v5i9zPx!%P046uN0b{AvT$yf<^J0$W>6SX+?USuRFOU$5;x975(66wK^fu=C@LxP(Bej`kt;ho_Ex4@3eNsrL~EL zPX3(&M6SY?V~z)zbafAvxBn{d+5jGWbm|ySA<)z4BAWp}Oy&==LFOiSyvIHtObDPS zg8=Bx}cu zT~4ASbD1J5bG*}ZDS`xGl({AR@=K)nkdjtCgy@x$jWsky?SkeyvgsEw?gi3kfg~n{ z#lxVfW5?p3mp-3=5*O{9lmx$1iHO$$HB~;p|Z#fcLtU&QOlGM`6JRZ}pELC4tkpV%_~pm6 zx)!(osAPI}J}I}iFt4zenudvag}Jo8KD?}>^O@RnR3+^bwH%&PzNIQ<5<#!1Pu_h$ za#QFt;6wLAieYIODW#yryoEe-D)H_>y2@NSOY+IA<6ZT11UezSXaoLj++wg8lk(lr zXcFru3VG(0n$kIWB}+lK?dh)cYJ41K5nd#vkEAgK7BSN~3rOoSvfL78pz(!a^k8hi z3m9ETlQ6lTJumNuJN))I5$39AWfpv~FM#BbE(|-WY9Qf!E z;a{mv$NkmCN)~$CboGuVxn7wgj8aSeO$6Ro!O>ZW&I9eKR+(zPbfF0&OCY;yhPIYf zG*%-_HNGHLmell3#gLu)cz657vGtK+#(3>O)MPq?@+{+Ax=*t9-+293AuS#UVF9(A z2tWSAU!Rex6EsDltOgyK9sIQYn$Q;tgyk&-NQ5`RI)ldiHaT>mKl+sO!ocB~n^;>j zyo2WS7m&etzSxp5FeYb77%HW{ur4#>dIg1>+e9HN8 z=6s$e(elLkBz+Pz2957;qRmkWnPWA!^~2HbU>gJ3X{sc)feig!`!x+8#7=6=!xc+% ztagC-xwb`OPH;*Mj*CnelAfyE68;TjY>oEH+Q!bCGLH0FP0EXE7wNC8ndRd5M>t!_ z76fj4!iuVXC9|iOnF8Gb>~+6W^|`+MUL0do_~i|$QoP%mV6U0SreXjNp*kOd`4cVn zhrerWUcaLb&9rD`2CD+n7fpIjrzmZxPR1ERgXwFqLQMpWuw~x-Y~rvs_|e9n6?jzc z$u>!E#-F1S{>J6l<>T^-9YSss&u3z<>s=LLl`18*I$tXcwtEiv88rAyW5yg$#-Jb$>W){<1ycR{R^@^|8QGt_C@ z`AVap8hLe+LhrX}?p&Gi(GboS8i6&taTi}I&fiPIYtOfwO{{&1{M><7hL?DkyCLS) zW|Du**eR2jeI#D>MfhE(8hk+Nl zSZmKr1Lz7!;RFScHNgj3)>1X8i-=j&rBU?vWE>s_YL+1V*ukVE439WWa)|Oc^U=D8 zrhi2mO>HOi%!4b!l`8*_gYv{LJ|usda%4uxvcifGd%RdbGQ+FRcJi)h$6C+DM^4WK zf1+zY+XUI4P&5W(UC%68jU2R0v=TKMW(g5*s)zm)et(aTK|E9ijp45~I7Y_b61`!t zaVMAm`h!0c0sBVQnK3y0Q(w!c+H^tSyb76RHOl&2XXX7~X`F#2-0Em~psb{;$3y8h zS3gh3`_Mt+466#+hJ6e3R(LvGDt$sD>Os7aUC>E)16>W`J8~eGF7Iostr%l+=Nt~*!u!q+78rid!=Iq(>S(5 zHIl}#yvdxQoBV_ZP-qoKz5aK(Lv3K7ayFAYzp7MbMkfga{>8G@{Ip%F9UM7IAy%$n zIxk*{qI_Jm&hr}Uth~)clHQ8>oo$!h>!U$+wt#sVYnKwEFj1|z-%i=r`#In0*!h!% z-UTH)BXkn-Fp!9hNstWF8WNHxmBw36r`4|^pEb{^!LG~ZBGC|Ff}A7l0VmG z1i>vdP{I~pb|Cv3b`P6d&n+oXR%Fz{2^x-Ba`lfuxLmQ2D5Oculu-7CuVvz)YPqD2 zAdoh9wq_Q+{wPv%t2$XT;=tM$`;6OFI`#W3dF+&cv`7FvB>eJ{VJQ`44F8f&ZhOvD zb!>r8pbZO*(T7x{&t40|Y;|t`)(aZGU80T~PAca9)FJO?4Ci8-SQWl^_DUTH`Tod( zqNf|sV33kX(__U=d7I<;;Tk-y;Urj1-s)0x3rBkF<@NG)W6-S4hzF0UuP#Llg(pV0 z{kBe@e8=69l(+o6Qj=Wh+D5A|XTxqWaZt-4IchBk%%R?Du$ce&Pu9@kZPL8!m%L>g zEiVjRJS3#V5;QL*JNd50A3o|55pqGhAHDOrm>nJTAxU?qMCVL(fA4l&zRD))FCwzz zV{J4k#97Ap+ak6l9e6#0ikH7`OS+NrzqV1+4t#5No%}_7IQs~>6B!mx(?)4RVSm9V zVeXOK+FPorizDR(%P+B=lMty+81f;!&0M+Hlj+k$1M88U*PIE9Pl^_&wd2LEiEk2p z6m{rYW=elQZb%lB)mrothBL%#!&u{Ds{;$?%MRL-3MI+5i}I-}r{ZKf51jf!vy%PF z><3>#sKuYJ|(^faKv1sp6b!9+r1e^rC0%18q7!ROY|; zs7sG#`-VX%KcNqlZFCWHY%vH|L%=%M>YJ%4^Rne6ebb8j4$G$ zYj0)hl1Dz@evyIQWZMGJwkD7#!&RQ#ZGRC+me9;kMtf0&3KRx#5eR8VAL!ha2VcZ0 zw8|pb(9Ba_xeQuPV=U3%(I5l^ENq`F4BI~I%EKx75j}tq=6QXvb|^}$uhhK$FJkP5yKTw{tSUJ6w-CI3Z|nGW;|4?46|hu>B#kNaeHvLGcS zbjokYKk2|Cr4*6;Kg#;G35gj213O&TR{96gPP=a5uEmttf@5$3`28d)yK!xb^W$LLA< z9*ptM1A|r;Oales$pM6{c&U&$%LK%``RG(Fv6CP;G_nXxn1c`5L)7q^Yd2a{^8<;d zq8)>3nt>>iK~3`5z9+3%3SDmM&NwHp54owOtGl;r{UVik8IjN){)jeasRcUeJ~4-) zga{gu91^-J9eRcZXigjBP&+|bM}JDkCz{CLAU9qoikU?($<{a?=-|7jV0K!e%ZDbgco5)P zurMOgWkIo%Er^pKiBT4qf+`eEMw!<8O#RCGob~|SwM+PFPSVPHz3mq5FFM_o_NM&VMCP*K}6_!5DJ&Xq{e~A(UBF`iNY;%a$%-p ziUhA)@bVbZmEc4#jk;uQ*vS>XDL8OQ*&tew6+=~uRK!rMCCrpH@*5sb(rK2Sanwt7 z*ubCe=(Wn%=pw-b>1_cPq9>$_}!T2La z6Ki6@-*Lorv8(1qPGCURr=u8}5$ zY$LPiAG6-Bh?POpFc121r#7Mts(rsNA}l=?jlcemTpcHpJI$(pU2P!By5Bu2yi zYm}EszJp1olQ_HekU55u+dw))ngx)$2BX;>C%T_P(m;tY^c6jl4Wu0pGD#F`43kwU z$E#ruS++eGu?-$PTHaNTJ26D@C!hl&>|8X4kpZ>*h<% zTda)*BgYW{F<~ZzFr*A|CJs;Chs?L>d*Kp%iNI?NJ7WkY6IXnsTo9;!?pCN^qgdX! zUUs}rv)w8I)U-z5WFgm7L7q0{h-+Bev_k=~RdBSFXX+Lv(U1ihd@It9E5++)6f6j=H14Dlp|ucYpabxDF~=VfnKxt_hJ(s%!Wv8aNwTK^7NnNuQxb{q+UAwbsG09* zFe4!xE%D%N`?O|Ob;qpl^ebs}e*y^A@!|0$U=SvdL_SIAr-}37@x%9-Rv;KDf#6S_Wy#ipW(ijBR;%9H$620}B*21pj_qQ4 zObqMI-<+ihKXs~+bwxXWO15c_xo5kO<*2G9tdIqXh5~u;kg@e^6(!!rGV^Q5vn8R^ zp?!~D{T4WQ$IsOw54l40KzPl0ulSorJK}x(DA-Dr+3Q9sUVp~y9aQf%XEqtD*Pg%( zoTBXdw$#H4>K*8j8>+W4kQ36k<|()(HWVp9Ps7Ho=*EX3;p2TlHaT!3SY9H$Yp@6Kma4pzfeF#DNVMl9Q#MY%MSISYsw+fPwt}rl932>Qw{WV>GtU}5kG|a|0Os_G_>OHKkp#r|B(%kBkl^j-h?xQAA=w9LT zs1Pn4OhE1c>SiEbuF%lcRQL3Ec{+%N3ZX96zUeCkYybS_{R0C)Lo<;iG6XU}8_l)8 zSU%+4A1G-|!a1&k)f>t=Zf-c9@^O zAP*9d_iFN|+-z&bOGryQi)r0l`3T|G$ZTRKTY}X?V$0sp+`s3!Wl0S{QVXbWZhC93 zpJV8T5`pZyIdce_O(2-_!enbv(3$wEa@H_=QP6$xtU%@3@kk*okugX6sd;#7oB?ZQ z1*>UJV~O8vo>#M(-QX%zylj?z?$=-9Mc88#Ue7xbZX1Bf~oZfqW-b49mY#P4z&eI;)x>+MR zK;)`K7iyE@Ny@QA8b=3)wnF~6F4`?^c$zI={V~Wl@FPBvInD1?{a%Jb-2X4}pn}@x z!as1Lqf8RR-ktu?OyjWStE6PIXZ}<&y1cdVDpY~`3!T)u*gTscjFuMfC4?|atqVcD z6DCs>*)aJuN|dz8-6+t4!G-@dUMHVPK4R&!%e=>|Ba1S#4^C7WOI^Uv`JjLEI6rM8 zDuOKVPj5v}oprfPD?ehw|bpu z$K=vRAs0vTR(Ida0Xj(EEHz5~J}Yd=XuhU znq=Qalh5ScPqKTt;&49Gp&vY+xZkV@S>{2SC4^NIHKr;6jebzL6}=}x5T5`7pb7)+ zc`zlNNd`Y9dv~3;p2jL-ozz-x>@$&EGOe}8BN_1j=4CeDxE9H~qNCMFRp(^> z!gQ9!NpX2Y^|5Z3^;{r?8GKUrQslL^yiV^2p?oC7oCE1N05qWJLh~Rk1YFZCPz_2i zzIR`jVxAmDLWn;>sjaW1wdG{#rbrKefg)bCIgvpM{I4fa{ubv?PAF1niUvt8H#4lNT^5=-+namjSr2Q=7{VWt27-5~+H+K#7ufHSx8(7UCzWDT! z_Rrf_e?IYm)Ztf)^B{=@PzvO`+U~#0SJ+h_Gt}Wk#WH0{NMKazsi>pZtwlJxC9%@O3TDa@=YC)kA@LjwfPXfvK$u3ofn?{`?x?ZTx3Qehm z!m&F^4gM>;W1Z#yIHxHY`o0cQoy`6ay>Z*SB@41+Gy3&Ct8pkb((tLGBkQQhTIOa2 z3`QrA4$YZyqP_8*aO;7AtV9oRxgnuBJfHof3XB%s0uYlse*;Oc(A#OGj*+WrLEhU) zgZLYcV-UaHWnL1K7d{TcW;O?0?LJ1WL;!^@zfB9)jgTsU=uUBG z^fMDn6|e8f1$AHh$t%%D8j*pY)*q}`W5;t2>BM#()RQITn6?5%*1>~%Tt)6SiShI6 zj5@oaXV?xkNyhYo%mqxtdCs#?fZ%rj=r^&5Hw^Zo2FcbbX1?#Cga*So^RnnvFpJaD zL86T%{W7c-BWaeJ*wl)sQlsgTC>ke+vgE-Vm2$-=ee>!Vl=#}J{HL;%crXEqmf*zJ znPw3oPIFbGEt4L#nvYWXst|qYa+Vma{}mL97^_QHM`xVw=d?}Oc$jS?TJfIxP=aR= zA@i?>-nw;ek&KG5BiL!aE8)!_R*t?mncz-FXg*E-2#NF1$JPD`y2y^KsQNFqE1|0< za9xo?M;9OYSXL^*{?H+8K{#70BbK;BZ{UnEzHBi!6TWmA*%UGwB~0>WoJQNlqcf1J z7GvyTb+lc+BjB`8SsY2Erh*=djH%b$jsB#{peR^todXWIb>QZ1X#)>M~w z@uVTWTR)ZFKL7rr$1VBG;a*z!OknSym{0Mp7Vu2tfHMM%?*cCZOh0T9f+c>)GYGDj zf<$6Pv%ig6R{$t2YZ2OuMQv*wi^^xpxhFes{X112z*tOi6T>X1BJn^9f%g+pcZQ;H zmV^`6Kv5XlkWjhZk$W0Lf$Xg02THuMm?n4;YvsmucBy>hw%SVKiIA^ODl&iKERgS( z`cWbGl3V!mp-!?TcuyTt_`M$y9*;e=D3l^VBnl_TkLj{N!i7Xdyf9Kac@SY%$>-A< ziy&3#Ah=0oh~Cg0q^bfyH%IFd5q1Z+pO&DRgd$_LLBKJRjF{ms=3nq8l_S;$<;pNr zbXF(Pr(u`+wo_T;B_rU&^aeqeMZacSJ;>RGVNWhjSbZ@y{FX2b_4k;n^!`PN8I?8q zq(7J*j+5@tT8xt@8vfkOou!x&cD|z$zS`B~e`#vh>!}!FeN~oMu0f5S!3$hF!gsxr z4;MWb0Wc1~LOp1Bi*-|@jKnOP%l~l9^x97Vm;(TF_1ok9CI><82*J>YFla~#fL0$8 zjlv4W8jb^b<}LZ0A=+pq?p4D50tL|b5?NRZ+d-HH>F8^37$~=gXA;7_N)Hlc#pcKt zd{$e^CWGw`$|lALGAe!ewNH3&Nj2@I^>VH$ng87=FBgnLb018rzDSEtGQmPo)wIL$ zD(WJsd(#Wqh^ukZEDY+M1XHlh90$N61+89=s=Ty zR5=r1d61$2P_L8 zO`EurGpsYY!*;^QA!3@;s&4AK8vi9ht80QY0d&3k=(5ZQfqwtZs1* zLeTJ%;gOj^%R*ePpQV#(UyV6g*t6?7+1A#Du@%UmpOk=^SBv>L#*l#S_ai*aP-H=< zc|!Qhqwwyhwr1i!`qJ-CQgdpp2>Q`d7;HJ%B`uo>$|y2}6H`e7kXG z^wdZ5nh{%e;4fk$liOFh3k|1x0FxOK8V|4Si=*}E*F$6Pi>uI9v6jBwy&p_;jkqLr zqP}bE`Z5g{VAwWkK%X`op#JVk*{ip~ZGnshHAM!Ogqd?(JELo|?yOHZ*>-Ja3q1RK8i9=f6No^>_2=x zdrjKDT>H)kWW9ZEp&_1Mv~$NNV|Kw>-0f1&?bO;zefGxw&&D>5@81cEY7M_*@V?)j zFv@2iFGg>Yv!<;lO$t=H*w)>N=c%Ek^sD3d*6xHU*N;N$*FrJ9hdxMwpahTG9Q*X+ z_mcq_0!1~IJk6)BT2Eh$Xns)_mmT@dKW*}xA7t=!^=&5~t@25r@q#-&X{T-W1fGuD zm_Ni2Bm9pDGauVR{I^k>xvCA0q9lY62=kGhlmE!NGX-b#`1{Ru?Y2=NM*7&a;*MZHC{?&Q7WQQ z2dl2V)sA@C;Cy+Yo(*eWl_hzlMv;OvoB{N+)jRu69JI_?!Jud5&tX#|X5Xp&p!CY? zWyDZH8blPElM&<0AG_@xdnpjzF%(mj5gkh!>#7nP=Md}s5FH;IlT;Iv;t-wsfQac; zj*G8}%Mn%HJLcTiRhss6Cr%@?Q31LvF<0nGWiN}GoT}#OCPeF!{8S=uPysZl0O2*# zt)hzUol@Sz-iNmmy()muozng5;70Jf;dQ1_GM=_m=1H(d*J)xmSyJ68ctA99#F%bu zJ#jlWVFHriqDM!%pZrM(@bExx@X~Bu6c@?P|RUO~%4$XsM|0LtNicOwp1>LD6 z7LlEy`6g)>uf{hf1+mtvuSYJizm>2Bk zAr&hQjPn>TteEy3>%-CoeA!cFBoC@M5OV~?JGV%`9ha%pqX>=_!t_Ew7uE-wtdV(4714|`Up*MsM5)&EtHyHrJOaY_}AV@+%%;R-jhFwiY(q5*PSf+LyiEb{5 zzGIdVx_?D^W+Xi8F+6qMg6>2<7TRTyY&jx3GureT|)5%e&T}5h_M4&zr+J z<{8Zf%1_UU)Mj~^vQ0wI?GDdLS0%`-6_1R|jqb{gt<9lY%qe}1ovNC*ZjqPuI;Vak zudpkp4}krz%tBJ+ohFMAOLGq8AV={THi|q+^#%`Jwk7Q-^N1==X;{G+Ti)l_B>ik2 zx+I0p{Dr&Pg}t7IExFiV9zEt%y;V?)4s#0)COkiSWi#YN|K&#zn7#z%bQN^-gB7jw zK3PSYRagksywlF&*l;f{Ni8mG&i^Y$Pz5ZxW-GW>E^f9i*32zA$|ZSLrTF()gv?&N zs8ouIAx@fCEQIITNu=~PJK|jqNBd9?S$8RZOe&Rl9xH{CQKz4xiZu5Vhjm)X$3;gZ z`SNz_a-*y=F^p)=wK9k6G8u|;GO=<+J?a_va^yNoweQiDOBK>jblP9BoCXW$&t#4( zvC4IT`?bYCnZ+@qIWTL*I@5}Zm8uq1Q|$Aq%9^V>7OTSSNZbR(d8*$%Rl$7oNF3q` zoC33|t;OGcueM~b4mYWaikJ3RgWa8aepCb*ytG*zDfVj-1*q~QK~6&Z%)HqY1usqc z-HqDb$65@+x@_^fW_C~&hUc5=TDON(<=dR`T%oe=npTtgoV>a&@!F@s`riF|yXGj9 zvFMp)W|A~)rFpDfD9g9ng0&~~(*w^v-)KYmjCzun6)&j^7%a=*>6YUfsXYOklV023 znRh1}99d!y0|`!?8h_+AUWn&ynPkm(!fw9$9AGs5W~Vz1Y=m_+<<$um#AM>EaT3>Y zkONp0ARIor=$PUXhD*$Y>u#2;wpnN~bpmBckVfJ^_?nIY@_G`=py<#^IHiAJJ!&(f zMDwFnGh0uKFZ;W9H!ZaJmUQZ^O?IvD@YdaumI*k*0cAZLr#hFJqj3j9XZ@`NK_H}- z@2Rlraa32_%Z9DnQ&RRlVO%NPIKO?Yy&aPR=dF6KfyAftj`wy!pI!wum~Ud+oLgTi z+qf>)uEsTDKIO|9dZlG|477Kw(s6!JZ_gy}Y!~W8UH7Q;>ZD5RJgzNFG_^{e@^~ca z(oX19f;i%#0?o3z#IxMidAn-r3pl505as@*65Yb2VO5)z=;_@Ut=%3^E;$_C{+nT~ zo9$L%f{S52)#W`iV?7n>mS3EE(3d((r-I?6VHD9MtxN4#p1|YK7D}}g4ZT1DRN%Zs zK)G=Bi4Wm>p%=UHn9fjW&a>|@4$EOe%gk9L98JW zmqGD@L9!?G#L(cq{C+wJK+i?tj?k2SB`JnKkB0!0-9@Q-LQT+SBo%E0mff%4phXlp zvgxI2s!^_oOktrRZJ;nZ7c{E(W@LPL)Wn7L4b@l^jL!1SShM~pCg+Hw%ZRt1jO(+s zn+8Rwi_(88;z$5pEFd4m&*+W5$QfdMaGZH<98*Uj=?SbMZmVD`IguGWk?S%tiK20P zIH5~8Njec<$tepJlBw00$ifoQv(G5b(HtB^PY*_-8=pJ8WFy62qzJ#Av|H!D6eM{_ZU#5JFxJP+24Ay=B^i<+Cp zn$JiC{yTSRh?-}#ccPUF<9V7qw!u83wNL_*A*7EVc4ZYSqJR)uhp7 zHYOPFH{e~LZThq=e%8cIbm(he8C_+oD;F8VA1e`N>(hzrcvb5-k`W1i*IP+8UM6M2 z3xScE>)F^nd429EDo#aQ_9apq!e`Tj$)yMuE&!zwM zc-_2k>7b*3zGr1<8f*2|)ZY)(7n>^BTTxQmKFXF2@3+{h zwwGtNXJ=M_Qf&_w?u>AOHq8HDFrSP~mru_5zaC%BB+@#lKtyCnOl-tlXwph-_J!pC z*W>{Sl2RyQVzJ2R`ZDrrYijc#Bl-RPW5c6OGjQydHu6ufuIxU#FJpssq$7~cftu}I z(%GD>X7U%BFMlZ@D0lk;^NS1l#_NvuOGq0Dgw`t^@=(!|aN@{Loz_rv!lhBrnHZMg zm?T6E-8oohA75|q^Liet;H$jN=`L;2=ZxeFWzT&7Fz{b&u*sEjZZnye^NDX59AjDy(>X`(Q>h8P zQV}l=;g;};%$SkoHcZyaKttQMdNoq#*bZ#IRN)?^j3bl?ztSL-f;1J?!GIM8K|Xyf zyfU>~^OBP8sKgLAZbOZUg6lUn>0bsV3nlB$1BCKOXQ(6mS~ z`W+P5%f88`Gjh?(W!rZ`_GM zEMLoM7xeZ*rhe7AxMykXaRxhBO0WdkaV=tW?of1?)oz86?tD7L5QO=AW;u^{;Ya^o zpo_%AJTq`NBOb&;x_7eZ&5DF;0Y5ohg#r^a(s8G`?5iW9f^jna=bsxCN zlrWR2#AQk7i}h}^z8=Dhf$)ux0I4!ZKU!L6Pv1_{qoYz0-tbJw=R6~E6C!MkzJz;Y zW#f^&P4pVY-ORdNx|r6^UL+B*XknnNaA_WTB7T0T_%k;o)EmcE?e2NodDJP<{dbclv4I6;=dCk|v%8@J-;#hh0s1 zROX?=LDY=uP<7PiIh@Di&OI8@%f9oV&7C5KiUCwGUz#ieBWDeMkGh*~b3+$>_rX@> zL(gB|Ew3+y0DO5t*C1>^)5LJRho1aL?NI5v5ge3@sn9*iHg#)XNf# zjmv#L0t9N=?8#9<6i>Uf!c7j5&~_e1$GIBtDMdllnK6Lq+RE@BdqyJ;{ez5EE?^rQ zOVSZzAOo3Ylv=|8FzX&^V*!E^xOK4e>>%$${0@Y*3uquw<}+7Z0N zvON``n?!a<_RjOFD866aj}?fHCuq%4rhorh%RBG3N~GOU%-JHML(|h4C5(oUg^m`+ z)mA#&b|kYf1_uqYkVp>22m9`Sa-#p0yNm#xZR(oLJTj%SYXEn~0cuE zXJQblrzYO zH=M>A=IU(rc2GU95C0=gPx_~E53&0>W-Jm*Ka5oshn|FQZ6Z~t`k3g#s82YB&SiNx zHW+QvLUbOrQ%TfUXnNCl?5iDjXB(x%mF4b2>@a%;1ouh<)doX-Ld(1CuDufPOr))9 zAAo`xbTu!my%&M|d_{54@t(?iQ6gurAq-ZLiH)@0icIT>p3X47x&S^G)hRyph81iZk2Yp% z$7I~35!-OLX{q1S_j`Q6pkXCc4NO`6XzergUE=|!!g4OAK*u$)L1Z6OT88M~y><|0 zF5qMNtB7?A$`irDWX6-XD~Pi}(r{ugc6sD~$)t{`&)rQS4cBFF`&NzbTRXh8tU7qx zUmqR1P=L*=w(Qt6DNV(*sukYKl62tIV}+Z9m%$*jNqCP=ncK78_myX_`%CE)o9D{b zxFvz;6hlAYq(T7O&9iZe8jBn=4G(?J=o5VAHT_c6W1;r$cj{v%6HAPo_|u0a_-Fa< zMYaqoT^J%Lrrk?sLXg4U7|i!ZDnu1Zm-E=;;%l`u+^N&t5Hj zPicuFKK3m!s+qOgYdgLJ(3G-&oZr^rAK2PyJH=oCn~w#Wm?|l}@nI>YgzqWt7(dEu zIvp@f&X7EmX|r;Bmm;{527dwu{!sq5STwH(9SLF>xr%S_I##MBoKbQK)xY1BaSKH zw9j}{jzW7X{o#)P_dO#$aN*-=LpixwNZp|Lrw;U8ZLC5lQw07SrYpm)Lu9J{&_FcJ z@?T0)_r&wapvi0?*F2!i0t2On0F6}yeOw!JJv0d|OfUu$s|5oomZrv!d>4<59|}As z6q`I&QLzAtgd#p93wliW`eZD9ARGwegN2cghwqKiC#1fkC)4350br2@3G+HDsQ6#` zQOsXsM*#rrmZoHkuOK8*y@#(7?4)5tg7groN@yr8EG$xlu=*O$7>r|b8vJcB$_!-n z31mF|NyYX-q_2z^BpOA^Pe^`>K1Ua6GLH3+juJ$q;2QJc6Okr?h*-j%K}bZjac4Bw zd^GJNL0B7|$DaccMpEvzvk^Tty?2^oY@YFRM?D$)bD37`im0S`I_z2oj7+qFEWk(TVFcT8hv6;qc6o_3=*4AN^DmYO zujB-+J)|H7q|)+6b}9Rrc(CPv!$iGRYqM6yj)UTEVB*JN5WY_3%uT(H#gK^%(E6r% zy@v!N6lrXgw9Wz|#sSpO)E#?d3lBn`)l@Ab+}>MGx-gQT11!rPw4eN_i8qkZVOdHl z8L#7Te11`c_e=ccXRWbwBfO?645eG|jEf}Ar0xfBh5~~(&`Xd=v0!A6H<@!cgw!Yq z+5@^Q8r>{AbY$w#ET;f!$PMeRE?>AO8+|Bx+#|*XFcS$K86BFrqfA59#f-~`Uzq8B z+l>C0ij)>dqo14QsG6D+M_yk`)+k2mmCN`*g5i=AoIjrZo;)+GtAOm3if^7o8ptE! z!E!~AUsa9N_BwxCIkht&uQoULCX9&>oue0zZ!SEzvo^ookD})cI|oLd4S$athAT*q z!+jIt5kqs~7*v&8bkk9+a8m?+EV`{_igctKvkzn$msv5=MTf8qj|79;2ja*C=3=zxYYJIIS5$>TnY+ zGssW_qvc@_AxAFfr7xd^qc6x}TpIaLoludcRYaj-tb;ST@L>55DSA%SaAT%#7Azul zqyc5+WCKMLd*xj5v_y~PD+8qpo+UFKSX=!?xE>fEJSeE$DXPy3yK0NvR6>;4tGUVi zJp3sBpfgqvB)_*TW_LiQcBl56EZo^B3u4Dfvnner2@9$XCOM6#a41_y4b!hn3!MN2 zI3aJS!ld`Z$?$8^!f2@%lO+Rd-qzJ5I_0%tl&!zquz5gaE^fUCjm;x^6|DSmpzv>8 zo}(I5|5reIDk*zsHD?XRj|YNrZKjd_WFEEpfWWHnr38_+6|d?_$OaM7>UAZ`fh8o1 z*`@K-j2N;oW5XS)IyMU1l?l@pgD>llYCXykB`ozY{G`0b zLVpUl3H&0Lw#KS>h&NQ{hMj1trmGgdx&V*x3yVf$okecZ#wgXvg#)IV>gcdm2GWQ* z=!u+J1w5N8@*3#^Q>*u=-lvk1k~7VGqq)vSuagbJgBQzlkpEHjzrCmTrN=pfF!ArV zrVKL5skeo9*O9o_=G4`PiejYa1wo+@zt{MwR&FcZe1dY6 zpFFmwI9?)_D-@XX#NnyK82*RkiMexnfG50~c(a7&Nj2b^Jk;=}Q=!&9E#Ez(hc-h8 z>olx@%%KXY1}h6rm02Q+6$Z{<^xWo6jO?hXdQFY)-Y~FdhGFE}l!4=B)teXEi>;Qo zkw8}pv3TC^gY!Y)QN$Yi>K`bX6dTBsMvaAI;rt?s zxTD?})ag6NNb-RsxEBc(83~G!B$VXI3G>xBKSREC@xx5%LI@E~vzEjq>c0c=@GgOo z#m8*W&YH8isA2!$v-P5GY!zv5F*{ ziKe1$A}#=p~iux?_GTioFNt)hx14TZOcn6Aq+K`l*f>TgIbUsJ*l` z!Yhb8#5i8OcS1lon`fvZjyx0ml@1KdqNntM$hV1nbyEu^5z7*F)ipK|W1K(U;yb}< zrtVEjIO5oRfNpVOe8E{rBo+%kN^QIabnQTx9uS_33%SYk<8)vRVbfNukY8i^IgB7} z6S84;Zeqk@@$ z)Ync`uWtWN7FVfKkj%E8Txr3ZOd^2o$|ZbRElpfdN-ELL_(f^L!qE%KT-#XzX>$ee z@SL=98ZO!Bs#mRsbB)r?rK&J01B(gwLp;<)*XSl+qMgJk&{mS=^3i%>%CKf7-L1!o zjV_eLPF$%EzLQC`qbtsq!Ati?xzj=8a(QFG%~JH!dXAK6-XPwhJib=UQUaIM^XpF> zf3yXsR0<6I&uD`C|Z8{fn;jl=d&6VGb5Uk<{z&G`TaTe;xvB`M?fI_;rY z^Be&+%}Vg$<^K-JShi&nkmgM#ceP?YOa^*@;K(wCWk*NV}XGkot}C zd(AKZ>@W_dfTPM&S%KQ$SKXJGbYT{{aJ=9OBjcC(ZbCY)*h+eZ*E(>&?_@(eYh9+4 z7Ct|?mX@l&w@n1T`?JsW@7ukkkHljVLz?QuVJ6ZC1UtY; z+9O&zpwgF^SU+=PR<$4Iwy)pCvc3x-g#U>C1tca3746Ycp0vYYH8K}EG}hK7fd3$b zA8};F_|#+ti_8z<7LjlA>s!8@+hKCZ?4W^CsQA~CTr1Zz&bs**llWcm>;eH>$P zLXC_$BsLeS(U$)gkcL*NTs1W#jgQ1TVJ11Mls@LrIgJT_++`uzYA4lVzdETWKE?kP zJ1(ueT6P*~aV+8qR&AS^Zb_K_vNy48_95qM1&vnp8;zgRKWTS`F)NrbHw-cT)^^Dh2>57x~VO(NC)1@ zG4~0O=Lc#bQpEVuFe3b5<%H=_U%_IkbL||bS7Y?orOby@YS|+~bYvv$aXHPFkG9N! zlhUU&B}5vE+=y}wg41K)E0r5iy*a~wAJUoSdzzD*|s>9_zMLNgV;nD_vgK!iJ8&g)dtX%yhTg=@SuGS%N$;4IWb8dW>)M+Z; z^EwI5Yg{#p6)M1v7I$zz20Qw6f9p%ZV%;g1~CgBQC@p_D5M2+O>-rQ?fUjxdf;UF+s zEC2(dGXWUEq~mNuVMhH}ThY%!1B#ga{i>28#20m-S`3_bIdC>6ASHR&1&@)5$#wfw?u3v1FjRI#4%OOR{C};Ds%C?R4B%36;$}BzT zcT6%)w6#9UnoizN`k9=8gJir}C+PNh4~p6MtXZ zl(Uc`I;NC^Ijax5o4DVn$D?YnP*}Mm-M@p2H}o&q3Oyi~a_UXZN59wMJ^otgLA;skBDbsLSS-w8vh5Q{nBos%#(K%J!1-2ARgAndCdsORt(?DLQ$LpV zbMr2IExxNvKfcAS`sgJ)mrdfGqerNxLz}?RAuY$>L(>#m@f;k@AAZde`a+i+NhaZ9 z2{CdFy*njZWU)AH3!9BiolD8@f6<@O7GQ1S(%XiOS^mrEh`%Yh%_T)2A0Ko>St{>) zay2BeCWg!`W6{^_BYoNGcXA)zY~FvF&{xRIiYAp+p+M-|&Sw8h?Gb|`k_4j~F#jF| zFzit@g^`SXVxA-8FbaC)4VIk(f?L0#zF;b2H zH8!zTO{RU4h|5pv1mV~k7Oz%e4d5H_KUP6?lO6Djhe+bO-Vc&$vwkP+bi_zxOaeih z`OZw_U`JjZtFl+JkO82qNQj+oQ#sM2ON)RlQ86Bv$RfvEP8)@eCjG{npr^S{*`5P5 zV@{9jjoP~E&!iN``~?y=0AP3)#L!%{Ig(X>r6N)pzV9-&K>R;*?^K+s!DG%_Xj7@^pYnhl&f2KTS>DiDp8IK*bx^%_5 zdGB@^983rVSdPwnxFWXf(|*_3uNJyPx(0ZJd}P&OpfQJ#W|9_>^n>ChmtEuG0EeX3 zZm682zw+GW!k^5!j>u@|snPsvx9}~6qCUH48-Rt^zPI2=VEyba0br-4+f@%}i3Ni3 zkeTdla(WSz>|ieQHZtWr$I23+dA2k~cs}?!>qLP$pI@VS3ELsc_SnicNkm>Nx!CcM z=*A{qJ=ady41i1HR(#IPi`5oFzG`7Vv#W^ zNlu;SLVg;~OIx9@zB>~Xy(Ai?h!BPhU_L*jLBCeO-2FgM!Kr|DBSGG`PV>;E+-F?p z1?E84i_tk}KK+3Dpd~>dSJ?YxEv|TJpSI*5kPjsJ%YiWsv?`Z#q7*+i91BnRRPtG4 z?EJL{*p+=B2*+KSsxGG#sP`&T?nE62TRLv3wiD^&tX1iomN)PK^(r)7FMsK8F5{Ww zXVOe+5w1(ij()ZZWvY=(SzVhNNju<%H{C@>uEVwWTG`Hi-q4&Hz-t*}Z*d=0-rZfV zW8s{1r8k}txc2sMU;&CLhR)*3$t^!{-@?<)xK*SuZ3r0sjT{B7Qn}P7=mH8N^Y2#27Sl5?xBLca64Af4~$qM)Ms@k1xY_1&j~{nt&%7>?f2nJ zcPn04PZ2R;IyOn^760_>OCQvZ^j(?D1JiiUGu-|a6h9&OLesltXIsHWg*fF(2l6L=QS!~e?hj$^=}180)yJif^k}o~p|gQ} zY36!-RJHk|@xBq>#qRfVi%$&J2;*|e*LN+eD;mb~o_s;sA~B5gcyc(#=YWn3Y-W1g zh8}X9Ve&vGMvZd`@+@3?BAyrk4@JHBZxFXlX4EwyqURZR^0ViPSrNN(gjVs!+@j`~ zR)F0@LCt5;f9j|ir&yVt1WO%tsF2Y#q6jMT=z}L<8_nFC1I!@^WM*IxCgiv1Bu41) zcAZHm(?QQONd9_J6tt5g>A^rqRKBdKQWUm%1)WaU>HpwpNYfE7*$>zo)^ z0B5KQq6YzaR}bUr4ddQOh`fykM5fSghz~efgNP6)QPL4nNT+Jb8sh0Isp6vb82IrE zz$%%eNqz)WJrLLrICK?Ft}REd)+NA5#!og1SJ+8zJAxuJK-9>n*Qya>fowNf=2D`B z@~Uah1)xL{2WUeE4Zub0*+`5Mastve6Ejrv z-8WwXH1DE+GUUkR8^}B5^g+U8rdf@Y$Oo)7iF5RKY*@&?Q%fYJpIX6IBjvf7bj!ee z^-IYGx^SV4Y~e_p5#FQ$^5BYu=mL=d?RA-@+j!JbqI+TtcYO{{Lu#m+Uxs1mKwVVy zbn0y^TbM||rCwoYh9YjHjbSeEY8e+J2%hOlT7krIcfx7gA^j5Q1KZ%pJIh-{L*80p z9FgO>1iWzf4#}Y?T$~it$p^{b#Jp*EjPI_8omZyDLxZ>z$p`O>{Sz}c0yAP0i!17i zb14W>^w>)f60s{7ha6!F3fPteL!wg8GT>cNF9{g1Lu{b47`R49)XHa&w5K-!ZxI0? zL7cu+>{bx#!VTETt&tu2%n#OAjp(h9$8t%7 zCYP^FB7)Vx0h8M4(fY6Su(OSeN&&^Uw@`c}tm+I9sAwgh699TiCxC|IEk+tSVTeOh zP=G*I0$T5af>r?u#)DMS>GaV=wO8 zH!oW@l7Xo}&hxuRvd2hbZUSICp&GZaQDBy%fL{7jiqHZO7T1QyK>>6TE!b00HZW+F zG1Q4-gFJPFgg!SvzyRs|Y&=wLP^M0OwN7D;+>B{O$W}3K({3@2b@j|MhD~VRv3{ax1CjI#BVd6n9%(ce+t^ zb#9~=HfrE-^!OCBes|%#l&jeACQY^?O*o@|rmtp%t#T%SE0!?3wY5gRYFp_|Pf+!%<>)DS<bAwJo`^_0P@#z8~y>sU(A%y({o(IND!q0cEp>&1hgU%9ZVSn)9O zez{~jh~h%AY7JuppI#K%e{A%b8R>c?i-yU~g}{cZVyO1E+OakV#lh9$p*0Sr55CUJ z{z?Os#>5BW+)cwPR7$iD!#Z{njG?&9C4ts4Bf;-wIOc}AnuqAA#RK<05D>}zW@IP9 z;N!POiDm%Qn^8~{>HsD(fHgeznIaV|@+;fN>D3_5XHZ?&=&$Hrrm^j?YKeL1kJ$c>k?K%zp%0um$Ok9pm1FT@ql^>iWEI2 z$fQJ{tHPfpX-fj0w6%YqGfX!(Y_Kx&8~`jxb;b~skY;vybeR@==qQ?-cKkMtxE8O_ zd`~ggmtUgpRx(t)HSM-9bgw6u-qrA;StXB2Es0u<1^`_8qY^5}*Rl6HI~15=W}y-? z!GkkzS~4-}HYrN&E-j?AklKxY&{#?xT$!78mVBQRZGBrcABJtC|83q+a=wmfVQ8#P z&(LfvPK^$(6;f>}*oA_+4RQho0Ht6~v@L|v_N|4v7eX|^%8>u>BtXY-`x)?*Je zcGUTO&!p+1|H=4s$we8Z8P%U?%C|#Y17q1a02r20SG6>ULZE4?DAXk}m=i?&| z8da zTt6(C98Fyh9b6~gUWeLknCA^a2R2|jt-t>0i3lpS8ji~XWID&0*hbry1krKL3gKhp z5q9sW-=hn;2Dc>Yrx=*$I)$BPK{TlG7daDBv*T@pLpdEE;?sB<&27HFf9z>7|J*S+ z{#@rXZrJD3pM9(QvIA+uLsBiMT)@vcD-jGcxj~uXtCu>QRb9*;&6|4kiX7s9fEBo^ zNu1l#jBoY%ZSEOrr0k6i_U1!fmFsiXkGO24m}@|N$`#Ws3(jV#gEgzVhXAn zEm;|JYh0Kz>aVP#zB_t6)l?Z0+4C=a*MqlA4EVp3y!^h)k)YK0y*Tu7Mej?H0k@c~ zg>^@^%PP#wY-shVRa%0JVW|P8m&4=mD$mb^3j(KuiKW^ZTBuvB&~Nu1n-1b_DD3sS z5=Ley%?H~{_cGKqG!j5>!t0+2RR&Y_TuSXHmo?AaKQ9i?>{Hd5%rZJ$-B^9407t8U z{{zZevA7)Ko*+AT381#B-bK5z?cP?fFB`98Ok93(3%u`O0{WWxbCbEB)cWs-<)5H` z6l*7#c!e~}cb*cn<@&!moqO$sDJ%{Xe#)m(Qn13l(xK=QEm@N;)F;BYA`sP|=X8sA zPBkf%HfoD5G{C+2p>`@9eI+j1S^T#Q`RvE9QITsvU-&FDSFQ!ZL{Oj2vSqii`? z`9?o<;53DyO_7n0Fv771wHe==c-d2TX>#Btl`c!H#v@REqS9J3^y9gP2itmpP}0Z+ zcPnCP=RCt0{A3WI?a9j|gDY%xy{B=_Y#Gjg#IP*DP|HB1R$v6;^LcsDL>eNN^Q+O* zZ$aY7j3C~evmlo;4)u`$BVXJLG=aqV>0T2kCjC$BUY*BCKoZaMMF=vbBm9o-?wP`! zh||?Y!0itIjUWC8fyf(mm3_=d(XS>*1pyz#D^Ak;VvpR zs%gqu{OPHV_uajti=7{aTHlV0b&WI+529Dud;0djwMZoeym`}s1ys~TFy*m_xUWE z+WFFHyOD%Bp_K~d{cxK~Z`km%$=Yx@mt*EN<11Q$5aHd{#B4kv{vzTZdgbNPi?`0d zEh?$PwXU?1H+~OIzF;(%yT;x6Wcs?Zdwc6@Z~Y@u<`Q&$%Bk7?%Gv8cvy<}sQmwOB zpga|Hd0dr>!`=YqB&B-}-&OXmy7l}pMnLfQA*c4o`ywNa7u#Z8SMRpVMoSjLFpt;v zyF4r_ibc;adefL*e0xue4t*2%+$dOKFc_bZA#mprZN|0TUsrKZ>O!kInFph-r;B>_ z_cWl??NK)u&D}uYgbesXl4z|&m~@lMO>m-L@~n1Bq@3W2UT;+TG*DgvS7GcTkxk;q zWr3__MM5lY;&xkfn6l^2uzn@3s)qhJHIXJqo|it3|9j&7s(AChchR`QxD-V(6!Z;? za+))GbJ-+neV|-&J&^;LD}`7}zB`7y2q{nvFYy-Q zXNF6q!@-t(z;iN+2(Ox$XeCefY$ltg@&JarI+jAb%`!Hhk|(>H`|AhC7C*WRP6r^hZ|! z-}fgjtaynoS{S{mhoi=)<)^_%tc>vz*Vg?H4#(~r*FsU1tg7F<4@(qj#oJayB!diz z8r(zd0IHY9l?EYB(i<=W<4z)cxiPEXeD^0I4}e&87=;~57R)Guj%?a_(-hT`8}|vV zd8~XzsQAMTEsI6IL+w39;~va5%k`0MRe^8Ta7|3lnKBxp;nSb|k;8WLBCD5lY#2SlsSd{I}aUBP0@g&>50fjPjfSAq-qmfVZe?QBz)K z$H#a081%A8m{B5XkWVX=`6QPE-bR2sU`0XsgzO`BqKQgSnBts3XgoPTnbi(Ps)jYp zWJ;baS;w!GlKd~rp&+6N@6i`wR{@f117IAS#A#rEy5K}$;D8)sqN0&FZ3*%e&3tjV zW>(l*WOCDST4`FYaR>`JxG^205u5P{VV(*v!2p4;imE(ht5*?&*7J>;jyxp(nX*D9 zKBhu}HNTZkG$Cr|S$S*}zTzF|c}_QQ z7(?dBhT%-~8i7+ogISp!iaVJ14jSs*T#!J`Ql2|Rw*pH>6fCxC1E*JBL|*?%?P$R_ zC?@&Rm{YmLb36s3594c+ER-J-jgy6(f+Nl#w-`}4vYxSl6LjU!5=Q}7iWgBZ-ZHt3 z6=2?Z3|ZvGGx+1xFn*})BCT=PGf7b(KEe}(1GfS^&K*ksrHIWC*F$EN0Oh``eT-Ss zhhi!W6IylQ`K?8k{)%PQ_!;yf^J2Liz`Ucu+NT#}lU^dg%SsR#Ad5)}hg>Mui?%{z zL6jL$xNcTzS0*TONUK{pIi^HzWHbdr4jK)YCydU(h}ye^K*v~L9d5o1W}z?V>*aVN z+1CgEUADB^A*m+61N8p^VA8V9HX#7a3I4oiI#URIZopF6Qtn$2rW@#LW_{rwNqO>v zD;%pmmVPb=YRmQ0WVwH>A4J+hKiKRlRJ^`$o!hD-g`~p0T}35!A}?YOkQlj!bvBm` zxN~xkFI!CwgJ5!4b9zmL(d%nLSUeC}B&*+c@7gX5)PpNIB9)IFOTFXM_h0Ivk5)Wr zQhs;vER82L0B(|={JL!Is)Z2sb3Gz!ec(aMgK&g&TlMvN|M2WD(+ z=e{x<7ANZ;h+#KqEtc5ZeO>&`-3r?@BZjbeW9(ZRU6e}5woA7tLAn$%~$GJzR@a5gbWM zvX2ulxLe=&mDub>osPfstNO*jhk)A}Mlmh`@g`EuK*9QM*jRk|t;LQz&VFug%1vdg zk7j#f8hvBqamSPuDv@yVzNzc+NOO&T>m*EZH<5oH6+WI$FvoY}VgLT5{Kc_pHz|TR z)A+vBl62(%@F`6%xABQvoakA#3ix1d6<0nW+pH|K9D&y&8YS|R`xPfq?+~{)5siZz zH=Rcq6$-#D>pn@avx(ufrNL)DZ>z%a2|B^vsW9M1mfbTez#`o9{l{qvSJU`xE&rR4 zw}!?|RBoCq#lJQm_C&>Vw=PLV`rd~+hVH*|zsECZ-wiX20uSusA9f6CY3+o5)Y|>2 z%{#{U%Oj!ueGz8)y8z72-*Frv`_yEj34EpR_X^X#n&Wvj9wR()QE8Qn^V+^i6+<`o3MF-Vu2o(8f08lfRF5uP`TE~U zc%H=9+@Arjf0>>+)P?N+!1EvT&_9>H_RBw~l?>A}({cFliy`VX@PZ`+&2=lg66JX> zl`wP(q51VQN+g&XEPYvTG+1ZSdgtOz8(1cD>l4A#y}AEzjq4WX?UQl8+G9~NhA)3+ z|2%A;jO?xwt9!DOXFt%J;#h1$y04JOp=$qOH#on&(TFDeO=~~qcgvRYn%94RH9eO9 zIU)Nnzx(0-_p;@`q{FaFN1szNugkg!{d{}2XTFqV9ykb(qlDLBh$ro&C!SL{nQ;V+ z+>7LC?}9Km#B)?Q>f2h#6_&^6x~CqkjhK<1lW-J{V8jUNYi3BK0J$XBk)bhG%)fw` z&pFY;1@@X(Ug8C>V@P9aSYkIYV?Wi!=3qrCkxSCB1Zx|6jyuXllSx)hTE9eusf)&$ z8pp|ts%fmpy+Xv9lZWbwN*W|O*e1q(SdBMB#JZ@uxsk`eMg)601&!A^NKV3flqGvH zT=o2P&_Z%UmohOniOQH7qXLLxeo3pt#E3*tRDp!1LSol5jRf+fWCSAh_E9+;l9VKx zRCNoD6cs6$N{X9GDkw-yha{J5Bvv61WlqTi21)s%i9}==@wds33d$7-S!j<~Wd?sV zfrRD=%tv23`a7{=Z>IC!H_-9$^#nO9Q|4e7@?u~^5x8m@_-y0^g&-n|bkZOLa0H{0|j!eEj(` z?VRZl^MoVwId5g3AehA^IdcaQrH^vHb8eBEWXUJ*G783Pc(Ec~5sgAobs?v8R8dD^ zA0J?0tOQ-jH?ve?)ZnXdyDw8 z?P=PXi&U%Zlnm$Cwh5olYI&(Bsuc=o9XiuN4B4lTOun@l$wQ8JA~hG0TTo(xexZ9G zzYmvYWcSfswa6RPlSmTTnFOQwR)*nH8PylV)?dM~S%K$*Vdv`ruT~B%NbmP?!__b0 zYLv73&Pg~UBZRIBAeO^ikJ}Ti<~1!=NzRJ`R`E5;Y2Rzf76rK8%Gm4IC?6wL#raHU zs?G1KblGF|#cOGtYaD`Iqq2lIC=8j|5nS@*x6`z{4IZS5d;>n(e1sAMF@6~Nb@-oz zLtV;Op!JJ!67!XuzQOeYjSkOx>i#a*-F?FIA$qL06mGD#ulF}C3oL3#?QeKnKv#@8X; zi5-85+P9oJk4?cme~I{hLIqxR4%NqY=0A3--}5OfBDh}V$u&V0T6$J z;KIrC zw<-VB{rV@X2f4bJk3_TIPrjHnTYB;yp1#tXySCV-LL2Npyjz=Ws$Lq~ zzF$dwMD=}Kz25R?!uXeckHLK;;{E#Fec>ssIX_DQ!{K5mP_@SEj_!K9JA4cMo;x(NfvwF7fh&4UC3^ZWyg#qa6!1}M7*hTey= z2;0;q3_$$cCT)okSqSM_MCDHRfXd?#v%}DAO{if0P-fduk`x!Ew9jcoaj?5!z7-;WHfjEtR)3=xm+fLtZqM!i@@ zn6^MHnjX`2Bb)<7+z;fuX5{>-V?v>$n$4p^&91sQu5}XQNjl>vFzh)I8%7+^^BvXB zZyw`JvWXill_>6ed7PoPqVaDNZp|Td0~79{TI?8;i=vafE|dLM;Giw*5Y8z^vkxv? z6Hx<75XGr)PE#~VQyv{tSyPY7Z%!sN=O#kUrj1A@Q=S|}aL585U<#4{Qx|8H91#vR ztZsJVWP6cVFMKkUIhhC=zgB)7YM6d9(@H)2oOd?o!CBixg#kI6N1vnlBSgc_jE{G& z1!uNBbuPVnu4is;VGFzc$D5&4XOyNP%x-?XWd1CF?rLqmZ;tc5WZoVp!uxvW|G)|K zsUyWk{v$E%BVY}RWb5!X13q|oMySnt=*PQ(k9%t$QJ7i)TrE(V4)h8As+NV6PQcth z-Zp<^p7=O)_>pkihFxii%pASmwWwj{M7xcq{}0Vbv-pP+jnG10JnE#-_bZuq&f9(uiJk9oOs~H_;T}A>BkuJ%}$&EpvY|Mb^x6lY7H0Tvy{#D z=|=47m_;e?m%)h$>UsY|ny;H$nX7 zf3`tU008|R1^^TA2;c-fjWYle5dSp)-w?l$(D47~`2XjK{@;&hkCF273<8vt6nIHV z`1n+m_>@T$*%Y{W6gW8K~D?hX$P9Fj(3R^)#Gbl7TVChg2EJJUw&GVTduLTW>$}WbeNkW3;2}^ui)lx>lI{N z?xEm7!TJE6`MeF8$I3C`QUmoJzcLl2f6=~qluAu=ykwSed3ihgbobl29d#v5 z`;}r2iru<7n-6@X#)`9;6)|{oT=_%>I9o>BmbsBeh4$HQHyg|hue}Kp&U51z!|3>P ztX!B{4hfT?je)=vw&RUmi%|>~kbbQJd2ECi%{0lQ?^ts^oe!0=DrK}l?L}DzG3DK~ z;#|X+y5;5D5%Tn1w(C!+8EHplsdmvZ`-$R(Nu)(z>kG{Tzqr}Van$-&)@0rM5m8{( zt!+?ux8TYnFFDlhn14wTeUX6_nEJHi!HoB8lR1^87jBv|A6R7*snxN_UYIq*miEo~ zhj~4ISv|W`oqFMnaO;$kQydYAaj{u<5_^-`r&tU#FbN=Go9Q$9!Zhl?Z3Res-U)~r zJRM$}QaPD5^OgZwyY9}B;Ktt6y=`B2($O3l!rU|I!qSp6utG@Qmj3$c=gVJc0B8F_ zhx|N5&g(3aA$FU?2+7dJKLTGyqg!7N4)Ci!@(AFROgS7U!9Po!RU=0v|DYrJ+HfRr z__zosmAyvax@Wh~UZJzj#$*44z&yG&fs*FHRv}A_eAqs_1@joeR1Za@|1^SX=y8(}=ix zrt~yuUVXxU(rPcUO~2EUGJ2uVb?CL+7B%J4go?uTqmp0xRo7(I!${foI`KQ3mc;vu zXNF;Is(79|qGt^HQV+jYrantH6ozOEJ$`oSbeDd{4&UuRWaHExJ7y&IBDrRFk_r8k zKz$MRRR+rAx93bnv$rBFb}ffwnx>LlRgD&1q45mR3o(v#A(D7c$Hn1AM6nlXgt0^4 z0#PcMRI9xP?7K%&zA@gxqI4Q~M%WT^uQ6@!AcFA+7fna4I(8=t7=hPDa%FRnIXRsJ zE)3^Mt2!%wqbH*9R8gV8lL}nrmtcksBrWv`J;e1)!5qWOL{YGku|7|cs;CuAgRmte zm`r@;iGsTr6t56lV-Nn&u<`wge88zwf@^2Sh=|HRbEi|Hl0^mJs{*&{2~>X8M826K zVqhL2M-i8SioYQ}$LmUBR$?2hpl1e(CnydQKL0 zqaQOipp{%|xE+4`o_GedUicozOeXvGMU=R1K`X`)?_%KG#k)+d-i@^;!Tn}w7=Q8S zxmtC@q9uDBne&=k@2m>UgMtq~4u6 zM)FJ)vFeLpKVQyAR|_wQQd^n})d{`1Veop~&`0~@6qUpp%8?*5TN)zLL{lM8>qWlB z!8SLW`29sl4;K%CSk4jrTTl1J^feNgi;CKx?N%lpBW1VpyxQso#>1Q@O)_!Q(+W1C zNd>1A*6coK^Z+x-)BOxxi``QMa7h5#1cpEP?hS%s@S1Z*!?rf_OPk{iMTH5fQEb$-%y?qa!KCe-96rL6T8LKBO;o z&9%&bb4@9DNrJ1ZrZmyn(8V;BX%`2hfj)~XAi*qLqpsP{)oQFXtHuZOP)J{VoOZ^& z(a6gLcj@tFNV#VO*f+#YIKK&$YclO@UJ#@Vsjq+ioR#Af$r)b2rlPHPPPc?2Rkq_X z;9Huk>7vbs6e=v`idHy}oGXCHOG5lK$vYU@#65ts3?X~Oi)ED>vH9>rk7UQst}N9X z=3tB5s!t}7Wn$!K+aBW>4an6RuqQxRBl0v6Vk2+;0JepSpn#HQovK~n!AV99OLy!-fiK(0YySKZ z{4bx=v9d|5-xL0ifqW&3fIamb`nlK9Q$E4V?Nx)vMG{4jF>E}Jn;6F37siX36rz0i z#^W)FMIYfKKkiE!S*JCZVdg>7*Y;J?Ena~p7KenmfEHc(RB>IXyoM`S=aaXf`)E^DMoH%lb+6U$u&-H0R;>!^%hFTp(#%8&DqneO z!molCRb%vkL@kR}tsH@uUb^g8T*-kebD2@tW&qI9XO;UkYk-rd+d~Xqf5G(pzw~;A zvNeG!B8YlQq?V37G!zMbWDRIjeEnaojHoqzNB})Iin#_2t&_#Mca(lm(R?I}j1h^n z4p8LIBv>8}zSt$3KoT^ov{GgU%Cx1a3pfF5<8e2@^Y!YJqs!XM(e9 z5_LV%x$@ZrfWd4wTk9~ppIp1st%|n1Vjb|?FSH5J4GA-%$jSG@f^WLw_c6k z55j(p%^`dY^KT}yo#Ged&9foi@s|52vdetAmCpU+R zMEaat4mK0$LN@n_E}xNJ?ty2nNkcAlI@bc4N0%jp=B7zEtyE80SayT?Hfotbj#1GIhWN^oP-yhFtB}U4w7RxS@iY(a5gWHR$mP8iLgL%Ag_S%_Ko|S#8 zDB5)<;9|fznr5%nWtEYC{!0w+ny-j7n1G2gY}w?I*#-eKr;j0zrms8;*}cgNu8Rb3 zf&`q>#jUEB_}=Ulu#}NeToX`m_E$IDAm`Ys4(f_v@UVk+|D0a@T@>+BJ0ls2T8Ewn zyCFEwxv;)3r)e^foDa`IJWMPJ=zLhVx){|9!MOwCIVGp$Qq;S%S9)&N;gE;#v4Rzj z5+R7>C+TyAQ#Cglq$-wg0WDjpNEc&xKHkO{a9na301PR5uHP6O*GPxXDV#$)6Q`){k->Hbr#7l!iObgOMP%d)3f;0^*VdLTE506!9{%03L=4MqPpOQf9#DK>}{(s- z(X}2fMZbdT$l3$GpEDc<(2nfjCq$0g<=3Dy!c8U*ka3f^PZN6+Moo?>|KH@@C<)%?Xx>VJ!oksX=%K#zNQx+*vh zc~tIqxi-mH5yKgQ>lMAJpL>IB2qsW1WNpRVvQ>P+ReB>miIKdk7o^|mo@Zj`3x6sx zFM^#gaLUmd6^n#PC2c`oCmn?_m2VWdm-k_=7<-19XGFE_L)OrIzaM9E& z=uC*eb-#bdPvApxt+qF!g;8t|3o57NebkcjXdXe;g6E|R%fc<=5d)ERBdj7SI1;7a%5kTb{pawLugO?iJ#lr93 zcf=J#(=P$>tRXs2swChe?Fu6NtLt;iK7a%cMU6LUjDRG?l<<+ibqdz=zf&QecOhWP zL2(pw)E?@OCy64RYF3@jjuQXhD7xGVGPF@I*VZtZ;}9nO7?shO4JovDuQ`;w`rFO8 z)6B5%vh6yS2CJ1c6{FgFGNRjcrj&r^#Ils>=Rs&BBvnUUZcROK?!|^&3ST?*BQ*3F zLI7{)0fEFbYn7<-v^d&~jD&cqGb!y|X``E=8`gv=biv3HsBxZ`_J@f)w8L@sN!wwa10zP3sCz78K5b<1<(=7;#!HRothVMfxAR~Yn z%#0ozu0oKLr#-%OhCaDnYVW8RiT?4-`M zSIi{~iWHtCYfq(>1rmPx4!O+|x@eB$clyY`W3y!+!mgwBRSBG^PdF%xEkA-=l=U9( zjB3^=t7BPIuT#|WKqX{6txnL1gU>beXin*1G_oZelSNms~nO@g-C zy}D;BTq0-v7nkT|~tZzU!ig?#A8SU4y&3y9ReBxCEzhcWb0^ch?Zy9fAY` z!67(FASCI_f1k6@+GlnL_s&xDT24r6lc18Tu z(E|Pm(YAjA`=uW|N*i;)1Ld;%=~Qx(x5TxvTw*qg#^33TZI;sskAiU>?2$joTac$s zo7xJ=LJczneWOm2J2<3{>3w!|aV3-$*>YrT`4o{>m7Ia8ZSuSJ6`yBAkOlDc-j_?< zx68A@eI9YsS(#I3G*gO=5+FJkoi+2`ohPCHjw!0}zIn}<>(qX9!+g_C#@WDb=OogT zSG{213*owUy;#5|hxoa@n%25Pa@N#%)c%Ov>uAS2&r{v@tWO|H-_Z?qze-bGe;}nl zFm+I^?z8h1w=S#ZnvOwa3@|m&y1CSeeL(iKag;i>5Aa;zJ@L9(LzMQk;Nfd2 z%8Z=bUfcw}{E>`?C9Z_l)=%}2ibGAs<6MW8DSfT{E@$oH6;?PNogkgb#R7td+wk^=59qc3lPxKu=XyK%;>7+VE zVdv+8^O?F}ivV9Pp!xW#4T2W?{sqza8D#IWG1Lw$Xkr+nbs>O@IpJ~w+8;@|Xj(f> z+&g`Z^4S=gp5nh`IkrlpgLwtXOUN#qRMTHU_Rcm^fZMiq>b?@TO#nB<@YSJ|D1^=C>|G7r-x<6lo_~m|ENRT9(-YoPI{@S8@Q& z+s4q_V~N|dVh~f_O_t!L{;8>&-5p-qEuzIuaMKBSY9y19)=AdqfgHz-D(!-y)4b4& zqy<2I%07__L$@+jDK0DU*Kh^9+`>ncLnd?>z%Y@KdM?d4r^T5y?Lw}^U^zfo2$RO>GMU> zK8WPzvf4aiH0GK$8V3B#cf6ma0P&d;&T|gHOa&o4AufUkhfWJZRbUS9#q)xF75QNg zPlW5{W|&W4$=6(h6NhH?m=g84X7z**>Um81iL25$jp{_>$4wh%4|``~HNTjZqyz+X zulbHq4JY9cOuj{*!)sbjEJiXPd-OcYBA3gW^Z(LFF+xdEfqy!ZTR3{Rt6G`zN4n`x z@0(|M;>+JdI*jJWhktB8UU_H=9ko0BrL0ytPgR$Z_DRJ;#wI7HU{j1`qoBaXO~OtB ztw%Vo)w;OJhAYkduu;uk#ra%b^{Qqv3NDlbWuh(sDraM$ofTiL;>L{VP%_ z?KzQDIB6if`DyXvtgUQF0y;@=8x%}CZ|~^w!xhY|;U^TgBIUguoG8c_D%M8Awk}B^ zvq`3Q3B!n#|MeH+n?Kk19{IF7Lm4+`GAXO6W=c`o59*yBk~bz0=TYQtIyvIKIpb05 z{?`ujBr#?Aoi02W;3ULT?lWnN1#4)_Vnj6J(_M*OTB2}x4ss_cp`pp~xKMfE$@!W=UfBDbh-TdTw~o*)r*OyO z_vX1WQasznr`@OA&+KIp7j<@seWW5a#k7u)(-JqvOqm7{M+bZFLf`icKan~#u2Si6 zk&FKDiSH-1o7;)a<>gOyc~D|KQ_s{MYcYC6`(lKKP+BE&4+j^TS+$-yPH+;$0pWd4 zIssWABk-z;gc*Z&f6l#6>{Lufk&H{!J)6IW$bK;jkz@p2c4Mw8N9eN99eAk&qjS7C-6jr&~a>Cy>-yqABH=pJ3TX*ac z?*FcAh9F@+Aw-tUb5G+}MH)EZUW;>V7XKk_fLxQZ0+Fw+cTN^R(^4?6{;;`Z%%khD zID2t^osR2hue{B#^grI&Ihe{V`7>2dKEq2~!)U}x@w-Ned=w5Is|KDdABMq&akT5R zz|)1Ea0Ng!f#EW@ne*XNmgCEB;PEpUQz>h!k?t6+TsLyH-lZj@pbkY?^uNc#GA3)UC z68Baw6P=$6+^NhiX}yEROMRP{i?CqLZW<0SdKy6(Yl#t@gDYT^8yY-6wRR*y0YUZU zsY#ZBa(rJq1N{0bwwg1qR#v<9q?Ffc&olDXXqu@>6cjjD(gnxpQn9PE6QQ1wQ0sCu zuUiG|nl?j+XKYIzF6y*-2AW@%N3)DXLRxK9i_HaG=ZsJ7WS$>@u^6*}fMd-)%) z^Hs#RBTQQeE0QQTv?OoX^J-2|gsu)S?41)B{HZ_5PBx5igtl1-DWX<*0m4Dd2*bh$ z6*Ugg_)ak^#py>zOOk)*-^L#;gb$oh*5x6qQj!*9gHY-B5t{Uz*opmb^XJ!Y58+cu zB0{U2w4Aju0~}Z#=Lo~c%t^A-O>hmIi1j&FLUdD#4hv5=q9VM?9vhGOvJh9Jn{p!E zH6BSF;6f^u3Z`3|1?=Dqw|>nf;vj4DE)6R*00>G$>uMewV4LXZF%hK-T<>1#NB+{i zP~K)cZ>+E1`G{K#%>z}lK9Gn16x)aI{@CbtT_iSYo z^78|vmqp$!q5FB|=OBsCmT|yCE;Vv#fPg^$Y{?thETbi_%P&LJmR_I(gMAT9iE58YA!hi8Z4|d}jyOci5`Q`Td1Y-fiYUkl?* zEz02iW~70OJX(8Psl5Y6*BqXnaH8yzi$!8yMR|fa`*h6J@IQw9Wiz30$3C?p+@PO5 z;6aXU+M*dzmPg^n5T7qI*h6C0qKqLS*OOj&rZXD5BkD=ERm}Y}!C!@H3aarzG(^b* z*E!Ybndv88^+m`TZUL(z2Gp833;~r7?DK67CEn|{Dg|9V*G#%YUuFn6a^3dQ( zK~B-waD*QI3R!F^L3cJQZT11oJSPlJo?`7*1j88^s#LMWfKrO-WNGKHvgr*|onDLj2Wu zXc;=N(bRAl{_Mvll?Fo8TuVN}P(SLGpZ4#%T-Qi|J(4$wIzJxXa?19Ls2 zuU>OB(#T4Y*b5olqv`Yptk|E4#50ZJ6PB>CTLAD=@vLVdXnD*ae;2lB_O6;Fy@2RC zBS%nI1j16nTsH@EH>dO|2Yf)HZb0;xxM)^pIu$eFq{cb+OmC&S;u%?T>pa}BGWu(iCDv(?#RBgRL0|!o4gn}t~VbI z-?8{-T*SpUD`m0@G4XgxReHK#`hh9%!R3}f6>XG0Y_!Z4_$o`f)C05CN>;55vi)0> z&#xQrI2ak>YIJ8DzDR!hI{wFTeC*>v0HfIb9u23d3_%B-Hs+iMg`5hOHkZ1lz! zjd-Mp)0H5FpWYQ&UaXd(U5>Gj)X@iL87e0kaA`tN67O>39N&O~!J5dpPuV`_`S8kK ziPB6~E7~wA7(PiPhTszXo(B-aD&Lm}IaQ1H9Ei6|gI5qs5IK#n`Vlib9;MwfYrB_7 zz>*=pJKPe9v6CQk=PTosc94-#?6+Y|4CCmaj|KO}8b`e%k6y)+0~G4r93jkx}QEBWrcO?P<$ zylVkIo3O+hVn{bC900=CykmPf{h)#2jw(sqzu#A@h!Kg zNYW0nG8Sl3HUn)=quw}1-0@rc*g3uNuy~#TFX3iyxxe1!Yz|Dlj+u};fRm$X0T>>- zEm8I>+E=H}?<|cafT`}6NJ^bUa3}9>M4GX5R_;uZ87q8mg$zzwJ$X5!6Ns1wfU0kt z7vmIv%OcV{s-X;4F~ZmQp~S>23}NZzcU69)fC$LTYTWN=>_mpU?!pme*?< zqL(7bZorErWFe(q*VD}_tlAwZ7Cq!s?i-1<EUH<{YlJ)20#Bs%=t0 z+23&^(qwokX|hIA8%aLeiyxPUuPTjA+NQu3^;Qzm7RtjdR?ekB%%D_XlmD#KBTuif zV{2x|Apqtpuj%Zbs9dF&*&8Q>k@_B0a{rt}L<#U7N<;DgET;#$844=#8y8Yh$uJn28 z@A)Mv_q)IUZ-3nrF@l2) zFM!yARB0A*H{!^r7rHFP7%Nhv*V>!-5$$uoZJo>|yjh;SS@E;&;-zp?CEbhM_}!FDot?8A}sWJHh&oPbU+`eY*6WH|fyw#j5Z zzSMlXDSeb(7%II}hXM=V1S`Fg@0=><(fAae)&`+0x|9V?+FSL@&JCVPIrj0{%l-*M zje?39n%NoiMCJMZ{?=~;SHPZYo!J11Ao%5A&Dnw(P@2;h1&j>AU} znUi52=;zQH5wYy!glkcXwl4OQiHw%txoq19jf)J7HV;hEcTOd+wRQZSQJfnV6Kgv+ zojd(p_qTjOG--qgI`Vl`oCsl_00@BFQQ)N3W>m0Y>wv?7&hN~@<_WVDDrx8M$8D+` zWX4@>ZwhC>tIdrTelR=k*JN9v=bxlWUZf0J3B6pQ5+A$#27g&UgvwU(%Z+HuyV#> z(e+$9Ag$$Q^=b#@5@4mFKWAri=5iLcI_S;H9Fx4+bG)8ZG?-e{pB~bC&9j*=s*xMw zlCTTFY8(kOonXaRV)N-G^q#PbDSeKZMmJl2j{#8rqhLD#v*Y2_2&*d7$|~zW5t(RM zBoLLu!Jba)s_UWE5pYh)|5Iyo)iE>w`D+E+M~vM-_FWA;ULs3+36qH?aizZ|+&t8J zy4_kh8Bm@oCxnMp_becF+6ZJ|#6+(8jYGN=QKtMxN7KOOh3OWk<4eoBx0%Vf0opiV zZy_Q`@I>LYcUJFR_zfwapJJPZ2-%fhmkZHlDf z8z^r;+Z3l6Mcb^)dStLIMwO%#5hM3d8#60_-`!SlVL{~jtKaG23E=2V<}me#O+?m6 zzsYK%_`LMKFBTkDQwwqs4LPojv5TJor)2}P&nkQ}Y&8i{#V;EW7g$Xjr}18FMeg&g z*zf(7!4tQI@^>0B5#ffs zr9@mSRZ0heSaDXtxYgF@aj4!gEh(gN0M12m2CsFjO=>X53T6nOZATpJZ0x7Nnu zU16llD7MR*Ym1hyw>e`nE9~cB8Bm=kPn1-2LU;j(?>iZ&(p~g${|a5r=wYAo;6-1` zVu~x>u1JlI$Wq1?({tl4r_LA5F)RtDqb7}$rjVcZ#PTa_YZCP0v{2Io49#1R<7}0) z$R+$okQx^tCPG6bLzcGXwQn9!#KR;TR5kS#mfflWDU6Hmj0@OZ(O`Se{4H}*!rbTG zPd^egDE^!Bii&&^i_6_Ic=9ijjKp^V!gnu@_e3{1ESge_MYm{QZryc2f-N_jPy+Q^ zkUF$P-4dv136y&S6<7iR-tnnQ5%a$8AuKU^mfq@PF=}h#d<&&q^M8}JQw1{*B6!33 zQ!%mPnsSW61VadLoJ(x^r4jx;@D~XuqXm=08|gB`iC1S*n_$jC_C&~{R^nT;xXR>q$UL_Sp@O7fK;Hbcle~j^}68K z^@G%whk@14C!(Z0fXZ(1gqUsX4h70tgIZhpO7V`xJ0HM#Pj9-xCS7>8dTb!(p&9G_(* z^Y+pRu%TB^Ls#kbB?8kil*q`ekzh79!Dv?Ucyh92a%}R11lH*69JVZ0fvntYa3rLJ zg{34iIySGYyt1??Cm+%j2Tl-B@0OR7lUEn$l2`orQB!_+d|Y61L{W2gL~vnrS#fEZ zZITt6wIY7EIKMK1qAmCE@F@G_JTW~fJq>bNRk?e5#&+@Z>E%mVWJaM*>54f?MgcIdEF`mHI?!!~CD1EnQ}H_O8rAl1_L?#SrbT+UUBqoq>W ze#o{^q1>}3gK!R))r=fpeT7ExL2y;jNY>kl6bea7;i`J)wm8E?4%Ns}o0cXm;Yf8{ z^a5iP$7KxCaYCozoHuL;MP&XK^ZfyLKWzF@YZ*$T&sO-)oH;DIb0nmU*XTkR-b zM-S1AT3W0G5GOYr+G1Hl;%;B-TXlBgc_s_xb{nZKe^^c z`N+~%G>l*{#gdO?unD$=1JSm|vq&9(Du?F=TsTf02vFn@(n=m>1z0D18|UAl!2ztt zCz1OYm9xaq2NLnCa*mqlVXF{ZqVl0z9cM#~7?Wr)%y_fyOi^VwXf}MpbE0v-Rg56A zIC4co=*EoS(p)6P#Y_1jG8QS79kd88YpYzsHOTI$6bnx($&qmA=bA zqz&XGY7);N>sxgXVS>A!RK6r`>893q7#`!?$6_{pJuXvMP|w^Tx0s0lqE(a8VAm@{F&GVc2wrY z6Eg1-d*D2bZ%Ip^y8yW;o0DZtD-aQb9^?I)`p@~FQ`=RXKR;7ftDEhlM{>N3Vi^v0 zxAjQQ_wDL`2>o^4@YAjTLv8uI$oa1osh<5enrmXG#Z+eP*xIvPV07szY#C%8pVSa+ znK9wfW!WVt$3eDKZJNL-^O0G6yYqWNv-pFcNXczTm{RHKaWgGOJsQL44FlaDap zHz4%QFQcF*Mge)vkZ-CnFCv0bBu`pl+Ajw`BGU$m7Orfv=}hK>g@9qL@31ddyqR6xWEXan5MuouK*Ud=|YIIv0XU!&#U*AGo^a+}kggBbC!@&6EunwZgzWCuJ z#|rqh_h+(961WL`hqSPsSn*4@RC~FjqrbtMvf2rjUUleS(PwhU@sCENQqcId|ksOUdY!vjQ3T9uhyVGPdj7 zhI;~NP$lCcvBp$3T7OWZI)pG`acOBLaO&6Y_*|evS=ajvzSpVj?-9iggJ>T+iA2q0 zG@Wi&p_tjVipP|=doz0V8s1I5MRj_1tiS@qk5y4@1e}?*^Y?d2ac|~}9Y0h9mxlBp zGEiw}3MLS*24?doQf6#2QIVo_R2|4TuTuN2Kj9`P6a>elzJ1)D-*JT zjtzC6(K~UAy)~)ZZtvF4W_7e;)6<@x>&yUiXfp`z+^wh$tTtY|H=}K@6m$jE=(}aV z>fr2+hTxp?W;OL4bD|z8Bsfg2@Mp-|^#xbtlkv(BFcfrK+o4ic_740E5r;?GM1~h| zL%wDM1XEb{QX}5M6_c4UNNw8lLb$^0EUn;d0*0Y(wb@m%mM>)nmFRxAM;hdHr8+$$ z9E4mEY>GB7)|&Ov{kZHlB&x7JY9tQ(d%JvM^ZSXliP-E$a8QoW=ymP~_?R|K^KW}b zRXU&wx^QF}bn8>rt3(WUr+L3+yVB6!Za6~Td=yuUhe*O%<1U{09+)eGC`@QhoA4?t zgt<3s!3ZM3Zpuwsy>c1&W`b+{u~K{HRL|i35--FwqDBX-1p&!CA?b^d<2&ELLRylD0=hd+gKR4XI>EZ-*-;CE;?6M z+e0GV!t)+~&ng}UhSL59E+MHs8UX%u@clfS*CcnYej&dQ`SAWn6lGMMgXTBhFAW>H z3%(^czb|=w`!~VE;uIw$lU91&idSS4E{jF4#pc%GW^j>7tAD0?1}a@2G;X^!n{L?t zz8vhJS&onmU1uAJ1(Gz|PO4(w-(&~x&ze7vJPf>XRq5jaw6>IIE*YdJZs$}*UpB;E}S4X{4m!UPRSg=tP2VV#q9|r%L^as3a8o( z|NA4HmB524&tK_hgyWIBhaxZQl&5xgAXQu>D*@P9P?)19QqTy@i>xXXV6pNLK=%aZ zYX=)EMlm@?Nn=L|)I^EZfc0^sn+$~kil~CNs%moKeR>Qhcq&4Q;!%3uR<_ZGxJ-(& zF^9Us`VrCR<f6a#d%?SlRFxWy2WPDPh*M=zytcZzBm`;+WTv-OvE* z;Jnx{C6N1BH25hn`YGB#$SuA`g?HGUUkVEp$=25b6El`&n8Rg)_vagakk$51u-Ft- z=0oj+iWNMFPB3Ojly^zsSTIeI^>CuH6yuwW-f9maRoaFoU+2A3vQ#aRs2 zsCthkjNqxz*(9|;p_J4lb?3?V8YR#TC)Vbvrr1chN>eN7CP=Mv64I#&=_(%xi4WFz z*R8qjO-Uf)qQYCpoyPGl^rS$RXwHyRk*ebQKu-0{tUsTWo|%zf98=1}Q(%q+S3+sV z_^G_SsndF?sLwQ4<*B{HsW|7U7fR`X=M*C2G}8FAVP^7(INsN-%6V^ej5+xga%iS=11SHJ@l zLc(jGPPGpACa6}+N14En#iH2vT~MuTsPLNzl002)&gkh}+*TpEs=UB0-YXmGRFu5P ze5y>6+?aFDJQj-pVKd?5oRH_-5ldI$hgc3nCni6k>U%1pW$X;;d|<4FFwngtkfG}t z2PFft)&gk>EckF9nQQfBX-gE%Eixi#p&tAS-r(m z!zFsHLgJ4lU(Z7xg`q!;p#?giRX@u^yjX>)geW@l<@n-rVJ9JZhvyn7;rmk6tQb(7 zJJdd!A_1KWwTw@=Y-G835<7;tu1xb&S@uI2B5wH;OIdCvlrf>4rLL5nHA+0e<**DQ z{XVOB6gro$a#Swyfe+^_o^>EUG!`EZiQisxJbP1Xr#;7nnH5T$FK&>$0BF zRT|}#js#ZXrdRIvR-La_rO;9LV^`a37xvp$(v#u@)K#^xc&yr083L^Q>drFgMBchY-MYcRy5u^E zI%m%1=K?K~3|S%Zx9hS8O04tcto9$N)1`}0GZnnvSx4WZ_b4+? zisVn$HE8{+Yc*n6c%KO(ZX8x=G?s2C$!L5V3He-LJcruEdfRZQQhChUaO&JRUPrzC zzA&^FAiw`!sXEXhj#ulvxz-D0WlbXALW74BN3&JK5?&oX6jnO)2)bPI8?K|G-&R4s%-{knT(KD%Z#?at!+cq&f$I*!rwUw z)2knOa7r^c`xrw%{eXosP323W)jErG`?L2qrWQpxW zs_V4ya*z=S64-DXwJI#DZJBmr0L3{l=0>QpHAu4+O}&Q>l5}SYcCY7p`CWEAWOQry z3k9NTsO<6=?NJQx5lI8e0@eN_?jTa5gajDv<>s?5r z=G*H1h|~+c>;|2C=&Z4>$qT2)qxQaHOw8F)77y znqgsKBUeNV*j%+933{LHGO)Q{Kw3I5-rKrB=DdV902UlrClj7b9Q@rnIG>2VC>prJ zHni(7m}fJzeF;O4*|&v91W;2C7)+`>Y(#&nL5Y2j`mI1#UKV8HBkn*1&=BZ-s{erU zO`PlaLn#-h6YKC2*T>(rXh;Je(1JfaoA~SiKSCKkLa~QqxQ0{pNJ!O`$X!3cZ46V- zeZUcmg}welvHJL@4n<_&mKqx%PCn9xulhkqQ28iLG65C-0Ie%BvUg2#7yKc*d-U)6 zsN|f=AG)z+W`MkF3%(kDG<0ldc8 zE#N6}N}dlU*ZEUBeRT>aCmCItddAw>G;1OU9gycb1rZy3g`=sPf+zY6wnk9`|!;`bM!560h{K0C+3 zwG7i=F7#cd%U!;5?V|XzyllFJD852xwo+ujEEuz_?Y}a_G*0ZNt+eHXj9sqZ(uvj*6hiJn{QHHma4T7TFuk2GATZd}W2STDV_ zd?pt*Z*;xp_W`+C8DZFE^sgJ{Y^>&nG8hJGZ2&ZK)~yA6zR-)mVW(K^R5Z!{w5vALig3Dzw5I+)vkMV1K`|#`+=Q2MElMwi(ZapJMm8gW}lBH zc0N*U1&9rnzK*A1tj!MYtZ}RtAbx&#wSo3|XCh>`=QaO!aJPKWb#HL=pT>uMg~5(s zugCxY%KrcD75-`be;WUv#{Z}B|7rYx8vmch|EKZ)Y5ad0|DVSHr}6)3{C^t%pT_^E z@&9T3e;WV)OO2l?r;Uvuy7Z}z-Xu9o`Mm2hzXPvyrQijfq)8TFnBy}e!~AF4m1rL& zNAL8Z!`)c8y+Uc7n--gjpDINN-tGdfSDm|O-U52|L9f_;wPO0On>Iz~3>ayDCDVNZ zr0>QjvVH|3-v`B;s-bbJjUDZOC-j%l-}m(1*A{f$wKbgK_Z8gt6ujM>t(a*f)O2o# ztu%KETz!w~>ee2S)4D>ib&oO3FO=T|$q1&om&a=Fj;j!72a8-Mf2dF+$41a-0a9Qi z+(%8|cOEHgSd#oNpO1f}iFERRe7;%nip78Xe5Hl|_9f8p7okvX4EX$?=HdwWi!@zGU>xX^R| zy>stMC(xs@5`nxxi-4%nDV~QmmB(2?@ui>prDI13V^hqY570%{o8|T`zk~tYIAAbT z8`5+!w{U4F5YSF=ZjkcdN}msQwj6rdlyz26eD=!pPhOcm!?*up`u|b-Dk-Pc^w)I@ z=O_QI^gaGd=^r*-4shNMHeJ^K4J-aXN?-rHLGP5E>u%8e&cEprZ}A(2)~V_LQ2Nez zcZC{v1EF`{CGMX7qx5gHn7;i-=^x9*7T*zC+{U?|vj5*ozc%!&+Wiu;0O$+7?EVWc z@xPRQg?*2mf5@&%UDjQ5$9b;=Jc;BTT;9cBhf}gQwyZ_kds700wRR_ZjwWw@MF049 zv~W*B{argXlKV>tZ?mE&risVmckkwVv3Eap-oaGZ75STdjTutafBmuP%Dta=za$WH zeQMGX8dkT!)Ntxhjx7Y&5^71$9}z7+h(CR={hvx7`0G{aJ5fGoN#3z}oCY+j=a#7F zH>*Sbr_zr;c~$zru>0P3r#hPdrSu>FTj~2=;AmQI{9j7{1!C>4GVW zWMrh6SfrKM4FwRka<=rmjy!U5-0q(2EL^;tmXxSbut3y*zdslA!rdF_YdUDGB&{RGBI_e>*vna6U+=l<%PhWOFDoAzi<*d@j-i(onA@x&Ya7_g zh~@ayiTRWLm`uM8zYb%5#Z#+VMhiz_y`|Hd>6)<0{Kg=FJws^MCF5DAl&XVxeI%v%ZxFCd?O6?7_W?s4Kg4achT zvbHO70%;u5v@q8xeH@)L-b{1Da00fvxEOSjC1rj?R`~=RS;wUSt_5R-1_oc>vl`m` zv{@N@O99o<<0KMoReo^6D!gv-WuevU0_pkEtKbCT*mrzjI+bC->Uw0~@2jf}`j_M= z5p8U}g2V)^NyZO$3!EjNdj>?sEs~JV zN!b0Zi+4zWSIgzv!*DXUz`_%0&EH_Z;HW8X7ZHpO@FP`t^6bPEtz_XRbL)_p;$|)ZM@bXYAZ491<*NS~eEj0D$iM@Ya%IpNRRgj-Y^9Wl2M~lZ`&E=-uv5x_ z?ce+#p|AD7g+9HGigcw4DnE11lp?Dm?Nq3#SA3i*ZJcERqWrDmC^G3QdT~SNvt$5j zo#a;|)AgJ>l>Gj_#bg(iK~huVgbH)6fyP&{$RMX)u&`8w+)pz>W4@mcBk%0e646EH z2O1Q(bUAH86cuu-(0Qk@qq1nGsO#&ck(W==6&WXr)eF4pW~*881wg4PF;XT4S~~gc zh(z`%`j)ilFZtFn=Q3w$FIPowB0uI)8S!i7=uvT046n1D|g=dU;)yC|Yu ziSAF8I+?9%%|}yAWQP^$Nf_w}x~>7n@sj+POGlv7M6P`|fm?-z;_Y@4XUum47M=<% zb3*Qhv`_)|We&7-#?3GH>OTL?R+lCHYldec!q|aLZK<`l=t~-q)r|x+B$~Qsoe6 zmG3f*|Mfs7u=?QU&ue~t8>)1D1CHcYQ1EcGxeA6{z;DlBVxIA}9cJF8haw^|2|+|P z5#mkZh-F6F`xquplXlV{`8O3j;c3mixpnYmH933@IM_~+?^lt3FxCD&o(?_$m#I!jpVK7ufElLtxbyE|^hca-~$eNCmGdG~Onirw*$MZAxqoip8LK)Dt(3TAKX8C_Sp&WNDt}{m8A(i;33{TzRN!n5)(>nO>AcVb$Vi z*ssuYW{@QGsT7;l#knCWgJ9GsnBAv7M0sc*-_1cf>TJdWwzQs?kmwNmwq6TXG`=H9 zn?g;Bi%_@Q5%fHbXH|_CipLk!?~uHcR0@h~K&mUpC~$~NwU)|oaLQKD#Jyj&R=3-W z%i?Lqxq2{$>EO+c?wm!4Y2z9?pBBXh@oHdGTV1f605IMvypEcF%g9i)de~J1Xlv() z$mK2Rnf~1&seuNOb6?Suvnjc?a}B*>q8Z4ltgN_dcx4M0{#pvw0%mY6hMw|=4#oB) zS8k&dqIR@QJESLnc6-M%OTQe=QLu~?nJa-t$8he3XydlRS8hDX!jP3rj{oW9>^=Kj zFk5AciS2?SzgKp6?xe>CqDa(D(PRHQ;C~xuH1>(%-O7$iJ_|9 zw=zPoISgN1x&U`bJ_jldbevY(dt|I$)Qm;nAYAZ*gY&Q}CAh3Itk2B@GcJ%z^p3ge^JEg`R*j6S z)Z@HpHuCT~j7xJF3kUNeqfAOzr4W~fY}gjm%s9ZoNK(*gJr4qM&Vro+GzCKVG)i|& z(TMz-tLuxbn1ZFo%?y_N$v-`(pjV=eC%pGaY3KWH|D`PD+gis=5_&kf$d}Lss4&^1 zgFWv>6l!noP;gr&jft85b*g{SM$tu9qGm8|*Gle&p}4NHrmcUUj{zzVj$M$lRccqi zm$j#SQN?$J|q zkayC-IMH!X<;GaHh2@^bOtpk=Sc0C~OA4vTPo+wPtc{(*%ZNf|>6xY22xgl$F-*To z3-&C4n;wwZ{pdDHq?@dKNMa9E41sN%RYMH!N0iCPe8WmEMt507CZ`Hoq68S*naHHW zeiiUU0c+B|-kX1T<*yD>_c46&erSo0A(Kmc-%LLR6Ar^QRGfc_#t--?SR}dY)wiVE z>n~lZdMkRf=6B?Uci=hA7*(BvM1aTis@Sc#RAYAiZ3yNottF={qdvwx{uqT7+P$U^ z2(F@yBd3(QJ!wPw5z(W&T(hScciZscQ(qb-ILu1`*ivvHxbR6{%4dL{#6!^sDu@(S zB0`oWVvJ_Z*LSB+e&cane=8$q`RAXv(AQK`#sph;(d=Dy&<(T+w77BEtnkcbfNh^h z7I=dW(x|P!a#9?iFzZBIk9d3Bhw{lX3K<4?js$*_X1-kJV{QwO_t)H-3`s(Q(;Vd_ zag4}HXOUdzpvnsf6O6oJieQzBAax|)vGRRY`W`$qeU`+eUYNiY@>>KZEGaH%8EPLF z`jHfF;}XuSwtrE2bbJIMpZ04rF52EcinUOTEis`eb42DO^5i7*>+_#qk|BZ>hmdVp zWkEjHcPc=|U-L#Lm^;tgtwt&w5GxvoZD$l`UxRD4Lcj{8cy7f}$zr$xa~cJxGmjvz zwV>ok5ss(fq;8^99?|N4_qE_b7Ys+qzQw?`jI((S3c!iw*rc>Q^f4aukH(F)o=PaT zjD6c>hp?2GLD4A&}Y%LKEHDG31@Og$Id5qDzb<(y{jA(#ne?Tmo zk**uD04SD)EFj6I2YekDhfAFL!ISgl7;aGST{t)OXPe{(E*MFh7XF5%+FPXffg>(h zMD!Mp(0B{hPC$aSb)bk6N$BPq$xjhs)k(!tBy5|h=>D4Lv?0@oKHp?WcxuyFdo$WA zSia#C%g2jd`b0J0MNM!~3hrZGJYn{=z)yQ1tKnFjWV4lTivNLPS#e|ZhN~yp1+?Hr z<~juE#7Y4^1z%go-5_hR89DuZ3TX?Fk{HkFG>UsS9Uko`?GQQP9?(CajdE zVHgJ_i>ydZSUr^@!xK(AO!!zT_dQoKu9f^x3s!P3Ru&hU2|Q&?dZ7Il|6Ks9zaSarKJy)7vRNrg zTwXlVU15($BJF_%zrRT^9W{Y5Hl;LSN=tH;5Z3-Or+Pajg;FZ)lao1!ON2PKN2w%; zh5qNX${!z5PE-{x*0|}Zgl(hpo7^%n<<#Q}Wluiu^E6tD_9A&WltpEXyIb@;Ph%E- zN6JspFlfAd3&mg>$`|U00qa0`0)`jfka*lk31b*@lu#zZTW0>-RLdhHA8(cOZq6qq zX1DiA)~taMWrkgZ8gjPg_#Jr~Gu%~1D9hm(Q34EzU2v!6>~$w%32;OedFgU@`R*bl zeBR9Ei~j*)pZHA1>i)PH~kMaP(PX= z+2k!8qQi(?;VA6cB?`fr&`zF8#PGRVL7^W;4f?1;g6yw!C+sd@1zxU-hI?z!CsjFn5XkT_w*x0C7Xf zbG%_5mCkglQiBEM!xDyEdIC~yns_z8o-Itp@u;^OXf4%iA`sPz>Eah2&B|K-55k{=fy4Tss+f!D<-asOAV{{~uGy2$hP|4E5KPRc12n@a zn8yxD;WwjsePum@A5c}PI)X_qWjaknn}wWmCV7Ou*SG8K?;j+q8+PH}s4^Ry^$w03 z=ys{<3xXfK>^J-|5LGVn=Tq3^Gj-T0D)|%c{|5PK4gB;Pyndzy5%jgV89M~Q_jm00 zE~+;8@;f^NI**RA*{u_3Q@>ba||~ zL0on(>jy4AB;FudIr&4{^H-DK@*k70fN1Ca!}H;?p+;UmH$uA9#veh*m>i<3@F@;33`qf)N?GOng3haTINqbGG^C%;C`6a)_#MO4a^Gr^8K0*=xx zvXwgkw%}VEe zuA_o}E?Z5d_ee4^#&S?Wi#lA<23Z((OCW{?&WAmnSmWb0o$=fCe7P00=i1tU$GbIuY=4pYirz>(= z>If0SG=yGV{_Xre`2vHUVu#l}h*9|)SoX=Z2{t#U7TnoVxcH%d-YKq_SR7Fd{WIVM{N~7zx@pm{iS$bJF&eUHx2DhKM7{yO?GFiV z*i{Ph>W11KZ#34+8^|%pS0^jlHY$cS^=lj|*@Np&V){S1)TYsbXh(K>bUR;J{`Nrs zySKZ$Uzah#gZZXhue+TEQ^OhJyA!UReZjkaMO>rFo0aRko5;HyTC1EP)6OBXsWGyC zV!Y&=zT~2ET5Sj$-j>%x4X81w=(J!fq05zKkY-j@c~8(of&>hE>C_?sBtl<M^8oV-RbY>inmKTV$gv??;tAY+dAxtGf~O%JNsn z%KnZy_|)PGnMrJS`X;UGQ|xs#?%)x4ZVMb27#u%^9A_3Er_OspkB$R7J0eB*MZSy? z|C9UP;Lw>#l08nw8qevK<4o_P_-19y;pSAR!*G(wH)Kro{@&j=kl)$7d9QynzQ~GC z!`EX?RQS8MsKko+(Wv29E1`>c!J{mfyh>W`?ZGW2j>dJvBj64N`28c&JvW}DG-=5% z9(bpN_h$rf#za;;bVb7La8j`0Z)5`h=hh}NLC)fdiGvCE|5Vg+fnGy3BRfV+mGk;V z7tDh*iQE2RN1XWZj_Wmg!)zS^*aT51fV1q3^O#;*2`~8?3+F2?&y=s%`cB)JP8#c+ zc8X|1wGpXlX}yRCT(|Q(1xrWCW!~B~>MriMu;|oO2a)Pm&4sKihlV~*UlJyb`vTeR z6h%{6uq6YjEeTpnoe_u$eDKBI>yUoR&wEsP5L}9pCeKJxaA1=4sb;*XSund77TUnjT&5ug{;duavJWzpNDKenOwcsM-Ri z8$qx}-CJW%Q&AuZGzBK(zI^y9THsV~h+PYSRY)R)z8Lu55laSs8Y*;1NT3YIr&|8% z#Ci{`HOtEc5@Y8zE!{T@tA1P$O4Vmi{CSJZbxe0#g+$f&O7S&Uz~D-tx>SeY%EP~* z2MCvd>I&)q$ovteq`O;l1f%f}yreOz^Z1|XFEz;TLpXkLLT3CMB&fG1x%h>FznRD! zmzxKaZ#Ajt#Wk7VzcW+U;2)plYH<2($9vJc^yrFsgyB9Z_xv)a^0R!$PnZ5n75i2> z9HjmZtbY8bWcWdy`&onQS$+g87xAp71yU^oV`Ja(uRP1PfMrL(vMb~3Fu{FbqImN7${h7D7 zcga70msXcmS0y~$+!mB2M78Y^Er5YK7E2d z+TwY#xsyz(w(x9CXL@7*R>p1pG1oPryk95x;!q`J6X_TJ}%=ZoDPO}9odrIFgxO61V{@~5S@W{7uY!oiP|$U8^D;QZQ8 zTzCg9L|BwDpZENZSeUmkg_NQfcmy}Jz_bUh8&<+>0aJUp%O@>kW=kvnxmN#pPS-Gt zk7Xe5I$Se#*@Uxr zWM>Y>+Uy7}N9vy@64gkJ<2cqN&NwYk)ZmI(7oVT=dAspyp!zp419W0t)1y%6kVMDI zx@m0FSrZRrHIpTgMc!CHlbkY@Md8&`SjE+>CDSDVyHsmajd-2PqD`)M#H1M=jbc4T z`IwxkCA^^pa!}6&V^?=R^&&zI?_!~kfj`l}RXF5Xb_f=za}9eeC-5^Jj(mSLeF|_g z5>pPB(58)!J$bh}MXbNBLs`d^lwAO`f*o@qszE6o2Py!=9GuE;Fd@&-Zy4&vvobds zIz`7*KGY+2M8V=e9vQ1j4!w83VclWH z!0*ZS9k1>kT3c$todhb4uA}bTe-W+K8|hY*ddcM7ICbO~tz)evN;OgR8UZv@CJ zHHu+j3BZRP#}FZrqVwKH_3+?Cal^_E7pA&>q<^@hh>>Fv??^%VUX8vb^$a5kvt;7? z@PF-72$NT%FPsri8$kOKRW?M$tBC+tw->G!2}j5OTE_YN6PcNF6wKJsj6#?~`$MJ- z%pm89B9T(IlT#Lh3v-Wh4lyF(nTaIH8v*km$xvG%fl2<3q$fO#LS&61doasV->1-l zE{vw%?s23E(4o+;=%e{mmA!KP&(JN1GLy=h2W?p;r4vpUqv&dKA=qYBVORFC4*LTQ zGa2DFu{4ulMm8-8CCB9X{5Q-o67n@$bY8tFh8<6^3gi$XVeNsSc^p1biU;Vd; zHd;M}9e*shy3o+7^M5;xeQfYN*bHBWeflvDcIRKhxR0b z-)ry{(ULfbBnGZ9biBfR#L5bHfd`sB?`Zy`F0;U)zdF5bRw@V?E88 zOxF@>-n^W{n|G$H__&rgww$AvQu4xbI9*kgA$~{Fq<39h%?$UM{ih!4*c~wFEDSlTe;3=L`+z)J z3+vD3u2$A~5qP~^uhjXZ7PMiIQS=J)UB#Keq8~U5)+x;Y?gi|>7sOOIUSz=&PTJc- z$xZ5EAVd6rGJi$@eI>Qor;=?OiZkM|UUdFG-s7Ozq`k-F&{@N?LC*wtv8!U7Ls!0g z{}++^;QqJo9>ay}TNPWOE!p4lovY_p2{F~H3$r=RRplvrMvz67TB7i8_IBoS9A!N| za{rq*W|&wWcBmi>=TNgGWj7jC(BgLXPGrQTzd>48_e?_dIJ{w{8CRqui#Pvzg8h|x z0=nd+wkkIS(Ix5n4>Ky31!@CWei{<|&m&rO+XlV%ePg!jdc^DL1L~(n6+B`f>=o91 zJb#$}fq5TWoYOn)l{11qb)PEV_}Mrq!VioSnWXD_*wnc?#v?$+JJ-0u*Dtt;Hq{zB zj8L=U(#2g!-~5*Mm{KEwFARw=;LYx3@5{Q+E7E8z;upPm_b{kAecS)zr6lDF#jtN3 z!LWD9&!0mEH(4#;@`^W9?MHdW2a%Ax0r-WQzopt7ZtO~LU}1Nmlr-7O7W~Do?bcyP z%&{{?(v@eUZl@h?@|xx9u|Cr_2#qG)*pT>LnJD)d(U!0)g+aZt7B4f(+jPXGGl zrjv%c{oSNy>mDlc?~3#NyAKv7-P;`Yp~EjjF+_*efQ64WBD)*$3Qah_i)~_qZ9lf_}_LWsYMKVI6V5%-z>2+1Se z50dTM%RhdbQv3<43CC9mpMLbb7P5RHat6UoTWeJL1S0r<2mgEwMho!7zSKEzaZR0RX9jpIEFkRQjx@8%t(|> z5!~Y;HzMbx_oU$9CE4)cefCp9i&)+=k1;w*;JuP0U`mu#Dh{e21I>=}CW)78k7q`X z_YsQMS4?;B!4`O2NS1uG2Xx;isaFeBm%tAjPpTg0Xc1P6;Y-$b zkTm8O@5ux9DT&lxCLdNLjrNd4bEkZSr%cUg#poulx2p*JOc{7WU%N~hNl@6@Nt%GC zwh611cuRJt(-?kE(*DdXcfL>*gF$5VcE&3I*8xuX|@&D;b!(~y&M@tVmkpw$IQF=2V%4u(A)2Uzo z1m^3||4G}-h*!1&Ii8AdL?|R1v8lyb(P@bow2ObT$v_^@+KfPC{nwU-&;d*2$4Rl6 z$|%F8EMZiUkeUpbW+J4#I!m?;rnQ^ITbm*$2vhONUg?6F8Vi`u!Yo;Gw2gD5MMNKM zvVYfzYW32DT;Udu+dkWw3=`@(IlX3*<;mz0W6@#(_|k*(bHdP)TLnyY71=)2$;B&k zC)MRyTXB70(GC?M$|TLpzT*F{ohCm&FZqhP*qAJhv;f&Dr>fUHW;Qo2F>m=eSH(M? zqT8F>Po!6dhQ1uP@+99DkgOu>o&CFz4!7tHZ_$ZXQQx0jvhBj+siN)UqLo>^H4&nI z<6@SJLMLF+K_aGh79(GonPq|_)0vzSIxHc-aeNMHG1+_CRwQhYy z;pnwi&$!VAg}y;W`}+1#f8g6VMD%y!7gr+0Z3vMmOAxtXol~Y&-ZPsIPf<}lzf(Pb zxoG{cU0n?s96ncY+)`h-USD?2)w0Lm)+gB!#KlrjXk3@6p(J6mDfjHib~MiBi%VN^ z0(GS=ayhO1RU=s=%r>p!>#!!@vDUaoUF3(?R7~2mIak$NpX`v?BqgGIP~Z3|iD-$8 z?TcvBp+|GMZ`0R$;NEq!1^UMY){iI8jZ`|#tATl}THr3Bs2Zkt<*aP9el|sJrdn+< zHxMrno>^T0JTZ=K&2^ULhIN=UovF001+`LTw1&)aQqH%8U$oGXw=&GTX{}^U~r#)9xkHj&I$5A>@*aQd=BAUbMF!!uS8%QQb@b8eK5+jZ8=cI30xnFg2XB)|Wm;B4vFX=~cBc-ukUZHZtCm-x!1{2mgK+exf^INf)0$|p<7syhYR|Ed=%qd7es6cezMP_JH;rRAb#k|zX^&z{k4U-? z9kII!ECa-#I#R-969g-o7e7ZvGcL`*!jZZhqgG;RgC5`w=6J~H*Kn_~3@ z;%&baG4>DEZw)T?TOPl)J|!33FhvaEMh)$mVjlDdeQO9I$Tqlx+p%aQHM}BQ%zFWiBI-8^6sj?wC-Fhp0i^kdOEj0z@~) z168BQAtP#!qvb?n@kpbsG^2&KWYg(mBnx9`Q=?o1BYO1X*lJ?}u4CzzmZ&H|nz9M> z1yyx_iTwom$LI{hKD3nz$h;*fzpxtC7YUSw0HuKd)q_cm0o55LVPm;TI(9-MC4&yMsVwu_^T%DSL`ZCyG{=kV&@m$=sGn4EkvlwQ1{xiOrbl?y70sg=vDZsqmXA z*>q6p%OvTI?*Kt4-Ie7o9Fg>~Opf=;-`30yMQs)~5P%XgtIsblub5Rd&{*OM`44~2 zU2u*!Vy?z)whlTZx#8pPmr~xILMHfuD4%Bb-nr6tzQ=VA-Z(K(G}{DS_$aneIzUtI zI`_XmA7v`!7C%T@QB+)5<)o;QU`OKB=PUbLIw{QV4lEuPna~DkNcc7)@KmLLgB z*J{(>ia2dVzNz2b(?aJ#9D6X#{gv8){H8t5#oeZVyWfcRHta3yFxS7cA0&lZc2hVvAG%Nf z+bW`*`oXsR>kK%Wx;SCJHTCacw(0%y{DIlU!OXw?wNT56f2%cO+tc4R`B8QS;wBcG zMnC;?IN`uP+$f$uPdz;OEwO(X_g%~YEOjaRg;fVQq z#9||2wFR->hS=*x91S9-rlw|R5sQn6)m6m$I%0DZaXN}PpF~{GB5vjp-xm=-mJs)= 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 z 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 k4uA|WJCWC_jNo_I+AR+jUV;0t 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

    XMC{KK*L2X$Hw5mHl%oMOX8O4 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

    qxG;u45RZ- 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 z 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Ð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

    M=Rq)+IaF2B68e{eX zr{z8~7_Hp|-Rhfms0c#Sgo4(b;Q1Wg;{Y3;db6|EUR|;rev<;eqqL6wu(SQ_+t_SM zD)s^LQ`*D0f$CSjRA-e@;jX*JTNe+uiLOW!ZT{xHR|^?P^Is# zBYDo2^pkth2k<$sv^m$-q3oe=6dP}HaKpDv#&FmE1y#FhZfGTM&1Aei+2N1@>5w zh_By3w}=+8 zwW^|s(TqT6M0c@m`DevSdHYlcAV9G9BYJnSe1`{Rjo5ql$Z|&TP?`w@P2MS%rr|vH zAnna3Gs`g^|KwiY1}gwgqKM8ypMMtAR2_5+c$N$p}rfEg%OFRcaJ9bk zxvG;Pcibv`m_u-qOMfUhF%@w-maNrMRC$7O(IYXl{5K;ofq>;`lmOE96b#7-h^>rm z_C7`1S>&8)i=1trwTK?j!sWB49nm@)0d?ekoK5MTRHUBunkMwOoh^boMx{Fjt#Rju zI*dC`8#hiL{7xUp0Mv{Cd`7^TH}1g%C!{armu`q=dg4VA4Yz+Kl3=b{d*VGuLP|DLO<_B814i> zjC@sn{6ah&gvn}W{}9A(b6 zeKa1O-5!JWVs*n)$zrart*^;^PVuWR1epQ&o7ZQc3xp|%mWybR&r4JEHGIx>W5tSz zK{X3v)$DWnIM+z-5g;J@we{y6gXAk@##065YxHUL6iIBkksqSrDG?E1)aNv>>*7x~ z#F_Vt`Q%MX6+!dHTk_YN#je1F^rA!ViaU44tdFs={jj#|4?n$REyPVP>!t_EH(K1+ z5XkY-iomqVx7^9=QxvEYKQb1HAQ*{QA`%HQs4)t24I}Pcuo6azxRt@J<-^?>916wV9f}vHxclHRxI4w&9g16VcP;Le;!+O({y)pJ$tIg*lPk&l zy!Rc^PtFqd%ZxoE+RcUXkB2GCW#2wlyFrd32>=cO2?g!X*~!7h^#d{G%i_@L&@9E& zBpoKs`5j>gTX9NU92FuiE@G&x8WKEjeSQA#d`rUulO~RN8s@=^qaLa;Hh)Ty$0Poz z*u>lMmyf7$Xr*OEC7J2*d^?SaxeL%R>i)>V5MP3yctWSd&G6bt{K^XZ{T%ShqA9g` zBFdICNcmfd@G{D!qj_V|K_Q1!jvUR@@j<-UH`6Qm6DmUyMx=jKIV+X95^1Z7vKrV` zXk+z640Lh68)tH0>u}c-0!?`$qZ8WBREq=qLnKAX*j*VS;@AjvoATfGQI`PdYP*94 zwDvuHj%K8hYZ@0DlITJmM&dRpE17~4?7?=tb33^ zfMmtsCdFcB#e7-30}=W1S64j!rsR!;8};fqee^d@tfcE4N0d*D2vr;t*r4F zk!BR&Z*Ux3%O4qkt1aLbKe$sh5pl8qK2Q~&dU6RNiQ)YjsrEtm-%XSv`!lhw1I7sY z*`-LtGCd_zHNUbQUeO4g0tEOOnJfUTgbaY9fq0E0FrRfO@{r&9$}feT*fMHAAv**I z1b!kK!HRFWsI^Z6AW&8FT7UkfB1P)EE*{_L1)TmOpCcakf!gy7OX~cBts?xgPYo5N zWZ4-39!pMMMI1*3*D(lu8$m&)(@fUKhQRFj9ky|1ggwlZte+q!*hAhAummgIq#B|c zZG)Io*V(5(A#D^)%N0R_rubf9xURdQ*?~VCu5cX-$$8#+iKBGRaA#qcI z2Le*K1D>%kk{H*Sr_!or6Iv`2Scp69K_yl#Canrh&Dh~b z0I-+~kZgm`j>_sRBug5Uo@jmOtHH8r>37PdeOz=Zv}%={c=2eU88B&E&P+V%sgU*f z)%gfIcbk5azBHh+h|ROCyNy$Wdenbg9r=i+-hX;xz`W`vVOId;&M5Lam#FNh1@Igk zo8|uVR&V>6X>q206_W_pG?t?^(I}C0tIaRk zSd!UU;LJpg?vZ+oqXagACqVmD0XS7wa0sxpJEkiD+DL`*Eyoa2#XS$0JKFH$4Jjhm zNN<2A7?&BQmId1pY5mDYhU1cm@QNe?#AfrTv^K)UP2(Y?xe9zHo(YGy1OYyZz!f*> zhi~JS!24KI923O@tnuRLXJy>Tbk!ojd4XDA!9o2vUuFPHf(<^g2DU1@#H=Gi94UWb z$`wl_RS!TW+4#sS?Y`4_+#&XSl<7EQidfI zP#BZYAUlN^N*F>}Z|!Pbze6{tK8o$hsyQ%cbkb}gh1>{^!BYD%_q~im%lryd=R$;N zF7ru6Gr^@tfSP@!WzabVJw1VAD+-U% zxop%X+8FStf@`RA;vR&S{}Zv2zeHmu+6G+}cb-Z#B3V2boOcXy0L*;~C_IBNleR*b zNsY8DydOCHJf^K|_>@>8v|*t5_HGWZp18?mzok*JVNgTuQx~TeItFO852X0HltH-4 zxrMLz9ftnGRb=I%2pUaNlZq6PUNLAkwNF-WHe_4vpXhk6%H>@^s$Fjn_1#xBGsVoGa_@ECQ*R<(LB@M_H)bTq6&@=NlQisF4MGp)TE#t_L0xt|YrAZcpV zz@!qOhK}VJVcmq=Vtwkj^F_@}onMOFMLE$`76gR(@Bs-vWR@E%;}L*y&w$$A{u3T{ zq`@sxt=3unQ-nSwd9Nl%%9r*{1PEbmw!u>4&}q(G{uuX($wbHSSoM{9==8y?bK8l+ zcgM9-%#G`2)N^K9z@psS`e6>U_^HNsz^FRoeV&xi*$<=D7}OEJ4Tr?pas4Vwl`kO) z_Lf7)=E(FMOc?)71XnQ;BR^~M8qIP9V@*4_+tKVG@oG1y#n7ov*%pMXZPR_e^IQFgMA3yD3xMUr*g~BqBY%e zQqvD1)QOEQhv+?tv5eoYxu(TLKNN+1gqhKWy_+Z8>Lak1F%gRyrkpYs2l$1Kcm6bA=8YjKc;Nkzrca#(Hk{#tws)Y zj~=IF+!FI7zFN+`b;hYXp{-ifVk2lrK=}UVf zDqDaR`tHRtk%J3!*y?E+NN>54!tHFCvqZPz_u}uI(dxBAJ1q^Dlm?o6Vu!)Vf0bBp z$!O{Wwa5Y=_kVaT3?(O*jLlgJd!x<9WZ>Uq3hH`|D!nAS)q41 zvGELAY;I=r4`n2iPc0??IKC&e+NGHXN^hCjCN*s9)~mLKq z)3k=gWraw>&h87LvC|6*wz51>fcjsqp06TvyPsHZY)N^`9!Vq@5j_?rOdOO;MOJkP z`1%NDU0Kz#-p{S8DqXO0s&VC>=FqxQEQ4eA|D>-O2Tdc5yL>*5O5lD=@G z-SwNdcXNb}mSu4?p|4;Vwr#FO9UUXKdjB3x%d=O=OXtRHcn|6olo{#I#?+E zt4qJUJqc8vBfWn@np=1#KO%kjA%=(LXU{{7O%yIM{>eu{b-0;4X;KY~}-w%-PV#4cC`4~qY(?tl(2UwNs> zt}tKq-!9d)?O(Ke)ivRK%ax8aug==5SF14*lQAF79UeKh5$b9XD~b_xz&qjF2ucoc zYF97ChzJ-{@KO%QzLx?gHMnV_cyallFe7@AVWb&FBs=iA$JJTm6>5v}QM)o)K`lxd z7&Tp4Fsqid&j@{{7JW&XlvfN`45ei&e1D&y*05pT##-FeV!kSadJixWu-H%7@b;!P zHH|sXu1K-j@qWi)byLx!$J2}U&`)0?C;i4%{()_14;K1^^MxH(VrDCj0*8JEn{o!1 z2MbTm5nD@z9MX?<$@baAk<@(VdzUgxrvpL%G^+Q^mQx*@M?9`+JZEV!esny3)E|7# zw_SlNOn5{9S!JI<9N1L*je!@mJk-Yy2mf z8KQnT;-YxA{AuFh0-_3b`3o#DYo?*%AuO(eTL<>9U2M-z(~6>WS|-zo1WrhG%7j?; zTgcbscnK7=PH2yRP+zdbK-mBOIg;`xh*3BK=50|@z$iB=f=;YV6kv8;4yN|AKO> z2H2n)HX68i>Y7>_f_&jy|e$7Cm;y#F-um)rNpVKo)?b!wEFrms|(dolw!s7MpbsosDRn*X20hO?q z-QI%Jx&FMcSXKP?LG67FR)uqH_eK1a2mDbV zcADqLN^#aeh=SB`wxZ$iU5wlMG2S2Tg}N)BK_&1swd^(M-s@^BF|?m?>_10ff-Z4{ zR@8(e4uqa@ge%5{HDaid8gEwriag@9<0g3mAiP+I;?+2g^04F&jbe#!6HH;3Y;w~5 z-1Fi*l|fxd;vK9!ZJ1*8=i*!t2`x*BFlzCyE)T^lVk;lSEat`RZu&Sbgk|VVVrU(^ zD)&w556dg1Ne-m5&Hp-mm)W0_fkTuvWRdBG$wtfz;tWcZ?~dCx!fTQux)VFoBy2VNy7Bk#}{Gx=iZ7b~#@SU+ruZ&%}rxRd-ySpAmQA zL1B=^X<}nfQVDckAzM(yb5+$VRbjr}pH7@1UJ&#i6;$8^pEp)ZH>u-H%1Sl0C(J># znv`G5)O*LP#s zzI;o79rU&#T+9LM(QFrZ zYaff_fS|>L)Z#EW?;xj^X4%UCCU6XFa0K2vk`riCw>X?*lODxbv%xs#T=?yr9k}oL zgzh0V2b16N#@y4OZ9MF`ZJ&eZv}I_zmh14Cc9T9_{G806T6B$ z?JbAy^W!f?MU_uO!^5=u^ZdQ<%Kh?si}$m-AJ#0~Ii}!mV}v>6etjp}neQOqIZ+%{ zTC4g1BDMgWWg3FCePWNV|FzN%4k3$e`%U98H8}ftzr~%tBrDj*Fn(hrlT*Zmo^n*Q~J2!2&BHeCY?_llzP{LkO-}O&URPh^GsY~|0>HD%*mHbUoXF^M2TiA z-atsfJWIBlW~9R7|EZo#!z1;-=G5HFR5@PT;J1|&*1HtO1f;;q%g&?lB$R!J>l9B_ zFEdX4cxTUYKA##sfUA3EnN9#6As|pYvp`)A^8@tOe&Ju`(t$)s<#^EGeLyC@(&4w9 zM<<`TIftu9D_~fT<4WYpyw&X^nwG={_xDECG}fXa#sBb>(i^S4u=0iE^GUqoequ{f z5-Zc{#-do1zJ%<~wuK3)sM|F~3S$+W%N8jSTl+2)r6SsJS=d{)8y0>q`o>lKjhIV^ zzsUOuRVTUR@oEwJ-3}eu*~`-TsK~jC1`UNxD0#u2YN4=Bd7zj$y4=fG4_r}jt4R>6 zexT^m4t3e2bw!r(`zY^bSF_c}9(;gT()>nS-MetJ&VRGrE)+sr+A3w3yI5UtSXB{L z-Bi+9fA^IY;y+#j|4gg!Pb$a_Ic#<>%o6?2XHA8jo8U&;5Jad@J5*|KyVsY;&kka|V9pr&Z=aMs4d?3ue6Y z?yR~oZYu}`V{T-s$@Fchb^Ay<`&`*i^58oQNKZ=1YznhZ3RSI(ie-C!HMIP#XOFB0 z?V1JyPx_1ntIhNqedq_%tev6%AFx&EM=CB-8Xht_J_-f_DkdQs7U2&cl)+$CY;1L0 zTupp@Z7N&?DrN~9Rw+7m83s-{CN2dQ9wlZWO;%xT8hj%2paK2q_xyNErz$8_CMbs;a8$>gs+` zH4#%clh8Dm(zaAIu-BAu*Ov0smGRb>^EFWLS2l7~HE~uqbJa9=*S36*AOT0mCPziBy)uiN<Sm6sc=J~HwnBr`ZkO*LaWOGTxBU@YXB7>)%JACJ;nd9e z{Nly(#_Gw;!a9!n;}QzWw}VbTQSo#eps-! zLu+QtuTk4mELda9k+qOK#4{e{)!;Ku92NT9$x1*mv^lQWjJL9CJ`^$a+K;Z-U_41J zl#9rG#?dgI67Dn9ti7zFTq-IoQ24xNx%TGZeDYfAKDb(i(iiiyocC($S4hdVP$E5r zPZ}@%lJ-*yr*!Pzd3BfVQ}KCkoz%16Yn(@M;%MfALFMyP%Xz_xzGZfYr{-;0D%g+t zRs-e)#Umv25+PbP3_>IIkcJAi;h{qP=%sh0WZ1)h1b@QT{t-x^c=RJemT0#RjUb#1 zgvZ*Nryi+Pv>YGJuu2Gy;cA9r#Txz08=;UKIg*L_Oxz~-X2k!`!z>oS*R~farm8{} zCr=Yml)&>DMKe*qoUV{n%Paj`lCkK@H)PYHhdwlx_6M3Q^47eOEay!kQ_7r?Ba2AC z>YLqMC_MjQ-1h^kfh<@!^f1#4Ra_$1AH-0Qm#mwCmCwj9dL-=in}|L)L{ryVG6|cX zjyx-}{U|d!^yD}vG3Vs4Ol{<`7=}MU-(4S9w()reYu=MZ36sZtXz&#Y=4iOU@6JWNQqNPDQS zuuT%i#y-p>z&$&y?fWpE-`mSTEvKfk*dfhydo57+hNWm$7oChRm!&vpR(<0jf@M)L z-ug)|{m)QT!m%SIU6}362x0OW+Th2I%KD+1;>wX>J{?+xt|W35Xx;0E3#=#2g3dat(m@T_<$b+)Yfw!FG+OVdUJ=elG+RYvtne!87^^=qmda@k^j z+7A71(s?!1LG3qXt{T?Uk$X3b+xkrTSEaSQMizmy!dOLtla?Tl@QWe~<4RxXJE zXcH{!AHb4nv91(dZfA3vn%R;0KKHqm%^56jwl?wR+r|7U-Tm)!gkK0h*4=NNkSv~D zS_0e2BXrO7znT;_0-Z@EICWEi9)z~&r}Ud`N2bA&$@K6eb(Ay_d%98_2%N&#D_eNB zvBAbYs+s{-*OV<{)jW>ZlsrwA4F9(DfnJt&pdMN>UW6vKlaLFkH|W7Nr?aveXCi|+ zFH_~s7t&Djwv7aPKg@WQ~y*Jo>c48s_}rxr-4kT_*d3InLdNZ3rlI^b=J4@ZvOCUPY5J@t7W@CcU^q z{f!6m0b`au3A{C^C!@d*4XHiJ+l?5Ywwl z>UL-6jGd;6-av96U1Vi&A5Ko35jD;aP$?oV_e52jZ^J5rlq=EGT5JERfoRS0w@*JGT$l%>!|;@=I8C1}2T&ZZj!)pjMlt4B1H$ zkn50qSBy9EGSpuo_7`0i-rXK*3qvLcKaKMtEk$r_9E*oMfv^?b^SeGC%M2IK{Q3Mh z6Y~dZKp3d>kQx3B&sGHCoD_tx-G11}cv*#w!K-Sx=~jT6H3ZjfGmn`IjnXQ_8P!3M zDV+gF`EQW_rRfB-oIdskY!=;fKUOlzdbSL^HlfzkByjqck$NmQk>>Rhe08gkjO_|>HlscHEf561)m

    )&?i#7idq+R(o(E3%}`nnNlLGXRjmR!)3)tRNV-1jXL zQ++`rzGNcs<1Hu#%|O>CfB=E3^Dwa6-50A!_ew)0D$LUzFED(`H%iL820_K3*k7gA zxh&O7fcDMz(>*u>Xp(US?%4;Mh8oe#1SMSQrF{$Hp>unZ3Ziy=&y47OK?2b)>oOvP zn6xkS#2?{TasFXxUJ*xM#T}d^o1ipH zzD;*w9gCK1bm6gxDv$$jmoNvn5nzEf)GOQ||Hv|(*FOd9iK`ssoEn7|V8cx3Y1a}~ zI}$l^A0^}Fqo1aJwh&sT67iaXHi>VS--vZU;4be|CqveI+>_=m} zzG=Degl;ZIZI@~par^lYfD!`!dlOTc0fb^m1CNqHZcWg1DRmfrSbun^K8^YqoEACQ zPR$ub+AW~5< z9@7sCf<*^>!xo2#eLV(ctkqle^LY@`KB*!R#z!lo|4;&57u*Ice6U=TGSpL6)SZ)P z16PsVMUQo9^AfEG7=bPz@{)u#T6OxR0A?O7_aQFDdpW*=9#u)X-SwnO9UEjfH3z#2)7xT^Tn(V zqfSxM&f5Sl!JutVAYlMdzSa;GLbX)JCrz8sS`zJ1WG7&*a(yf~41N1H-*0G|$n+of z2kggiwEGX7Sb2~0VkSZQ|J^$HVxf?D`KfuUdso+iHy z1C#o8u?SX)b)bPuJK=PXR`0ASv$HYtfh2uOu^wlsoi!D2qq=Hhs2JY&gq~9CFW-el zP4N0f+pCI-pt8N*{E<3G?SRqVspdqIR(+Q?wj~M0 zCY9&?d~GOUjVn?=Q21TOh$vT!OkyK0#dT0zn>mBYL(z;up#KrJ(Qw zSBp&AT~$Esu97CIUd^p`Dar1@jjvraA4tNt*vzKI-^g`n-!ICBP6={L;P#Fb#5t%W zs9;Olg%Eo;KBqK_%T*;8)`>hc|I{J>|3>nWp=cdHu- ztv6b8PH<7W-Zvy?I|b)f>No^yBY7Kv1~ySDupX<#ryZ*#jru2T_X53Z%3TBWl3SD#y0VcqP49h|U%&5mw)7=)CGzcso4>)%$^kNqlwIn1I13Y{%x zXB|A~?X*mT8KG8ymk!#4A&1URJVe>kweDHeejEL4J6ONMON(!1pToxy=FVPEpT2KY zJ-=7`{=M^4Dh=5oJaJLLyM1^T+qMY#5qsMar|c~2*LrUenvULFw?5p639K{! z<9G+`XZ!kyTo5E%yyJzjx~}5q>RIRe{zobWd8-(EhV<-~$0yXACxB}c^PQ8&<9#5X zo&)`sm6yq~&Tbj>?)n0&*p6|zM8hQK$&2xyOoG$0wk-z4TtmOxG1gl`)~4mrC*Lo? z%C=&`ZSU@?fe#y<^W!rMrx28{V%ixq-W3qUv!7o`%mUc1 zR}?As7o(WAX=YhbGxccmcNnd;Im*`(xpXPdF$#Qb60(~;dk+nA&NF2deX;F^P%+7E zKonl55YH$Q``ac-;N-Vw7toBDp&&K|F)nqn9|E&4r*ld_+y1Qgq){^cO6;bw{gETy z@k4MaU2l=KN1fycG9me3#mabh)?0^6|B?y%%=Bcf1#jzAzXe)`M(fF!)ij*7 z$&Wv~*Ox2Pr>}plCVu_VCB)RTk)V=aPTBq5IRvo5w%%ObNI%Nngl29c?AjZy+V2W&*?ir4`ML^w zt!a`#rj5%`2}j zD?Ys2osg;GoPdUCCrS&3Od@wW?b_Xdny)pJ@vZb1YZg&0JV)sw^D2+LX>&XFLl^f) z?)Fhg4*Y*NWUE&^=htZ$AM_6&IML`C8Hj}3)oke=qQcQ0GKesF$%w5Q_>kH-7+3{t z*6wqE_xYg0ieEyyR@3@Qt0yjbpl`Rir!2^L%o&+bhmf27x32ZPF6hF#9eNTU1N(nZ zaakYqu{yLUv5L=SRbBPgxIrv=Xltm35ZzNjIVWueE`~=Zis7;q9-pKZEe0z~-8Olp zj*{Rzkj*gTTkDyU-&=|u$~n$ApAFfj=X2$^lru@s3uFEhR-_ASse-Q+jofAz_Bn1= ztvd?FDQx%W%;59M&8kqhbsGXEJZaB-LI?E%EXi60F^etWe?K_2u1v~(uX0*)+uQ^Y z|NNu*)8KYhAJ#}9>@16y3yMXyTu#B-|5I$>V)W!Os$m5uf44?{Aq1eec z1okSn89&l-Gd}PZ?;aQ}*`;A=q{TB|7{{_PdAWbXOk^DvjIT;}d%GpFUvk(w=fDh= zpuVvYPMZw6w<&vbmzpYusXsVjKDY?mc>1p=(r_6wZ6|Vvu@r_ z9glsLvq~(~eyt+(EV6tpCz@sQzGYK|_cbhP@P}PsB9oEfL7{kfED;gp}B>T{gwDt7oH-R-&F#UzObhpAx!MOat7Y zl4R~!G!z{vVz!3>73&Y9|APk|zRs(*S<*H!!JYer^x^(O0%x=|ZwPi}f=VGOi;Crg zg`l!5yJI;kDrflJD_w<&EgWgKTnJEShXCiWTWrTjcP3Zz3V3fwJy}>1)$gE~IEgNb z3L<1|P1IDe<@PrC^XD`rnZ^JuvJOSv6;nNlt{@z~Ak)r9p)escAw`=&?Vzr_qb#JO zx%tg*weiqRJv;Gsf5`(+cKt-l!YWa!!Q5*Bipv>(fodHilqKpo+rXgahmedV`z0@2 zxryPQr^NVbT~Oy{2NPvW^DbqYl5p3B;>rr+(wP12J9Ot(Qc?D$6noYA`vgUb|4&a` z7~dr?1(wBdUi}p3e|8iGo@%&X#IYnsu5r9-kkyy?(jSIoc%tjf0`2~O64`=r_7R#& z(aBn_M20n%#tTjN(#-Q=m;@21M8pv!=+(T}Wzj_L!qX}1d>XZBG(>O(+b! zWEM>nVmztUY#IpbcC8X;$$Z(e=SKSn3`eS`^dyX(+n@s)r!af!79j71#k+wtpXci!+I+VWnZ{*wi=RLmj z$15q_Zosc!2wLOU-2^(vwF8zV(RV)hF0Zb=+OeNxR=O#E9WI!-ch+yVHrlaMzN~_r z$CEm1t1%N%nX54cPtTlNlrq;!F}Q2Tm-P64B?Nx*rQN8RJI(O zDfQQn6C3-q2w00%x~-zpId~6vj%{+Cy^MV45-Cso=T%)&@=xHps^P^+AYK1TZZh#C z>!@|pkK{WJ!ppR8!G>sFb(=U2z~vTBu;(uz!n{1R>1lWu;CalM+!h@6VPF>dMXaY!59!Kb;J5t~lfMnQ2>UG(lB>Vtp&bAtAwjGzO5&w?kj0BV9Cns_O$Gc#1HGpA^pZqI%nKIChy_r+|AbKV zh+^+0sAQ7tkv(cxWur9c?w>4C^&yMb-ClZ@l&4{T>rIrkhGx8xhaYsaSPCO}U1!?j zAan0v;oDksVvEAQymlVRr+-OICR`il^{*EX)Xp=ErVs%-^o)US8d4b=cQJ>kM}(ew zyq4sknBWpAqu&CE&`c^5Bb0=sHy1 z>m6Sl?5almX$nl}neO;q9^XcB?I-q;QHRoV(c)^%C}!ksjcPMP0au}4eN~<5UVB6b z|GEM2_>s5;T+$`;I^&oi3z}Az29TvG#jrbw$_8nxkfQ#n1jxa2k@m9tGxZ6rxENsi zN)M?0z65P{ZWz)w>mREex4Z;aIAm+5r;^#ta7>Dy}PG)@o{%hz^&%6!ex0+VLGST zM2HCssGe|R**L+qm?6$^ z2n~P&Is%}>19orOaUEr}b$d+mMkAiUuB+L4Z*LqAZ61}OWFX) z(H9KYl-4LB^g5hZ)_`9g#xh-n%u+i6uCx8Qn7Ox5)a?U=2sz%quMy0{;WvdfYRB@W zF|ESzlnHR_ic)XL6#4kd#-vziINoF4j%GhTdV7`l(cbCXu7!<)77s@|4k$Zrdn_##kk6YT99Xx24UPtdtLPA4a4 zQine`1FkCrW86EJiKZTMqc#FFH*EC~yt%cx6lMr{1&qK{Dh%3Robh0*%wuU%H~iV% zuFrxSbVksQHK9u{5?^@fSgyn#J9K8(ClCVx@0iW0)3+gwgNo9&iPXs(W9@vywN-oz zUl}*Ue4bsVX#m>dhcm%2!QCNAw<&QFH~!+5h9f)CWebtdIQM7EJJVhh&WaD(JuhN0*6!19-u4uaN}?XEx|?!&~sz22&CPYF%o77n_ZAP`~U( zUxN24K*V)vJL>LA0h?kIm%U3XR|o*OMWno4+pwQ!@!7kpQF0cirm1&hgT9wjWK%rv zb$X8NC%}yn=vSyML{d7Tk9WR6gL(iWZVFKr6N7Ix6#{$n4uLA;K=^4O2oF4SUf=}S zGlh*IwblpN!1~?IItI`1r$+0WU$6yhpr zXq*Pm7itR>fzxSq;~IX0;+gz08wOs+6Vxf z%$7LM5kg~mq^8SD#R55i16@U)25~leSa{(B(Bnc5r2-j`LJ4@`sdfT2R9So2F#kHh zym-+CuV4b(P$(^|UmNB;0;7Nc8nmP4;i6hCO-WiTevUZW@t1X50F{<&Dr?~%`FWUyo4T<<~%h5#}5DrY=^}RLvgL*byMR#wS!P2Oh2dDqM*c} z(*r)B#2;A1sv!d&kpa)kv7UFaK)$%&*9l1UiEMcmd`6~14t~IC06N(A6Kx2ONFFVH?osZdzq&`iTsnw_-t@XQA+zY`g-%5J@2<^1v$v5nAHlBc~EtMdOfMM)nVO0#@SGkdh)l7x#p26z@n5*dX&(E`!){4vOEeI#wmQ7o&lX?yi!{PaiVqZOzv8>;@sbOnYsdK5Wi`uCS;OLz^IKl0# zAR^c&essOoT#_ZghsYoCk6w5g76hn2&X@9E_)^|H{j6#8;H~qJGYZh2^4TK`ut)ti zJ#&FQp!&!61e3*HOJ=Ngj;ExLdV9t_J-|I8n_eWo@4@5iQx+p1`lnL3A+~JV^0zb+ z)KsIB(Abhfe|&%@Ly?niuAWzkZh3~nQ=ujuP$jZRUA82U0WhDR3%3pUTpZ2oW}ADT zu9O~v9`(qKhMyRm$b5aE#?4x?@vZS ziS@|DGCUf;<9AZhpi5zn9`SBg;k|jqf?(fguP}D3@1L|`T!+;z{J=j?Z&d?QH4vkk z2d`=l#K`?o<-?4elhJBVnz}396nvXfKNoM|<_NaMN^blg3A~ZGa*=&0aG!|)kMx#N z)`p9eLFgoC`GG!FUTMrDS#89PA{C7hY>ja|4K56}kM7BQ9Sux2K@rQQ52$9mjrDAD zrX1d7TmntJ9TrU`;neVaaSagD5oI=%#29T;9Ja{fQh$Lq|J;@gxbSf9pfIfhkJjmg z#U*sV(k$kqnj)_-Pvll))9_+hk29W@-sVL2OrR&4rMI5g*A6}_8_~Vl=EUn}N`f{Q zxi-x-;QX~{Ua~jCjklDV{JE5u$52kTRU1=)t-iKA&Alsunk#+Dn+J(!meYIEP5}Ld z0eVp6(bd8A%@m!2r=#~Ssa(yG4JpE_D6M=DjSm;xf-hb&Th$$mr`J91zp=c z@LQ_;5rQ9$g;N*^j-$tq>d>*;z2jQXYw)fsJ|8(C%A>2IaWu_2#@!b&tCeEJN2P@e zU7-7~fYYFPcaFO)M_xDeeOD|8QY%Tr2fhl9Sy zjJ`7?-+-qlc%%ci#tP8a`*+GhE8Vk*jQ%mAhrzjjGNu1ww$)wQW2p@G<)b6bi?=~h z-_c;7?rk3tjP5UEi4785b7+v$yf=b_duyS06t>w(AB)V#w@%o-rg)YUu%(AZ%az3l ziY|aT(J?eVJtTHF#BlHABtLBBGh946gfKU_Ck8OI^~~fN@{)R|kqvU=&R?d0mPR5I&bMGLOy_5$M0`Zh?LHD>cyQv(uFtRB#+dZZaAfFzQp# zQ@1c$qwm@(IL4tpCi^@V>MWO*WuVyq>-qLqRc6ozG{8qafaivnMqDZ@*<|ZpG~LuD z>9228m~WK8fL;OHr^GR_W;Nj9J6zFYKWlWW(q{*~bMI_2ENt>bdsb?89Q+0a>pUN)2Mk?BLAS{;W`B^Kbsm+syX!<)Dt!fWaO%mscli#BeKd z!PwN$Xct<~Rl)Gr7Oc-u0xHD}-22AQRn+0=3(QqVR zKg<4wR2F%|oMw(dx{3`GS$H!Yi0}?nQZ7mT$1o3vxk*%5f9Md8CWalKzKYh*9)yAg zmWhS3vju?QqVdGye?Qr8vgVnK;pHa+4zB01Uk%iRq>_;q9GjP1%%rMZ<^FRJ{i?wN zwUhgATj_OA&R9Xyr*n1+X-Q0S;Pm61$?Njn`f#G1WwLL7YIOe;{)!#O@YpFU^jud& zZ5iya9P(AJrEwL8p?u;xqtIm1A-#Y(&$;!~DMY^ia;h*an z+3UCC>(gIV@Q2r6zt_|>H2Nm!2F~T?Hk8)vCggh574d){ZsEX#%))sPrCS4a1<=gv zX12n>mC%-1)$k3*#yZX>)=#;8-%U`_MjM79LF(4;iRDhJZF399ip-5iGn>aorGc-2 zbi4J!*9C67m8nmzcwLLbpH}Q_C-JLSNUEKZhjn0m+uN!dGOs!wCEGc8JDvnmn>fG| zC#el=x2B1?W(++=u$~b{kI?2WW!LEE3m+clJ>yS%!Z9AQpZD;J_9Q>dvIgw&t?$WP z>?)G(%CYTo{Zrm*5#14*aU9w-?({xgc=J}E-u{pybUUbw(YnUKePB2!_OE`A_=BC; z=0aH(HPCrMQStC#f6wFlA!GKUHw)D7`@o6(QGw7=c*{Z3+yP4`ox^7-C(P!mVL z8K&UPO%8fESGhIVh(gE#Q|O4Cnk$ReoL0`d6A0P#!2gRS4RYT@ww{^Grj-9xr1b6}5d5|x6qR2vgvXmMK zwapXei>=j8C$NFBdo&v4)f@fOGuV{P`6POW3Lu*8>|&udYvC%!T8U; znjkg2r2BMDWIu|bWT}DoXN}{JhQ=S-@$)r3mRP9JexL0MHp>nLz0Xb8-tPLP{Pk}i zu7Bf=;+UR1N+EB-Sz_k=0h9VW4zR3iqRyxKm}MTd`twMQ~I$8c83r&CX4no5eHi% zt0<~zEKwRL|F5x9xTj{TqVB)9#s>d6>eeUv@Mklnr@ry$I?Qp~6O>}xVwQkb1*z}} z04q-?ldDJPFQtc?OO#3B{xQPWRJK=xxheLu_~ohi)wi0dt=DJNe+ygvxcM(K<3tm& z|JHMnH~l%hr)o#io(nLMnW4-KL7^<+65%YYQ86)*QOvQi@iC!k;-MjFiSPN^q`1`l zsFZ|kXhu+0T5(=cO+p<@NqAX#W?6khPB=MBPdMujmNYVEGKR77iL4Q_#;BgY!mi%s z{=wm2lbg`#+3uCanEAZ5(CN*|?O(r_7k(b>4U`6*o{eA3{DwwRoP9khga$?8ZheUN zhJ+hb`iFz?J0zyb`rJ_8_Axq(fxk2hlg(aS@m?)#bUCc)Qo1et;Wo&rP*Ic5Qj5kG^xH$5INS~+kFQ1N= zTBNC_9y?2J^R6fM3R0G7rtDRc8-HF|oo10gYFiP|`H6q(p~0Vp8KJ|EXl>~Wo~D$P zvRf->H!qN*4LtUUHq`alASlZB+2FG&2uNACDc}GxLg7OeM2Ctak^Y{SBnXaQlwRC{ zFG~}YucA<*f)0jJA{fPjQKJ@I*HkdWSJpj*JjXJX%8?$h*~`%^jB13nv@~if1_+s` zT1QH2>YD~0uaJ8S_!Fq!Bi~%B;KK<20;}Xv$R(&634eyR_f9o-{IJ_RXRHIOYPoD`KQ@?!CGn9dDdfq(s%spW4k^5H3Jo<08?=YK7!O9in_7@ zaim)7J0PNh(PG|cf=S1K4%8(mWS4$Y31}EcFRW#s?DR8q6U1EQ_|-*Y)A!#r6@07P z6swNl{|P!dOA5pRSHoz7r#bZN6L;b$il4uGtSa;NKa6gK*0QYJGrm4-D9U_&SR2(g zx?FC5vkcoX6#34*YMSZ5y{&BZDh}iE&k+K%h?z772!k^;+2dxYZ=SFd5PIHlf;WiY zKdvWwMvlb$=5g|_&h+)?(L@1|mpyb+wCkiG^3CJu+?@4WW1@y~Q%l{w&=3$EWvCNg z8s?sHC)MFK?UW(Wh^D@i&8h2FZqN-ewFTgh<05 zbX*IVO@M`3%Uie$rA0Dpo(`_|4%aE7vt9+f*N zF<#C6c(Z^9`rYW`eW7~vbY;;S8EtA|E=jcIu_2+GXAzs2M~?VOPU?{5mlbE2?y+)Y ze3sg;_{=pu+D72?wa>4lbYcs#RM#r zhlpQ@bwbLHrT=!=lFi%9uEOwga|t>2rvyw#Fc@RV&m7{aXYFp);C5?am~9Ax0mKx5 z=C;!SgeuOv{JBgE1NAWVu|%Q#JHuPa6QB#F%9!!DRf^f*P-wP8z0i`D4(9vMzX9*fk_B?i)q`-B$$J zPc!N#pxbg~Xo#{Id9a)PL8VB0m2zRWg0XX&&jqHOViZ4PsdJi#iaESCvG;0e!m_RW zc$9k8)mr`cG%%rQh%S}>LViv=P$2&F3F%SjUMP=J_|3t<(^4NG)OY6x|{m#oiU7LeX69DEyM z?h$u=>tU{h|p;sG0)2 zTL71!h;tk*&0(iEjMq@=TcuX1_);BhD2jF2K`#Y~IP#c6=}D1uHb5ZVN%`35jzgmF z#AuanZC&#_M_6wajEm3YF4gn{+^0}M{E<8`%TZ2io|x<{QWA17q9QpUrM%qg58Q%? zJaTW|4FavS0|t~!VsQWKkSvM??Y!RPn99+etT2lCC!(-1EphfB%K%y&|E~VOp3O+6 ziiz%uJ|kgBHkiQjEn?6?*OU?jNDWa#mBq~v+WPj5G+0mE%v!ml30Y1P0&)q~9W=`L zL9cp9)73oHJA2W>Ie_vF;$oMpgDaJB+-k+$nlZQ@pfk|NDBPsz4vE@3%li`N8kJlOkRhx+KNBM?Y77U~)KW9;WDR_&aUS+bDNf05q z>W%ZGC?D|n525(7tATJ$|1~xm9^-4I^zY_2$yz>l@>x=lC=kXL0Hpq_A+dij1p{$| zhdltmm))1h|GcY1q>dtT$fibUMi3Y8`TiMEY8O*Jx$_dmIVpkY^WG3r4+B?}=VI&E zqi=5Z3G52=vn@c_DldL+z_#wn&<+fnO)BS*>4|(W%#_oRiU_~msP}+g2J7O%9Do1n~&UIfHDvwX3imD$s=RS zC+{Gj=p>}eC>L4Cms=@T+9+4ssg~HO z*7}&1_*;|*T2+3rsSdHL4RLLOy0wLSbVU2~#QFCp1P&(qwxs&Er3ZE-eHnHQ$#xIR z^Nc9)jw1{3!Z;Opj=<3ex zO`pnajWQ@(iV7>v3rn|{DX23u%g&!KT<$E~$U5CJ&%Mao`?g-Pa5TPpI(Kn#wflAZ z$MDZzi5K-y&qR|Rt8h!FOSPz3a&W5EmJW_`Vb~kKExXJu~;(F zn4uh0E%E036~Jl~3aOMZN^wVDcbY|Ly6Mad{;wUSI6fuTqiRe{g_M6D%=ckf>WM6x zSn0o#uk4Ezx!B}Rv8g8~sx&IgnLW6#DOe5PseJ2Yuvc{ztroR=9I&gk>fR2#z;GE@ zCJMf0F?@AiO}q8bK}O`=1=0aaqV8oS9#Ee&lc9eL8APx5E%R=PiwB z=7{H`NEkg^^C)^Z{3ESJ;v*mZgjs z)oCd_1HSC?IQ1Y(T6Ud}E+)NUgWN=JQP|~4mKA?lNw}SJb49vL&o(ei`kOCOe(2UT zLbhvm_j!@?n_Xp*PP?m3sz_H+HL}Rdfdp~}$4VJ`L5$ytK?NGpWhPeO)GI%ldBG*y_ff9JjKjPz>bbTBV6A=IYs_ ztILjld*qw88f}3K{2ad>%M^M2zYJBZ^a7#CELFAF6hRsO%bCNb{tg6lZ>keRfKfkr zym&@+>C*h8=)1<}zeO(0=Y&Tt?|1-z1=rzi(!4tgWU_5YHu}Cm6uQ%plI!*th)C5$R1=T+b8393lM$u89^b++0?*h{ z@Np2EQZZtq%TI|S7tzRbW|cqz6|xRMk89s>a1V^yG~M;%sZnG*;aal{?ekoBwlV75 z<1FNO{@Q!y za87Qf2;SC>-tnTOq>_8QBg-d>h$CDy7QG=s`AfL3E8bbZTrSCw@eljNLW?Qv(NVs< z-tUqCWaxxmXq3Nj9Tn~)JPiV7*n*yRb>B*wMX&>%EKsRQ5LqMn=6#clC{)S*N_PoU zb|;z|A&_j4>xx!I-)g^y?i$>kVlaKWz?1JLU(@UoUulPUL)vmSta&R5IanyLlgAOg zecDMe?}AtrB`_>x#?XIO$;gfsgUu!+5S%eI<&cLFv=5;3;dgPA#AXPhR#n-0O2Nu$ zloPU_Bq`o%@ws1;lB6wTyZf7cndf|_B zj)~dBqWX6s{SL$No?w)fxy13ArHb?S{NrL-PUuRsQq2oQ8Q@34h!>=O5fy(8I)b zE@z^HG2-R=Rqdi`C26w4BQt>O*rc84KKz4RR`i?JVNl8#kzpP|X;~HGr|8ujJjhvi z;>uzkDfp5ivKc4EoSiaA+>Yu)1C&|d9IPbxRfZ|LFDED-KWV7C4zqbRzW%{p_>>+! zJO{2g|5uIuJGPlrZX1J6%q_gA(TQ99z%1>FZ z#Q-uWKhs7T;r25RHz$~iS#155E)=wU&0P7k(KN&Dkt1LQQWw>mkv?ci9DCsB|H@z44 zpTRc8g{7BewWf10oIzs@yK!HK75XFU9^;kSUcV&zkdn8re$mm}dTSpoOUmx*{ki11 z!L`<5@TYZW-}y)GUOBrHpP(F=p~Q+L34l2fH|KYqT_AeCgtf_|)pp~%IzNE>68Ft`t2I<29n_V+mQl>6UZNwi^ z`88QObMbMhHbkd|cl9vh{h89224%7hThbX&&cPFKCdt^GG5MQeDx*oDJ4BN%!49mO9sQ?yNsVZKNr_~Mt-{iBJ+X=czuA1DoG2v3Bt9H7ri5or0ki^?}penB9)V67srCbt|1(KKUV}IHp<+1v<<$z+NQ3(u zVs7riPQusZ@WHoFV#1VlX8ARl=V#oy20IMf(KY*jHbOG5`_KL9`e*LBdh<|A`#5! zT%qz0^0Bc+t^Mt>c5mug0@TY9^}n6jw;olgc_*}ub!cJWuaN_>@mY*Lykg_1@7Qr9 z2-bj+Fh0~2xo6_^QGK#1WxlHW$Jew}8NjTkYe|4}5f6rWJ-Lg!VUZVOeMFJw&qo@i&Z++4#T zvXi}B7`)Ypp#zaZA;7WYAUIQi#C-ef`EHz&{^oRE#b${8c)=e%T?SX*I~%=EkT3H(UnpI_ zAdC8yod+y_4*3xoxO5(LSsJus<8EULXT217I2l;c87PKf>c0u3^wC=Ed^hC756yTq z`4k*5`Q(e?`h_$KR;3aTbcmSKhTK1dCMM<&?}K~zIb0M2#8QDTT^xp!jL6pk74!+o z1cyC-4ttJ-MZWXJjS{}Gk-xJJ$Xf;0hI>{P8b5w$tWQ*YmPL$hR51OQ#4eM`jgYP_6OoH>=yOE4ted!Kq$6&$Usp(1 zMxA7z)j zfu^L3rDPrR?K$2YFCk-!SR5mY57%}g9Co$JWc?ZH8x_A0m6)0y`C=78bP+;q8#XhZ z2&{%KPbE^zBp_0P?mHtzmqLi>{kSqC7wElTX*~TiO#Ci<{Se}*_>w@=h8bSCU37^W z_=K$!g!%tD)rN$lcEw~3S+XIfvYer*f7~}r#hU4+yhWu@{!ZpYh^L*5La0t6`M~LI z^%n6`0;E$ITob1tI6??8=9?j=-2lt;9m{?38B3!E-E|FQ(8%|33Wem-vMRm7u8V>BuZ|CSP6ZjA7vtGQIY-|v{ zTRDOFX9T31RN)IML`{N-G;q%D^amQJH~tuKovQUcQhpiU0}huYpc%dGkG-;2xEKbm zqZw&*II2&&u75MiU%Nb;O=I=S5VreN_Wjl8zW*% zHj6Y610Cs$>3rmuxaBkO0yMkR@Sc4cb^=~bp_TyfxrDI%F>ER)?2vgO1t5;rK1%W; zOA09}<1r{}l-1&d^+udK&|Nb7IVY7qu{oOPUJK+{3XG%=)5f%`#tNsRflJ&DtvuSLgaB(Lk!ukjg1+x7J``pEIQw{~1Ux1LTX>w*MzDN{+;6smiJviVBj} zGhcEgYX9}z+ z5YaLzII$9mD8y28D6}3khA$5-qZ)UjN;_XlSd5gmRy&xKpEt&E9tIlFOM`0 z`IuS816+@UUOr{a?ivo^esQ)=Z6=YT?u(9YW7V#L*&a*@=}v`0$|`x5p`6~(9;ho1 zauBQy4t1WpvOSjCSxKt?hQU;YvC768EO= ztF1c5Vw1VAdNh|YN*Z7tdLPI(7!l#*%Sas&ZW>9Y^I(nRGKv`$fs6zzjM4Rt2LEPY zI;b!kV~sq3{m-8hL-4Z$kh8J2`zm6L-;hi2W|S1fmeVpI9WaKw*KB1t63;m1Tsdyc z$R}>W6(9k7UF*!k?X=&@V5`_5Q#X;&(@d-|a)>oaqc{A#Q8yK6IPzt0;u22yc&1;fa-6KT+ox{Es%~1JSU8Pp5^xNT z%^29)9cP2@s;-;Oy_xRon{HBMGbWrWbF7zgpQ#I&BI%vhQk`6#m|V?(%Tj=MQ=PZu z=FCoEC_V+R+w)D;z0cP7%^cLtH3ZBI&sE3IRHr~^X8R`TM1glGi$Ch7Nd+1RP8}|K zs|h+ME?%ZQ>Sn$>PW>QWX4)bPf;}-DO)Ncxb3Py` zIGFEyKZuQ35io+Kk3Y^5uzdPD$7l@uWHg%VcR+-8+|7JEFn2)twnZHTE6?m9$H~{9 zH$095&-Fi0dYBG~*)~l5a9FerIFilX z68N?gqrFb@>hP_s`QYTt_O016=#;dVp>%DeiFo?$KED3o!2T9>rZZM?a0BYP%hH7F$#O__JS%nW4>|a$t~8E8RZ5MVsT}^ z%Vl{k6UMQ0_uJ{Wa(bXq5jlR`9mUaXIY8y=<>jbWbL|fcU$Z=$MO#hH!?3laa|7ee z7XMGs{-X0HLz_Na*549y5LmGtO!VdQH{l)iVioTG?Rrj?V?*<%OkhXC&0Ag-{k>}V z6I~qO7FjW52m4gi<(4xsu%7>3ps`tj&?ED0M{CIFRlWCi-7&fQOK3Ob3gj~ zzBm87tUH~-#^@Cl-1uk5euya<$`jh$Q#h=IgT-f8v9?@y)34ODPUuFiE_N;F@2#GV zgRaB0GU^`Cc4nVNYN4i|dcDuo;sar1zh|GU`IDZ#7oUX>p4%}w<3#>kY5XY+rDj)Y zq1!|zYnC=Feoo$h&iVD+fyt<{lJmIz--ux2-mzPH^ybMzug9Ztez`W}K+5$n zf_x{mB+1*8f`YVatEwW>pi#X*4i6KAU8PYPJhbB~sbSIONYG3PdN1Ai5+CRlr*>Ac zlBirOJx>^V-R9qTgl4pRaJ$t1rvXqP{(N^dDMb6*f%$VeDML(PF7azxf8%;2mWvXG zuluxibdN1hm67sl6<(cmzUAMePqb22`j&WMG9JBQ(73V)oN|jDo%&oK@ zxfJj|L!?q;*OHEqZh1~OYwVfH#uh^lr<8RXH_ldL$d}EirQvr>9x1o5ls~E9J2_y6 zE^}~vw`?~yn8{L7?m=Vi3*K~OV@UIF%*#|Pb*8-O0AY1(v%))pVr9);wBQxgZ@Ue& zd6n2DaV(e#g7uN9oZCtATqRstPiCF=7&>9CwpeXU-Q%#=G&M4vx^ueuuxVRZlhR)h zXUeM_mp&uLMy8t8E%(vX8jkcNEacwZKo?b4IHp6COWvhhKV+|4dnQWB%UsR;8IHwk zjQio35p(^ISkj@%*$`@R!8)akdJ3v=z_?J1+RL~n)@B3Vl+7X$K<@|fu;<7tPYG~od zD!ffzWPGM%kgRGiRE}GABL4E`FkCu+{-#KWa4nTcS@0*)!;km3xLF0Kn@HhiigMcf ze;;IZN|H~JGG<0-;o(^8=YzdQp02DdH|6w?+5LApy>^NTsvWv8(y&<(l}lxIR@>Mq zRRn!_|40i}?2yApHkh|rGqgY6qaamRC}b`jcG633C9YWFJqg2Ht`{nPZsB1?$oA1#n|QdiJ_Ve16g3QjYOtL23R1k|2{H#?u(H>$ zl&zi&nGs&3chxfNGzus_4M(y@5eLB}BN$J2ySt;#6y@U%O1jHco-7QI@a7NMto~2;~PVjw^&X-X{^f_#tG9zYsw9L&!XG;V{I*RgzMSLg#t_0z=Of zQosey37@{7_)0zrz?Pb*xy>l$v4n~R9&ro_h`;7h*Q>R}7c?7Z|L2TcV)z84S~|V812L9luZL% z3YTj0N_3gJd;%NXWfYGvQ@3Ci`^wIx|qvk5j)2sL(SV0^w|-F!m4=p1sYfAJ`CZF#j5r&(j(kJ^)O=Bwi1+CI9rw42stO<>XGobq#?F455U3SRJLfcL0vsZOz(LU>&U}c<+xg z0fcHke4#l9!2P~0?kJ!nN{9>j+rr&nT&fm;d0FS=c!PDFo;5RY4Y8BRt*kCTyz}*O zq5M`Eo!X7Gf%`BN340ASKvYfDd!GDhiJ@j@N&Fo63w|U2maet8=2bFO^U){-$tR;K z_j?^-Qm|g2!4Rx&Ih_{jf5!+q#YiGecM;%?RoAxmda#D2S>Ib^#M_TaIaJWxqdb=xR)n`eH(3+k<4R+k4rZ;70VmVF#ikOXNUO zfyxGI(D2Y$yI1&c@Hkj#oBKX`;nOMN0GYs3tnl>eW;|q(5w?(_FSK;F+~D8~tw2x| z5kIBVZiO3}E?D<2G#l3!?+&H}&-cj&AaW{4Y^wQWZGXKc*92DONYZ@9aj@X|4@cY4 zTuWo2h`sa>H=&hhH{5|n#|cZvhVsncwJF>MppIlJYOaC($j&)DF zfo(_dPKT4>rsF&nN8TrHW*97v3MXM$GpY#lg>gdz1o#i1vXQRh8x+GW<-?{zS;DS| z`8h&c*Aer{0C*lYaz~U!FA6rNbvX6;-ENW`83{K8m%E{t-v$#*4^YAYz$}4+WTONj z@k9quNp8(sY+xinZ8p=t$2&rh$Hys*KQfi@o{C5C(E$5502|K?SvRHv0m}t|^;LtH z-<0I?B0^#~fyCCrUfQN^QsbkPQYA(*JxU9rQn}TN%gL}4)&a(A#xEem0|4*wOH;6f z(?H_ONGLtvYR%&6qWm!0Q$W8_&0$hG zdx&7@3Sk$>A3nB$ttd-Fmq=z}j|{`Ao1DAnS*% zr%15ptZCvI5dE|z>(rdrVi>u>oEDGA22C2M4grg1XRF=8sV!xz0l?${c$KEKGGAbY zFYw|b>kg1@NF5uJ;TO!11+7kxutSKlK(d5Z-3E7QO=#FPS$ z{FlqZ(#`w@#Q6WJ^A_jy zf2s>Qn-Ll&3#v0cb!5;$tq9}?rNw#$zpH`VoTUxwrQIh$Dn=kpOdP#FfU!n}`Klx+ zstDJwh@hu9Xseics6>j}g)+uO5ece{WTi?706;(==MTW^0m7<+i1?$h?Lhfy9{G=Y zz&p)UE)RA5EaI# z=~GjwJ5lp`T62$WvK&>R2msKU0v!keghen&i~!{(A46s=t2Z}nu<3`U4r+5!Q{VF*o&FLQu^*(yE^ z&_%WE*9Z3Ap*EG`MsfZcx!hct-YU7?Hq~APP19ChrdF=m)-SpZ%lK^)L;!d~0DWx* zBQk*bx@8?9id{jI-=N+|q0&U5(=0YwD!9&pAH*^XvNb5SU;;>jTMawpR=48Fe5+Re zHihUmK=A?6khaCCJZ+{L$|PWJY~j^5h5%*zB?00;H^ejXGXAAT_MV2^-R{`!+#>(R z*rqO0f~X$(hGZf@szLYUOkTkCd#4>?7Zf=@+`r2w#>0rHJMmv+=PYn}tJNi@17-+- z>6-kXUNik}rxZDWksN>pf$^D!T|w#(rXSe9j{L8>cNe*z83TX`7}%?YMYrgAw{J7u zuF{O{Nz&{2bJ@TJEx1=Gd$TWm6sTd39&GgQ=}Uq=7U(#=?!U_&P;MHq*d6#0JHU9? zXR+H!pxD1r3%i93*qQCeARa)S8=xT`T)l`S0t{jXS1j4W(l%9a#lfJsCZmYD;xt`yJ)gEGX0HH7%mbDBM! zG@Yd>HsGXY+m?y58-z8q$iJP$eH@AcWxXYVoa-5eHjL)X7mmvpu3M?fN=g&m<-`2w5 zRrfD$rKHfdlPnL8q-(h99odo1Fz68W-?!Lr*ZPw`JW4BH_#1l1*p6+xm=@y&swMgv6>3)}E?kg6$kOPJ`D*ofS zBSft9FRUR-JwhQkU~h6K`BW^h>51CtJ)dRmG;gc444B^_yxK4d)C3l-BmdjD9ve4f z8L*E{j{II1t<)V`4_6TprPLXf(;iu*R6b81wRfE-L;_&Rtytm(Ek8HOy_QGY+RJ{H zwf-2#ZhuF9PFjdV1nCBh|0QU5kFVj`DeeEh@;bW{_;06$1kl0~A5FZI7-&D`A7#{E z1M>u1A+#hV)RBC%*AQQ^Ec7)j3rYgTsHQtCu^2y0WD@qqT>DB+(=%f53ZHFpF_n47dnYz6eLViuzU_6QumocIM-p z$A(ap{-Df$aGnRgnyE`JX~;Vykc(YN65hNTFa~xnxS;IHl7F9mHNX6sQ`P`E%rVYN z94O6T+?oiwObseqnY_vTd$T00x}tnJY5cwSJ5qOovbLv6|Lrv!!p$Gh$C}!0_)hUD z|Ct~_s~lW_5pB13X<0H^#wf1>NY~T6V=X>loIC)chOlsdmD`uX&??K=1;zDovv`^|&0R;}lcbLGgFAg#BB z+wW_&5we=^3G0$m8Ens$lL+NStDk+*Sk2leeSvz2Z#oeo;MQ}AtkTpn)F)0#>BxJjXnO7hruq(?4?!JDmbum*a@>MrSUohQ?s ze|TvMlhILlrT!p!{vq8DAnW>*H;7U|_Pto-Pq5bCT$ATq+&r?R=Q52M)7OllF*Z+dHXw-dU}AdNhdX zEa%MJsMq`F*?MoJI+@6q%cu4~()YpfKmrcprf&3981x4OO$^E4TtUgGV2;r4)rfdC z@=|MG>GVT%GTml-!>43&&1$S#VT*LFYi)J#VCW;GcG_a0SR@ih3>Sk?P<+nLP+Mx0 za-P7Wan7IkLa?74<8+t#udfRE3VT~^%{(_l9TuG}>IQoDI&*VeF1YKy-_JXs>DU9V z_yy(@H^jf8%-hu&K<5nR?d((@6}PM;#`@W=+jjIfSR&hvKNdKIMwQA|8wwumQDtnL zjW@(So0lXub^`@5->c6w`c2?ekbI~PAEJmv3IZx&+(Ll==HI`N&C>AfOCLU|>MWL6mOe24p@f8fI`)u(6!BVn9Vm?cR|DvXxbPHYbDr!&#o{bhbGM z>t1%HUdtVyHqIAP>e7;7551vGvjjQOY=n|(YrgorXjv+|idET+{00frtW2a|$}~0$ zmVmUlHVIi&g6yfdIPRDT96Vn)NhhFo`e+5x6-3%=Q4US%(x8lPz1E^=!(!Dn6(i6E;0$)@K46S#!YKY6nr&c`?fqFH z=+giDOhHzNS;AbIUt3oU3(is23JU|tnB+psDi7DTb(=siiy692ITkz*e|hBITE5A(}P7?UKwyUVRnAo@p*khNfh8%bt?Lo#7WAoWfb zT%~9;x)ZlfpMoBshrb|Rbj)y#aW;~aciK%8!ad2+4k$&$=$=jd70rphZO1>Jr=$<5K{1s#gywHET$qf+}^I`&k6Cw zN!dAHBg3?Pi$>wg%{k4u+yXcV6}SA|!JN@OIFz8zJtv#^m|IU)yiRnjXyn>jifyO= z&*gH#S=)icV#h*~`dZ2Dn611)kJ_r|8a$a6;crPK4c82=(%-pxC@x(?206dJh`ds& zfqB++2p=#ULfMpfoN}EokDNrq5Eee)~T`axctz- z#E-^nW(o@<#_dscoY0I{GHY-8KH{gJu?&L6{50p{MLVtV6-r_v$o}#)1GpKzH^cU3 zh|=x@JRPlp#*Qx6ZEIJ!{(VBl?=F1sd(MO!T^&+R&fW%l-`-T*Y8)+z^n9c_oiU<( zEq7SjiTYwwGP_P6oG*BCCVxKtY&;8OLp<;1di>RxXXNfeg^0Xx@76is)a&9yL%6+z zixXJY*TC$nt2pA;IE?1i5MmH>@CWvOq>Gu&$>E>ixjb()d{9%kl$<#Nk^3mY#$9v> z{0N2wUOx3%ezXYlejzD#OQ#iKf`Gw9?FMh%XX!I(@4Q9QFP?*uy}IYrlsGb$;kVgxx|?mie!_0<>2a7~ zWp~D3Xp2>z3wfhO2N>5Ca=!Ckh*+>Mp?-BQgjZS+MBZ79g)_RYG7VqPc2oyFZ)>mD ztS$A-`%Hc30xNyK`uE7V_R(lL*A&_~bs}si;>^x^s;HMxWb`IvqSsUExe8;*2prEU zX!t&JJ*(E@M)c{a@n4)(4U2)tYtC^?1j$vJyt!*FlWNvMdT(p^1-v1^TdZ|c{5oip z*$AT6#+{k&YLFbT@AbPYWJ{lmQ0438zyk59kYsCA)P8blXZL0$mFM+8RlwjD^)SnA zbuv-hj8o2lt`s(U7=ze%pc92Z3#GuJ9TO|>c#pu8nBZmZ*YGi{$#k`u^c zBeP!-X*8#eYpIjVPmuTILP0yO$?AD-=c@D{0iP0mWcHC%VGP(Rs*ka0+bj+#=6Gi< zzBBPo8!ij=FeFf~ID%eUr-nhm=YnO{Kv*Z!1pgUa?0}5{^^$M6E&d?tk4CE?LpOgx=(oF&m zLY9$Jv4cfHF~a~xQ5Z)iLbEt@|GE8df7+Ufis1ZTH;Fo8cm92|hoLLFUA9jCwp#Es zbj}ZoB=a{K8d9Khc)fxTZiQh^So{5im!Cl=b}B-=oQdAcdeY!kwad0#fi|c+wIAqP z^1f$cGKhoJ1V`QVUJLt7HuP!D^cC+#&%+*%F!G#_m(nTvNoaq9xq8VLq#Ino!#9H^ z5r>BYyx^lU54Ob#fsqYqhJ0~%=Wq+L3!n)pZT8)*#OUUcT9oD|n{;2mBcx6aMRFIl z91Z2;2%+T-Vn?uNq<1Wm3f=ikPZA~YBNPM_g&`IVlqvdhC$7LPNov?kxy~MRnc=*s zEvbF-0g5v9!G>>9ghzA+Yso?_HKZci1fs^n#Up)9qA1PiQ7wGJt+!zHvm#XReVnGK z5R#E-Q+a_yFmlhZ(XC<8smeTMpV)PLsLXHx8uW0wGO*k#9-2X9=2RN^zVSZXVPPiD zJke3M(PpymUfIu49{AB#XVK`%QNb-yBBo%z)-d9aSkn~LA{+a^`ERiDV4Ijvmh&gz zr{;s$(hjinxItkA_vjJZ&=k_hh20o}*1Bh0e^uO3vFFEz*0Qbr>T_(#0Y9(_rtSac zxh+w#$mODwU695l+?p;=Lk%k|DT_;lAmZZ$9@s?3RiN*whP-tmb7Ug9n-}eRBGO|b z@niyp3{L$hu!T3_W0USgHi20+Ipxugh8HP^4wbLmCX8Dh-Z%MoYVv$A0oKQU{psX1k?z@Ke z6Bq9Vu?z#M+_vP4hqh#P@`@S`N|grTM4F10mJ}aVS4yft6Od6gLjaNtLk{5I&JfE^ zh5aA)&Z;Sn?~T?ogS)%CyA2ZD-QC^YEi<@V@Zj$5gam?12ol@|cPH{AggN}{e1~&& z`l4%B^+i|jUAwz_z3*BNEFM8yz{vW8SiaA<vWLILYOg`FEx-DsM*e7amM2`rh(HAEUJM9V4#U=<&ZD+3q{eGkhM5fTujU0h5M0SiU*WaXF; zAR$^_mvTZyVoVZ4McT2Ni*U&vI;)lmV046XfKw#is`vc-m;Yhk7PMUD52DYj6p z6MC7;KuySV%>`MizIU-AEdGV1W>pD^zyuNZqDXGIS{)bQq>|Rjn*727*kmg#tG~B8 z^HXogu0R{Fc#{xo#XfY%Yn2V?^~*QB*f-Q&)!9pBupBjlj@`dh)EsLY-66 zv|e!XkHlp04a6?xk800fOslt%+{cJllHf2CH^!ZpBzB^pZ>FH4x@uAB(%!iwe|L*UCrfV*MJ_} zw1astt7V{&j^gdZ(*b91!MbegsA~fax3j;&?CJhP1R%W$-<iPkihC$lKA=K2FbadHFO!+Ja5fY8>C!Sxb!?8Eu)G?%K&tcxjF}DbBbk&$+42 z`)H5)>5d2JPe$lX1{qFA=zR|{p7l^)@X}oJ(f(m+d0=gQWNUk3Z-3_Kc;W1P1vQ$D zF`b7REytLyCRi>dSZ*d+|46Z2O|xH5vffUy-OX^^%yQn&iC9ashh;b(WH}!>LmS*v zTf8$n{Ia`)^7}*HzzIb|5hY*VmyKj+XE!%D4-E|!K(~rwcA*ucsWp?C4YS$J^ZD&d zg`Gc&x>rkj*US1hD+agA5)LYoj;c~lYSPZ?GA3T!6~QNK{*08tM=Rjt zRc~YXY{ScR-P;*H-wglJ319DpZ}!9gw2iyd+YZLlX~e(&Ak{4!%R(m+4kyiI zQYa7*0%4i@G0GH)>O7cFFI7*LQHp4qqdD!DG_n_*kfCNBP_+_`cy`$-IU8l6KI*ST zzr}YanpcM+sVO!ob~qkaF!l9#tai~|M;6cO@G5@N`AMy@)qA}a<>P`sVVw7%*N3pj zD$34#D)aGedwZaTb{>n{&u;cBpP)|8R`hxbuW$IBujAitOBRz0xvkZrtYv@uFV*Q? zZ~W=*HNMd93bomniG%{M$6=4a_g%3<`bTl45_CAuI~|ps@lcpMPn~_0HjI2Uoyx9C zMDYzw)579R?eY9Cq-zad>CPd>N-=Q3i6;0!2HE=kS^Z=d#8#zu5gN~yKpIUZ3f>Q4 zRxvIKL!_@WvK8Q3)0GimLS0d`t24~C_m`=rSK$15bdXFoezu*My)ji0CK}nrkRJ4> z&n8j`U+5?afm{?hoipk5$dEwB!6Dwn@X0nuA34`d+l;@!u7IVY-YCfQ>yPX_*;hj5 zT)X)nFvt#G%t@}T<`c5=`wl@kC| z!=cu3f!@?SiacBD==HQBPe26oj;2<($7t43?Q$ZZ+(=`;lu-|EEbe!+nT_e|C?8zt z@|nU@3f)W^E9rNQ|&uiUcm{lkcl{nnVwLGG4EFX-Rg zTHOXQm-nL4b#}*$<`muJta{suHl@(scE-E}!9Rfo`21?;qLS0cE;+TvE5RSS%SHU3 zL{Cnj%+yxhHISc}qwMOAZ!YgivDMH&Y&+Fy|&e0}6BoX5q>+2;A zbp3a^y0ql^&PZTi>}r|^C-|{12s>hy-OL(z zn7Tz9GRxU$E`vl^=OstrHc~xS7dB<{JP`(fcio2HjZ!|Ld|JFurTa%=0K{6)c%mGm zGhM`dMV*p@-+TB2Dc|huEGUQ%GEk&&Q-n2;jQP$j9bu6XTys(e6Fmb$>|cl?<2-^V z*%pai2z%9^LZLi^IGhNScEi_|#wfI534|F?tnB>e!!eBL=MT{|ptE>(LmzBE+%n=$ z=W)OdPg30|4D_3p16-%TH5o!nS_xL*FvUwY`(aB`3l`&@kV!#ev@@8SniRa)Pjqvy zq(I6amz`-(vTR~NzI{V^pYy$QQqOY&pee|_-o?wvmp&f^MNdt8fy#;?n2Kx&O!C*X zNQ8`(DAO|>zCLMbpJw{D`J48S7<2T^9XL?x)#R5J{f!Hbtq_GW%s^T>t=q>GA2ue8 zC9}9jC2~|!g67PbmqDC^z?ZZ-d8SR;NPb)gupHaGt|CSuQjr{T`_#C6hj)@Dfdw_4 zEW1%EhOxrPyungGeBNNd@BLlMDd~A4ZrH(s&UXDbNocL6?DJzDpt(}Q?p(TC{<6$_ zy4K*&`9h$nbR=QEw6aH83{%oWRVAa-i~CzoRbpD+m3uAb7X4zP*frNwd#z59fym3x z+iK60dUbK-<={t`7l6!ZktNtUU|8Q&LXh*Si|L>2qBp1KfmnN43w<_4@lR z{ZnLok&uEMZ*#Hx90l%lt!tQC5Y9gO6L7 znRSDFFN#fzS22aTKK5^aFTooRs#-~(LS3|di37wVBQEy_PIS&n5A6^Anm|Qpto+ao zYIl%?6%mWo;NT%&vE!b@W^Tr>@!LQh+16LSu`g>t-tUN*mZ0x+=*T4ulsrwa?VGg` z+)vZJ`M5BBQ_|5EiMzPl#?RdY!9``14lf6J9l1ijNjhb%fMS4-qd4AA!{MOCR=KfyUA7zUne|UcAOo1i?eO3pX%{;RNqIYhod`GhlL#I|4vUCYd$RJ zUODg%lERVjrJ+T~oKP_}NOr{)F`J3%{(IfUBwhI<>GEmg1b-KXpa&J%=j}roSVU(HepZk`F?;S-jyfN>uD8rUxZRr#7 z`+L(5pY&+a#=-Skb;?U}w;k*AF>S4Q2v=$%gFpHue-@cU zfC!4LS6JEvnwY#}e3Kt5+~#`*JQ}6;WMky#$>gYX1uEb1ZN+|auQum9^E{GIsD$x3y1`3oy6l$Cl}|V=eUc$FJADuRJrZ2JTB&nR{-uQ^M<mGcHI zb_xR$XMoa>MR5l|8kU_SRwpsCI89=P;GN5TwjiZ6Y0r#VQ$}^?q76&3SXOgslrE33 zWp3vI7bYEK9+JO!eV!<-v*D`EXy3JGJb1G2Q#%aY2laWvgGn`K4G_>iDg3z!Dln42 zik6by4?FELvix&Rnj403xf?Th`tB-Q1k^iH`8%)8vM9uRYa8!2zURxk8y#oUDEph= zj25ql-1p#6HMZ!o>DCBMx3H}U)Swy@HEXjEBSo_wF@_Y--_{~gFz7AeXh@^8RdzJ| z!LRg?r|~M_fPec}x_0T#GRxmf6iua1Jh*pigvqnsFL&UZfNe!4v z=PH-Ih!eF@#Ev6K)Ea6@0%Y|D(HPNM9CB?h%A*6pjsyx3m7*35!Q3N}_IyyHKLK{q z$O}52mC(og_PVuwtknN6bCFd~m|c#LyGKwLu7x~uhi z0`6S`64|lNw@z`a-f>wPc_-sN6W72n<~d3L*A!3aKG;2CMoqM;txb)+stQ z5(E3d$yUzEy?C`_#HOD`EgPqT)`89at5b_*!MxS4)nFFoyum9-cjW*{e6^W`k+ z;3N~7%?VH2NjTq!G%sNnHH{e-fWc21jmODz5NhW`T6drLBn$<^MbiUWz0Du86zK@t zkhADSvl;@Un*+1R^0IavK`a~TW&TdV%&F95+3n0uEYir3j2u~!^he_eTwWwQ0I*3B z@{iQXpx?)_-=mosh{Wni&XT26;JUHy!IFU>Cjt$;^KLAM%Ha{@+Tabz_*-VtQjL5d zlO?uB%e~FdtKW~&Y-h5+%S4{`a4&Fe&rjZVj9y3eRQu0k2N~$!@2bF-?ZQ^zdhTkB zhWgntkHtILN)##WPwZx$Prq?tn`5Bxlq)Gqp&eNsnM*;QOP(EWdS(6xF*d)n4a$U7 zytMwXn|#LiB7XcTWc;=Hs>Vg4qD50CUPRDbpVg@T^8zKfXx7kw9^Qc^!)S@SHK{Es z89jBWEAb%VKOcwBedyUrTWX5DvlwB&3iq6o1&woD{_}803-l)QOkDRtPAVC8$vq}! zC`%|7?Prv}r=-wL!d3NGJ0O&i@v2}g2dk7T)cR}$`?wX9`Sg@I7UZ^`_#6jjm#Sni z!xDf=B?w|!8FdjTNg(^-N`!bkdNLrcH1v8S!O96S_dFBNyGnV$N3S5-Q7MP&v|=9$ zx^*rJM)R?|FZw&p;7ZSAOkQCciqa}v(zsf|Y3ih1Smn@Pvq$_9L>8x^n&aJ5rBvuz z#^~e);E3(>LF2D1Ap;8j@$f51*hUWASFAk?fds&b?UsU^f_@1s#e=4qlSIyo$PbEc z`T~MUDP{4fwrudgAhN}M@`U~mDhc)1O2mgMb?z>O2Ge!;u)1Z`9I5EsuD+6H;ku24 z?08kkfiSRx*p6ODl@D2UC#0m(rAApLkF3|{*gnI}AQhuNJxfegN;IG@ldiFld~Gs6 z6^#<#ht{x%-k^p?A&N#Ii*{!-z-zOSgS?p=+#JQ~_7~OeD|r^uRMU2T!U8(tB)J{u zIO08nsthfKvuF-1*Jn2{xl6fBPpp}HA|r%3>Y|fdNry4=JT0Z5`carkFiNXJSi{jC zmps{de!m%uBUd)G=8UcV>7ou_Jc^Dv2#h^o!)drGyN1gZq<+PQI9+UU8 zGyP{gF3}3P8VmdtTY2N;HwC$L0A}}34t>@58_$*TnY1`Y15e!UNm1X+7vEQVR_cpm|*PcO7A^KT1YhC?_nqMSEyAq*(5 z9cE0ZRVkZrB-rThn#I&G6eOG)3}@~owCSCIA z6GAT&n!J)AbLyQ+5JIHu_o&Gly$a{wXuT>bluiNs;Ed z*8-6w3;cL}{9JO8$IJZ81Og9sV2+$gCZcbOdWQK3hQtejm_=dS%Y#>=bIfORyaG{6 z?(-`}lWW^5#e!U^dUG>DbNA!#XDMgC6=@txw2h*ueyp;*3{Y+CX5oN<-Q*FZ<(V~qm4+u_Y_6! zPAZC)r@$^iHCG1nWi>B*Jv1WB?RwDTn`F`T;K;1x`q+lc&~WeX)yCA-YAX5lr}@)K z6l4Fnt-1FK&71K<8=r>O+WxJ6R$IOek0QnTq;NfmJGD8qv+4b5qc>i zRpU{Qqmv&Jw=ECP-fY>~F8a5Tvb|aVZhN|U`yzFB{(7q!YltiZD8ak;SPUG&8XD&K z&Y>aWtKF9n-W!Jj8@}8e(OA9L*!yV#i^Uk)!;+Vb*){*S4%*!%d<{gk-1~(Usr$N~CkFG|?bUP4^ZX=SND%BJ8O=Ri z>N7C*aVb0^EJ?&l?q=y}`xJb48mD<;pSCXnIMegoi=W>R zzKbDomfwQ#uI2or$DU94p-lHN=G7oN&tWUl?g-Un>(15VyL+PdhZsfsJ}=k9*K%lZ zep>k6UDLn2)}gDI$g`Z51M<&)2KJw?B7ug8kLypS-qa7X&1c)@5BNA|gnNfn*D8V( z@`qHrv0H-%G*6}2p{N==Ul>u8BMtSuBn@ybjHFhJntwWc-=5x4VdzuQ|MDyJdOY%V z*DL7G(`o%js=`Uw;)$P_W|_tTh14k5Z@=`Phs{3&nB7o=hJvCG z_cQ%=yZ%1ndYI$iUh$scYv5I-rOJ=*rI3&GxxC;v0O|1`C&v zb-k@kDZK=&;kjL=JyJeOLCg*-GhX}}n@r5*-lXhv7>gk$ABE^57dMS2OuXyuTuCQS z!N<0}KzeVZgaP)8+;)bRA;)IM1q4D#fQd_>maR zqR=24Ka)?Z4~v1aOiMbLj2z1~@VAD33thIIOw+6Y?~giZ;nF&cXAz+umFbkT(-`8S z_Fl{tnzHP!D3eqU$8p$kyRR2S!P;5uB(F9IcnqggJOBp#`YMYe>h?6T1e1Yq^Z69A z_uLc%?B`3OTEERXd7suh^7*tZ`U=W#I)^4-14+%nmMj||1vl)pwMrzUK^VewF+Erb zm{x(r_z`W+Pb<--HI3cVi?<>9tawTE-|+y`;3!P~8{Ruqrllph#ErtXYub1D-m=)} z|79?UZ{asc3wNhPMWa!Au47Bx{kpvU0zl!s8%ESHZ5u(s$JvDhBH1Wi?Fhd%NuKM}69l=!i?kahuX zfQ}-G(2A12!uAca)-<`Q`hqbb+z7#=uiq4PDOdDshEAwH! zOnQ4>qsRW+@2@fQ6QN$L>xt1Ms=-1=(}fUqG*#?Q^*h0L2m6WtntvZC!;yOJJ<=Q3 z?IpTb3e=f~xi0r*2DccnMRy$%6Ty;AGmO4YpVv+#e3*TmJi@Tyen*}g1FqsbxrWA$ zMJ7FDW`(siQTKb~z~CiQ>oIkF#_tz;`sG%vX5YCrL>_EgAC(`!}1{&+#q zC1heNQ?Ou{Ud_t;OUN%B!@TYHr=Ah-!ta_zeiIs->i#2p7}pQ>XjbG;ojQLgW5;U= zQX6>mdc*ha##KFODX?V;eyvW2zYElK>Lo;)L!+tdFSnL@i9yxOhzvbrIHT0scvwK- z>tLq}Zz}pg;t{f$Xl`zHR$nR!x-8X9ep-?X<9V@n2u*T1ZPl{+chQ=+AJILABU-DM z+df8*+qg|DWe+a8teBMg_1|qo^a$nbf*js%W;OI&U<6@f4gR@-2uVWWT;sd3Fc=+u zBI?6*S$@muFoC~!1g*q=d&c3{VKTM&YBM_I^W(2^K6lW6VTIUw#y!9pFJ4YJR0V7h z3a=1m9DlYYVsf4MQ4x}%T)~uP;RlI+pw}D6La*}%@V57{UB%^-^Im=^w1(pe+E6YJ z&G+_-UGTo&fB2yNlCL1*yU5{#IZLU+tT?`pnclW+clGQn-~MuEj8~vbNeY?}qt6OR z##{?q=qOD87Q@7znW)XKKwQklZ3a}u@0?%-GGwA9n;l^{zr(?x|5VoocwE*yf53iMbIWa!ES;& zGW9iClred~6Da0oTS-@#u0@T=(uiIRt#+5Q}+zTUxa zP_N+qzxJ9*BLUK!`kis zpP%dWe0Vhe9^7&nfpR_CK$PJ}3}(Ma6yd+@J{Y~&eG1KYG_u>qR;W2dJJoiarO%)u zA#r%upFfi?$D%Z%a^hPp*fSw|?3VPEe0`W1Qa!i{YtR)V-NG!&zh}()cV&(IvN09u zxnJ-lXjCXn<$D}9X+>tvfOuXbEC0Bk325|Gu(6+0&G;)pi8KOh%m4tH6#ztqxoFmg zBG*$(H==mEY9Ta~^-#{FKH6uq2Cy-QKpx$qp1>`!tg;<0NvI$-cmtH%&C>9{ithn0ak)v)LwWS;Rr)zl6fvrAV3>I6EHEFhAt-o>IJqQMc*j8_w z3Scf;%Yc;@&wz$YkE`s&>io8bX&Z-)aeXeelUy+XGgD3|w)kZo4j-KrqBqDoMB}DzD@n?% zw4MEYC{r)nTx{t_prl2fiywLT7$l9*WD%Txj(-1j3Hwm5yFnAL(>4Mw3M;kD9I?ZE z8p9t-Cp^fBuAVqTBn6O|!rvjZ;8Bih|*(?sJdj;9-FBvcLRoM2+ft^9d^K^ zFfcn9z{3l{XA~D^1>h?89Yss>umZTJ#IUabSIYy*%iW3jxZv^x6hbtbAHXcsM4Bg= z2f5TDRH;weIET1Y-^fyz)<2gR4<~Y^g-Au$Ju{K@vcj8RLOF8 zNhB`FKL9zmZ0Z4Bm>6yHLh5of*<;jAI45m1nwZ&r7pW!;fDZ8yVO|KrpD1E5L>LT_ z6zn4r93(9QzJXM6z=LFW16;V0o^un}XAmPf@!);bA@Hbb_%OyoLJBNN20e2pgOXW2 znNY0jxB$}>F;T~S{M)kZJOTn=pVUXQulF)&O5$muh~uVR@|4O-KdhB!aItfTF}vGn zn4-wL7INSq>u7w=5gynm0xl2_3~;&vB20;alz}+G-Po|9y;;RbHE0ea#ElUExr9)@k8XehUJZsqWvKBt zc=r?f+7Ia5wtDX$tnY*a3+|dZtlum;%6rYF64w(0eWLK(qj~;-G7(j9X=P?8!4L%S z2Ysj;r;1*qr0%F(%wNqfDN(G!-;`s%Tk@rzIHRVt59QZs_TZtWAY^(R6yt6rMA50K z`hWW~h6=xw_&(Ub`J}{`&@*qR?Y_mFq9-+H{3W4p{)$&SOIrIGQ8lgaI~FwWdR>eE zN-OLG7G^icgc)I4u*RP!xi53G!~o#0@Xy)|fC)+nwlZ*cOOabU8aUjW!YT7kaKzqy zf;AtZI9y|hRxN8mG`9@>i{96?=^DR~hR!jU@`MKh0HpIx^3BwqHl$r!f<2< zNRDn@hbx20%aYDUa_oz?S&FV|)lxk!X{<4}{-UmN;xacCRuS)Ptl&Ir9Z1nZ@rDpc zjH`0<5@k0wkcTOrw>=RV*4<e(iXd22iuz|>hvDQuBgufoeP`@0 zd(7F)itnoQi+9sC68hm?27*Xa&mU)`#XGWq+#vBZhz!oM_2_DqQC6Q3{LT#{;vH3_ zPyxjN9n@RwN&=8754Jy=w-~2c(ND<-@~OGwRl0!KlBz%V+tcP<&1Ap_^$L zo91JBl~g)a7WAh!n`0xbc$Zkx(7Y&yL1NwwNBfCS`WuXWCiz$ZK!!=dyEW3bjZauc ze#atuozv71t?^i`!=^DlBw0ltieBrKYx)nU>nsGY&9f06;^>?X@5GWe1=?^31}$j$ zoy89-&8;(e{WuCH~Tekh$WdU^-hNoD)IMA#^Q@8s`1H^b|MzX#;jJ16^WLcC7gduz;KLbWxYLDkcv1;!j zR&Qb?7+u4#3P6B8S*=RrisK@vJ^M(Wad z^TE(M={2wD>Uth?pe^eziTJeERTW4P$(EexfS$Pz&JYL6wcog{-X}}5`GRFcId4XF zvQN)_c-Fi~R})2!4Y^i`V$9#j9p4ziG8(@!Y?~E3V;H<}(9d2`lc)j-3wO&?1N@MT zfT#e*Guz0lIv&LgU$P%>2$S&@j6=@+b&fn@1Y9j{Htp8~K?Vo3L^Dam17%OBN{cJK$) zN$Ph(deMU*z+BX0RLlpk+E2$3A|vlq6UHfE$UG2NGKvqJ6+hEu+sTyjSCpbZ0|O5) zt%HC84;Pro%8>6A+OrqN&5f4ZwFYxyCOw503hw!7IwfN)?YTL55Cej19NmzQ$f%Ff zPENdkp1=@JWt${@g`Eh-&R8HOuEGd_VF=aP)|>a;o65XIV=f0t{OV9pfpN*eubU86 zTx(ex$ZPZw3!=dc#78}e&^-$gj!IxBaGvQJI>fI9`qs)8oQS1mJdDwP=L2@<_QY}+D%N06+zi) z?5jO%pf~GoErB*W_k=H;IjwH@*EP@W16TYpuazsC)Ed2%Z)V!VDKUV(_u;yDgB-_~ za?OYO_q_nXmktNQEaf|#^C+S9#1aH7!dk;`d&C+(FZ^|Xi44JAzo!hkxMqG(E`9Pg z@UOk``|`~NJ7WVY|8V%9?OvM4ex#p((;cVN0e4TpUxzy*lAA8eGn4eETmygIH9vN# z0DR?uRmTABNfR9>54A~v`j;Dx(=CI&BL$oQ8x%*|FD6X!J`7S1oW@=sCpc|(Dq?T_+YG-hL<~95(a66jmDwWxC%2I^20Yhi;AaHhBah*8OzCNP z>xH@3pN}-|#b0bn^88Ep{%Z^hDL{hc=Y ziyh$?aHCdy2{)wh$n`S82e0-2-jd4Qz)f&vZ@mQ?n>g|ScW-Y>bnaTX!+R8gobMev z=eO%fj#r(%Z?rng3wzJMyj*;FW#)bbfFq>?T}iE84c%T(X*_n`U;PQ{-s6G7(xLl# zCQm2{xQw7aR9fj|01zP;Q@PXOjn$3N_f{9<`vxG#T&CsB#NC$xI-}B~c{5|Yfqf7K>hs`+xi=bA>nz7h@aV!zrnLOuAjlfXazDDk*&Gb6GCc z9G*S+Ot`Ey07ztkPH1d544^&u(_V#NzNonyWli*Xp$* zFKoWJk+dVtMoMS>Pd6rU-7bQl{CS2OGxMLcs?KOeLgd9_$Az2T(M_iLz)MMKIhZ zmc+J>E}puOkp80~Jt`6r)-M=Bae$%EX^cKh5g|F^Bxej?$JLp>JU)Qb86Sc1$SJw_ z-AIg=sv;j-^#^p4TqD?Z!iruoeK$j$xdjPZP)=ben@#~W^emK*(3KuPKCrG1kg^0j z`{-jS>{RT(YobsR#{bOH82!dbB%GGjK`8Q}zPkc`QQaDaYH9ykmsR5&G4NfCC|t>~ z=HuJ;<^_=y)t`&`F!~f^1?2X^JPULBjtav(Q_l?tZj!GDwwf~@;u;Zkj@Sp?JCUU+ zn!AE@!(iR`F5>My0_CXI03BJn+86`Mg$W>+bXe_ITits^N2Dgmb*05(BRmF6&OzbF zETUW}g16`)2W7Qbo!ep7p%}E&Sa|S7Z%%!Vv$Ia*)SNr@KgIpWdTA6E!9{DTYrQ2k zjvapj@Ydjc3)Oqdhbe<>%>8M$R?bBzX$PvaTqa%_?hJD9eN(GX=px7w`RqCNtKIXE zEU@>T>64b+$Ot0kqz(D1w~wGr|GLC2M?8Tan2+JRknd#wu?oq`(_!XqF8gubV2S9! z$Dr4c`U(uCP=Xo(Y{QGJPRq8-e1xElU6iM05m*71WnWA@izdVl@o4M-N?flkGE+bX z=)j?tngwA*P1Z*^;tQij0;gY@R|ABH=O}!RaxvHl1U7kGs>K$t;h{giZqNv)tdkJ` z9&Zvk6eCGX@RNES=YIe9k|yXizVqis3M*pF9x(dD@bf!f?=69n-`D`j`;fNq0e--9 zmO;U{DyYCBgEYE6;2oF@hJn(y-zm)u8m1}>5qYt}#sNg#kx9!6(h~)pw6#*uW%?B^ z=cP)lNe3WJCMs>4cxNlua~#Yj=`OEb)dV-N|H4W9x>!-2zdjBdn~noZY++-Fl+%31 zvzOamiFv9KnL)fsqm9WWA*^}F6T>606HSaQ6DXJI(~7QLl>NP~XN+Q}6?&FLdriI3 zS?}WeA#3{pkAtmS?V0C8af&?)-Sjk{ZdTw3u!=U(XbL6v%?0@V8N>h&o~7k}aNill z+y{|OQIi4?X;~>8W9mf?sowheU>|Xom||UY{R$hmZOL5_2bg4d!I3=Z^Fr@FAoWumn7gInIa_q7CvY9Hprl%ycqMDgmAF8Z>z*N>u z*m9z>s|A@{ghrPQcu)D?@i$j%7!SG|@O0@?3-&eiV`ri7q?-*|p_=b6|NQiyq zn5Y)4mc17UHHuH+&+ZFoJP6Ii31yYv3kh*%#B|xtAceFmj4NX^ntCR=x|t4__8e~C zG9~#tZI5Z3zMz{-N9lKch_yu>@h?b;V{1nbBetWWXs%!<0xAV?f+D-$eT7;h6`n@{ z2g*K)N6f{EZy%FL6C*Lr%b=HbyNjOl?y%lT7v|_zP}bDQ)a@q^octgOXx>`7^6VWf z`sYdbwNWbU9ar)ek<-9Z*v_J<;h?JjtvVaib`C}xN|YyyuS$Hw{rY1r!Pgx zD}^oOUxJ|mD?U{LX`ylUp0UGT4uZnZ(wB*try*d2Scy|-v=5mb8 zjXC=#*pDO+jR^g=GwF8cdo}AW0{=!VJIUdmRt4(Zx3h#-C*7odW*kb3x0$xCr0xk;8cKgZoimH3FV5#Z&F}2xcN~ z{H>A!Pk}*C2RmgUo#I-%*vm!Kab^B{NjrjdKrCrVzW$wyW2V|DM}|nZAiO~6f8v9RZRr|K@+S zJFDKg{_fw!u?qA&7ne|Oq}}DY`3O&>i3AgHelkka{;$gq>(RS+<7B+B^E>?AQ>E1G zv58Y)TNQP6qteSc>vyiD(YdEir3ix0^$k_HR>-BYVTMuoqQCFW(PkzCs@hN~XUCx; z{d+^Y*|y=KBbNUSdA&ZeOkLjV?mf%CH~OXU{^f?l=D%-2k$=mrte8d1UsNa}pL^jg zbRnhxN#K0(x}w(8kM}v-dUY80XM|-mm7a~He37wOAi^aeg_+=%jib?mbmNh^73yeX zeV*d}Oz$+S&?4E!B9X&Bu|h$bC@B0e6v;AFY$UXS6tqYbbnIz#Zra~Mw5Y-|-|W$k zVq#$h3d5Kw#uA!?MKnh4<2a`9$-{+|9Xz^QD!P9!mNmTlf05`29})<^mgvy#pIgwG z*zXg}s1sI<6HZtW2$mQr)230vbjtvK{^(TLu)p?}HH5Ui&Zg0rZTDwseLEItv(8;hG!36ucK@ zD(pF=I9q}W*dQk*TS*#QMMZ7h0Ty*B(`zy-2n9Qv{u3C93%`OZj+*;5h9ho<^;ZSw z>j4`!z2TAVSD*2DL3(8L5|Xd`e_c`q`4|5)VMy1v6DI#AT&OP+%5Yn50k$l~SGOB) zuMllG82`Eb%(;6vR4J+oFP8Ak5F4m`Css1JU}`*fc(iCOWy&C#mL$nu&JfCgL9Vhl zG<9l&j@1Fft|{~PR>i}%=1V%veCrSYjG^$k0$Z2S)ZU)b^XS~)em}=fIci4P);?I! zUa;Y4ubmNPz#gNp1A*?`b|z>RrqmTGHycmVtyzeT>WGPi%qcme{%WTqm?< z4X~h3)qI;}<_!*dRTUNw=4L0yN}DjBr)tnrH7|0_AZCrv8B^w+Logv7*`1y7jg8Sw zg2{_RusgGps;$FU_`ZW86OAjgdK{B_REZ!wlkX(x5nQ&-E{ z09hwH*HfX$87>gLM5uy~BeNjA6>Cd{b4iuAqiSgGNobmrVK$531WTwSL&QzBa}P@- zb8Tecc(^d#N$jB%$U&?D9haRoiufd&-+7tsC|b;!ShY@0*ICT;Ov`x|I#z`4qNqSQ z)niYWA#)M~GKt2wm@hj^DyfV6Rg~Ofku2-{HcmV^izy-88n5dcX8j(LI2p3@rz|5u za%AWXa}g0vWnV#?BJ2Ptz&jJ%ZuxH_>sOta7+cDPX7zG3@nG^5qg#XA)*%pEPcCZkX^3(i$@t&UP_U29+fj2fn`;OO( z%TF@g(oKxYBsNy;hBQKUGP;Y@CaOx?g~}84D(-rsNF*cEi}GC83fGHc?~6cb_Ogd9 z{I8{H+1hv^i9qlCKjxW8|MKB3)J;2pmh$ZH3HT&GE3gPD)sJ0)LOcD#>#Z$%ZRCwA zNHkv3mwP`IJH(DUur)dZmpgqe$M871JBqs>;yQj^w7M4Z?A z{t`O9;K7TLL~MOzk;T42niY{HrclI8%sfe~ejU!KQjRZNuQPpfI89zM$!y|MusroT zF zQVni5H^~(5E}`y49i$fOupfIYmZN`)bKRlm-W3B9=_8XY)W6*td zsJ9I4$Dxxp17UHPpw`dpq=**htip*y>I;bv$w+)WSvopDq+93L3r|<Dr^9$k&R-f`VnWV)Bo@(z(%rClXH7H}@ATz7=XK{vXylL( z?Qmi9@QTOvXDhw~F%eQ*6|p6d#`|!r^7VnIynqA|;jUbh7r0gmth~Nu<0as28!13X zf!}@(MvkkJmY;)IC?l>JTdlCGB(+~j>|FlamJUK>3?y}YRDogTsbaS-VcWs+Q~tG` zX+wT6&yDDFxSa*01DKmd(NSIyZQ=wuQCKhqEdEzST#(B(V?3tG2$mzHH_E)ph)= zr)C@&ha9)goI&^%;iwByl%ennku(PIP;OKA z4f8{dz^b2kFM*`gN6GJgQWQs02saKRexeLOIT~cS$~YNR>1_3`aYpnwT{J1dNv`0h|=$<&@g z+oo1+}w*Za1 zYXePiXq-Uf?(VL^C4qzxAj#W{_3eGQtM=JCS)=9;nB!o~S#^)+y02&^`DkpXq#Eq= z0J39A+97X{$Op+dTV7>r%(Fja(8bF#kMg~b=$&-_!d`kYULJJb6Up8`AJLYnJ%GQd zlz#i_brMho*sydG?#8$sj=7E80jN||VM;;JI8^Ltr^RTJ)tC@$z&|ww^UxVY7vl%t zX)<56K=lrSS^lSllTWmk5%0z#@B#uQP@;I@pL*0Oe)>3IiAIvbqmf(5IFK}>m9%!p z!s|s8%0ZEqk!lf>Rtkc0g3)ppzszQ32siiqgi$EM1DLb|d=vr*{OuSR>^o23o_Gvt z=bI5}aaetzu9T$ebkmqrN-?kBqHmGA#;9eTB1Ro&g`8$V8g$VlAQ^Qy0N@&d3Vn+T z7$moh%%AZCj79)F0ccFod?w|35P=unU45pO78vIvWIV1>{)D6gG{jMGqF_ zb;*(`6z@=Hhgi$LuPP;l+nU6b?TERFe{Dcc{&*o?^}G9UO}x39Aq|Al@~5jTOFU#Y z2*MgIo3A4C|D_z)(*MNH{)L;ni=V$w*BGpC9%pQwWNx2k>6l^doMrEx=jd6W?*KJ+ zsWA7bvG#%42Q)hdwK|8iyMKZU2@Q#ejEISiNl8ta3r$;#&D%>YJIk)SD{gx#?|Q55 zf70Lf*E|l;Iu3k)5~6$dN&m{n2N4i}2nj)a`h)-*@5h-RgN?t%ng2+#K1;K|%5c2N za{iWJ`H*D&m}dWy=l&z#<7bBB-+Yfh1)dKOpWhH41T^3eGyqW%f~fg~@QCm7jO_MF z?h8mC3dtV(ls^?&I0J^v#X*-6KCi^rE+;pvr?+fpf7y?WM1aAFxHv>Y0-`Pw0RtnN z;}ES0h^~CZYZF0!*KuLb38e4rwU6MnjNt#NA((?9mYNYOt^d1*V80Im9lH8Fa#K6~ zvtj;s%krNu>xiyxM9(gwZyzx}K7KreI2%J;O(CwQ5jQi4Z*z$6^N1fyh@Z=dhZV%1 zZ3JQ;F?5U=IYFGCpCgVDuj}<5=XL#$a@;-I-NPd`F3!u$%+xC}Cez)`IM*$|ps*m< zxTrKb3LF!ckoa0~SeX@_lUG_=++0`|m06jXl#-SK%WiFZ9aa2N9u4oR>8*z~mJC6P zvg%Efyf*4)-NDdoxBZ;MB5Uj6y^47EHIL1WuFT!#{X^s9!jrQf7tz@<)-$KPk|sn%;?8z2F`4^wN{stQqchkv%Z1<0?+RxUt_Vw% zVBm<=D)+^Bz+JglZL;~Gg^1zQw#;%?maY%-4a~MAX4`%4+a1RskvIDq))(6-oFoi~ z{f=v`gj`xzRU>G`jJA-e`;)dRraV7&vX=hnw%iU5K~Da5P5lqKSt@vi&T25LuJB^^ zj+GT6w>JNxKP&G0ZlNCYCPkZfYv2@qVanQFP)l1jc zb=3NAzYl+knUD_G|2kxbQFg!+zD%NxXc5qr>pDFj5C1{-R4Rz{VnD00PZkeVzyz`p zDc}jjB}6yhDVKgCc^Os|%G5ryFmU_znaBjyJCeaMGZ|gm67zHXT5?DB=5Z23=HzEy zvDO*}gYtw)Moxh%^a@0ZJnB@QlF7pxMI!3KyJ1RcTZ~G6sdhUoQlnJ1uk_M^wK)aX zmY3jsfwHd2Y_q^6MPuW{;oO4Pa;+)`yY1SHBHKnW>!Qyp2YmMzSE-- zA=J6`*`dsXhJ&>@X?rTKJUBIhxg@XOlZ{kQjUELXHcY2TBn`K8X4F%DaPylUY}%8+bHUFWtPNLi%NYJHD}(@DFG6r}@?TmI?a;7~@Rc z6<7Q6av=w#>!sPnc-x)QHE)E&nXBcPL(jc!VYraz%k^<0cdw=Ub!9VbxXuNQ*YH^` zmltk%+Nu+{=!t01srj7ROa8A5zphrCbD~Rk(yEo}HNi!nzLjG@W9;bXV4cx(hOIZz z1wqg!I}$a1OtFzBan2m~-wS-HQ{r#y7WSDX?vpUM{@KP{3i+|P@p33ItICVxxgr{X z?N?tHe26rH(?jP~53AdjMWd>@l_R=Se*MYv6Cj?1io0QxF>-(W6|6Yq5*m zwEqJ4QZ@TKue=9kkn8P>+?aPp2L^}ksoD>tei+dZvz`Tq$SNQDez5pQYJuJu_PCDL zAMn6t(;tYS67Vid6<3zR4S!fM@sN7laXI++zz9Bwd5X!hNO}HSjTrxV?Na&&l-CEG zZVKM7r#<_ICIP+VQU;()A^rC)U`W1b`}i>`e##A*ZdV3NX)}sO;Tk{Y4c%YV z$>D1+k8s@H@%&x>in0@im{k)iEVLSV(DH)qX8zGTkYGF|P&0;i_vlaNWrH z279vqC>6^RGAtNrH?>;ww2RK28{djdo^6~^2_rG)kK9@FL?5WtJ$Rnb=s!AH2GSG^ zm9fETp=J0uakrO;XY$vli+FU2<9S)r+9{gIDkb2{eOv^rl*;Bp)KB3u{cf^c=;>lo zI9LYZPPHk+X0`}EO}NWuWU|>cZLZ2mNRD%LEx*~OpHdaSrdDYw=ZAdY?frF|^DU{8 zOG0@@bbA>Ko}4M*MaZafOOUT_%LsHxNHHG%mYXqoDq!#dT}A3RFBn`Yc;wg;PtNP! zuf~jFg0FVM3^NM1`HUCYk)$V+L46}y2%#fTOePy6lEE$}J=s#I&%rJIc33UlGq@1< z^oAf2z2*RQd-&bD55eybY>bZy3luDbpV>kSWH6kUy#4P252J=i)2fBZd;v*~x@)A4 zP=(*mx3+?-H5}r<1zaoM^yWI8IV-Q(OkeId_aJ!t)51wd77aHXX;QD4}R3EF2_OOYgK zO6*f_yifA2lNZZfnZSx+Vb@yIao1!`Bi3Xue5gwX+{iH~Xm;mz-RMTVE19VAqEr#^EtLIM|( zhShTH^^u7qqDSP=Rue8wtbZp*#tpr@_AikM5!|i^bG-hf+oE?NF@Tg0gKW28lb%bR}M(1P2 zCV<>?#OK=)<$>KsYx96pA}Z}yx7T?U)FDpYtd#(B@X0eKJzkIYDQ*0SXfQ$P7T=60 z@oSN=bvav%kUs1<|oJ;HyEgfN zvHE6|)ymLTL7@CK@k*fBN^HAsv1Wa-saeg=-IT-m38yr+?ctDWEBc8*z?{eeCF_L0@ zTR4j^1wDhwhP7iTOv7+j*yET_8e?!SHhwxP*6*I^bF&Y&yXo8=Cif_Odk*ftGW$;k zhwJ+-b`2d$DUU{H?`X~$JJ9kh(R@H~ojbB8>h>f*^mM=tg(H#aoL z0Og}hPy|b)fNbQBWu(a=a+8oR$T8wqOa$hp_2EVY*Shy)n~c;$LpJXaE2h{*k5_OpF3W>d1@%taCv1s^zoMV`X&4ap8OZ&+=^vmX$A0%@s;%9T0bkTIXhx7H)DjK!tgGF^$cV5 zMPoQ3;+sB3>+_*`;wStRarmh1_i-ciz7pxRVl?z3*!nCXmd%1(+oB`SDL*&D96gry z&@G7{ADMuu>B#%5CqCPKq_1!gTr}>H)p7SeahwjD4>hq&G?BwUgxf!{AUDzc5vh7J zj?UNOi8-d^wK|W*f*p$Dm!2{#9Oq-`N2ZOUAA!WBga`~Hvsi;Wox$z6tB_(??F(5F zC-SY0HtpD7RV>0m)_0DaWkDnOSR_^$QnIf58DzzSNd>aFhv=yu`DyG&q4Uku#&-#^ zlXf@x*8KTkQ~MA@bo-enJF{4%2e|bZTk<7a#?^)OrXiZNeHyzb_`nba_bJS{#!1XD zlh5A0W5PP0CG#s;T7hE*sZ*LhejH$RQ^p^?of_>@s6QG*Rl=?#?e)1|!nEDuzcjUbrUaV>Phjcb3eh(`U9ko~rD- z3@XdVObbVFyFtq3lidxv`yH7*#->wjLavMxBGrzBk}f`{3r;n7M^vN}m9FYKbA&x4 zRd=49ueOsg7Cdl(U!kP8+|#INy-s|6Yl7J*|i zKIbEm$ppD=MI7WJlUyc{dqO6=oL2Hf&XiJ$&kC)|fF6$7Pv}lx@3KRtD6i}=z&Kg1-}#1V?i4T!q2Wsq|g5*kdT<6sbFdXlYwp;)UV9g8Gw%OEq` zcKg0nUQb@xC{hVzvk5^rk)ueAnW!+$kI)VVDpQ!iPLRDA<=E)nT!^Mv<~o`Cg9TOc zSHvnC$Ks!vgPq%0CbX&kyNJauDE1MiZjV%E5LP_1K`%_S)H{|HP>d5Lgwvhauiem((utjG@9@KXVJDfs1<$&;r<e#XRej_L9= z>-)$vU!8IJ2ry9#*d3`x0i6(55@2=hY*V(c+Nf64zV{jC7nxl4@ym&l^(TrRKZP5- zg;x_TX2gro5Nn=4~ zJ%FCqgPCY0rqN3gS_WB~eygu&tc*A2CRC~FR|{=f?ZRU8YuP+(x~{~rg}z;ldX#Sf z8F~0C5(<_c>sT}8Ve?8*KEasuUfXB$jWVNLgsoutgHvK0ZwQ!dqf9LneK7K*Slc>yTT2^^N~H>s zm=~eHgv#_dIy_dw@01Y8I+S0A-UdGr%bCvqRlfw+<>~@pw=5k1_rX;C#Arq{UG-P<2 z7lKoeQ%cF-T?7-f&kA=8{8QU4amQ(O+?^7Evv7=L-_tdN^{(?8xhv^yuS>*_ zUp>Zmz`w&>?LBa{4PS6ufONVd-U_p`51*80-+vQo8zHsEi`?DI=uHeLl*D>4xt_pI z_zzD1I^6->ubj^kynnA1rSAq{M1z~0oYWr%sWk+2@A|*|>DT2Oz;hiSglJg_R($rA z6d>U?g$}X*Kv%IraBf&?EHDh)Yz#gm4L_-?5#2=nXQJlz)}L;XBcqd}LC)W9g`U^|WAXwLR{3B$*U{{t}kQqmBR4riC zYb-#WYFHDZXeU`Ck0wW1q3_}+#|dW%NH=H~_<%e%W(gU!a-FbAp3v498xR<)_%LSs z)m^&>zOf-(#VYAKGVW^1GRY`n&csPL(yx0bOoh+i=&fmfh@`tXh6S18Czc%hI`x}! zx`A1w&ULy5Hr+}!tdlfVU@8o`8FiIp=6X^L+Z}GT7UW&zHSYTE!b-Tii^M!#9D9X3t!wryBM{%p8d}~-fY7k$HQU}4WcP^-Nr#<2GFcawqjhXM^usVvS#ttM7Og z*>HgJ(i@7YTPj*749zEt|4u(NkG#wdN}HcLhMgMm?B?}ulZI~|&z)GxAX{3ZRokPj zmoEl=+envM734WlQ$ERaJuz!MEeMnKcIB)M5FXZBXVh3vk~k#OLhfrgqIBE157`-N z-%Gx3OXS(%MOl}n9^lm9FwSbKMZ zG8v||;x4>~d%Ph%Pt|aHI=`yACtKbryW0Ql<)-hyf9v1CN{I z;_u6(w2K*1U%&CdaPhY2dGFCe)=wH2bKN@L)2%^vM-8)^dEcO5zw0RbZ;|(tEI(q? z%kEygUf2~|WTd+-`MQ)l1mAQLFwXD~sa<%Br`n=J!QJ=&20nFN@-h^?&ZJ z<@!@A6AtAM5?BxFhzIMYjS8Gip>L~B*P!7M#iLnW8YrfjhvYADn1kN74gzs!_x_g- z<-FDCkn!rB3|=?o!?--o)njlIo79eqoACHgP6vNgsdSR*4{GXo&%ZcsYq2+TEtvB? zek*z~uQ|6kFFd(?e6jF-fhs&hzAwPOZ;n8GWTJr)9QE9xK-wV`1}0AM!Tm_#pSp!V zY{k#=X3djXyYBBgHZAHeCiD|HzyABX{fk1xz?o%?fo0`b*1Yteoapo~j<361i!+}* zvbKkRIRB$c{%6wu-!ARLTU>O$s3_eS9UU((4-a>DR#wUkN>&eP(>xw(YF=I{s=`t# z&5}&+DsGJG6crD*hm>?KLdVQ3DM#0Q z&D%U?(M*SWu7=wrPnwT6?n?^1ySIO6Xk=_+YG%%KVJS&kmnOKaBCmE=3hAO zbD|LYk8#RQJ*`yAzW}(sOx*)LD14S#D?eYbkE?s`IYUvRm({V9Ng7Ug^S)Fjri1QE zcT-1iDqFzMIO9!Oy?!MH!^9>2Mw1MhftCD><)$n|Zf{*ms8aA*AJSBIlwk61~?AMUc1JPzbIcqW#DwCQ& zJj#ifc`g-uVk*T$KhX=sADH9Gv6Y2QbuE5$FiKD_8r0H9p!}XnWgYw; zSdv-E*Ch>Cy;QbL40F_badZ7ic|GV|8@QRO4(w=< z&CfA)_4f4*t)ZCc=Ya+2Q5vN;6n~KFx81M5l9&hr`LYO7C+d4M7wf69e}B&At^dPt z-87Vi(oLwopySM+?#R7+H|BRW^Sx(RI_WNfoOALzuoS%&os@lT%YC$g#iVsSD?=cc zef#!nq(L~t#PXtV$)heMz@sHI|C2tXO;w_E@h$c{Gz6({rUI#WWmS`^!>xWRCNoKUhVOo!JT4uh4f=fo9ZZmg|81!^%A->J5&E1O=)=P>g z$OQJ)rxRN0qUTgQaTo4^qN|Cl>{YWoIe9fM0?KjA?@O?8U5|=bdDzuTILTkuGvWe{ zPs;Us?KmhQMO_T-*k}&Jt~042w>65uY>~a-AIHgReI?81F!J&k%uzVOn*)lIbTF@Z zZ1rEg)}YLwBPs>j$7Sm)j(r^y-n`-8ZD87$_ucxoiO;WecJjkbPg)~Dz6Vg{jJDrK z8>KCrs{+7c&QlwW#YW@GI#DC_(^ZX5))_?OM>rT%iV`;K-oNuiQPU(4kI51kBh5$gV+`^~qb@@P+uMh&HtJ+6?UmwJm-1bDgv0MKE*#fwSd+ z@#s?Nhe#YG^a>iOH7>7|meiV7>Yl;XCXwk>Z*R(^tPhMBKP#Qw({-7`@fEui)VyNd zGoynHtp{>X1~Jo+$5}t7bLmS>y2SjjY*M&nfjP+lqE^d!?k^^!K$duL>d4XdeerksgLhLPi(Zk5yqoECP^wqE(Lf(X@sy48`p; zcv&Y;Q&Gch30-g~zYsv0N^$1>vyHa8z}Ghw%sA{>nXHlr6-(G0Kgy4st7-1pBSN={ zN<+vZ0GoI3UyVf7q_71gi$Zxr0l@;+_Ix!HzIlA94`kyP6Zb`j;{ykITI0;Z-_TyAYg5T= z4Z44tc^&5tfD@55q6q#t{FZIQi4#unf#-()Wieg4NR3;Vm`pLmpOu=*cc=Pb_afAfD9g0SMfr&0M56Sl_ z_Mk$M+&JY4oxh8^sIot3-WuZ9#T0>!6dzvXbAAA)p@nnVB2z_RK+GbM76+r5%7*|- z?msAwC0zb8$N&}SQ-m(O`qL>!*dIR?#?aibgDly7Z)8#Q=lV*R*jx_BYoxfrMQP-X(y z1NT4oqm=o)4=q2J_CVp%=kdv(Fg<(86<#xs{28KL_Q6T5=s9~BDUH$cxZNHOB;*5= zYtSRPl)?#I!%!Gx=y3Qa1v1{J*fMv%AUVamD%G&Wu&WH68cc{ETkQWBZ3?|!-}h<0 zm|VwMb;NG~M54)PKg@@iUnrCMo>ZR_9})ffA#~7-M$r^l-&S%en5THj`hM73v(7}V z_GvT?5P*V6K0<#pDZgWv62oc{ghCew$S|@z`B+|v(WL(ciN?~I7@sn--e8#E;alEG%s+JCcNa)Pn-Xf1(U|dy(JM&*ErwtMLWvwB ziE0o4_CO1#MXw=LBs@SE{nHz?2vk~DBtm>7qeB;VQ4|9-pV;cKcQsFMyU78}Z#247r(!TIESa5D{A~eJ`cKI5(9@J-T?FxWEH+Qd3f@QW@&fT+ERth7uWbguV2pzsQ(lvhGD7 zFKc{Zo_ndNdxfJTkxb%06;t99qwkLFzAR~*Ix$Jr2?vgW0&ITfUa9?F=vR}NHy4O^ zYC7qYgGhn)#JZgcI6=vK`LVNxUiZJ8(9%&MicxeM&Iap7a}j|4jufu|P|#tD1%7Ig zVcRD}tib1z``C;Wp!A+gP5RvHPj6|}Y-5q)$_ zzAOxAG7(!OsUZZl86*dVfS@3d3}F5lBH0X4=L4;(7Kg+EdW9+CI@5mz`lTDCqO#Gc z5pp)Psuf_kyLJSACynOaC>9oRhFZ$tz?XNR5|bQI z!4p8dYbp9xPJ=rGY5ymZ>@>%>QJs@aoxx+wrgLvn0PuZtP4ae))?JMzel6P~i0uxY z)e@L*3?#<~kU_cG@oW0=&11GPQ%I|y;wxGls|(XHNKWWrtJR-gYH#G!4wkTcw_=qe zk{N3OZX(E%clF|QRg8QvJL9T>V3@-Tq#(zLU;Fd;X8H#{l%>QpQB2^L6FSMLa_E)R zZX#pohf?LpcNYag264!O0F;!%#-uCI`@5QSWPUrsi%U? z312s}P-e0vQFHFJ5x%sLNx-OfT2SsW2GTZLS_kJI%B=mA~9nc`>23b7qyMgUtA03~Jnf&4r9ndTsV615{5ag!K!iOvfY zB0XSx=uT(SpH9ZAVKgdCW!4haq(;ygkpQhysl;cYyWx? z^3R_l5tLo(aH4jvep!OijQIYBd#Rs3qr1){Ye^$w(2?=QKDnEbB`4=du`v0;VeTYU zUQ+-+73l453k7V*YI}(GZ#})~7?Uev7*%)o07gzchKH8Gt~1_A)=7l$k*fI_fQbqMkx-+(qY2?#W{sW{r7K8o&w zg3dYhY8QXm?z1GAROg$7oKC3PPhw|6P@t2^H=mqKHQ9FKZ@~8K9L?3-6vq6q22lL2H^CKkg|Z48 z&_VBs4AMp=s{=W_eydCXxXqBS*nLx55TUS@FI*kseV{opAjQ?nwdrWd-+r+>q>cJj zK83blKRfw~fbUaQlO^7%n2p@dG-&j#VPr47tp`$5tV;Gll%#+%4G=jqfP&kKspOn^ z1Bguu$T7FfgR?>^z9N;fva7Ma;I!_MvQCLPZ@LSx>Yk)uT%N-QylY+tECSAxC%|DV z?sH?V+)LIJAl&q_bg3%4mrmoo{?EIs7TjxsJDs6eZJRFJWm4M}xA6XSSfKh=c0-vq zXB7y#1>vsByhT8w=Z4~N010k`tvj1Z*ju>`i;ikLe4$$d&dc_(jnFWGJ(b+FgH&G%=&x_Go) z>Yznxoy-_;VzxgQv~N+jk2|3Wo>3V zNukK2d$X6xyA_-};J<3*&x$`3Hwm9|(qz>`miR zyIhLPfSfuSo$IFmdcEiZC6Fg=G=-pAjiF1=6(+MF0ZB0mYrxc_REDh4EVeY zSGlQ{#f9gVjTB1OJYbJe{}P#_Y3p`h>ih3HYO0c6>ZX|{Uuy9x?DF!o(Y8&i?28t# zlc#EL{#pU&o8E4KMson~^Ei)WH!jV&N6LN@6$q_&k}YM$G_`w`eHc zpl%atKL7rw|Lyf%p$28_kk28I_i>{<7du|@tOAaXg7I&yJ2rmvd=-SjDFgP!qB^&(Dt~f z%b8&GC2aIx@xrH(k4POvd;CV5_x94W3c7n`YP>xf14B{N%Q_2HGaEnO4cN)y4Jj^w zln2UG5sT`)rz`56Piq#0j+w4`QChKpQIh<5@>a8#%Aw*idOp|`2Z#Y?Tkz34t1>Lw zD)lM2-6?yPx7UD55672 zqQ9@LQChdWbfP@5ZYE)*RQk(O7rdu$psRgkY;1C>a<)!)UT1NseWi1)vw!eNF+kRAfkJquR)IrYeZBmc^_SEG+S(i zDg;?2Q?l#UI`X~V6+;*@PX*S2Ti|lMG-{VV2J!_;H3g2m7T*h9%-H}6hpo{dy=s+` zaZFsb8q1^F4|t4Pus|JsC1gtj4WN3oP9)7JC`C+2eyEU3X_w{$5kHm!ImSMPEc6VJ zWVK}Kbw5<8oMg3#PkK!l!@p2!*r)Q$fHJNcr$DS~@2Y1%ITVA3tiKC?u(3O0((6cW zt+Z!{5TLPWY&N?tCsVWP&8%~qcA;0U_7#!xSPV2;^J9e2&E>Q@V*e%XXR)S<#bhDl z7s%^|UZFC(D$9H~v>xSge({ubrxeMM=9+o;tVx_Q{dBpKhj>T0^=x(NHA=%jB`H52 z3X{zx49B>tM*qZA5JwVxg>z97dC#w6;D>2Ck?y~XlD83n%1pO!eoE~iLy^n}9KyG2 z;Y&orgne0O57O|A)<=)j{+cG5D5Bz75&HRn^a$dM&7R2)C$y`H9H{^+EypqGtLd{V zX6dM5*oATSRh8yem=>ty?t7}1r(mDL%N3;l3$%%oqlr#O!?4W&kf4XMR=ny*v#No+ z7{EM`3ut=LSbr^W6chx)#MRaVASo+M3iiT(I@^Mb6Ogu#>s5p1tRZO($LYS!uk2%ZMHBK2Ss zZ`vnu*Bn8*XzOsRt_~}jo$I+f4TEOb;YWqRFA5oIE zlj@nU#3?bs-x&{9$FU zd3oq@*CWA~ykZgb#xZn_NHqE%Ke3=KrB4k)w!rP`iwWa$;C7mF|Lx{U-Hv-yK6oDf zl|SUaz#3t!sOv*iVxGyP1kPU3Wd*&4Ct&U2A5RblT|^9lGx`tBxVZ1Z(Q$fo&nU!2 z>ftCT$3U{ME^WURX(09r1tW?^6=b3tGOfMS( zU;oSvV!iLZSO2+Ko;}f9Y1ZI~Nr_C@sFZkU6^V|2H-i+PjtZ`j3tDxa`Jt5oh#QRf z$ZIoRf2hpyH@)KRw#*#*NL;~m1Rrr#`6~L1{V*F8pN1p!NKLY4WQyA+#>@qJN5>|M zY3%8gI&Jw;a#dE*QrlSN?lllAk4?fyLLeDH$pUfZ_+nPs7@i8LR(wA99sBE#)9$K-G({5a!h#E zq3D4m0@c@C0Bvc}h`YoH6wM#()?so0Icz&n50fP}b75laU_0Tn?a4ckH;Ss|a!RHo z`a5oHgDSZ(sDTzb&B@&m*Dp~458r8_mo2+V(}H}9@#QSY0~4FP*tAIjVNNZK#q!kRqm%_iE{KYKIgd)UQUgdlBJR{3c}WS}a#(Hm6$B`ih3 zaRuKQCZor!QAy;xnu2w*W`uuImu_<9i0`CK&MUNs@5MXaCv3CT_-nxI9Ay`fcBXUv z1>1|YoiDRiOdPGyCfp(s5{pYYQfx`Wv~5x*nvPCcEE;Nqc_~^M;i=AE3|KQgHCq zII{QP65k9C;dY=#Tu+t!q#=>sKAntO$~X+>$%jcr+<{vNEHJOLLdd3@@r08tQNSIf z45@eGYNlClEJX8x#w~)zH%Fu*fujQbJo^O1_SgPxqn<#TTk!MWb0xGwM)15-*%8GV=6xHL-K&V4^7dR={u>jlN8kL9YVsMeP7kS zzpP=Te9^G)OEQ)S-YlE<6HL9u&0wQk8FcSxR&~)1Ss!LikZ#T-<#Z2759m1*_UoG9 zK8I(LvLDRrW^ZY_fAjuRdy(6jb{TfPC9@_O&&)A^=Kig8c)11XJMYkC%6BmG?w2w1 zCphJQ--&vRk2~X=2R_wmZ`~M<_p;o_`;_70lKw5B`VE`F!~S8ABstj~-!?VE^~Rxw z>Nwl&Ihh&zCnA&a=|t#2)yx9sL%;CUhsWY!)iJn#J3rhtU+h}>uLrE@5=5c$zS%c# z-&b3{Z|6e^#&QGCPg7g7%emWNtpOgt#ne6uyNR)_&Jus3#;|TTglIaaSyHh7W*4ceu#KwAby?(03{7*aL}Uc~~H%=cy-&S@Hy_F97ZRf8UeR{J;J)_UGRG zGpAIQaFu5oIAC9J(tFo+`Sa#wH7%#LDK7N38tM0PY5(KfE-5~5+MjzP{ZHPAFrzfe zze0GWzr9HLoiuTM0d?ce|6zik`^j9Q#O=Rxx4{wD8NbjS_;>pSk zz`~PJW4>T6$5%U+o^%aZJ<5<9JzCl@S{Xe`#tvID9xSW!q12P$L`O6x3J|%5vkQ1b zMiNY$8*O$@YdcJV^-y9rpCl~sYH7RXnse3i(bm^>r+0dP}Sv?tb2ARpE$v)^o zr36=$TQV)I8PX%x>?MSF&}#)SyNq#a4+Z zdSwyhxE4cDObR_R=Au?hC%+(aT0!|=gq%N*QWW4ZQtNqQ9TjX#6}vwwu7{K9yYw6` zt(W~O(=k$cM=OtyEA_OXs%|Wv%AdCYoaG& z7EC}rrd^T={rBh_xlIAy=Kjn`9>+od1zJNaYFEQtlciFV@j}y(gQ!tMt)V}9Q$SA+ z5l8WJ2B_14g4F^=lBmvk^lXq|P;(dov-A}+1C;h!!JydR#A zB(5`82Im|QrszVx!A9(}Mri~6`zxidwT(GeO}7zEUJi})^i5n3c;fhtMKX;i#uzP% zSRq7mehM}1Dj~Jw9`}z0^&{${32rgJU2k$*Fk4&bS6WDV+}@zI%mxWaw`0GCx)3O` zKv6Tw9Ufw^8Nr8T$q)NGUAplUQv2BW3)SUEa9Q+6?L|^VJ9ZvU#Z{9sR=cc3bAOI& zg(td@4_+c&8|Ds1OJa4NWm_J;o_LbZkuLze##{*{Y=@g|kbcq7|8!;WUKxYMX{W`N z)5d)U%QM6~C!oU@i^FBd+^xPnSfU-ip4DckSD5IM0MB|UhW{& z%BmWtn_z$?AV_Ao$e-+$Yjjk5jssY9je_H)RQA*3=`CJm%jA>NmB#sy8JOoRGa~L z07kUte4eXMM6vBm27bvMPPIinbu*63zY!lUdn|9)Y|`ypZgw2LVGZ2xIQ&$1ys{ct zvDbd4H0T{1NbbP;Z>Ad{>HQ!vC{9U@hTs2H0<e`721cr*zk24nL-;d(?WG9 z(Vr-01M&|Juj=WsMESHncwdA(T5ZqMIUKY;{0Vi0n`@*;dqfmAY%xBJ-8;g6Ga}eq z(;|Vz0IP$943kL~VPMs(0s!v-T>vQP-6Fsqit!3lt4HXd07!6N0FKSTQ?*D>N{5!} zLCD#_E1~es#NS2VaZ|*_e!agIb;8@V!Ee_s0NXX_W;|tl!bj4T&T1mp6C?QQOVIxW zrzbCC4$x{fOH>da@NgQCMcD)tkpbA<)v0;DcAx|E4gvY;<7ypP?4EuNXhC79A&NJ{ zw1eF|H`B zD(tGJ!Y^!|%mYjzEddVI004YoN%ENf?9^*+*+Nl&GVR_H(84z3+RZs~U*EH$5zO!4 zau0F)sj)B|x)7)Vr&A9e)>s&&3V{#Kp&ZVkL`);;01ENZ0rbxx015yB;CjvT0e1i> zAoi6ZXJ&5szX~J&KhKc=+x`Dz$X}-sV-vi*%uLM^qBAnwUK#T2{DN16ys$9ie-QH6 zS71CgGcy}f($v_L4UNjEtMsT&O|Oq`$ZIVcY;FG>Us2gz8`tMPP&|~s*p^urZ`zfV zR9SCQ((g8(zu#nSUAVH^G3&9pz0(UlI6lrkDLK0+UAy`AeK+%)70{q5Wl-Z;_}0W= zvQ#+Yf3bH~4^jT{pB)&6PNlm$2Bo`Oq#Nm>Q|YduyOBn^hVJf^?gl|h=|-0C{`Pur z_h$cs=jOROpZ9s4%iGDZZ-3RA#r1tCUFtz3&3Z)EwY%XnVO(qnQ`zl5LWf74;1nHB z!=q?rV?t~`)n#0mkMXbwHu`v894N)bi|sbFs+axr5oc+A2C18mNOFmeO;}G5eNIaE z5JPL>dWWT2BvF0IiM%ndWcrE|SzACuRn(#xQ!OAk7Oy97ho*27l9tHd=C-y?w-)u6 zv)cj%w&W^nXsSD~sc{?fbiK8bzRATI-{yc*Zed`1L`c7}EW8s_1o1kel_=0!ym%raK zx1_7h&iT)lQ7(q!MrCzZc?ocFqu7$gKWM4K6|LccNE)=(NXxj!|^&1MX-0+)o5w5n(%m`L3 zu}g7!PY}u}H=UccU9O=_{zQ3Y-Ek;E?LQ}ls^)_>+nTdvLe{)~2+MKp;ANX#{glMo zuZE^-8@9sbe{EHi8#$h=`J=Ilf9hun^v_b3{%uz@{e{pLlW_JJpQe!GR?^jQFixD7 zqZDSIu)zZrW?y?Ee&|<|{;Xpj9(E2Nt09PnJwZuJU~M)8wCW_F!QLR+b2DPa3)bN; z9_V!=ZB2F`#-dAELF3Us&_2RGnAyoq^18DQ4l`aUT{kk6M4wEvk$h4ZH2zXKLsIiL zNsmO{gWZpY(M{}zOa5&dZWYmN4kOFZ>DigaS?tAm>eHO~@TAvQyRQV%BQvoCfnO_a zOIkJfn`zv}1KqcMX#Rw51)NOs?zmFq@HIs7u)B+WlND(_;L(re-%ZB)(sG#0u^Ib& zB0x>xq-5#*7^%au?Dnr-+XfsGM@xWPTFbyp!-mnw&fS%t{{@I_PW!dvN`<$|XWwf$ zfh~HQCS~IFGMpFd4KCPgW_GK`1rzU6;v2%K*;yr^X(vXH(a4PlJFH)2ukol^xdo7%L+Oo3O$dv4hwzRk zqkl@!OwS|Jh;r`<~O{f28TsF{%!$us>Zv}?q6r!@iaIadyoNk@VG}t zS-;f1CW@A({Oa?N6i`ky3z-{w!fxgLVfRBN^aC`p<5zgcPIUM;gZ%8x+OY}G-juKa zi%19)Q(q@mnwb6C3)Gh>|F7J5)NE zlEGC+`nI?0nK9C%t~lSaBVNwixH=KzYv!*iu;EIznwY=lw1uA-*lK8tuXERY3ORi{ zJdhegytN*D%CiwImEP-|44Uvtd6r9`ZSXQdji}e%JkX`zRFIMI=SR%iZQ&iCT?`TL zuy>G$)=7cKnjMgpc*jh`ca*s;HC(^gGgYkj95uCeCE|1Z7*BWAA#hzO>UXnTHsmjL z1FR6<}75={!vQR^{@0e*c$}u~+e`1|#9rgu)Sdni82r;p5dikb$4p5u1Zl7Rk^CPs`AL^|>p2{w~mCe~gqLAE`4I z;{@U8*yuO@_=7S>fHc-^%kReh7yQ5Az+62v6j_gSZ84|X20>Q)+ijBcl#daA+qb4> zxedPsB*xXWzSGkY_iOzPFa8X$H`%l88Xa@o;I=ghMP2my6yxxLfpkMi#l8LW3tDxV zyoR0cqSck~V)8+>CgOwujF8-IBAMjW)ctNI!NIL5@5T4q4}tE{P}kRL`_4aKEO|Du zx*_+Gp|%u0;%Q^V!0%Ot=USF{=zZ8w=Dao3uVSMd#RZ{kPL$mxhvit{aPbIkmdKhm zHN;lNV(xMGE<>ciKlbqsWOmzwC4Ok%Sr-$q5BjtwZHODb450^dk{op#`*L^-)-|DZz$frd1w zIhulMCMcE8g#Rotv(o%ERX`@&{{4A@guQ`Tcqj%vniYeZXv?nwxlQoz2yNOef%xfg z`Ax2uGG@s4eq}{^U;4yRb%aa<{GX7JSge31l!#KiL3-2T_bE8~4W^g$j#U-`=zKdI8;1jVdR#S`Rc27A417*`f z&5(^OJfK#kP`lqy4w(?`fe^$IKV!KFL`FnrW02EygcHnvR+fM{56Enca_Q=2mnuym z6=F$mc0Cx$d~V%MU}HibXiFGk#sirlAOWl53DlCvX=6g+NRZNOXL)_I7!Wmk!ag5F z6$D@wHMur7yVl+Z)XPB{2?Lw00$Y(Gl6*!a4RD6bui};Akl7YjJryKZFj9DN^w)f# ztrbXf+th?1X3isS2H9w{1s=j>a+@L}pvHuv2F7Tr^(_@Im;tS;r1G*h#kbzw1Q3PM;@sui>9PZV~&SA(t_m4M19eYqk4$MAavYK4>%u$V+k-a z{b1y==*f^Cj}%5opKfcP=M>DD+GqTV&8Ld8nMaAn`<;!r5Nw0F%$SCSocSRlhk7g| zHC(z;JMn#ZjA?4VMS6_NYK8zHlLQ>`i2>OlIRIS`C8;$zr7T~gEpf}rNQX9}yhz%3 zM1GUYu^xvY!E|rr#7X(m^h1HCz?c~GCkDFmvmb*lT?l2_iW zZ)|w_U(6IewVwkN+6(loQ{y)869aTh2lWb~GNt>}dC0Lr<{)pIFhfpPGMZw$2uMXB zBME+=^6ELS*nq%!Kz*?ZN~2Cbgs<|j&2_IdG`HbX{Vp6fuDI$zE&VT5+VR{2&pIC> z$Uqz1%OipcHavs`UM25~QM{~WVo2Or9=&4JA#?0)Q7J`3HQ6*QWtjPy$2kp&+xmhA zNgQP`{hg^e)?Fa}!mn3p^&-&)#Fh@`mQ<&lXTBmfH~4QXv2G{g9&0d6eOGR$Cdis# z%6=1Ra;qUrvtlb;TcUzX53^{=mj@obSu^#HzAAQXLmPN{lefZ*r;WZ7{+yHBGJs7| zl8sZ*lN;N^SJ1g>oM*7G-G~~wlf|gJ9n#wl>R*FcT_I|lu{2&v!^R!!zN<~?8%}?3 zmn-x-c(5Kk1{O7UiWsvF>9g#7=j9J}`K8!C8Qj&v(n%!V>Aur$3g}2V023z$*F5L0qlURid*~j)k-cMrcu#Q4d8|QS7EgcBE63hYa z9i(9;Fp%cRd+jAc=eT+T)|>JioAQ(etI-*_qGk1APW0ha(t)3gb<4&3l8O@V5Q`YV z%RT(sg{%|b^u-N;>e_u$9er%9y;mgt_*q7T=Ka-mgX#e9j5}s-uvX0>bNwtG;k@6K zewzWV{~%C}EQQ4-^dnV#57jiY`ne$1{?K&^*d%C6;fjgz+eJZ}_Y-}rLPX{hpx_Dn z{;FA@*P%y9Q#D4%DeSdA8*M^?>?hiV~_rURCkb4ivn}*Lld9Yo{vs--%(|bzr zxv$?qo~x1$g4fp8F|LW$R-oTFd)jIPY|~^Bx0oCEz5+c#T^LFPQ4C$tUM8z|r|qKq z$OU=cPmYuNP7{;OJ}=Jfvx4epYddJBSU^8{%*LAD*{5D{&Ae~Jei37~pWZ#4!8(CE zK%c=5X?%O1l);!6ZJt%^oF?6v(;63qm^n_-2y3sgYI%>!U@RzaEHF;aQEv!#?bRCi z&d+xUekNP|#5N%G@^zQAoqHSPp|a!w<{H%Wv>fErc@k8>Sp4v^fPJ=LY6w&io;@Ia z6@MFE418JmLe^65eHm=-}u{)n?L^aZe1yRllov1t0ToFEL} zlD(=W_~wT4n1rr##<(P%trKLgO=bf%;y3ug@Z%T@ek?K>hF~(yg}lk-WwOmuvbJ@$ zm94YQ-IwJy(g6at#Ti4MxvJ%b$xS`_qn0o&Q0+@KZNYR(2W`A*mCD>zLG>TSHPQv0pZ zIqd$4+2#GRl2SFznAS6Xw&ShnNi{V@)3wJxwKGMwwbQxFV&U@p{gPk*cAMm)wc#F< z->zcLj&AI#aM$<;W%lqY9*CeT-PEq7_iBRgp5+%{8{6iJ@0y-ayCt6R6TTJ&<$?OA z1OF^X`<#RI$%C!4gLp$=GRBJ4`mUyBGkTWc%dR^1W&+#c`O6;N z#4fMKam^pN+JCT4^%Jzyg;r%y`{sI=!*5Yu*HYhUh_v#s$caDMLetdiyk_$+f}FjO zDaU@qV-3LkS>dX##O#Rj3F<~iGx_r5zc-1TS*NkGvvA$^rPdN-#>#K{p|c0Mn*aAk zRnZgtL)U!pWG&V7-@K>44KMT7XMN+5=bTmNB2#~{aF=N|=N}Trv62(rh+ccps7}`m5sBMV)`+{M$-a@fXAKTI=V6f@71K zAd9DrG|M%B_8q&0N)F zr1;)EkG<%vlaZRs=L6ZedmG6UlWa$qbA*n)`$4;NEL+qj>igi&JR`~@VO!VV<7NwN zg|bLS6LTLc)4*#2^HQA;-zl`@CacQQzJ4NL_&1BAEc@hW_Cy%+ME)HdoIBrXbff!S zGwS%>f#%6D^qC{?*{c5;XaCu&eKX|LaWWJ>BeK+xTZjo;shFWL_%F|T_se&zf9)Lq z^nI@>0Iy^q-XJVwGIBC9QYa~V1VTX-$3+-fq`ME zVKkT{_`d;A_9%{+xWxF>l=O^{@VYwEkp3WYaAo5gW2}vQjgD<;ZR1o^Q(gMcNndAV z3?pT76fHJrsvHaoVuC^I8k%O3<~qpt4b~mANmGFN~2O`xuH|`6?ppePZvCqk}!KQMX8Jb24 zlg6!aqQ zv-r-&;VYKvwSMXgZg!sB;Bh(OW*5WXh8l&z^2|w z>+~13b53L>D-nJg6G+<5w;j%izv$Q0P}FY8&{m+6nxKVT_n}?cZ<{tGDkZxwxLXDNxT9N<{4^>rE=er<%VY{ zqs&{v(A`r?__`NrhI(hbL{EFXt z0v-8S zTFdhSQLh(SIO;1NU>F4YFafj1(};BTs?)mN>QdVo!J1Cgy{A6)In3x1UAt>4C()eh zwdy3~;dXF8F&}zuz{o6PR8d*202);ltZ&k7!fV2*|Gc_#m1EvUZ=4n@ZJ~CUa-_m( zggdwn#GBs&oVHrn^$DK>pRWi0j2*6VgB<_m8Z|pw!QdL<)GW`;eSODOvfE^r1?wCG)}SiOg(LOQd+hh zOZbc^8+)ABjpCf=Gd@XkCGoJ3?RXMig(b@Vs&BS%W&mRoC*8wvrbPPVSJG{9;pj|} zsL7yH{{iR)#jfnt(vt{9ZbE(?(zjp6nJ_4UBeVN!c$AQ5rgrr<$6rH3K4ZL3I~>@X zJOox$-|9$BrR=*81+r99UVTaLJ+=c2Lwih|Vp~|r(!pWP3Udr0&Z6+_y9&-$1M}qg zXp;9F5d)(pF{sy3{$vHLQOl<2bXtO5fpR3R4S3JYd$(@eX?R=4{MzbWC58D8-&`WeooBh zTar@N&G@LX$6U;LcQkH#JeP)WzAKcg@ssJLPvaZrwc*)*B8kX_a)D zBF&MwxvdUn*U%UZ(YOg>APxFxE8Hn^`&n zqoD}+mFcm|Rkcs)n_x^|f?)ZLdVHNFFy|bl;(Dm7H=4;%kxqrB5gV0UsG1}D*kHZO zVyt@7$&2HrP{CFp;CtIb)l-Kxhdr}cy)u?>KKkJ+`f3^M!yj`FZgn*n!_=1RG1UA6 zBOiTw?-m=rv>Ny809Y@St&qF;eg4QPKE8#j`3!YYEcbgpdO?27j++LaDuB(J*D9(K zMgtUM&I-t&KP(YhA89{iNoL+)XR?6JNXceSQ!zr(kO%rO9m9 zAM#P+4|?<~`BjlOGD`PtOr7sd#TM%CJ9vV0B)UkS{V>{uY z0nhPNjv2TvYIT3?E>H1H-VyLa>6Dk<^SY@MKtn5h~%(xRfQ~^(glc%uNPA zg1HLb=Ru{t%~^e;nZZ{11|2#D{LVHb+y@hp!yS|#XL}=X<=7a&od9X56`OBa^e?@& zwnhAr8ju{>fqIhELS+}U!i0=g&sA?ctt=$_tlw6BSd2G$+wtIo3055CHsI4e7!5N3 zN`Fm+;rTBR7Z-+zTeCBW8ZL&TVYlm?_I>s(c!UtCf`IVblY(L=(fortn&CVx0e5LH z*T~f?oGhy)4zPKM#RpXUo^BssXQ~n8@W~n7IAFJV^QQN+Fh*$ogaL-=Tz}(4{90UFkUx z0o`kQPCB?P!`t9*D%*z~e2<=H@^fqtVFZIMuQ7KVl%&r{kza*-}EQ>4RBBN=)0&TXC;)V%C?n!IfY z7R|=#hdj_poWs@pe7PTK_SmqucZykw%K)Ht(M1|Pudn5tFKV~;aLin8_J`v$p>2OQ z=KC|nv5kx-_evNq7AR!yw{FuT@q5lG0AGn0ej55oMqR?Fx*-p@HmEf^7+WW0OBU`-pkh&d^B!SN*za4QMX(1k zp&M0Rfca9uT$o2`lRKS`mWc#%_Krgw529^==aDSj5igMI9C+adkj4%`!iMupeXH?? zNCo&K2l&$#f1~FCwJf=sXroAeLrV%EYX6AR%YfduP5eVWko7%&%z3E3tjAEvs}GK> z#e1Y69f%P^9`>j@RG9`{Js8@SBw%~*$_)k?HVf*9yL?F(;KYW8I)&Nq>tokR5A{$i z#QPl$`-#d$XfT@EfUQ)K;jpLuSBou0odDKgD?tXh_wk@#GNJ0mp@xU9V(#I)KrF-o z^YI-QXs}yNu{c+O8yOfy!Yw>m#k)ZpNMRh^l4|>4Ve!t=f{M>sGu74_SJ;0qst4KT zN-VmCAS#?UDq1Cq&N*t=ik($5rc+Lu)E#YI8>6b_Klxmg4-Pjkl94B13E*|XksxR#B^r$l^6*Apj+E4L8<~z@Jdck9OR;Gfvb3^+ z7)av59>GhIXMFK!0SNEGaDXzvl32+0kflPny|kGBJRWEtYAP!R$JpfODHd-emTXMm zO>*Qq8(>2YL!J{yehx*~ub1h9N$+uDp?G=^$R%?c$2+AtQ!@okF$TdSq(zM&e;@?9 zM))pTrdvEDj4dMDFxlBXP`7GOo2iUQBL>pTspWUY%B88xBr!eA6R>&e?$6NZ~ zr%=kEPJ~)1@dKHfB2k?JOjm-K?-E9asDH|SjiT18#ioRQc=b)d_At=)p@R7kBE_f{ zN0&=$$0u{1=XoTGWtqBv_b;(~ZemAUVgTQSgZh2j3lqdj{7y>%Tuy$Td0$0(?2(KC zlEwffW5A^+;-xj<6Jd&Ps{KR}q5v-tMK?g3(a9+7dxpBpa2`rhze>F%KlVHB{xUSA z2RDb2vp0tO&RIzAJ>(sgUC?o-7lw(n{6s6vtRJ;!$-3-%w`3Pac zkQ0<#$sPod3P4c>aKn^KHx0ZzvR{GP&uN+|ERk}egp+0jFsFHNNb&MeE45vI%)1Fc zM)q(cf+y^O5{G}k=|NX_p#iE$q|7U8X3A)1y0|^OhP9LwuQ$hkCRX2~E|LH#!(YFL zaS|CuAe<8x%E<%8Yycq2w@)JSXBLX+!HeqU{w>R#kPhYQ$&eumZwX6>V~CjLM4tSL zjG`&QlLs#V_`EeBQnvG6{XNQR3sfH!RJmGS^@spFMySh#SB{6@41i~dub?-EC&mU` zQI~5-lj6ITqo;e5Scf7JY*>SN;4TNFc9N}ys|Rh1k_U91K)S~PH%y9ma&4y3K$mjXn|&8uq$ z%%d2L1hk|9x#NM=tFX#9WD2OLwW(;ye646}s~{9C0#*o@n!sAlU2ll%?#7C0wW;WE zivQ_J0G^~s#%n<*z+T20v>pJO6EMTQK0yGqXH!iJt`=d*Jt3|>S_S%X8gin2<7FvB z(4|s?efxNxOb!8@wAE=mNujtj=3fx9F_#&PHzdI|_Uw>rw%2LvH|csesK+;CwKm}G zHW;tvoV3*+9M|umzMV2QNJjyzDw%HMhFJq+jSbO@a=#U(HK$b zJm>nMP#EU5+T{Bk^}FG`yHAsGA6dSb%wX?EnZjBT4=Mn^ zPjFVpyWWl%A(Y*dPaXWso%6PxrzF*@QJEWyom+~icuHM_K3%CzK!6J3R8&78z7P|P z@b{tcgeavPCE%K;W8KYO5*aHTSH?=Ib={btHJxu9kvAB)(;AlV7}z=i3dX~|T{$Nzngu;|# zKcYuU&<)F?3k6rlYDhbUSw@qUM){*hPoE0EXHDc(da+`U6)OE0JDp?|tFBZU6$6hb zP$FO&BOZ)ZukaxF9oSG*xj7|L^9k-nr5&*!Xkiwb_ zU_oX>*-t|#m#-8Q{?W}{82|Z?wG_ZMttdAA^?PAT z)|6n!)Yi6s|HrH^jA{jcJ}jO_w!V!YE1*i$)eIys}YCW+%aq--v)Jw5|~gXvc;ng}n> ztoCHL!;7^oD5)%{#4PBM<$7-{__9rUo=r#^&dX-c17P!@>G{uO3o8c88ZXN_lhuDb z7eLbhb_{@=aNiUf0w$~<6MHaWqfo?t!DoFoOaMVmo>(qe7Aj&#Dcs?Az>rnI6p z^ZQ~Q+3SR^!Q%H5@>JhdmF!hv?^00Ds?hT)gK$fF)k@{W3ib910I*u{X?4F|akGnh$D^nONH=cW{?9)@@yQxAW%H(^etNYxWg(7)(~_ zues^tyCCppUUngi@TN%n0sq((qcFl}(vHtc>kA|)B9z$4yOi&%fSSg@?#iCB3ShUv zZ?|kpB%d~vcf@`$RP)D#Y`nd+OhGKi!#~_*pvnX+L}C;6KZe>eI3#OR0)3i>}jV z@;B+`1abOA;{3#!{q$7n^xFE=ZQU{}{3`{-@g(E$TsPN>yz{oR|LA$b_Dinlj4m2NiG;Ei0CLBQR-!rlTpU?MEqO$HkP z1SS!rz&{>W;*MDGon_j#sQ8e(rbU$3w8rr}T+J%sZnL597j90Q*=__BZl-K+1fy?S zyKYw3;y8p1wT-XkYQD1G-hFz#X3XhRf8(e*g>=|mADaMm5vFL{4S_?Z(#FHWnbm2E zrO@NcO1o+Sd%#vx$f}lW8xE*$iMsZ_Q5s+Kg{%ttWi5_elabn{t@e@4=C!T{YgU`2 zG+3{c{cN`2XLXU|Bddxl2LvH;D>;RtCNJ%w8S{dH>^V304nX<%TJe>yqA5u{MQxINsZk*X@_AYSA*-sYg@mYwg@=cV zMvIEX#fu1u2&V`mrqgDAr%g!~7D-29{lUss5*-wRTFF&i!xa{V+)&h%mztK5m6;Os zp(iv94J{&!>mys4swfgtLcGxIoREOPTw>yKT#Q<9&~`9%Xhkq5h102?uEq4F*dyVc zB;k_87a3mrZyBlwli6gxJdBwQKV3>S>)k%#Hl40F`mY}-dAt9fkwrtHN9VuD98@C~ z6=BVAk+l4j)hHH!ppXExVjee?Wc@q>dLK*LTiqg3ai3@rF!%cM5Eiu}hi4uy$?a?Tfmd7T~9<)I?y>K>6nI_>RV_A)}%5=y>Cjn#`h;QI(m?*$xb=#)Mv9 zuMtGvBgB5LFqEDWHrb^?vqQIGLQk`VltI$(()l$qAVC?$!nSTl^f^un8Rl}HTo2~S z{_Jmqlaw3OcOxOxrpIG31=$qpC0 zR&DOCQ@Awgw3WgRnJM+=!j|m)F{G0Jr|lTNLatV%ap)wh^Mi*?+iCSlHS0M(HAg3< zo~tAE!!gNe`_*GbRg3Por>cUT*mkj2v@Ai+B2RP~C^`Ci4*)0*cDksqB&8CEN6D(h zPi8K24H?Asd3G)VEh&Yei1qLr;m1DaS(DM4T%XrMU4Y#cr zxlM(?hIh;K8NRnMtQDWo*Th>koYytLc}PUB6d(WG!aI3uG#0y- zxy`%f<8|DC=-S*TOXGXBRk8Mbbyl%OUU5=`MbQ4UxG>hcy?*?tVI1O(=_Oa_Z{W4B z`*E84htqKPDwg3%twPkbE=T+Gc)NA%S8pP=sa9E{aTS!C%b(1Gr~Ls1^Q%lU z6}d!MPu)V5*G>OAwp6$fsX9*Ky@;-=>Z@jmiV2PmUk-H#%(@_RM|Rz;-#f$+ihfSX z`6C{{JzYSj6QAh|rf&n8_tJ(1Dau~b_Hgz_eEEGZPCy#Oz`5bb((aN%wJZh8dbyAc zB;B7fbsx!RtmC^oG2 z@*Gx+)_eo|SmNdU<9eI#ELe2WS<)92ojo1WCffFLH$QSxwCn?_(c(Dr+CO%Q>TAqhih@lo-AIspq7l7I6bho(j) zauq%WAjppP&3YfGV?0TTiN+wP1XhRSvDFjD>cJIRFDaY*$Kg8{c7Z*2T zQ1e4KFLy}`dE`IC(y+VU21ioEMO zSl|%7KQWs0qUkx0iSR))FdA?Gb{|S}1XIw0jug!DDO15>9@v}jy7zhpq-VT@pB7d+ zDBH*n#KZAOvEHrmbN~7KSmI(ivF9?3ZumpBCwT`BB>SOH1wsu?aoIncHG=G&ojBj9k zb*Mr+?D%sx0r^y)cJaCn;k?QqI#&sck~cT8DHTJCYl8lG<-|bMU8LQGc|Si_)7_V|UG32t1ZDf-D?axt2n{2RwHyP zTr-I=3-cyn#$e$(AFy(%S(zMQZ!XAH{F}V`w7J;imiG{|Y6Q$`oZa}KLp|ddOtC(F z`RAvf$jN+|zR$L0Hs6;$Tju~XgIy7alWswg)i}w83hKCvUY3dJlA!C4q{Fp|wyYSm z+B7St#t(froYb%BQ91{!FtDk;$Z^)3E|U;PWxsv2Y39f5jlus?YOziS0P9`kP2p|y1Bw}dSpL^NJbG6=`eDCS&>gbn>#s(jFP z7rFeMEfg-Xno z+bmMIh`jfQS+M7sMNtK+EYa$Z07k`Y!0R zMQ|jKu`7Ns&+niQrNK`_!5?&jHA6Lw-hmp#LclGW3LaXO!zu=@N+Ri`N{k`Ozk{@H zFg}-RYA%Nuwgit~>uTL=Xoi0YqEtr-prfmQhuotnTl&5Xrn%A-qMt(YuJPkFjg|>= z7~9)-7egK0!$On897<8Q18{xQUHq3r-T0h?8AF%NRl^yfk;oW!ApmVk^$%}Treccw z2>`b3S6vxZ?9L0xdPEdc0z)keh6*bE+#5PL2$gWcr=sw1KWJn?vr0uceN{SL1z}Vk zXVed5vL zX^A^pj9a;hi^h&`!(qc&nvhJOLl4*@4E9@6dD9k_mh7EQlj0HH_lTunb1)4 z5Oo3~tepUCFap*Pz>hqqk>q5vf>^ExDm-cD-F;+l0hvP(0*aI*ATc7mZC#jF}T5w-GLeo@2Df^N$ z&7_elt!=DsGfN&m$|xK1b2K}7fMbp*OoTqim(Xg>TFo^mW&2!RyzW){ zjh2hgLSH;oA&H^^ToLQ|a#k0VN>-RJ;;}RGnEz1Z0SZ`q^9G7qVHB2ptQGWFn*N3kY)+7T;?FpoOGGg$k>M(CZ(ZUc_$B z1yTUGLa_pxNA#%F3@&~tXX->^m)K-EXZ2#uY-q7jS@G|(Py2GQ?}pQ77Sb(I!89f% zn=8d$0;)cdHk#Ze0nDJFM`DM;EJQE@Vh=+4f2gkP2a(%#x@vDeo=(UsF(I`oCyp;X zk_Z1q3XBT(Y8_ zzwFv0KULcfIpKOqY0_qQr90L@YT2IZ{Ojx0xavi0y~vSXQ6wtrIR!!V?I`pljp-^l z!mzr$JOX5~3T!laBz-$kw7Nz58u)f85QCu+TGK9lQ@4cH`;$ha?+w2p$Ti03sH({H zQFX#FU^-=)x-E)7C#sAzf_P#*=U5stoy$YBXE6Z;MaQ9Cy2aVFg_y~N&#ftRv1Kwf zwS=hkV^oWhWovYlQ$a~9vp69Qm4MC8|E90;mH&snQkJDD;0OcACnLx|QMPO*L|0lx zN<-Y^Aix1zU{(oGKg`^}$z#kMuL6gp$;z?sJ8aOqW3(cuWu!y8KdOhNbMu$Yplt^X z+F@7R;Xm9_-#|7oo0@kI6a)Y)dfG0~UI7F<07=R++>6pFm0~0??O{S$5?x^GLHz>2 zrdpXgVa!<6Kp8zDLYlLBN43GU!Cw-GEl_bj*_z=4S2xv&AkIn~U zrrF{v#Ma+!;4F1Oabn=l`2d8+6e2T-Vmo*?G_X4kSzfCUng)^@19ou8#gz~yN8uUt z0ler4mHL4HL7<%~WjmY*?zQc22=t$ge+>a-L%TOgrtgh;B4yci6PVuJ`a^xbhWiXI zjF03G1zj|$B-pJ5oSlynu8*V|^rb6Rk3rwZ`wXQhl=;Ntbz!tXMmr|f?D~E_51!#q{Q)$vP>v^$AvEew5QxL$)>cZM0|;gS1ift? z9c_H*2$*8sn8tuHfr-gSi;d=%zgoJQcD<28Lt=vVk=`8`!uH3kLv*Y&Sk2QN(1yaB zX=04YGbM~RSo4q_V5qXPMiD;n|2NCS{@(=4|L?x}Tf)ZP!66h1b&AqA(1*VH=61=t z|KpqMW@aP?1&4=6L^;L8g(W7Xq~+vf{pXv9#Q*P#c|}NiZQb|knudbrmg3Tm&hGwR zyX^YJ4yb-{R7>YfdY7Gj?plV42`qQ6d|}CHrDA7uYjeA1@7MZalf&X$k^0ZZdHuR- zK?&13v(3Z&MbthPxtQY`>rHu4QCK-!nTP5rPFX641g`sYxkMakgR-tvQzl>O?qGB| zj~ng{hPh(Ov|QpxPbQ0xsrCl%`bLzCC*@@uwbt2qa(Fo}79Ei^js9-={HbXUG=-d#OujVMz9VOOm~k_*d8xfHl06fr*$&*m_1Fm7 zqLth61qrtp)145><$M2STvp^pI|e1wiU_%wTA^Lu7+E6yQr`_Fmrg8TZuqf4tzDKu zh!P=i+eZ`04CUSvm;A6;@ER>%EjJRQ+@z`%`Pc*Z7A|ku4k8h`R?*Vs@?;vJ(Z3ff z(o_ptNlYiSFh9U2Nm(dn(iV^?PR|cPq|b0{LP5!~9ka$uV;U+O%!-?Z=VT~kdTMDbqKP>5O5;|_!1Y&@J^}{OIK=XgQ&jd* zK{6`ox)@ns5YZs8?o{i8TEbD(Q1*(ZF&hGd^j22Va+ko0>W;@uELb1riAC)&wLYYJ zLg2}+p^jbctnuxryuYRxl?AzWjhMutZa=4>yj4|b|N8My(*>g7-)4>$ zO8aW^>2ix2@bn}6YekEUfo=6)e2KC?whX<<#wxcNX;S)nVp-CY=NOto^ou1=*Vi*3?rIoft=@y|17j={?*Vxu-{Ox>h(J$hNS z!uUkP9N$-Q`}weQbe9GE)(d9zN;gVgbiFQnUi4O%yk<0vl4ZpV1N2E38Ww_Bmu?1c z&f!I9ja_~DClXVaJ!hSEt8xA3?DFkLHHWMH$d8-%dk}Z3htU{)W%`3mq}a=C1CLk_ z()`aNkHtl~%B{yJ_Ge~+? zd_P#@y#dVK8M+gg$NS?$c#-?Kh!h5=_t$r+uy;*}vYA!51~@vWhNcG#eCJ>sGIgc7 z*W)e*Y@7DpQr`yF*0K?^|1b95qASiWYS%3aDBRr(Cpf`1NO0HSDcs$?aJS&@?(U>; zCpZKM6cB<3LJ}YlQk!>=Grratr+Ic~KR;kKp4D07p7XjdMotQ&vS;H5*@v0yz&n0A z96n1q>H}T^vH3l`plLY@N|(4tLv%Jzdl6Dco*1vC+*=Wt#EIl}6ccqBhHBg>ah`hY z{?6WAM6c{x-n_4-S`;bna`imMnUvMai<+W$@`cjLuvBCd>zAvT$l(?iL(lw>f?OOc44PkUv|UCK_ZjL7Z?U?NNmBtWw= z!k|;plJkrhS?2S{B;(|CjbEv%h!6{1hljONA@%y+Qg*TY7GdkEXZn23?Yzi5d@MuD0J{I}?KjjK&;SI}*)|tmHY2IA&8@*yfvD zr_goDpso6Dax_>TD#qK|-R=dq+uCI}TCcQgdE%AU_3?Vz56*o&%tgM>et23A=JlhH z(wR@irvI{|?-x66Q|9q%%FL9wvF`vC!@N9b64iI1e`3M)K&v+5pJVAqzy=gFZK%Q% z@WXOcpZ)HVOl#6zcV$sosd~ z(mn7p%^f#fcaJmyKuE0NlN9K!P(%ZeH}EV9*C`5_@oDs;JU2#w0L_%mx%7v*%e1&) zJN~DfuRWZ9#JRXpGxOMvDRe}|+(p&GEPs6^9JmR3R+qtieS;*}^5@0S-G(X98c8Sa zhUHdyWpuy089X^YYXOMV7{82vO494L)A$u(b!L|aFkX81EsX_R-QaDk?y|IXr!0+n zt~6f$ObM?-6-B_AsuN(!RU>$ESn zxqT-~vVoIB-TSouK0xrrWPUU3>PR%zse!0E=sG};f`MEd)?^&;fQbF|;rRjJX&j{0g>p1`LR@|O7!{N@ zB;=gpOr8+heaB1VWI^I!R6Cd{{HChdf(Ty|Y}E(vWx z8oOWqEY2N&8I_u8s7h}&#(qN#BnuVv)$x zkQ~1`F1wQvYokXA;*g|=%V;y*K)uRpi0C$h?-fz?@X5Zu=qk1dDYqC%%1ln9pr?M0 zIHyoY5F%U<{GzUL6wEexqX0pVlSNg6WRV4N0YG;-VQ$a}L0(+fa4%zbS=L|75CPd| zc`Hk6=xakOr)(smxJc33AVRiqmukn=DQb$-2;4GC?&%mjKJPRI!bnnk79~^&G?uB2 z#wm{e2R^X{Q=}m}968MH*1=29*B*64XM4 z;FCde{)5darDc5-R8S`4{xRDjO~%#RMoQM&wu!{V=K}3cU1Qrw6w|3$J*bh9oaxZW z7B+*6?;P&jsk#7IjW1P;B6ip!i5>QdbXtjaTaj;ik&u0(nJN>!x|6&Ntc;}5Ji!RG zBe1=fAu?SWlAac-a5Yf=omJDf_YI&>C)=PdR>)PZtx2KC$N=sz15CDk)VH z92<2R^YR;UF)S=Q&0U3*tfV*PVj}>>h;SK(@jVUI<6HFaT;RRG;|XixU;7}Dn3p|7 z+k{*oTb=F8`0@53xq&>j`#!xw3C&xYyd)P{k2iTWF2dG6k=Q;ciTp!TH*&o~xXPI= zgK{|JKG|I;LwLhhB0eG@E_R&Fev~w%34n$7hf3~Unp}@7!2zy^OuAt})|g?E8Uex5 zQnIIQs8Dxm+g4`JRH}Agf-Z)yR9##`ZV(Z9j1orHYm6L(V6Ljs3zgyGfrN;8ql_9h z6KO-1fzS^Z&IaDFB(fNVFUIAykY?~xq+;2{I`(D5JP1D`IYTEww2EYN%h)XhwnecK z4i4!x6gZaeGO*)PuXMSBd5d+o7m>cuWm|Fb;7}Hd^Ru3Q%VM@;S;z40uJ344IemrUzcxU#S~f3 zBs(vsAZKh1sO9_ z+V{{bwY7M@D|YIpQu}2~uub}_ z+7`sx8xa%^jU~up9%T+v}92-E< z9cI*K6A#i@-IoQ!WmT15zNzF?@iB=*l1n-b?frX+ui*oOhl#ph3(&tc@Y?VV4HN)} z3Q*lMUb~<4%?0W5N+avo@k_zj2_rRZ37sO`6C`gW*l&h;d`5oW@+uR3)M^#H>Fg2U z^(iiRSvl0f-Q~rA%8Xekx@5hk=%$hA2Ox{(x!HPPEQeq z;T25kPz4SBRsOik`&w{*B6zM=ZSLPBVxgCMVIYb9ddI~0sU2b}!;3Fy3PE#yYqoxD z2r|{}!Ctr(UR=9Gt|Okp#+n3S_Z!&Ffd=Pou@+m~`<5k^##UvtHwAZ&+}LwGt#|tn zrb{52j=nR*2bFY|~caRe!Vi zMyjMli|mRD&4NkDwn_45qvyW3h0pN|o8~WcISlQ9QACJeSMF)mk7%oIVKeWlFZRoJ z{K8hoybN!_m>2WA9J4vyv@Hg$)lr&Vk)>S`=$3=}lKw(Z;agoCr?CO9t@*3nrKYVF z^_R8UZ9vnY!}9|Fx=fen_AJicKifS)voE7pyARL1({pH@IB!JsSHW;em8-q0{9Uj0 zou6EL|46?Sxa^6zfAJIiygjv}ki4bqe(+%SrO;(-HTggQx)p@8LR$0IpZZ`N*%a-2 zAj#eVZu7xcmjhbdLu)g{9ID!GF~>oO+QA(55m(9<^}oXnoI|m$w|r4k_#u)Av(JVN zM_||yMd&_t=)uDCL6M7(iVL?&%B)S0u8zjK7B^5Q^g!SS&Hw-=eEAyW_=mM-kz)AMfP zGpfi9>TI^89u0i6Vol}yH?(4yr^bnm(}_j#$)~1e{@)sX4C6Eno6ROLIrY7GNmMV_ zef!XNpPD>{ySAJ{CCysrYrZ4Z{R1{|uQ{Y_=;K_hN?yd6U04;b3;#X|0sxn3S15`3 z#v0GZ$Id5GzBFGT4iB%65})D!Vvv7EAy3l6?{u#wk6K5Iuf{`RCwo^E+!qT&mkgzI z_4g7gS39~x^RKwxJvU#-6>SJ=Aj@r_cD6Uo^j`-iZzBG!BXixUbm?ZhLexvOA{oWn5s(`8j0%V1AwyGVBM_U_INR3myKifl=jv6A_R#|Q7icPV zKJaY3quQ?G3gbsz9=__)fFqTx$zxFQ?bdV0k#$ti@#Ta)E;sI2z1fOMjWTuPE8CZu zVZZe4=<9XcuGiEpo0D1a3X}vWkpJ-3=VR%R{d?i~_fzEG&y;+A9NS?o_ur$UG^w8E z82={!1y1k?PqjSG(*4s96ULlpzgPmXLhEG7RoDRNF0RJL)I6~-&^dK{JT-S34=ryd zFAXhEJZ(l+VP*j@xPUe(o+rJACn=Gtsfmj#jXSQQt2m37HaUTsic1pKDrszDA~j`V zI%{gufv9U3dg0D%bGl1=O9mQOTlW&-RWvn=9ZM^#?VX!FS=w4RTCT1xzg<{ao2l7c zr6x@C#H2kdl?X7sTi0wXH#JNc!;De7kgCg~F@?lm+kQ@G#-b8(NpW#sE-%4jGc6@9 zAY)a@clMDH&JPM!=2@Vibfs>2~upY9dUnb9t& zex_FOUXq0T(Fxb!FG!(ryT1wM^!|~dl@dt?;;aCTvUjEtaOTHPyyGmds-dz$!z9zB zc87fpccO*;l=V*2+uX-R5U@a8QEk^C5tKULRGDsIH^xrfc|y3NQ<B6`re#~zdzzELwWE|_aQkxe-1tXV$Liq zf-$o3Ror3pL}WD52eN4YPUUrSgfZ_*a&lby!gDQ*$0;%}M0*asq;44I3Uk&GGt9-U zr!%a{)l_4ZgRc9BnNqewY#GsH%234Lbas&{j%S4oLUnVV>|ZOFyKe zH41q~@!I9_v~A6jqpBN4XlJ(UXg=>d8jHSy6ITww=(OT_VY}9{Xtb0>niZ$Vmk)YFMEQ{rB~KNKAXS_HJ?_= zK_LtlAcbk}RDmzLQ>?uFTP0FuP>P+{@};9cHxI|6$4f6^Ojh8)PBttpu|XOX7F%N`m<`)KfIo# zx|ys*2HVBaavn-V71<-^5&0GA53^BAo70fwB88PH!!j=CB#+_R*JJ`C-pj*0Oz-z zT<-*XY++p~(fh1$>Q*gpm2(9=QhMI{1qO9@tqFYtlH4U358=UZlaguz-VpQ)c9+iF z^U$MYqU;NEX;TZ^J5sO^Xe@ap;)ssRmycmj6JoLg7#1j1{1cukm*^-@{dB8vhJ9-t zon-YP3N%iv=k8YBpL=epjVIiBNicG5z=GB{^O)yM`SAnkWuZ+!Z9R-l)3Ok9TQzFX zf0K1ZxWUQynNR-3WInA{4S-b1l7PT~*|)Y$P$OOo$|Ma$@L@$GWp=o_f@kK(S~MyH z(v)z5pW4BCpSpq_`jYArJ>(k66noL?8$6nFLI}6SzHCmt&@CjLIy#_IiiHT4pLsy( z+Sh2j(ASHJC0BZ%#NW&32HNlx09MGPBtdgSS5Q+2Z`AHP;$A4`Rrz#zfzZe|0jR7- zXmt3e46zUW1`@xF0rF>q-lUwCpJz&^t!uT=0BiOd-c=q0)tU~mV}}PCHP`&K(AT$2 zE6IBAS_jYW)h6m7Hxp#R!C!y0s!V?IX2Z(3kfB27%bUZFsiMK!;TU~nZ=cOFmSH~E zx}RN&z!Yr3Y04$~qG&i!pI|6DZoRdaucvX~0R3WxIM*jBpip8VrJ?u>7ONZq6LkTp z5pvts&=CV!X?(|mECW^D3+51ax#r;G7X+UJx}^gJ>U%lXeA~#`GD;x?9YS7N5i{oC5#O!T2eS zH#Grwx!mt-p4QH}GsoTbK2q49jox9w95-=@p6X|`hESP?vKvP_c{G{!jWn_PC*o(l z*|nRSuKMdnYh`a~`4{{?KJUg3xiB0fQYsS35FW|KB#pzZA(uep4nQX#LFaI7qtr

    b0YW~WdP|FHE6EEP3Lr2kmmu(c2NY~@xcip0MR?bb6~4v;BrNyObA5}y zQMuE8m|{I_V=IbCfK%$Y)v2j~pC)yMEN)^tln&@OHJt|^Se7VfcDB?b6V0fR7>Mcj z-10h?^cz7Ku%HRf?=YmsR&V473Y>?@<~UZ`!JNTkIOtR0h78OH-+t&A?RuQ0`HQ<} z>nKl?SmuGF1yYLJ-z)c2@!g$0k9Nl0%OUBYZN~IOZ7tx%dtv|0p?^N)QO`tHexe!5 zF?a5lsmSQCh$XYe7z}b5B+T3q?8;Uz6|2Xkw{g;x)!*%q-Gi2PSb!)?Fd*qiW@7EM z2x5EKZ7SDtcH=KQN@cNVwAc66jU38F{h3BFDOm zl(`2*#)iM|wju99gpm(1KAbNqOFdO93rt4Lx0WBK__nUk9E53&75mLKu4fL1k%JPFvwf8#XhiHb7es zGCvb0BHrxP#E(jLqaq=lcF|ahjaW31kf}!-ut8lVJI56wbuK+)&y#^2f z2IamG?(PYvASfr)>Mq8to)zgS*X()p-hb1loL<6&R;qg>? zB0?nxB5>Iw{8QM1B7~zqv!PbNJqCO|7X3{~Pm+K!CSU!rNdr`<)6zqF(u3oIdU}#a zYO%hSV&aL~u$N;I^?l$BNKb@d6yK1V`(?J@r=-;a6d(z}Jb>;u7iI+%WqW{uG|Fv` zS+$2Nw=W7|8sO9qMZ6ZE14qT6z*JTa3MF$+M5lQjl`-MNP?YYMxP=jO68HHuz0=NL zu`Z@R`-9m=_Mov&nPB!K=#^Q4Jw;$O!0erfz>Aa1EvX)}) zPJNXBq=*}ag7QM^lqhzDP?WdA#)_2pF0?KeAPIMQ0l;Nn81S27R0!z0&+Y0gKXMXfD;jViimYrK-k+1a1&LmS zqA$Zah&p-4iA93n74@d2ftP$kXTrntJ_IqV!!vZ6))_-`pr3h@3{MiS(h?WT&{^fU zL?(3iVdzAMaY9>Jr;71beU_3p#V=Nw|CBPND8H0Tm|)1LkU%+@OSPRFJIGsrH$zv% zeoP{~KvdCut~9%^ zq!UZe(^X^Fsxn69E;$A(gR;+9Q~CQd`N5SElqfHVuY?LfS_LSh@`A5sY4`!MY6Hsh zvK##~1?nOeez*habx5iNUuf=EH*(WNvMPuAa(x)Ib+P7;C@;Ku<2g#}HcEQ}P#p?< za0jxaH88g}kVC4C`Rki1k*Xg*)Fvc@Vd+`vxExJ_o?{D zpUyKC`@ce2TUh{Q-%!9~oLZlk?l{X;eYEe%@MrZ*mIyP+R-NgAlb*a|3aS%{e>8pi--}$KG7B zzL!=}DR*SRQbnXHz&5Sow-G?baZq79Y`@y-w}PtxX+W00t0BNDpVYqkzL-g?L{tS3 zLkSetLM}P)w?bm)x-cd1rG4<|u4|)yMNeI%-$kX3TFU7#<1=U06bHlRmVHCi}C61vNb<7KCewR12v*GeZJb^TrkU(OXxX^)g7kNn) z^n$_*1pfz;|4;^of6H$^3wz6JpO^?@z8eGG0OU%o{`wC6j<1#22FT!}ph)+COeYZi zB7+3|*bLMkA#b)xc*~ub^qu7YQP$fQBI`RNVDJ9+#Z*pM6w-z(jHeh|Dm9M7VB@y% zaTLIWj#>}D>6q|*h3Mdzr0KXyoSQ85RE(Ovk3`t(B%~Jwe7fma^fn;2p;n?5sk&!I zK53k}y7qnBjKaA~@t~VbJrZhbg$n-AcdQAC{0;}_3BUlseZzz?m;uLm&OQ_NPwb

    gAjq(Lm4FYQlXC-H6ZQ!%I5aHL5YPN>dO4ausPG& z(!zQ8?o92;yqGjVkaOk@{?H5gF0%x%k#3eO7_L>U#Djox)k=N_^xnQg!7crim{6-K z4WOE@xZ(UHx-;jHG--F)_c49WObyX(kT~%Jxz*ZqvQ(_A?Q)3HD$3aQ1A{N&xRn6bNf{&(e9aEY20;2zuc&)_GKz!j1Fl_zIVy(tL53tZj- zoKpigE{CP+QJDW0 z&-QOaK7W-g`IfwQp8SRXa_{ELL9W^XY0Cclq0i@!6^&QhuWO7Hc|kqPcMSrfqHAAn5J6pGf-S>s;EmkOEE{f`a%GWdI< znDDdN@%GgWn?436h!=3FAW)Ga1(}emPuPb?b3yHx$!QMDslMqj(=0|<~05L zoaN3*B<86s`1I@5u}I*{+oV~T^2BSg!gq0`s%iaZ{^aodq!t%m8~^Fa77!~ncwL7A zkerZg-bc9^xR%(tC^(Ob>63IiZFqIrYy>EoJVi2<8B9lx<~yT$Mxq-!dk&wtBZ7Sn z{oY_=#16kw|JO2KyhM*(VvB#pqj5Fz{d_BBSfc3qP~oyJ_>wX0GM4gsQR8~~d#zln z_Z^GtyB9E>?AA^P+_v)XpVR_UnuXbqSr=B4 z;Nw><8~S@o`08&@_N;y%+^vx^@#9T-^N>P#?yNOuJ`L5Prrqt_rSeJq)(`v5o&B3{ z(8Uz7%B#^U;rMWo^bn^4JV*p6!m`BgBd-IkjObiJX@8z1YNP8Ht)(WUo_{KsS~6s( z{%B3EbwXr#l=agwzY`mPV=-D*3F$AAjnZy=YhS|6?J(&zan)yB;MmyFx1LjS^83j zhlkE7rKP1E6QdKKkPs`CA|;vrK~g+ZJSSH)zd$r6yCfquB`P*9@x|$s@gYlGqD2A~ z6@{^@n@K{lr5_ap;(&3EMpVXNU|{mk&hhKip`m?*tupnuwsmy(^hNRUy{^{5#H`VI zJsPQ%Hr$Y%o0FfL`8_K=RXaNBG5X**UON?C#*ysItXiYkc&6h7oo+bfZ~229i5AUB z1PI|buBxQDG8Ftc7@m=9Z`$WI&e?7vUw$k|gMxW^XmM%C?}3?;#K_8*5MjlMO)o7y zz8N0gDDmj7eWooL^9X@*u4`iA=q(l^3A~*~9n;sO;k!Bz&=X_Rq0?cmJ7uqEj0tv+ zKFs1=iBOr!)~EDwTtE??IurQ((=MV^JBC!yUGGB+kb^;napj_R*TZshMyXUGiC_@} zrYsY4yk#r+E`eIwOL~c2+a%E5=zQ8$F2uC-YmCR~8a)UJaN@oZV z9ZwpsbD%?h%a|q>bHifgb{u8@C2p*!)+&Mh4q}n$+&9-x zliZ0Y?9hvS6y6>chHCiP=?`D!v9ebI#5RpRS44A4N9aG;=87L{f6IGsDaK;w5(7#> z!!Qk(c2Lh2O?h20bpM&pko<*4Z~UJ58Dc@p$I%dCe*9ud$C;sGl+>QsX+eY-S2?%G zKg`;{`a7@WTt>sNbJ0F8rpnnl+U}DCtQyLfZX6J@a?vBvo^@ zEiC}lYv+>#7kL*^8ul`$iBZVZ+)doHgV3=tQ~i(16TwccBj^ZZ&Ul=b-|p>%n!)ZJ z7)K(z_KzthZjleO1%Qt;f2mqU0^-_WcNLfb?XJe9qz5jF&R&cMRTHD z4<*DbuOuEk*MB!d8rTR)q!8N z%hsh^y&7n^~D~5iZ@<~(DFH0)d%j!b6S?cksU4PYSnx$w*9VELAo_Rdg zF39VB)%A2etwE`qR+G=(IL?(P_6b>zxpXY3({5=dD_b%e#55p{@*%MjY*bo&%xS7$ zpepTD)Ol@*Uv&4oiu#cW;ulzuqe9A)84_!AjH$42E?3o^m%=`ZvAq;1TU9wU6$g&k zPW8|3`sseoP{F{(yqv}EivT&RY;>CrSV+H-d3ciBMvf-Sf} z>&(mo))ED$tb3U#+?zY(D)IeuAOqp^)kqi*A)JU{iyoxlZuTuG{&7$E<6ekL6suYq zCSI-%Sk&E9X#NXo*wzTcx0WbmEDJhxays5-6cxYS!zlRu6#EUI0)q!V5sqQka1~Cf zm&6hC#U`OlN_(1&wlx-`5%H3TXHbBI#j?5Vtc<~QT1aIDV~Nm=Q88ae->y|OG+-95 z`4;NHNvn98J&a!0Xieh**#+GV3v{b{1|!^0a8LdW9KH;nk#X$B#4VSi_hd+MhxWtn z@>&|~y&)HBr?Q&;LqP@t=A+0(+20HqUroQ19JCPxSO+YV8F_MS)05KWijChW{jN7M z`~2>ykEXpCt4Xvm^cL~^>{3}hFtvF zKTD1(Wf?zEqT3w^|2NA->bfE%9{dqM)qgZd`iJv->SYSNUz6g^@Kh_)SHxmJeW_eM zzqme@RJw4>7}K8R)R?wVT?;Rm4I3bG2fSNy_x|LJjo}xw^nHCp+n&QmVEf`$0fQ9+ z+=B9d`k@$|-L^i;cvJbr&t;v{YCf`N|2u9P=)MpwdR(Ro{oQ6aH1@&3%haagpzvi_ z)}F`LS!S}&UTe(Q+~h|3Rl}*jW$Sx7Ongtf-_P&Y^R?#t8@Mtx=2+wjL&9dz3|$Ej z7He=56_$KFmiT9opY}|r`Y-!!;>ww2;MALMVrfN-7)@wKzcV019t3z#)vb2jwD-*hO=u-*Ec? zaAPI6x4DO~)%u|cyYg;@3&s(!8%8GiMQWx;qMW*6ZbW)S`xCtLRu=JF^oh#tj#}-B z`q&-f#~iI;ADy)s)fp3|OdicsV@UrMdFdv~Z^FQo&Cs0f-5)TfnSG48VT@#Zw3MKR z8#%43QjER5pQBQ&ouRiYx&1k>I;M`en!e_1c{1sfXd>U(t__0%q z({Za=2C2D>++BDX=rmc=h<7>uv3dTs?Mx&^_N-5U1m|PtG63ol1eG%Dr8!g!Ee(VQ zM%J~`TuZ0=6626J<;?BFwlhNF8I8xj!7u?!>^n$Y5W*PoPfFH#HGW`HpPR%D)|*$N z`DhrJ$eJ7rrk*<) zKcMs9^2W3iza?ZsN>9yUW8+y$1u8QlIT!=qrBQmO!86mUTGNm>(yDLLn%`ogh%(+Q zrJGx%|IJO0k!JrXtL}WuUhd^BC2aph&Ppi5W-O;#;>|W$i^&uJ4k40}Y?aX*l@Y9D zR!Ew`bev(0oVoiNkt~W~BH!nd7LnQXn)^kG+ops>=TOI*d&c|HM0T;BXa6HF9*As7 zj`Lrh4j)~Y=Gnc1|)1ii8_r=nwp6?Ntr3RA}l4vz~+ z!VAAw(kBt;qTK*CW>D;S3pfB?BfwYL0XhCzxNgVN=YX7ORuld%L6!mt*(@LX8bi$r= zGh1|g_V&^}ifp{?bONz-as_m(83R&w8tlLVA8$p!&t;{*%2;*E7>vt*W4vZ_)FsX; z0!gE^IRF&(m=#A**T@x#GG+dBmYKnl?U3}M(x?+-O_oRO-Xy5VP|75(uqh;%Ut_3B zwN@V4P)QjlX$4|>z0_a-WYvGv0hd+scUPq@RjuomSU8gCI-;jo(8=K!aQs(zS^?5> zVku8I@{niZ%a(f$p-(6&JhL`=$PRUscO$M{8>Nb>XLvnjD_K)3a$A$^SaMHXcMwop zW``in-p=q8sI>Zw3~~pxzf_C1qO@xPY{6I`(;T!sGOMIBj6C?X)2O8MJ;;|s!G3-n z#=2bzB)##_M?}^9`m|BHCvgN6#BEDo7;3SpO4LH*ME5xnsm( z>Q$9;X(QKcgq!b@*mRK@pEzbdL`i4YXWwC&OKOqlMx} zOD03>KYT3s|IVP{ltk@IgvXC&Y`;x535&$q>BZi;ACZ|k}QZqN!39#f-H8^K_m_&b!uw?w_}pAZe<{(&oQ{ptJ~4% zycBmzKV=lUeC`x_>fB_-$Q+gRu4GlafNXqoCyMPvuIQ|}>FB=cc$0{;d4u^@9Ajv$ zw71Sk$pU|)8$( z{T2mwt%(t<@+9JA$|CgK=P&UreslUuJiFA?Yz*iv?YsYhRWtk2XGiynUUl>!iE}DI zuyqI?(^CZYr;Q8n@gsHe7`m|c*q$5ex*z&LI*h_c6{|QL8-W-)9Y7Av0q*V${n;G; zZ4-ViKD-#kUPHj4vQ8-}J!t(BxTe8~UTE>s`gKUXP<@S&EXv>XzRRsZDVTX4+n0KHhk?|Zx6>J z{tJ-f9ZL5=CI(IUa_8!CV`^`H5YQe!=o!BZ!MWXd@P1IBD$a?&rk03G%wHy&ifHp<#c%T2R?v7y7~W zvcG0a3bTII;WdL8bxCdw*s~%7_${0kxlo)2V?fqGy(}D%orKl=*rcNMU+g)t1Bjvq zGP)z9Xn_vvQCd`h?Qj4|P+N0!Pmx_uz$AwH6b8Kd<4)qoy`YFM)OhshkhD|{+eHdbiRcdoV&Rpyu1*8eu$tTL|7Oi(s(b{{4mn^d#w3w zqUE<#+w*k$%M8cw@sMAMmUpSPk2$Wlxo$tx?f>SwJ>|LoD)hQ9^g@*SJ(c<)DqqGK zVF8&^Bcx5)w6EW|f9pL~lV&TbSWqE)(JPRZWep z^@xJb+X)u_2V^Yc#%cG1u{bUqgU&c@Mp=5cH!;+omzh*V$=|U%pW&B}7m%K; z?Z#zPYNRuTlw;3&Ta4u>+OSs|Emd!n05fz7PuDFBvPeg=^*C;lOnT@?666bhlzz_j z#;boGHTb&2?-91h?6k=#+ZOcn54F*^b#K&;Ao4g-=UQ`?34*sRavLb6Q}u}(YWt*88O@kwK zWbxnP8*^nF;*-lsGgUo7 zFb7neHTH&j68g8|p~vE=iw#V5)A;^=EhPRqq>iVUXv zE?RLzb}BRc(v9o-epL^+4!j$rx*q)99Mm*id#f7zkss)s4GSksYVN=6ZfG6c5enuh z!cU~aYnXDyN0q1on@eI>1Z%y#e~f>=*JeU*pIvLYLfhd zg=TX3bdTVgM771KWzj#pK_~uA1y$$hTdHIM8Wn!7m{qMEdcgtxL=QnZqx(z8P2XV2 z&Na&decx5sg}#uNT`gX|54Y+8(9A^iHmmMw(B zmhm+O2@S$J7ma$G7pg!F$Ni+hNoOn1BEv~WkbyqJ(B2ZGa#=V;dOV&hoz5Uzcu3+k zJ)BeJ9!v)%D%KgFBzTUq`q=`T1%Th zpQcSIM#4M|8Zro{o9f2r#U`W=@W^5|sS%Q2yiO7HuDk|Q%zQ%9VThn6VZkwCchn zTAjsd!#HZJ-AC%cn9yV=j%n=wIlJY0uIXtyZCf1OHz&e{9@8$3%T}_vyT+`+H}75? z#TTCi)oeyz?0n?Yu}6uR1XzK;mis2=p7-Rh-BnV7nYdUx^z!&L=wNQ)PjOD!*;QeJ zxikcid<%okg6Gv*kUXhktxx4_-@d$XnGLEHQWlEeH7snh-D5edZ)Z>A6|m?^lFx&P1z+ zNE0-WusydK_ddPWoFTBjJqg6JNmcqIs$b2=nKNMh@i2LA*I_Pafau%5WC}#6>YX&& zH;D+^r-vySp&Kl3j2fx)%+5IE^itpX*WJ(Qz%hs3YdwZXl|^Ok?r(%lb(5u z5PJESa(fu>qhPAS>0g$sRTZK@v!?&W-dQz7!G-O5W?<+TKtj5tOS-$e8G7jM5D;+a zM!Hi<8l=0sySr0fkWkUte&7BR`(UphunwM82kW`7D{i8EZvKKjFn}NSrlpjkdi68-~xfrBps( zubJxE8|!UCquW{xxGiJr@x@dd}@RF}0lUHrGiY=!q!6E0_ZCW;z5XA1aHbk)9wTrOOA zv%!%S^=B@=wqxqx+ZFpckY~Ubn`D22aj+WCQ|QG@y*OV`E^jhq$z*J03%3H|o)pm2`01pW@8MZs z{7G;UA9}**9I*OPtTp&r!1K1kYGh1>eGqnn#KW`1w)MbvR6%RY1u`l^`lmFnJN*|w zrKach+eGz8*HW323wD!*9=Ca+p9YIQeZ*r5A@2uzoq`<3l&$da{1@=WbRfc3@9k3iKQe6KfBaAPFaWG1;sL5m1D>9!qn2 zhtc_k`e;T8CpkT3cyeme%9MM#E5by^RQQ;pVQ3)~fN+s@D-os;y1Ot5grA)eF@-D% zQA#___hQ?c)_~nnM=g>FS1GtbJ3f{rK^SUO_`mPX=;*$-Xz}yt52GI!Mqr_6(VW!L z-`Z8q6{39hKiNq}sGlQYpwO^2+l{nJcYlaKtFXd514_4Bd1ge%evQ67i(JtjF!55bmP+UE;ac5s?+06LVyz{C*}r{|atLjK&H6d@CyD3OB&_ z^Gy~lPbT$`_lks(T!2JTQep*D=o);CA0T3t!X3%hN;|ydAUC=b$MJBoR8}arxybDBM(y{}H{M5`WSn zD{4^zur9nZW(A|sJ)bGvObk(FRlZD6|jm;ynYo$=J}|A;&r zV$9?zyMPh#N_pK2l&;CS()KVZ!AQ{zShrH3UwQlxk+(P^>9dwYBt?T$lRvCw1K7jw zDeaerN1W=smP1Y*k-(I$98(}AJ{cn3`$QV2vae^#7u!ds8|Xqfezk?@^VB3)xq z?pb=IgBwjKejP)EFf1{?vgo%wzFK8k0DqAq`Ul$1WU=R@#PMj6^Fr{?47LE6$eHw3 zmM2Pi+G7WJ(f+eqWl7)KM4qSC!qu-fDY%}Xx@=1ANZ_mv5^Gp@)7@5LP@(ySUt?jVzuU;ews9RS^j61N*T$v){z&=u!__rKh z4X{$Xl|*U_@)5r!D;>k zQ>GNu?((d>ApjQrD>7O*+Fh59Nfu&yPchdK6FVB09Zim!Qb|54fvrU`mt$|-kj;-# zC{Z36##A~ItI}Iad&m>N{}bLjY1Pk?PA8Nsy{e_d1!kuUPF(`!SmW=<*wsJ_exiNB zMKf)+u1@6z9c{LqjJB(`*jOhhZhQ)uAf z(|M3(-#8Sbfqjea%#b*(7ei~PWp1F<$R6t2hfd^;Y^z`D+ze?7X?Bu6%XjyrEjy;5^9byT2$%kp( zc~OVuJ&<4U#2dow`kka<_&4?h@9%YghFa4m>BQ^Fi0FC6bycw5xBpUjo1)T@5!Zp5 z65=O~8cL1k(a#ZU-5#CGWuV!~^o2H2#OL)A?#oai%R-g?`<*lw(}SmTgRXl_W>+kx zS^4j-r0Pz(vCiQq@Z_P75T6$pqpt>HipiTBIkZfLThgZoB}S*ss~?4x?_S~M8;2#p zf+N!}K~FD!M5jxHvs$}1KDHNSGyd~bF9gJz$kPRff#D53K-Atn5wG7}?0@1ygav%M zJ9Disfg(`^2SjvVq*0X!`|hvoc3HiCvGx*dGa|^GFIfApjD2_F!1JR};g-OuF*YtA zFlPxZpLXx?Da=nhj*lDZFB;QU%C|L3k-{z=dTQTYry&h8o#}5w9Bp%hn!v1dE}#Z99uXebpxyw1K9|O7YI}J;bBzc zN5N4Yf;Nn5*9^IujEHwL8X-(ZWZA|Ko&%%phA5dpN6&sFg2-o%DxWhMx%i}4EWy15 z5^8x!g(@x_&w_K$fvF}F=4k#|&ea|y(7c+VI30HQ9h(O=T4J|YQv75}AoyTx^0BAA7+;itHNXXB%;Y|>?Uaq@JW$13R46Bp?bcc24hwXjH)Z=e zBSbxWq&mAx5PY^h7cZ&<#stwLvwzS;^1??6bl0sUG?L=c!&LLa`7=*7KDTl>$1pX^ z#WVkNYQEB02V(|$h+v!hsmlHvYnDD=kdA(?@Poor{0G|k`Jb4x2hK}LVM~yIv2-jU zv0AY??PV^Pp;_%^%%Ek>TDU&-(hk8aUA_h%7fMh+sx^g?l#fQ#N4Y~)uQ`Ji?Sz%x z)MehJCAyte-JWID+9mm$70%ih?(`!pf$$)wd6nRA%7NA)t1!QSO3Mw(R~Eq-SgTqD8I>9d~VjAus0g8*V9}U z1s~a>AH}%Dyq-+f#9*L)7m!#ISd442#}r8+Xc5mBRl95BC;8gkw=LnFEup)u0kQ3o zovrw`c}UQt077oEHAtg7vN`q>YL)ee%e5B;7uW10>oExp42cw+AE)0rMJ*6psjfE>CF43H(v z)IdK{xmE@Rf4?5^i67$D9RbA;c=AS{6S#K&gv5ilX~hrLW{wRK!50);)U$y}>8p;| zyIV58&o`?=uoHvcU7^`ioP)fA3sIcQ3)3B*_z$14cPe@}Dht5Xy}Jw?=M0)V4jkJ;nkY;*eTUup?Lj(m ziI+b47l+*!*Eg4iu5I+#qp-leW|x(ZYKJvu+rr{EqK{W4vnQf0n$tV0Uisgm_?C-n zZ@6}Dc6)dCajxY|w^RPiP&4uHl{MYCu6(CFFy+`D+(qJMyPDURL8dx>oDt`+!#;cnDu6J*X|NKY0|DE>x z1_feo6=FKE6tPAAeJ!-7iPLRa@Ad?$3C57Pg2JI6zRzbzTGzHYci~F+M(Mdkht&J-V7IeT=uEg zFT8Ak+FGt##q?6{UKBPY+OJ8o#T<+hlfdJBJ=M(ZqVty z=mth%8*^H>VLYP(nERfUb4mL+?ek?u;dR#MjW0nfj6L!!>_U7EZ7CY2=iA&~3BNq* zuX7W&Hw*ll6j0gwL5Do197rH`80U@dalF?HRl%?4o?j=}n{}KZHtU5yd2Dpevzdte z?_>pSelzRg`E{cP&iu4Y6I;q7yuoC>ZK|wuFz4fajaku8uWckzXmRpKbU$@)AvDPU zo*vrpXi{{ic_@?SuuL=>At6S$5!O?1p z_p(E2Z|-44A*p0@!AbAw zsusCC!f@CFcrO;qW6neilypaSd+!)m%jH$OQ*s}#RLl=mpnWze* zpVtPg1_S8marpzh(}pyX*4;3iVgCnC^YHE38=|`OlA0mtjYv7yI@d^4sSDX?mvY<4 z8m+EU6^w-v9k=vT5oPXx^^K#=V;ol7(StY8U zx;~>I0Br7(tec<){!z1+ek6P`d-cTgUg*`pXj-S+;0=pzbYF9lN@8QPHB?jTSn{hz z_o$=y0!B>x)+8%lUBj2if`*}6rZz`w+_7fgK-_4`Pk9`QTajr@G;s`_iW9TCmt4wQ z<Mg!H}@nFhw)ZzjEz+?$Rl91#s=0g#XaUlx&Np(># z)jHYJjE^+z&voQK!Y)@$yc(r;Jk{bwuG^6&SnVM+b)d7?H)zV7waeOIftzI=W|suD zvWQ`N?y?^y>2LJ$S@ZdH&YVy14K#&z(izO<0Q@}~bC$Ei#G=%^!!laB9JQD8maR3K zg*WM|_+tG&Gfpid{5n>gJFV||{JV}SAeuSuXpr!cW>fsNnZ_Nw1D`qVx2HiF#S!yX zG1QJ?KAff@hDd$rr{%Gd-Whll%+DO0yyY)M{-PU~|y{=5qF-m+&O4{Da(tOP=I z3;)U~-kW7k-dJC1;3l`M87Dtidsggw-VUW|1yVHzffAy zKGyDCmc6Era^?i@-Gd|xGzJjYaR&Ovj<9!nZ#HHW-fZW7694t1vW@cNK;;}ie2}V~ z<4F*7h~~r@hb`^OkIMDcEhxgP@IOg|uHQ49%1=#$g!r_G&{gzHWtV_VWWpa23DY#f z>zm7k$_6|TvAQrStb+-8KX!6Q95aU;-PVR?NhO*n9cn;2#MZu-6z4K>W749_721iv ziR+1x29&a8NR9eRPp3M8ci68#XgQ!@hFmkJkakGB(Qm6B_6-kxKwbn4Jizow&5gM} z4-uGf3vqpa^tMnomyZ-%3b6H-vYvMkJbCS-PbJEBZ~iEv2fiz>`9>M~=}fCLxy;sWyGvFM}T3 z;=&(o;${!|!=||dL{-<9{`xY%e2q(OyeDS_!W7OB?pT`C(Kg&tt*XYtJYLSRbLW@kfF8&_ z4c+*JMX^yCo?PJSpe3iHywRdO)AQcB@ng=!v{8xBIFK)ad3-~CO*U(`s^D@;m!+${ zlH69u-7`M%?n}u8z!z5h9i(e~ak|zAY(*qdYF-<#UuxC)@|75{OWILX>yN9ee{+yy zG-t#ViQssGDVOGYg+JFy{b6%~{x))m@n>h-D2KK^7JH7TFYd^v3Nil*E&gJKA3B)a z_WZg-od9`AAx3nE)^NiOt>yv>`UaTJ+0(MPp&gur(NC#LL#Q} zQZiG&YkeQ#I2~{DYn07))>r@UCuJ)ACI9ws;(PuwHH`~{TBEr7zyTvT>W9`Q09rp% z!xSg zNfLAyXGJ3TZ43vbX-I9Ld92L*-Wb8AGKrFtU4dr9EGRu=SX7h6Fa_XCnuwDpI>}raZnK`b_0!fY5<;BXbv&LqmSowB*YN_QjY&cA z9Z%1ZCQVLnK$0^gHvJE8)~_aAwaBuu*dy<@H?h{Y|I9r)|(wLO2bE>+rBhD(LM_J z9Lg-OLek>(hE4r}6-pedhCr>QO}-YbG*jM8{hG$@LK6&IZ7#ple;;RvjYN&q{kH{0 zG|~O{FxHA}cI=R`9ywY5ZPw^%^NFpb`{%BAb85+YQ#(rqY zceN1um+i$r7z6nY2+cz zqI~wbPnZh~72MOAADhr3(f5sp?7d(}^}<6n-uP33=|f)uH^kJp9(~0Z^`HN=Ys>-O z-AQmlL6~r)^(K(oQ7H1bm_oGxhI<&v{CnE>g%}$#!Iu><5247880>jCw%-6Yq$%!-srJ{`_$~3zWCOUKqPaiO?25}^hEmZl{kYft zSkpipUTJ#zK}Z^r2(#1`2?et(Lz@s?)o+P4D>%wsC__6yq8~`!4)T)e;qVI!^lHX{ zcA}AkimrqZ%+#HQR>BHlJqy$!r2Qba@qX-ON$lf(y5=GB7yL{Z1!?=+X@Az-jRD*@ zA@uY>l6Wc7W-bi6rmM-8#KT@J&626&vhfW%Bkf_yA2MRyl60zr5+<@wWN0HzdAo)L z{`b`H!;yGl0N%SWl>QJDdpPE}99MH_nHMj85kR#B;8NX8{achi3r?8}*fItPzrm7} z9mKL8o zA`MSLZ(>yL$B^j1q7ILdHpqwf%X?bmGYJj&y~^irl6D%QSCh1%z~CIyBc_4lC~&bd zMF2t|DO9lpj-CYe6wBG>P;Aq(Ad{{*TO4bUq+k#k< zg`?Z$RJ?_dr0MV?Rr==X0XEs__kBa*nD4YyGhnI;v})GBNCrq0r+BAKN)>x`g%JvL z5FfARe@lT<)I;Ad0M<-_lDECfQslJ<89M{msKbh|hA|G%`>({-G%*;GGiJ|o+S)@~ z+gr`FWHV)@SJFnE-vG(!m1k8a=a6TD7la;U8A25`0!=h@$mME(P~YZ>e!otlL7PkC zlDZn#_z_qTLoJRr1I!#AYMPb<4oXg^&>`1DVtMja-m>J!sx&96d{;G5_xYdEBq-F-DD?&p zMFu6w2i<-#q(L;ud3KC~8GHO{hjB4`9V!R}(O zJOWYOA?Q2(94Cu3uUQeA1DzODMTcZ>9~BOo`sv<;tT;=NFT-glw0W&cB;LtNr>;uv9*!4QyYYV$FpHE$n3*bGu6&o`lSvrfLgToqCE_XQz%&@dx1UFMS66Ca6UnR zQM%rnmo@65=HemVEjj_=*G19cP_g5FyN#l z`z59pO56_3m&yg+(@nh2FmSExb<2^rhfu!&s|evpf^Y)CkWV|C)aOR^WzFPq!1XR* zx-2x@Mb^PaaF{$4$(UtiF(kHj-C3K9Oe=Or*7)5U!yZDz)Ur_Kmo1{KP$EUc3_akG z8gNK2^^cpiEqIkyfcX&_@^v8jcqsaxDfFJuua7G@4l9V&o$dCr_lFc;o4DFHMr5`} zOq+Zrz8xp-?Yw(|n02t5{guW!rqJ7LF+Bw@ah~khz3w1O!dJz1YV>yMY<5<$L)S)j zJydo#dv>;4)H6#r|K+@^(pTt;R#waOREC-Xf#(0p!6moy?4l?a2c(pN|4G-YD%-u3 zqbIF4Cf!dwHPx7C#sFD-#tYp)NWi_~+r9X@e@wUodXl)+6b8GlpvVKNTK1~dcBtmf z|C*W_{xJum!8R!N|JfFhGIm&BLaHM`$bx`3k^p``J$iY-oAXVaN1>u>0kEW!`OHYO zHNfOY7%)#b=;I->;32&@C}?DF1`L|@Njzk!L*Nb8Hwnhy*c+VrDD^3(OF7Z;qJ*-4 zrM%>`dQr53%+kGjT0xu9ScAveb}a>=aE{RxN~9wL3ahu2hqS)Oe{7H#d@becnwcVb zSs0G}`Hq`pt>q{|lq5$;Fr?sgJ#@j)KXM^Sx;n~Mo%HZ#5_f?%dL5K;Va4Bj{7HH$ z$<&SpY?zQR+Lm;k(0X(=b@#0sg*i%B`&& zeuM39V>yYPhkk7OEd6ZRt|*5?%3l~S(U}KIQhLF8tiDcsA}{&Yc_N2p5Vk`N`)LTr zIiuitxIA3i%3h$9R{(CGRC@mP=^}pgJtYKC$6-&~u!-cShYkz-)T1Y#Xm6q>|1B~E z9%R`})QN771b^qq1c3)qSkguRJHsK#(%dw(C*zU%TvctB6xkTQ6qzs!R)o`lyi$bu+{b- zyK!{pFA%7SRHh$>#1vAU@DJyoe^n#{|NJU6|6nkyZfVeROjl=jgcGWh7}~JAMsR*Z zA`ToYcNinum5_(<6O}+_OP>XgvYuehPgmC*N2~{~ulOY&m7nwBsd%`8qTPRRL24I z>%Hj|hodFI(U{y3$QtIyb#^?TLH^?AG`2`g=Qr#M5BM6_55deA|M26- zjREqw(;kBha6hD$;ikIfj`GZ$hQTqoe05fw_*vBYTv4ovn}FCm&aVM~8|> zm%hhp(;f5OJ0v)WcHCQk&v8c_K=WaR?!~5_?Jy{H4m@vC3_|H=m^9(7`oILu+((d9m#B0gHd{r~!7s6aTPG@uhWJe9~`kmL(& z0Q3%XpX+N!zePL=8kklv6h1SV&ZHSG%M6bO@PRTCMY-O{$%QE5H!JPmInHLt)VQ~J zmW`&f>PIF~&>q)7s2xMPp;xP@CKR40iCLIy?EgGXHfcAk;m!v2u#sPKSFP-3)Z)Pi z61l3h%CQP90@d08!V2|FE}O;X7=OFa0*NpqawG3bt8%qM-x2N9frNEI%RPw5s`Efa zXV~4}gD!^{0>;on_@v1AMkrSX=UhjN&-%GRgW{R8zT07&N89gtkG0y}yH7xwO!1yy zF4r3&$p5h~(s>+?`ZE@elSe-E*EuZ~P;5QXMZ zIg+Jl=m&j6K0iWe@{&;2P=ZQ|T?T|ZI+Mc0;Ts8Uu62ilF>E1Q@hrwyJgTCAwcx_; zGk2oEaFM$$`c{T11A4iPC5}|Nq`jUlsT<|b@cvY36RlKY$l*Mk%HI1z0ZBk}4S;0E z1lR((xxY^*!=Sb%F|v*TB9q8WbA^{4`S3*&&M(3W@^Df@Mp}gO6n0W9JP0Ep6SEDL zjWXn{98Emp#Oz&5oA&IjP?ub;BfvQ*GO6=M{F( z-yF$?A&fU8vKZ|HBX|&2hztZuy)9|iZqzW0pJfL0RLdWbmBLs0cLYll1KCAf&BHzA z!U$m@>Gsg&i&w&)Wlz4QZ(Qb#UJHCfF%NU1h0k8tQn>=neMePfUMs1aUEZ_iYR?|y zSn(#`Y8gM2--Fn?oGqj?z*m|eg67wILV8~K=njM%FgE_W!XRB2QehIJin$I8Go)j{ zfs$D6bfx#4CRo_#FRH2EEStnwq>YuFBue-#IfMY*uqh=Df{{f`ts+o$}uKW?Di>%gc1%S`r zAM&d!xwTxr7G)&Km?v)u(;{n#V5C7o!A-Qbb*YGoKyf00l0w*MW`w}u$(Nf7B$wEXh~vyYe;9r^EPX}+rD1Y|ZX z@*U_f&!R_yPiKku*9SR{*qbVRQ;JHbV{CHcI#|kElj3KVvT)rZ!ofYZB*ro(!tkjvqhgDUfw)LX z-B&)aDD99*#b23Mcpujx$(kFn4<~ZO4G3$76Zer2aSGihmt2?AEv$zb-g0BgveD+> zlMu=Nr=4)5TSn#3KIvVRnt$_#QRqmhU+mH)ZvB-OsTIB0Rhm0x-xF^SkO1hs>rHw>40UlYWShL4ZU+ox}Lsw2gw$uLZuG zrgHLkl}e9M+UcW>WxtV`*{m+Lj8?rf1=uejRFm*%4vQ~arG%Lro8j^0joFFerF0AX z$P%hL>UORO&C? zhcIuQ^A+nY%h1z0c}0vFJ<9^#Y(i~eU|^SLyI|g$Kfbff-}}`*RMmVRWYv8#Na2csCPc&bubaYf4cZyXGdg?c;6F^`6=iZ;40yvuqT+Nv!!$uk*4=V_Q2 zUzR(+KKkZ5KXzpNXqMzY2`ei-ljtoO|45dfkdVoL;>7Z2Lf_qgjo7^2(NoR^{p577 zx_1H44b^=m7^>aED@I74^;734#$`~EyS$uBajGvywl-ql#@ng%Mb7#CedvE>$VHF` zXessLRIIJo|1Psrs4Ho%reQp5|Q%gf!P|MuAt;xTlu9lQ$7p_|!HMx!#E`rSLYw8{yc%}>N=Q}hkDQ6>p}p*@Aq_5%#jaVYTJPcp>pN32ZGNv>YN z5~mq^-Y3zkF8p7E8u|9q!fhSq0Q$bLY?O%BmUSBm`#mIym!Z!e|NGoma*UL#HjNr= z9RAtGlXL0?P}sXvjmW$z6!|@u+0hfV|K}5Xu9vw)YMjX(?H!gsnl~yxB#ZJ&Zh+!1 zMGE2rx!Iqc!rGID4^;T+usc;xK5%h zbXSPV+f5`lLk^(KFGH(|fPHvHL%*Fkk%QeUE_){8xk6eM-@-o)6xz?j$UXoBjFopy-NvM+?P_hpJ+{|m%~*3X*u z9SF!+kjp5aPZw)RA6a}uGsVndR%%bn>PT(YP0NH5%a&q^pF_(+xl1}rQEF(us!O%s zlTS5Sh}mHI&_l70ox|-&!6To~Lrcr6O!q`n!k4(m4Kn6YKje_N;tjUqiyh}9Qscjz z;8#8{vNl8iGU6qKut4|ReZyaXX^Sf6nFrY}`Bob(&O#$`SR@f!Sc+CEO=SH*aSUM? zmAF-rOriWMWKAufkKa17t`w_)LIt`1Vq{(D%QX5^%j&w;;x8WNRyMj)l^mezxO+!V z^~|y;sSdb;3y^aWB~|NsL5iXgYrf9 zQckyEOPAkVZ}mVgrI^U|-JMUFvZXQc8V8u_-l-u zlaeeby0DK4fg|pkf0eYmd2^6UVrdmSp4PKV#<3NB4X%GrN?Las-)!sLTi)1l>Oi}h ztYnECS#BSz;HD4xbe%xV6f#0G%MKp(iV1PYIi5O+v44^q#x6)FgeoT-rVz$@;Q+l` zPZL$`-s)F$WMTR;Wcx}_dHFE9_>OqVpZRfr@kcQrDP@dN#Q88dk=xJcH(BAAWM{}` zSFbs*rV0NC13-$7x#n6;XU8<}F6sM`({`ZorKjQ>R@Me#OxW%;e524Mb|>7Dbns$2 z;#LptaGp|3QM`{89?9gxff;d`8*xhmS6q+eXWI2Yk5fMXW&+&z8vylZj{LwT0gj)Y zE1ohVjEel_F19sq@-%wIn0wWBuZ2{6oJSUVw9~#s8K^Q7F zG2dujoWI*l=dNtCcewDwMPiadHq~&BFDR|Fb#grOmQ_o-(D(_`ZFbD76->Br@moiSd5qgAY2HLG=*ykfor-NbUKq8u{Rk;Ouj1k^?|E^=*uWNGbo?7dWUy*KvZ9opGpqBYhV}w!k#dx|D9oJ}Mtw7%lk(M{&AE`Dtx3!o zN6vZhRPj%cd7GKDRgb2Z%ZQC4xSuo}6n#|D8yET3F`cxq>9OKm)o{Pk`MjYdZM4-nXE4_Xs_LW#KoXV3@17wH-yLDk zRFPU|l0Iwh-%6~T^;ggS68?6LGHLA}ZgBK$eOG=%`izY<`_P$v@$Gto$<&(VY}>2d zHmTvK9G9KVshv8PzvsH$^QrU54Ts@_KgqanbI z^s@LQ6nxsLQS9pK<9(ZQ@wPk0wL?|;;_$M*oWs|`?m37fWze-~oa67jYpo-PR||GF zBwP~98Pw0>FX}*DiL0y>U2#e7jUUr7xck=w{4iSW+M@MCc=ktZtT815!rFu65cB8Yz|922y`DSMecxo^T6rWt=uvT zK}rm8I|mSxX{5mT?(2akx-Gh20aQkQvRrtfbYQwXFk+Q39s@)&0IV4RCXMPanfnuE z;aFt&H{aGdprSaQkX>#pfvymvT-_ctQKcnhw_u#88XO)j+%?jhKZpiws}snT3!aMN z$Ja;&v@y7SG&%|f-r8c0G|n2>Lbm)Jkw_y^ml<(fks`iD@6Qwj)>V0gH6}kb$!7&3 z;$$~81;y8X59qLm?1bid1mUvmxOT?4ybJc?9r33!Nc&wRb7uGK1+Ezk`Xz$aoQUqq zsYuLIVz7+94-@AafWwq&X8}xCZFGYUS5o&=HpzNUuRFa~;r(p` zSQcB1-?QPGvlCCTGqSGhlX1@7YjON%j{NYXOW@LSPslY2l$25^>eqk`+ml2|t0L>U zhfIYh?dnfWyrmN7ri3^HQ9Ab@E)H8ZjE3b{k*uTy4LF5z5nd?0io*4W!rv7|<}O9X z9t78D#Y%XD1kA+a#>91Wce(nj{WK@~|6Lm_xOoi<4N@4!;mG768by+xSZwz!@J;9G zcx8pNI#XZC5}f4-2x#IV*;ZqdC!~H zwosh_J7h+7G7#^e9ZUKSfQr^nAo-}!Fd%0 zgM$4UpGF3Mbl#J8XQN%cuTvMl!<26{@_@C@sI|E-8CHbiS1DbI5K?kUbU#^SSrlDr zNiszs2<=)5Z5TNX1tZ$R7^_fu?%Qj`6Iq{P&YLnE@iJvc0doYEQ;ClxS#{Lz*_x|u{= z2*>stSY0T+uQ8UDCS%V#&Fv?)c1O&o4x@9yPsYtD3P6moVf1rB2a=G_WFy*;4#%um zWYHI8CV5`|A~7#COZqZ{L_yP%AK1b_3sGT3&**WuWyOVjUkHRD9KRm;e%U|MKe59C z=0-{jJwBG+C5ZTiei#NGzt^1iQ;-DWiJ~MEcPPyNlqZ*}s<)KX`Ne|&L*}r_cfN(_ zyuaRVKY(|)wy;t7duLr#X+2UG4%$aw$Ztn7k@^pZ%}p=gP({e=M?4gN0LKIVlm|!x z05m_50bszt?z{hqm)`-30RNwTfT#*V)Px}#q7dI=5FJ^Fo;*ZW$6-#_abC~qKoMf3 z6fyA?F;#__sX;6>AeO!%HaifzJ&2-#%P&LMm6H#(v(Jr-zgt!j9h-=*ZA8y5Vsv!$ zZ~$>Sg1DSOTumabrx3R@i0`wA`vt_qBI3sq;{US`{%8CBzcK!oeL#+8JDV2*>Z2xq z87Yzp0~1ebF(rS=i^3x|l7-$;4<=wy2~WRh9S(<(h-IX$Yn4ny(w-$*zu=!Jrt=z- zdKw!qMcapFUFlLeensCX%14t-jQfOsbwN{X(9%ABiK5q zvuI=nbPNo@MteLG16(c=1@-+1;Aj51U({`W)S zSlfp_vqt~%n-;HU9Fb|io|c5n-GGOmsD;+|3kL-OS0hn{p}&0WFE29 zq#L?!oTN#_zKtZYCiSPxQLgJSOT86CXH3^ytUO8j5Im7z5J=>3T9{FWPUp8BK`ouM ze-cgiS-`i#AxYF|;nabSW+U0!##d-G4{C|7)`6|t< zfRt3W>T-o8t$vZ2wYGIJq`J=X?y{PqUt6e#WF*qJMs>ody@q0D6oakVM!l=LxyLuV zwqe;fj^*0|bKH7@Kx9!p+Wx`S_X=ucEa}Ak{PX$RQ+-yH1}q*`#<%`iTU=no1_)T4PGTLVQNHtSa6o#4pI(MDJ5x89W)-G&W zJM|;r+JAlb!<}JVu*i_vY}@ZPNXIVy-Jsn}<%#AeIE7!l&F7BO_=%)!U+XYz-@DN` z4Zm%J^6y-2HMt!{V*w+&*&q8BF$8~p$(`f=b^1It>FI3)=2(W-_{6tpx-*}P4 zXtHY18K|hO|4tkBqH}b%TzjqrXmdvl%IR<6doxWtBXJ zGbRf1rFRS9G2JtQz9#{xMB3#Vm?Eshh9WQKT|@(maYGbksvue(LMAk8MuJ=wK>+cr zI8whP`7l!YDwHEDi+$cz7UlsZmp;qFgFxEUu7Nszx}nWCW9Q$vrInQJhcifLEfUOXhK6j$cn#inwLP7~`@qk>QOBHARKuLkAzX;t!ll`eI=| zgO0bzG4g+ZG0Dy-E$6k=xW?wbBm0Otl04x3^_iz|8;kK>8OI|-Ja3842;=C|!p&!0 zietUT&EjEZ@SXL z&h=i?Ip*KdpgaRM4It)y8LW>S!}8iraqQM|U`#_H#U~hAe!9)47(>{|BbdTH#PI}U zt*w*q<5A--)|2z#+R~8dM@R^{Me+t zZ$Q;bDN1`dIUylA*J3qMM=`E!#D%>Yzr~cN;TNAwZ_P;JkRS@HF0MXW9A_8gcq9Oz`n0~WVFVku3QiP;Y14Fa{5wQ zk>|?GXgwCND*3eq(>390X)&vID$O!(I?|o4-tp}Iep=G^v(v>ta%Q@RIsp#;w6lLX-6{V5 zk2n4u0iymzZGut5&+E6yg{#yZwtbFLMiJBdLROH9gvj&{5kry&gKWj{(H4yV*@(x+>{h37v}?BZtb! z_|b3VEY6XgI)Y2)B<@Shp-<;ucT6RoGUFE~9?82hPpb%juk)EcE!}p9ClyyO3xlgj zX>R0=+~VKL7lA44i*Y!gLbTp|Bb~6X=c1gxSnU{_t(_9Cv(c!XA*lDmao_Le06c>~ zEtZ2QtIfbd>H3l!QTwEbKHvH-qUL$i4i$mmfe+W#Huyd(U4NS!3&n0mTt9A$h*xN3 zb|bDfI(lY2W*>7AffTFtNavd*%bZ+6%L?|vt&^SMHDidYzS~foZL_DUcOPQ~K&^Hk zuLxb{1Y~8B;Y8sC2yF-BB?gU9f(l6&cQ&aW+f|(EV1NNs~yK2{3>%MNpBN;Sg9IsZ*KT&@F zq5{qspsl*lbAC_JR#=v02q!dzSue=6BG_Ba*S0TkA zP-$%fAcg{oeIR}TaZeV=l7!W?Btba%J#9GK3`VX;Hj#`lpV2@YXvDUx5iSxn^)00C z(9eS)+-VsoBNWiI3fx=`vLu2!w}$d?=^nM~#2kf1AqBWU{KpEw)3MN$gT7h;oaK>H zLY|2gQEm_f5BM6;c1`DaIa+SbfY0|8fiTf*3*>#a@nmu)w1Zis_|6U6YuUw?F(Zd! zBY81;7*|4E7{eN#4GV=Lo&<0%4oxJI4U&;##D!vtbYg6Yq1ntXuU3EybAWVZoTpuk z^PzX*T1e%vPB6DGuaLQcSpY&u;HX~oafGKQam*~T1CLGk-*$t)nFgJNiL(mfIVb+( z?SVWB=B+}pj5J2r$d)V29v(%pP--No84Ok#F~O7sluI&Yj*tfiG$MsgWF-m`CB{aZ z#{WGw2_BCMXUQs8bd1o0f|&z?euYumIl|UWn%acbkR4o>L%cg7^2nh>C%FRh zp6H!XHg+L7U|ny$pk&}Drw0h0oVjL3);*(#_EF6Ca2C@DZiat0k|Ys25Mfq7e*rG+ zvE*-es^=3WpEpbrOa;yJ(vw>AHQ7S;*@%jftuz@}Pka>wa+_f(x>2u!fKyw%tX<*H z@pSiL@gJ+=>_WP~i5!!W5TBT_mrk=7Y|;>L2vwQisdMY_a2Nl1Hah$Q9y&4Dx(A}= zXlCyhu~wBdu;fwpMP~UGeepKfb1E1E6Va#DfN_dnTV%(()3#gDP1U;HIU$6qXmkjQcO$4A3lYd z`}>_n2gq!swr57y%PPDA0y(MPphXa&2EmkYqANq_=yPPLzn{p1q$n$w8l0Dlrh!VS zl;P*C9+NuGSbKz&{+ESeat9vie=;0nnv6H41VOubeXXh1>p>3DmCK{Taim;L!*r5O zd^8P;AHao_>jwIY0TBinQD;D7TtO`fh=MeTRsw?Znc_;FgksG^<|HyE)6eafj&Fx1 z2rNvK4AvfS9(uGk8W6>#i4AN_!WW49>F49nPqvOzQ;9D$P@=Jmifb^E`>(*I5+DS_a)UV7~;DW27i{CQ!qCi5Rt7g5=kwe5xb%a#>25S^7wlx8XCkGJuL@K9uk()#x zkKjgJQ6}A;rnq@x;%cXBTR)oUm@$8Rx8C*>@WDxI3jtwEtAa4@4LEux>c13>pfkIaWMz7|6s z8Yi@3S5ZrMGz3pJV$cGo-!R2zskSN~2Wz$tX{nB6BFBl5ycmJnCPsuFITBPUq=xWz ze>T%kxel=0wk$)+NJo!owr~Rjy|lZR0gyz(AimCn=M24^<3N$&3}LmAzia4C%i`;UfpB7B)f^D)fNYlw`tSk z>g{&y6~60U7o}v&65auVJX=d8pzPWGNSrbp--`_`)!LwJN*9K`y??&0k@f7)_pSx> zoW*&|KDl-}`qLJ9BO>`rHwenJ($!<2r} zkHM!){k_$k;tR6na-G=Z4XlCQMlxJPVw4YY;t6Mx(cFgHG>9+f3}5i&daN8a5r^3V zA$qF=`$Vmz?EEdtAL!?X0b~tuo`x*n!E3{BpyqyV9&kPaSIQt?jSq*Fn^mBVrVDw4 z#S4odx|9t$m)!-6kczM~`iS7bunGH^e3-Xo-Y5pVM==%^loCew>IHnqL3}k5a6hZn zmq-XFe~s+ni;f=^FBxt7DEz5(gb&bRBIYJ*O9xd}GPxM>o}%-;n5aJDOx_0|GP3HDE)LbYQzD%Cxe$7>xsdSop*qnMY8W0Ti&XICc zF4wa(tEoBS{Jl9-=QL{+Kl=rJs%(f);eHnJ?_6iV=-t#DYQika)&!Zc*Y{1NAb|W4 zZeQ+;0%6cRa{la3r>UQtbAQn1qvHo|hWIexwGJNfuZ7kik^dnB=4J$grbj;d*FAFS zN-eE8jXrBEwgfH;CohU_Exrp{tP)!)TAD2wn*B?@sE6@Ea9~Lye@>ih#d3O4eCKsD zj|6Mb_0*WA=VH4dU*yeSGE-eHLs%Ahvuu7j$!9jm8@jA$JS&_G2^U}f;Jjizy%>JE zXqzy>L1D$uk0`LP`ulEmWr{DfcP%o1(F$W(+;}Y^e<3ue?LM9}?G0URIbYV+RL<5+ zUjC{T#WJJB?4gX$a-V#T9NqdO(dTO?P8|<2a(>jB8ug~ z%S}D571Y{UMaG%^soAmKTKC?mY53)4Ov0Mlo2{jwxraOlfuOmYyiLQuQ^Ge}ISH!; z;w$>etMti>tcD+koB2^xK?a%wRS9F6$J;l5HyiTT4uV$l(AT~@%#ZY}{bJu9z}RgT z|85oZBapF=UwgW6Y3KH3C!At8UwoIwWcNvY!Sr_&F;@fJIENjCh==~(~FEZ z+aLaJi{*o@0g6HA!$&R4TNwMNZ2QLSyEdx3^jzP+#rqd7C=PcmkZ=9y7vFnF@m;y# zt6;(IqN<{oqydzl*F}2l)uB)-KzcbqgQFf7m+j z>n46>3AQR(1fQ^ty5{qL7GN!fm+<){9v##i`4=qe|6|Em;w(s;Cp8|Bo}TZYo_h1f z3;Jhz{f+{pDg4*zv?SqFq4ZSv{b5z`X0%hkxb|5b$6;^Y8O7gi)C7n&bb2KLauZ&o zCgoj<*y)D%EK7x4SShw?Ja zs77hBdtNznepOHrIb|`FY_oD1%#S{Mk?i^4m_+9svhbXGPtJtP-dEVL0rH|oXq>-lI;&4!1g&;G z8GL(iy`D7(No=ai`anri+@-T5SyLEW!YvteLz&7;NaBFSJQ9*;?uzNIY?+00*@dJE z9;ErRbcLoI_Hx657D$`stkTqEgnuN(a!G2Fi0j{h8^8S`)BeNf_6PG^y~`BbGfQy> ze1Qvt2eH(6aD}|DDl9Kzy9Xlg=Ue&)!0z0Ml zD916_dh1R1fY{PjW5hgkQ^ah1c2j1|2r9%hIIuCl*MA4uIMc7lBs?->=p^V-dWu4p z3RzsbS|(rSn-Ist`QC@#j-{AmkkX^gxFM_4%El3!0_Ml&=@e4vi3(IY7Y>y_^9;_# zci>gL|AZqMT=d*OsEb8-X!mk=V>gzlq*`J$zQCYD3Z_#!5K)VqEAo^KcVfmaLocP5 zZE*@Xp2^~-t<(F0BW14=8FGvY)bOR=E|&OtcX+DnV!#$=ToqWgFtLY?N?@?g;_G7F z?F-YIB6D|zTP4!GOF}o^c(XfPseQaD>|3)FKz!|uy2W4&%-+OguB<+g0?8f@01zRKT z;_c<#pQ`Sw-)J9%??4DD(Ll7aT?rgqBW9j^+A8K6A~C(hYN9+c#}Zg_EJxoxGrbxO z_z!pzjCM&nFN513=JpLw+F%-W@C5Dkp5p^42m$fi_uFdn{FezfD*JnmF%tVBMH+g^ z8{DBgyKZi!qVkLRQML;FroJ~ssQt=}B&b}?6rVI*iiD4dt7TB;FEC&6y=G;xI@-9! zQL_GfcwYpoYFRSp%25#*ovY(_Uxz3QYO>l4rnc5M91_`|?;;Zs=H5?QJ)3>I6XH*! zk&%3(t|hA|+a#rBY1rCx!j5sO%&6&gg{E)oyriRP+c!TWWV@*xN$KikzF{v~>9axR z?qtU*a#ZwlCfZ9DXG1dGQK#6p6cV@LXxxx7&wZF@E~Y&>?KSr|Lwk91Y>q-&1Hh}Si=(bbz2hMHwEP|lXH|raX zRcu5&*o_NC6WezraZci&wT5{_;fV`UPpZOC`6@1Imfxb8%~=ZmRL3b0%|2qe&5AQ( z`@xkve-yrW3B*SdDFqyrNYj1BfJ^y0aeQg1kgDOu#UQ^kx-^`ywm(|m~!}niTNu%0rw~1e9KO1wz zjI1%cxHoF14Tn~6iZNJ&g3KR30r8=^Lt|J=h05c{)*3AU4vI%gHewX9@gDDam;y!A`-8cmhZr{?-zz#ehkzYxbOGf04 z&k}!HDn9pX+<-k4SRMOQ!C34(dH(2B%#R0EMyT2V{j+wPJ){r3vax^!Fl)OXl5pkq zHkkjq(p>KB><~4%5smO6ybps(qm!<0K4=7g#08?P~8SWP7=5`J}{sh+@z1JBRL$>AqkAT9Q*w7 z(84fS@9T7qq!zMQPI|Nr3pdGvMNJVk$h&OVQ+>vXARg$0C^6%i!7KVE9*E{BF-wZw ztT>kUX)zgLnx_%#1LG%F{5Y#gv^$UY8w<8~KoOdRQ!`+1TKBzDevW5)hqQ0P)g+Mis7GMsr!}vhgts)!ALP=+EMa zmM;tyid*RKysC&>g=-0Hj=?7?$D1H(Fu}}yk!{gMrcv?wV9IJt?TOBJ4z!Y z=;CLf=vG`m$}aBD@?O8P#YBwOk4#VmdKG_UU2Gs6+|vN%7|IzV)RRhbbpwae83B!` zUDH^S!&RFzgZVoKh=)|EeY)w_UU`7A^`PtIpzjAKp?Hm8ttzuPv+u;)&4_!O8opnf zKjR`wO!K?#rsW1IbNl%Fn|-~Ca2h+H486_es$n-Hb;C}>{!AusLzZU7H<`{(Uf&E6HdZ$K}UpXWpm=M>|+Xq@IT`(gio5a6V5 zuNkC8$N8E5>ZNYUF`^lGCeC}JleoEmd(ZpsjS~t5IXdN% z6rW+wZRLQxL%L~97Cil=5z!2=d)|i?KZxkpk*M(6u^W0{@~Qy<&L%rX9Kf;4{QuPe zz)^#+E4-e*^SA7FWDzISi~B+g#CdeISR(=41-}VM=un=TC2yN0ao2d6YHBx2c(uf2 zQP}{=0N{IslFj`DHLqTdi?@pL#BbL7l~p>iJ`UeT%PNy#Nh>DztD`G80p3Y~MS7rU z5@1;;ellW|XOVhBFUbcDKq7TLWgLG?GobOjPp(B0!?2gz(yLimgB3m|b}JOJ_*lD~kZo zc4A_&N>w&gvIGGu(4{L?B)}~)8OTaj(zqq$pi;h~GIF8v3x#BV)YR@ta_G>N<_M-t zH>IektP%9aot;GiL=+CYa{xbsn!h=L+z$Hk=*O=_`$+8+zQ%P5C?-L5h*SE-J6w%Era1)l=gI6ci=L|y@nM?=r%j|9irfC*8@-fDSNf__-!tHl$&rcYoS znP%`Lm|S*Z6$v=4(C#u~l!N(8WC zYtUH32*#HF;{!yOChcL$Bw)%8Pkqas66>A3k(utlUF2m`$ivl=@&-z)rbzKL}|6e`;P*8P+T2IGDn{zl87S#=u>sb^{_(sLw>`fk8r@`#H0F+`_ zA_P^BpCBi<=&XLy@=DiI_LfrB2KuT3eYIghxVqP*LX53C4*aV~5iu!qI<$u?m^Uk~ z7`hdttFW*+QHJq7!?nHhx8~w2c-T5N5Oo{t6}VM?ysjlQ9V+u*7XZ|YFW=h}Y8ufo zJST`yx#nuTKH#9w9*fNNT~7f)Kl!tcLfRZ#gVv?~I?P+YazHQOKrg9Q|H$ZlYQE&k z+FWeVnq~T$_2;!%jL^9JxcGE^_LH?FjP?9*8S^(fmION3;vk$_JsfM!C)RGtPijY- z5=Sj_EkV*Zv9J*-KqExm{BXS>Avc3!HL1lQcN!RAgp%)<(9v(0F-%!__`Qu-u`PcN zm7u##h`)1du1gkRez{?huttUay)j=8o8J&3VVGdOX@4ovzP$Fz0$BWS7T`o}O%{N! zr!%nG@;-nEq9*g{Qo_ax0LT0p)*Qyq+P#I~x3wl7%Jon8f6d+2yZLnDwKSUix2-GMGlWciEs?4LJ+hNQXZL!GpTe1NP~^ zG61p9Hc8#?ddF_n*sg^k6kA6fccfKP#$3R7moRu2NoNtczzm^s2W@62==)CGy&3iu zH%@^Ce0=Y}G=Q6By>%GsKcn&AfIqeG#mfNXnv$5ze zY~pfR$S0a#c2<$uu+LYaGG0Y1MY7T#t=|S&$zSPro9|Us#wcCwzdI6?d|N-ndLZqx z#b<0~8MG@9yw4Q9FDwVWY}!B7E7GEO#jRp8Zt@une}OrCtG_sG*pF1>dOu z*|Nlw4MlOYA%-q~Pe1yQ3l;Fw)QtoIB^HUK3Kpq0eL;^N~gitFE9k`8; z4LZjO8JnF$+YxMq&$;|4?7upI!GCoCiv*~}gUttNsKh}FLKaj&_GIl)4G_G=S#U}n zy~C_$!!Hg?o7u#hv;DAQTOex`leG=MT^}Hgz2CALB-ry3aLAaBFSDtFb1&v3hUS)= z3ak_ftVC0sroKIGw6SM#J3R}K%#Yl{I&|20aM+NwtLFzH3ju&?_PvBqPn|7( zaVT9fpexuBhr$W<(Eve0hgWU!v&{~(}<0xN909%+quQCWABlp<-c#)K zz^e{`><8lKI>MdXOF=vaM*~oz0iAW{6}6|F1y{^Fd*#~30?^PjxvR5`i~P@LLI12^ z{La&ql$CGK?yMc=8PD#^9UfK+&i~C_l)GGQ|G36{A593LWVVUsSn1cfY}7W^HCgOGa@0jM#GbyyEWEj3aSeDp zpw&5^+1A&GSkL@hnF8pRuYCXLaw{Kv`_pCJ48sY(@M@Do2hZ2KD;js_E=F?l~>d_pWPQlzJVu$xyjsM%#5~8{w zl6py{XYZjq-763Y-V;vS+XpA8A%>DkETke_WO>i;|1oh>&xRt zJ;MqUHRy&Aa8qzYkau)8WNACh^Q#JFQsXi5cwLrh@A;oTJD&AEw)U?ks~h9TIYzCN zx6qPzzsqbFKfhDox9)G12j#cRIri8XA^paCdTM$X(EI*R69otY;ADVWG?Mjq8Gh{I z_ZRS93=urC5^%FjbPg|n3aTDqiGvyKW5AnaR>ta9_0Fo~y=aeYYXuW4v8d+80vDfu z&zQQa>KKnuowE2EyJozomA(u-1@sZUxX{kS0A_KV8fYqYd_r9<$+m!pvJhB z)Ci&cx%NM*I@ZQ3liEkPLM!LCPByLF1o7-AVJK`T3&YNF$Mw${e|2E0A>_J06yN^6 z!7{oP^~maG3~G5zm?>dN}?-xvs)n9E{_*y6B=fE}H1+b+6vH-QZ)3LPhPhc-5z zR2|{;dA}42MpDWXlDtD0rPi&J7}{H~4nyS7H6fAWicHQE=0wC1{&;L33MsQp zM@|NV>{8);pN|v_KkW_W@oaodL^I%9ZN&eetl}(iHo2l{n%OHt=6G3LJeas59^URc zg6<*|IpyndIGHVYjvl%bpp+v2mFdLax;QgSi1b+!y#4`vrc26oQ)2czRM3d8TODA@ zVy}XMgNSX0&OL|?M2(&!*5Oka)VEWVMI^*Of)YmZ*LtZDOA!l!J-Tq7%|n&@ebmCR zh-E@OWP~8oR`+1;7mb6yr2rL>H~|5Q&YUv*b2h zFep3BRK(whyswW$<5y|yvA{wt>r0t-To6?CU|SZ5Nm^VSH?p3F?MdrU;hGGZU9drAqrS z41yGfH%{gX^re#0GD0H`b&|u*;SrSda!!jpBKxhq*4@tS!3zj39egx0SJv?!XKAh9 zRJ};L+5VC`HT>*XzwjDmJRg>_6ZqrQLdD!SJeX!aegs0@Gy`XHLmVlK6=aWS`;Sul`9OCxuQa(q{OS5E)_wf#qq>oIVH0AvOpl99DT1OGD*g( z`WCOtYYwVJygoAc5xr@Q-Zju;f{nL`alne>U>g!F=2bw29B_Mxfo5E^JthM}`|%N@ zXG>y5y29JMn9ZX9Y0BgFqrasClcw{&n=5Jv2DYt8$<95V3A^ROMfz9 zpIu)if`+^Wg#Pf3JvDyze18{18ogRo>x}CJ`I2H!F-k` z?GWsLCsgz?QE_WjEwd|K1~FjWu@I$^shjdA7TTz1j2rbT=`Mdl2;vk7?euBj+p=pU zAA1f4M%EzsiYqdaOy`uHdLTT7i;;0@`%%NLAHSdhdG)-=s;@oysQ5yK?^FY?)=7x|(j937PxH?=b;j-K8S17?jxHV3_A-~>ohf`29ar`Ls6 zO&l`z>p&ut`Hc}?HjJPs_FWR+fR+nlY>N2g7pN&kNe_ zmn{|Xa7n!Z16Hk)lK#qDVXTH6>;^M)b#WcFPoTU9M1Jl_ZfqK3a7JI%v80<#S~#j~ z7A*n-zeDL4mdT{#?04wv>b^;qc2;as`p)`n8q&Sv4F~og2=R^`dM1!mLh9{X8H>YqA)@Y2y=aP3q#8S>yF0 z)o(?td-&zaCG}AAFRDAl3V9`XYaZeb0M|nW%#7%mL?wA zNNKib1$GPxZFJBb+AwK>{3^*jCS>60e7WqBy9k|wMiS{_qpWugP0txy%SUNn z1FbrFaGLtJqNTRC4^E*J6~<4$4eDRfO6zF?3o=nbVMO&NJa%duQ^_?8mX?-5I4F~I z?lXrm#9>+w5_{Jb|z-{njd_S`6}H*KlR?6>4-@ZAt{Xr245tG7|rex zbhasL-hC<+8)v<4w-d*_%ghuxQppyc*4*B6JkMjHGj)@7xFqR(?t_?i-g!qAT_AwX zm#{J2T6YJ$DrO;Psp(y_qLvT1L`>&K>%SMnK&A~*6fBlMwARz>ygS|g9vP7Ee782< ztO^tomY#?{1*Eo2;f(bY|`W4+TDra;TP0+jrV(*O4`vWJ8k`{u{^ zFRH4}Lck0%FqjIwQP?p|2EHoXN+A1_u-X}q2AL>?P?~|ND4usoVdHt_c7|;Pxex)f zMSkit0>d_KA~ag1sa`YSL=oDY+1wXu%zs8`k>pkV)YrmWSpUqhx8X&`2h=T>J2;PK zYANts`6)EZ*)(Ux=ITb9q#Fuk z4m2Kp=FV$H12EI&(=5Xl!x8O*XY)d5atpPa;)@8m8b~xkpgY)gZXcM zT56YJ>R>q&vq5mdY5#%I%VY$c|&<=Yx#dsp)% zSDkyW)Zi@&729LUn-!xt9Fq>9C3nsq&&v0^ag$whgKLI;I>LR{5%O%+(&N)D-Vzf& zgYN?A&b4kTT&9K3$WZbV3s z((9^DzHF(MZmw=@dRjKpjWK4*j5x(l3#m@r7*A zebp-)((^ps?w79br0-P6n5bXu*hb{kw&FA}<=BIEBMhlHDL?47Ddc{?GsHNDP*H)w z8s^R%i~An)Wx4iM z16V?ZD5!vt5zgOO2bA0CLr%kYvu`>P(#fh)(%V;K{iqsVTZaF-AseKZ z3}NmgASTaE(USd@tc$`BUX*FsMIt}G(t__;xQ^3wq~7DEp!Lz{^V@2b5vr*7)s0Hi zt#@i|8bvAs=W_mzEs<>cYUhoZs&QG>nzHZ}Sp~`0EOb)27TIR3z830EpdI(Hda+;m zsC~AshD@8f>CeAxMF{NEKbiWk;`>W!bgz2SKAA_j*dA^!HW zzr7w)S1xvmb8_vQ$+!9iJ#Tb|ocFh=x87!NZO;@Oyn$ZU(pYS79x>^Bapr%B@C}T@ zA@3t4?^_F%my6HSX8jVIx~Q*L6Oa$zQsdga8ApV*eSrzM9GB=`;6$8E)T%ex#(I33 zk%~C3b2+&(QOt0em~g=+mQx^?P;`<}GTY9eQIpFiywIjR`Mkxy9euijwPY37f-}7L zrKFpn{`L`aSG9Jm?TUm-`A9n_pEiUNIAj($YK9&u#~wjory(PWSMrs059UHDRr=oU zO30Z&L6zu`JD+Qtv$`qe9}f#0H5YzH`PzW`A0HroiQT+kJ{sXBc*r*%>36}kZ>4>$ zRRtr-Oa#c(R)%)bn}VGcx&1AtV_tP^%ndS`yoSKieJf~~ke52n{}u{utd4arRBwz-cPHdEA^r57G;Wp1H)CXO^kW%D_A3;C zkAS66r_caA430t|@AoU}dtY=q#R{nDL9t#4?>{ndW-i8zhhqA<8f{vPK(k0AP6Bc=juG|vM9pfSYV+9a5BQ*EZ z+TMf&N`Qu(rcA=g)SxzHEQKTEU+wdq@gao1O@cp~80vl`eI={FloTl362Oxc4B-{} zktgKJEbMwB>MkGf)A^tgC-$c-mgN)S zupFC-5~s=L%%M6$zs-=7jB>wByQJI;6j0gE{YnSKhbzcH6|BO2TVSuRCHwJ2Rt0)! zVru7P#GKf$=>799c-Vuhv?aZP%EDWGl20|nQ+IY)H_1!S@PR4h4%wDlH=tgSh8DsXh!okDC#+)~j59LrrXQ+Z+}*_jMX9>7WP-T%aNud3<;L z=>OpZS|u}I`2Y#YS3V&8zj}ZS(3FWARl!GJ*W#~9-eJDC66dvTsfmuGyZ4{1z2z30 z!nPalc8U-|>!@}=M_;6?Hk0oHp7Q+%plg&1pF>(G4&ce0ti_$IMKUf5Vd-&gWEiWQ zf)sDqL$98y%}2iaZcot%ro0CW;iDBXb+Ghh672{@lMUAu@YZ~e{6QPm+#DIgiT(4+ zA`St>*Jh4(3(ULr6nx!z0&yyVAx}^0R1(2ampEdA;2iFI4rw7^C|qjGM_e{ zds19D;6?(0st@l#@aF6}kV@jj#vNuT^dpiKRJF6Y)x=oHy}`2UQ}LtloPz4EBok~> zJo->T*A*jOLIe6(O2(yn@1HgLU``IeC+>Id{^dyroph1sn?+q^bT>h}eFeA>j(?%3 z)nl36PT!g=CmK;OMv;&3@2ra)!FCB^tp$B#>yvKk4QcDJ{%BnMUZ4n2f4LzImpMSZ z^=;_4c^U1cg}sxUl6|2=7pq%+)wPwlZdeP@obJ58=itpSD0*=Ih~#+u@%ayOO~AL- z0EKVeHNye=QJr0mPrdTF-SuQWR4(FZ{P}pm8Z; z@USp=RMh_gLgCNG|5FtH?*J44fLB5x0t%F_D8iPBB-CBW7uPSxaG*OaUuyuq#BBE9LTj|piHO%Z z^fHR`O!ReL-v8A( z{)Gt9b4HSh!uiI0l{{!`i>M%Y@OCvN1Ok%{bD<3fY@&B;5gKB&d#9Tt_x$2V(twGV zX_)P_+Ky5zXd~@Ya3#7&c|z73mx(Qmo{WfBB;_r=bZ#o?yzKMW7Cz`SW|by$Z`fHT z2;P-hrih378YgpZ3n6C6k5pJGQ}Tb&h}-B_$WP;&h~D=UwfRMtDIIKYm1I#eW+ngr zEz+JdX)Is>J%sRV7oD2EYZu)DWnLqZ$AC!Ai%-YE-rGN!dp|8>yKl$&>rRUzqpg#U7vBLF>&cg5OE)bFmS1pp~Z=0_RJb9&qr&3cK?WBwj zG%jJm)pJP9rR-q6V4OIPZtQ9_w;}FHcGu>&98X(*^A0k)#K#l4EK@x4VqWC}M1gdv zPWH~^hA6}=FBJU_JV?9-zPbcLkFK$bAV*jM0qqGKjOrWGxr>6;| zCbV=l4k%gnFF(MIzv!Swsp?j#J)p}OyjrjA>;B&-eShSE-Wn;q!~4hP5bevdzsDn( zc(Wh8$SgdP{>k6pI-8B-=a!Wp=D-A7*!N0oCN?jR5?WJ*t!)MQo>r3u=%n zVAQ3;WKutFWVvJ}P~h_XrnSUnewCpa%Q^u^Xr)XH6p^|q!MQY zyg-4^M-fL(>m`xE9be{+!&J1w%U)atvm8^by1i%%xYVhAG@TpOmnM4mj|UeS`x+M# zf)x>=#RJEw(==xAJm!ZEPuZAF1ii}CxXw!6dRWT5aU6OUT`SVKqVX-aZY8}m2g@5S zyC#jigDqk(;e?#YZc2(61B1JjB0j-TI$5bYd-n6V&+>wCX;0XtQ)aStiHa3D>VXp~ z!6fR}8dbz<+;8s>`wOhu{aYq-`7sn~P)yiEc218{hmdA;WA2Tm=xhaM{UyCqPjjVE zE4EPW;3NL-N{F1uCum|4YFNnlF0FWz*b;z2etQQedUi8mf=Y^Gs57R=Sf!jGYgC*Z zTNdBP%5Ss|BQb=PB{Yfz^15g93@|?9V_KFjl`~omW3SKT&R?p|7&P=Bo6GocE73%D zKtu>>Mc_A;6HC6ysWHW_?P*zk#Oo|#;%W?J;$b@N&_zzK7F&$LaxGbVIc0qUS+lV- zo$lYu-jUvNmd;lC@N%UZ2d!$`oinB0->sicKGX>1IZ%p7=wafwR)XGCT8MLrHVCCf z4)>IDuRe?cixn^>o)YJrtS7w-1%CgJK|`M0C_Iqim2#M#2Kg`jHHf? zQDhKCK9`JcJvK;rCn1fyiQQz?A$87rm>%8(Xr9{&#mcMJKGV^~T%30D{&kjGp>&E` zuC41g`e%zV*cbi$bBZqF-tvn;=2zPW*D!{uA7RhBszAhgzfrqwrV`!WJO@sRT{MJW zQp8<|LG@k_f0n}#nh<@N%kcPB%-FL8kq-X4nB<;^{n{h?HV**>f4c!u&%I~o^*bYw z@EQY1uOtgc|KM|UgVdrI(}3Q1B*lrC{(98w`bBV;{EaJ%mLfWyCx8c|S~^!izY|Wg zL@`9Yw-Z)-_dNNS;3D^AXd?h#b2zIqPpiQDCP+m;DY4ds*0pI#1pv;^VN?cB574kk zua76U7N=$QEX#yQVl}tA$RQ1AwdF?`MK;l30G;-w{2ADrrQIbuFTw^nMCO|~nhL&6 zP~8CR1$sPbt5*#v>ctx9AJfC~z`J1*UWBXcZFO0iRz#*$%xk9+P1WC;G%JS8Q_2qU_Oy2Pw8k+z2z>38W4{xFP^*FgJ^+f8!bIC z-RH||2fQ|N7JjZ7cr>MfpgS3s4>Z4o*5mPCSVsA+qfGkMG$)({9nkS=mM0H$8l!n5 z2T=r~AJ9%hm&#}ACP1iawjKr9`fo1|s7$p=BEp1{!k(2(7hudhnbp$yq*Gsi|uiE>nf0a z%-Z0__ae&I0|4V_HzjR_l4%=btwc-{!LSt~XAV95mcv3;jSL!s9Zw=Ki5;G;!_*bD zR8GP{kO)MEh^Nu;R^N!$$N&yAz3$a;j3+yoUYHVGPb+{}O&ZbAZ`9WyIiMpmB9bAT zK-Yy2*-P;Obf6PZcH$=eO4{m$DQfGTFD>!F=s_r_<uhe}yT#2v+^>L%ch#*{?6%teQ+Ge<51>|zO!j1w4> z-Vv!;_#tx4rF=j3ja1O0FiWDfia;)7?0$X7Zh>3mACOXUE#6J|v?pLj@=t79KU z&@tKA3Ps}S#F3}#y03Ymeu2oY2QGT+YF9?Tul&T9^+`}6^d>ssyP%KYDab6_BI?1< z{ul7HoX1SfSau|_GgEhEHQw=8i21SG@8fj3X8{C)uoxzUlZ>$83J-~nIDc*1ZXr`# z;z$)mL+WQdVn|>$y|1~R?cYl6n9jJn&snXH-uxsP>AwE3Y!~5UZ=JPJNfICJ=+L&2 z%x8Hu_699OUu+k9H8y}%EOKr|bSSQFfMh05QI^`&0dO}H`=>l1wO)LzV)6h(a>-{L zVSc~Q>BbY>-Q7Jvu*Tip-QA^e zClFkN2X}{u;O_1gEI0&9NYWqg%y!muW-;{>YEh@^RMmCo&m1X9o~G@{1~&Zi8xYbO zisL5dL~5IGnI9H&=CPr+SG({}!nTb{??^uJ^`H0^;O>bPL5&~E6@(rejnf&@ZfFwpBWDaNjMLbg zn!FR&^aVvy@%)*g3Tb#*o9ScgMlp7QQO7YX;%bQwACjx7LUJ8$(%7heR`9H6fxRm& zo@+kJsyR~g9($X#a6u-Uux4nHB6IXvM{~q({j#CiRyxKK5(J*bBx-cP@MyU({Erjo z*i)OeOWvmQ%ylxE`jTdKB$a%#iT@7j-qbx^*#9B(S8OnYS=DLxocx4ZQeFFussIc_zWLp)p3 z&Ar4OOZ$m#qZseH!eJNHI(M|m#NFx~F7ttk#HNj2jXt3{OM;QpisC=_rX6C}=+-9G z!=`o~{3pLqsdB9!^j0g{*nRZU7|mqC-=(=Q=La1R!9hl9U%PixDRwBgalNOU^5nu z61=c2dV{GhhlEZR-0nc$?x}}PG(M1DAl8pnD}~Lk(f3{IHf}`WZ@WB9NG_u!G5+`F zPU1n59vY5wjm{g8#m%VImzrK$xQ3VHb1%Ixd&rTVo8f;H_YCnzzKxLdo%ARjk^Gm)4a!#pV%D;a1+wu@lA!qZ zbq=}U16wISyE*5wE#r1>wpf*(3_KT4<3r|kkQR6?uFl-<%tDF(~fPQ|j z;r3X_?-8$FEAC}uOr=3exCas+CnWfGJjCrkK3h4^_p#Uya^byWH&SCAsDqa16=6>Oc|W9LwPWXPaq^mw_*Xw9FADy6}$ps_qsseqtC6%jdg zrJ-)4$^Uw%s;5VK^Ls7#k>+cKcn+n7D1rCf5aDU7%Ealo>B%0aN%!r^t#Gd!pYhGX zsW^0N$ID^Sc@X{WEd4x4-)+n>aeSkfzG+b)Flf-zY3hg4+~wu$E$bXW*_FR+==gH< z+xA3z>U_-Q92sPumUQlFd-m>f*!~0Lt?=F;Nfu!>W7$8C;XL~-aTY6S0Rdy~PGpX8 zhRsHa`t$Fp)9I;ucs`g_8HjJZ05o3Gp9f7kO$t02k4Mfl-Bog3O>UwOi0q6A886&S zFNrBn@;kLwUM{W#E{7w!DmX6*6fCJ;EvxR#2>S4mOF`n4fP=IUhulG4ktIXtC8eub z;lIm9WGj`VBTMSD8y<4NnH7HL1yhW5qa?6s(rjm~!(NnSM(@Oiq+P-E+Rf#fDBC

    >#rkfq<%Iug>?BY%Z(-e3K8l%Wt=W$!RaK7woWi7)*21N|h*Y zri-qX25&?ajQ?e=+W0fUr`$=4xvm_%A*!}LvNKzKHB4Bueu=$!g1%kCx}7yMHOjU& zRIp9oxGe^EUem&u{U)kB5Ii=Nw3A`H;gPf?SO5ZE?dql>?MBW1#2zV_p5L6FUBejI zP+l0X+omtF&w8Z-uYJv(nWnE>!n@kVtJ^-w*q&8hkHLlJ3|84D1#u%bnV%VvTZdGi5noS8?(SNu47`d^N0Lut=l_WN z_r2iX_o?Zk13`=7tl3rZ>!ZB-^WgIznkt7C`EE8&1GhNasG_qkGge;{ zzat4SQn*=v`v4LNC)?to>=_^#G1(b&+1p4Q*AyLZ$HH$&JK`u~qzxw-O1=uSy1bpb zirzhqS+)TW0NK>a>~||DIl*tj$?3mEvHGhkv8|ndOO8Qq`z3ul8p|*BjDhG<(3#cf z**>JTihKe5BM(7yH+&!$WkBjJhjGckABK0PXP9$yJA8Mp4k3rTVsnwVG-);H90N3P z*K?=f-pGe`sarnQexMyHkc|_G3k$+QMsh;V&4&4t`i6>k?+W`<4P^@6fA^#&2&BBX z^*F`UV1x!*pd~VQ?O-dtXfs|20zr8N=9g3wwJ$W9b5uGvm};qyZXbq?ze%^bllaUx z5t#}eqT=6dcH472N{K%@o6@h8K6-@Know9OI6V6`P)|-i2RGpnd}icMys@Ifal(4; z;C;^5c;5Ur-yDqLdWlO}_&orw|aaiQ#e|4Gj`;M3^Th$Ye(% zN0%6)PfDY+c1sj&DuyN!(}+DFYtYKaGicU3{o+2!$kB1wo$mT+F7;mQW6E!a`-)^)mfR`-GL4!kCOqB<>_nzmnGsVCnNnd zW^^#g;G@Fx*U=={v%>YOK!aHxpWSdR7w52jO3)rK?t{Sh=lhG6u7hcn{r@4t=exoUK$8%(Fpx>tVnfAATOMUbGmO&JTI zQ@rUTeR|y6VDlunCjG5EK>2`FI3rdQ*t0*S($n4jdRFo3H0k?zep<1ySOOuD| z11^`Ldq4j3q$>{=)8$meaR94(G>+kt-S}mE&;pb^qbyc_BDuw#>aPtTOc1?1|1)$W z89h$8|3y=6?B(#hA1wSMe<@1HR6JEWwIA6snaDB!j5)sDBWb30y9{m)5v;p7pB28D z)||U0M3onnW-)4}mL5V(T8KXkYE}85nAEs<#L1>L#l~W=GEOkF)HK~G$A+g$pfWS5 zL8LWOEykjUs?>1c_1F)lFd{TpvGLqlq9PtZ#!Z~0_xdFKKBCTi9fj-)Rp0vUC5Z5G zZCfh)0mS*t$SDj@XWAtR?5l4y=6oaQS(l_HA2c`P-gobSDKVXLGLAW78GHuYeG4TD zn2N#4km*P9%UvY9*zadPUb272pKt6-VHqPqSz&HQWw5EDS3{d2loX}0de0LR2~$*^ z>po&^{M@0@b(pyp?EgKR42&AYrt@FNI-@ zT&j81!?~Z(Jn9d!m)H5a-j8a|?M2|aQ*BB#8cT3`etrL;j%Bgack-yDg(c}nwBk}z znrXQ&)?NxMc$D(r&mCz5U# z5lRUT0x|oQLXF<2&U9)8^F_nTbj^BF6w$;w)j08fwQq|fv{J^O6~u=(-1Rg&z?)Zs zepLF7mp&~7jEiyRark{^V~XrisM*F_>KI59GNN#M?DV2#N&v6C40bn0?n>(yx+bRC zRorv#+B^&1meQsaJ~wHabK=O532_kLJ8HuO#X~`ERn#h1cQZ^h*%Caq9<}rI!2@(L z|1M^jk8>pAx(yT!07wMFPXlDw*I3{=YFJlm7w2mC zm9RIc@1S59dSNFc;z6VynPkO9Gyxb()$!I31(uMfhFP zEg1Vj1k%(RHjQ4(S(wxM6dn25;k$-rdsLAvE48o5&&-6Waw1h3Aak6&{)A`M!9I5~Lc{^&m=^S; z!T^Bybuw@J=lNP5fuT>yxk?)-bba<0}$YvU4oIbfj^XCYO=Bs8Aj&lI>>~T z`rLfjDgB#V>TSrt7H9Ak!(xm7LSBuJ1>RSZQUo*Ko{gjhFB*c8y>_3@M;@2i^w$}Y z-S&Rzl&g@4Gv3`oFZh29XccldZnmiNZGl6V(Wrlj`vyZ?0|_Yap4bO~Zk=HmjE4G5 zi~y9PV@Yhr{pkE^s2S$$z&FoZkL)3lt&QX^WDmf3b#OPGQYud=Wu;O0e|D#?^kEQw zH?J~RKYI@5d4JT#^K&;;#y9&4!-PHQ@WFTbYKk{`TF@jCmBd6zYvj8vnxf@z{w(4|d5 zi!s6X88_Y6T<}oO!Y}ksGA{EK1GK>GqrdM>>;T07<^iO_pnkMrQO|^r@Y0XZzq($h zzL8U>=8E@anZY_80o`e0=avI;Bq(4z5W5@zoDCoo5xH5ag=_SpRsuL+5zpN{<3GDe zv%AJiv#ToOiaq1n_usSL3EjyPf7S0v@8sXT_>b19YmJ2+WYjH1GE{EJi_Qq+8HWAW zNy_3x0p~(VWW~*9Q<7{j9L#7!Vd!nQOBg(1O6aYW{Mv+7L?RfP&^zu3d-Dwl-+TkY zLCzM0KfgP#(LRz5*WTwgKU;7><^|FGIDR<7Xp|%YS`w9<+=~bp#}X)nG~CBc-BVP! z*sOw8cU;*;QnW!`p_*}3TwE>8tt(TNEt{3AKiMq&M{a+k>(fHNHjd=dAW&$={@v&L ziHx94+8k~-@;eY3L?wZl!kP8bnn8&mH5{&*E}=5qJekWnNz6Ib44Y)`La>Czr8YbV zy#2cjKLtU#&m^5`prJH;1KA(*34!62JemHVi8{mc*FXJAh+E*1HtZd#Px}T$9F<~e zh5LY-zD`xP6XRp5$&oF7igx;lk=PsiN7y++GCP|X7RjF{7#D6tPN9#S5;WuzncTKN z#!f2h5!9!AIh@$j3|_A)JOth;0=`KBeT)FefgHT^f@husL5R=^MUzIX4kbmM|XR~@_C5J$O%shY3^n!G+vrO9o-3Ww$q*IAL*OOrH6 zmo}*v7L$C)t&u8B?CC1)J2M1Q2XPEWv^^L!>s~N1m2yA*=8GvE>l_Mm4-$cq^t>O& zI2_{qt5?OWkgiuO9P^;m`_LVlAkgL{@FqFzxYS?uGuG3H>!ie3JHw@>$LQ?Dh@6yOuz`r;|CettK6^bqJ44-z=+~TL*%_ZE zVIC1zJoKvK3CYlSJ9aLF;kCdw zU5Oc44Z&H|%m{&18v*YOhEPcYk<|FCw%8jqPdltm<}E}HMW$e*hbQ%?QL!!BW2Y93 zH^zl=dZhQ!iw~>*ktXd#Abmj)KMn&CF5|eVOF_dZ<(8$R7V@jrX?hn(F#6#lu@kwh zy(u_KhcGI##mj@QQ(^KMDa%t+2#jni8s!>VGmLE7VYqtQczWfc?yTYH+UikS^1(a` zP!tf_yZ4jJ%8y|xJGrU_+GmkkV*h=xI#yx@EaTX%Qm8FsLjiWmS_H?eRJYs^zc}}8 z1k&}ep|VN3;c()p_<~6l=-)8YS@$-r%k))g@G^znDvqBHlyA+xPA4>&!!Jn$?((?mp5EtFGw-OJv%v@0)>G9TESqQz{9ms36zZ5HFqs}ilMc{>WyI0 z{1Cc$vnEZcBh3tJePqv#7??he_BzEIo)BdatE}}o7&)y@Fg>cTysk4VdlM8J4zg26 zG>f+_fCfiRp)uFnEvjV@^0eyVX)e#J^&mr`(h*tl$D zB?&k{XVgSz*spBJuV?tpnZJ{*t1C+7N6S{F$PSz%t+|TK2vKbTF9Sw{yzw)fPfxR# z_J#FNGcX{3my@N%W~p{l+Yl!SKtl;cU_>B)S(ynY8`^F)b5bvm{!g(_dgc>O&8Ykw(vN^E z(ye4;&^6gIHX{NV@*(B!@=Q+sm-E2Qf?1YFnxozxLS9zarNIXO5S=Sq)}^M9rRMTG^`iPoRL z+cdjzNu7D>PjpEeT4Zv%Zg&W(^%iCr)|z6+8a_va+T3?}N0gOEisZ{myGOj&-}xX% z&3IOl{6~1vR!|#|OuMyprWL`lB_HwugB}P$Fiau|*6h7NY1hn1s5*SXgfgz;;$nPN zYrG1Dxx1+2zJ#^BQ5mrCfsqr?yv--kFkK((8EvCjL5ut2HSb`AJg`nNnFhi5sW!f8 zNIOyJzXELNmM6cVH~lHxC*;(x@YIQZ87IZYq1`56)yC)gg#X2cJZKA1@6;puj8WVc zsp8D|T8}ywfKd6SR$218tT(f5(deCe``F{}{J3nj&0({};S2X}KXsM~V?V6&WoMivbO|$kcA!k_lFyvUk|6qf&@4P49`5KQvDKO*|SccD!n13pxnE?M) zJ8`yMtoqZ@5GNlM(u$LFUGl?7^1TL?Y%cbEC(%eH(A%_|p|GO)ZE2knsKUu4eJ^cpNC=Sw=$w(5xMt_aW9fRC`4ncV{N<+tzm2Nf>E}tO;4|I@7D1hZ_w{9FO5c^H@g2*4Z^2qT$6qQDb~Y@k?a`mx2vx22tFMW zez_yFUBjZ-#^H0vmtBw1amSRsqhE7GU%UOG<3^i?Ij2sXN#EkGfMTdFt=9RF1#$+ffjP5p$gB;Gb2! zJ1(^+os-Bl{~Y%6*Yg*dSFq?$floh$1omUVcOPWKMPy+du7=RUpWFm69s+Y^9ZwoF zPlXsyAqr1Wh|)91!;bm$;kW;G=@YyyzCO0JJxSHRyse|h$8eJ&h)zFK}pVbDq; z_$9#LPx!V7Yli<&<{!YR{#NIBWv!0urepqOa!~lAOh#)uoO>QvN7&EQA|H38IkphK z_w(uHwcbzto#sM#ex)vv2OG29w}6L#VI>5xQU-IWs}sFX%@qusm2_}ZXz7-mCU39wGwWN)g2W1b6CaVlemoXljred0^ zJD#jeuOe4}>x=C*%mq0I%M4PydMp2t`0oVA?oXf1*0?TfzJk!y+y^tXKg6Q33+GI5 zAF)4?7|ScRe{8NUvXJ?$l?~J)8`H*_99LLXb+zVHu445b^sfV|WDVrBLz=!k&F_!rU&AhhyGTa=@In-|Ac`RLl+YofgM*(=6O* zi_;Qm#gkMV3=ZjG8l_{&l+e$t0UDMnne66$>Hf#`_;~^()!T84r*lQ5G0Chyu&fs| zl}u5s#OEm`qXa2r^7Za4ph*(pl$8n8GMh zzcVzrqK_Ffb{NH}hWEcf(Dym#=lTb+6;nFCi2q@0gaL7BQzL;nkC|yQJdqWKDs4&D zP{ryI{uL!|dq3#A>ALo`NNg2dDpfj-?BysTlO`%;HJ@ZJMNwotF zrLN8c^WS%;6fof7JYgszdG>xdM)TUJ)B}@RYB>5JCn7#AuQ;JO7{~~p#}F{00)kA+ z^jAsn7~P97xXL0A^Mx_EqVZ-ox^guw8zFdKbYF-VlR1j{vEpNOylo2=uZYfy#&^~k zilYqN?FukY9!LuV#ANNtOu~OqkXmx9o#Z%HGpXgd%Fr?(qq+-9QGW z6)Rr|6!mVA-XStcXTyMCM+DMJ{t;WPg?pkjO$r5K8hm1t4?kj5L<94c`ITSUlB%6q z4BI(edJH;d!Nhf)QO$}p%47dF`uZ4<=(iG2>%S@dEHY&f)iXSEj z{ClZN<>B-{h8l&WoalW3$Pq^vzLT4SF#YHCed?q4{2ok~{O_LLbN{ak+EVhvO`Z+J zz>PKEKECNK-)z3nhKSuN`Z*U0lQ zX@G#Iu<*ad0oLP#pplL?R--F#>;6HoEd=l5uPU1qh1uuLtUe@}c_&;EDnu^AI#2f$ z8FLa4^3s}cZ7L@kwum{{zETpyBUXG`a}^u?MP!;OC2R$UoU*K=pO+WG|D72!2!9_; zrzNhd7!hHBI@nM}RDqK1*#EnJE#l!I#pxg(AB=#RGkMUGtZm{|7NCbg9)n8PCp+>jeUO70HEj})gr)*^)2y$zY(Kiv%K5Qt6!k~S z366DDRN~ouKGXUd`e0eXW`Ki%#!C855+zmOKM6B5n9<_H5+cPen}?fGF{^zVDqcrUa-)hGPcE!_K(E4(EOUOTIhSifuEcPoICnKOXt3Uqt>-iUKRl+rV>!Pz z?p>6O4*s>7Yo&|fohRWn#ygD3AUZ8m$zlR}KQauLKEO^XvNv)O0w}8W=P3T_bP}gT z5+S{n9wM5=0Gte?gq+lTQAtmY{SP5rle6{!R7yL5c7m*@L48OepRGZL?iA0_c39im zIm7{JN-X9%6beolc95pPWP=z z*x>X%_W-W_1pxrCptN1@9ds8#FL1}LD}k)RSvIxQ6Z`pWw&2DaKCwe^ZO;&~v*rL7Xa-Si>EQh94_Om- zar;U0$jm>q&Ln~<0)oI(<$^C!|AoJw-MJY5sNa#Wc6Us+hc)B*kELxk=xjpy_k=FP z$h&tKC;H!9*8-1zHhp`#RKC%j`fl<_x)6NYwrCsWDIClCILh5tOmSQk`R(`Gr;zNN(0`*OTdx-cuH`>5G7X|%UmTD` zXAUUZ!U*9QW+#75Cs8Pyv5Gb}^24LZ0RQrV_1pjW%;rV++axHKuSj$fqmeQV{rvL} zM%L6~iy)s#knW>V4L0Q>i-v!Zp+rZb1nfbG^N~IqpaHj=kBi>T7NOf2qiV!pa+7$) z6&3w0S|!SVz%p+jg0H?76JtvjVB3)4$P|pyQDGqzn0 zi?UJ+W`d(C%y*j~O^FAoNGftk_=^#mi;26bKIatU?jEQgQK46AJC8(-Xv1_IlL;CAtAym*4s@N{jLuE&TBwfc`(YCOKoRoY0s9SO0#Kd>L#qTvJ1ANTl@@xQ7kvO21I5w+G?nPD{+XRIOa~4n+@jRa?W_cL873&3Z}VST8<&ZLa!ycY9TPD>(uCNkpxfx;pL{4#w5Y}q^PVc@%VsetRh}HR zqJB#T!RakmsYje`EQ4o0phR=Cixa%HZCJ&@B9R8_1)M}k-D)T6B2i<@y1p}I&Kp_I zed%SlDa2PN`cL%En;LGDN-h;>XUMyj^bBr3vD113QbzLFO8ru5{TW(_=z_5xb+gXZ z3q7^UzV`G&(We?ow(P;m>-k?x${5_@zPb@>`uEuej@Z&vpRVO6X(~kmTM-CoVL&BV zn1Td}AA{c^nOKgJwux2IE%HcP$-d}Hn@FYneOx3zVbo}5RLHE`#*u@QT}V_(%*j&s z(Wpw$l8kA$r^0o=B7D*Dl;ML(ISsB}VOwxF5$7g$R{u%K50Ap=Pw< zQLVOE+7X+mk=X-nEB#TOsZp7X7(XXd?aNQfJJs0w=DAK2(zTlNU?3^%e|!P0(_jf~ zu3AUAj=^IZohE6#PRzJ>hHM`Dqyd|4vV?hYFmI7qXWr(A>Q(BL_*E@k9oZ(?(quL9 zU)cJ6KSKHy$_wk}E)=sd-+w~o95JpS#b8c;pX3P=-+dJ^>RdVFyl8A_vQu|?#I}ku zGO^&iHjA+q7ZJJX>%Rr;xciU ze;Qr95_Qe;>uX2)+XIdLQ`E3|{NZ=|{qMv_B(@{hGp`WxVc%E5rqb8nS4RSn5u|Ue zCxb5b@u|izj0nQP1$3@?3OZdvMn83m*MCHg$=$G0<)E3kKFSn4m7FmZgH0!;O-RLY z&%mgZ0218VSL%Lawc*wPTVQ8cHg;@|S)G&Hd?TOP&98p^$i2D$_7MWIr>Mbp+v|$Z zTDZ=SrLbLqtkELT?Wx3?3tJ=FT|?Xf3gTQYB90sQc^4sC7qT}2`KcI6I68Af2aAQA=; zm)PjO!FV3=MIAs|=4dk*MeHB(y=JgDfV}Fv_Bw~XW96oKHB#%pSPV00Wh6&?&12dP8;e$hc-eNAx-bd&EOfyK#@uNUV@?rsqMNk+>ZhE76#bnCc_yZ zBdA4eL_oEI$aEqZDY0NbaHFpyH5U{;QX9X_zcX!?#jaqAtAi4>lgaTVqRyCd&p z2U_VF(Y4+lGJsJ@3x_Anen#)|Oc?=upnP+iINXMkSsp?HygXT3sA4Ax; z1=nV}-sTkinx=Uc1e}*o#6kq^8Zm7;Wsd{YaF~fA0C(E$rVwy+&pO-w$oAF8`0Eqd zE3eubSWauNU)yalDH6-WTz6`lhvIG;rR`39w?H4Oc*9lGWlBD-cZ-soTYjO8X^HqT*= z>-9=LfWFtfegY*ULHKylf))FO;6?ffZ71T$&U8l1_huI$X+jog5K7ofdEB@vnDS|5eqVs(sygvbHJ35Q)ZNWoq^m@x@wDv*&>Nw67dZ|*t z$g=8UzX0B3xp5#NtrT_dKW{|#hv_h(sW^Y?$xZCcyBq=6ToSicj50bMOR{L`e3oAb zm0|uhu7fg;z;)UG;WX3nwOZ1?@49F3oop$bl%Clq$(nc)_Em>X)g*}@!_7`r_{u5T z$1Q&IezBx$-v1=JU3MW}&huEFU=F=MtiTzG5hdN2ZNd_lP?kcNJHNv$%D{fX3?Dxs ze;qLyzNs$-d_VW0p%ADEWGg76PO>^7{AW04&)ovr5$ZnYkomxIZ8W9x+N{_y{xsgQ zMBQ;ybKrgbzKkDhp2zW-2enr&(kW;KBN5;JuMV`=YqOed54*jbfkD%6<^+3f-Mjl+ zgz(gzVgKIO!sSdWQ+^>&X0jjfA|>pvldNCksP4TA_BlNbYw1QVN2W_GC-4rw+nS$1wYmVx;?wnYYxWhSnb z7M``1fps>%jduRc4uP#Mp`Cnu0|Ej=LP8^=q7x>3lNLg=Hlm9T600uIO*h$X5Bc3t zolPI*Ltm9cKh>i^jgwHFb5~cmrzhOk7akZ04-JJ!80^NF97Y&i$C%tFSe$&aIZw5_ zOmn!7GkZv|c=}}XJIm!h+x2Iv-JfjN*BrNpe9z~6Pk52EO#m*ei-kU!ryH;d>1}&2p>9vpPrt=58-bE z@c)nh7iZuNS9nj_C_W$FAA$THJAZJ#NHPWmg+5;p(_$nX2Myn9JhfCN0SH#@<1<}QTxq!LJF5ScL84^I_-S=?>oKtyWJ_^yGS@9F8|GFQ~ZKp+Cm2(_5 zPBeyi;9~*nLS8@CmMqr_h3$Q3%=|a8_BO2jC+A94znTEYl0d^?vmp$Db+aL4e#FWm z7(Zdtegvir<3S{LyEMdMUP5-qYq9vNi5H2&n2FPe4FX($*9_h-QG_QQ=CS0}W5uys z+M_vf)Rdk1iqC<7-qL$O=0~-}L3kHj< z$W{5X0{LU1y+Y@|8@9R5>@t;^lCwED8GN|@Rv6I8$+9#h;vB2bhz{yFDO?7!7HWhQ zaDMW6Dok;& z)kc&3b|}@9#%HpwJo1UB4ew2zr+8PrIvmkp=E1+LsJ~F7rNo&rV$}T8+E71`qno(F z>FL_aO=IZY=a|9$yTF)l*FpqV-tqL%#sNrL^o{M^M!?0;^k0^{kY#Pw21Q6kVm%fs zg`gw~?QOJFDBW%2$c)HQ5Lv(tTLx4$++cc1!!+X!5q#PymJOD&FUGYHKPTA1j}F)0 zoZ|qqHIPT4OUe>OQIc^lSqT={EuR%gc*p8|kAAdGa1Jill;siS-LR1&W3Y12h3~X1 z_@-~#S3!Jo%ewmy+<-lTr%K%31|ni<_ep4`xDRv$-0 zf?wWgx*=V?zUa+DWKmxKegzeO`sei{b~GozyQW7W?IPQ;M@Wy>UyN9>`-6?}<~J$! zU$^ooV%3kQ)N*E_)sxdMS@W4jG||uJ%p~7FaQ6f{?6h z0#A|PHhVdHYS%Fzo$Eev|0!L6^;je%5}XgCiZw$fC8T3AZh){R5cPB}m;7^%2_lS` zP|>oA5zfAiWUK|D?0Ha}d8vibEn(P7j}u{6+(xtHE1>Bv5k8M#M(Se~*THo>hHy{Z zcrU&m{4jfw$Pwg(Z~-LH$q6NhlqL=vk62R*q7)b3t9blt_IcGBru+V%8#-#E-FqAN%N1Ony^e zP=bJ%LE`ahK}C3Ueo!^M0c8I5A}<$w(RO`XwAki#6%T1_oOc6gc1j?Mk^XUEbn_(P z-g#_wrqZ$E&(iT-1uW)O5PkOM%nn|2c0NrqleeH+6)rW4EcdkDEOt&OZz6lx(R6{t z6576WDO-%VibwoFek*A>va~mdG*%u>sE3Gnb|2|{`w~%@rktpKA6_6rSd2{Vwl5g5 z4-Uun%x~rWF65dse`I~2@+y5ybfT{+wq0xJ@ZHvD|K}XneDk|gUOT}R*!(AU-r{7| zL8&IMg}6meDZ_q-m4^w{WS~~j5pAW!i2N+dq*;E4Ri)HgITD+Z7aDGxt_Ux}jZ0-@2^Rcg5UJQ24XKidvLNK#936gqWSso8x@^S@#?jiS|QZl0Q{sw}L>`ZtAs1aS*-uqTR;Qq`7?+d!L?)DTH%?p9>(>$%60hjX zWEJa{JLZlb3uRelX=Amqy1JMd(NpPmPhGL%7Uvl))IWA!(rGyShiY_yoz+)Vi$H8i zxn;Q8UhmBr_hmI_BonqMjwpF$t=Ml4#8Yuw%Gmc%7Pr6=BEVI#gWdtnHxmgP{t%`?{1=<^PJ{`f&jg=_;|ZsX2On~=^SpO ztC5CNd!Mgp4gK(bEBwT#DBC$H#zKZT^R$&(L2~|Nhuc0)tL!ixr_fep3b0Y0Y0;At zJfV20F;FGzP*Fuo=}OCR;{+99c|Q1| z(^2(N?J%C9=Y-qsbK@zQLlIKI$?d2o`eZMX{!=HCaqIw6iJuK7X~7AmR%cq?>uv5U zZ#=b&%Me4Xykag{yxMd4wtA zJyXKH(#%7jS{PouYh20V6GLA-g0D9|=84D86&_BnoqHG2h#?jh93Fz>pZit2(Pmsa zlGiYNFcVkLZXu#xBPKrOvg+{-?_2R$?A>u50O#qDUaqae!NHjPqaZ8)cBH-WPZlJ{ z_VZ1XF>^s3J=itxT7{b(8(g+y@ShYqUf?%@{g?N7#Fuk_`&7Mejy9yQ(zyH2iGPuw z_y~OXEs|w{Sc5v?%i#-;=0m)(^;S){rBc(*?{HHYHBz$$&YwCv(W=;&$k=HBBrQva(F|3xKwQ_5Ub6{Pu~iz1k>ta7VO{22<%W>Thozppi6cf? zr+(UzNy&OH($Dr^C2iH=gRz*j7T*NDeUMYNcsT{kd8zqM`(l72tKdU&vb zZno`O!heJbeDZ=ZX&JP)*;!DtfHon0PGL=TU&aT8xo0hA0Y4TQyUw53I?dTTsS5I3 zIeuli3=azX51;96d^mpqf69GQI^-@Q$|XG!%^We;&!N3Rj=^rV{ckLRpHU)UMM?3I z{fb(cEmZ_yZR-PX)I-mZagK`gRzp1Eg_LKA$e2;ZW9b`v1Cxe8WQT^VKMQEEm?Z@Y zPqYf{yb3kb3okYbU%Q|X4oA~k($-RlW%R!iP; zAvp&c&7k>$8=>L@CeS}3tyZf-30UE|5Td0UDBxJv%$i3a0)#=$__ZpjPz$k)PuKbQ zlT=Y*Srqn{VQzz4HJO$o6>~@;j_OktzgcCf$eO@2=C zuc=5sg_+;Hv_GTtLwvcI0=tVHbnREHkBznktn9`fKR2R6wp55;UH?v6L1(g5pIOjj z(n@kN(G2cT)_b74mBSj~d&G#Xahd;>QaT{jF3lcS0?V$?Q{F7u)e&{ulUqx+)@&z0L;qspg| ze)F`x8RpDn{cx$&NTn={gZSDgYe_BS4@}8x-Z_vkS+NN+q!z|3lF_2JJ$(oE0CBYx zHhNRpg{nX35WIbAktA=GR&Kp>Y$YL9syebznY7V+(iPimu?lFD6KNF*NJ9yyN09<@ zeTMqEgRHspLg#d0bfnduDB?}Rb_wm2745PC^zvtIWSDy5Pq{ZXbz*Goyq@M&M6F^^ zEy!h@Y6V74bd*|8`r=K6LK~eqVtfk3T_%EEJK9~zm=whYd~wEnyn~&w1>I$0A1?Tt z_y)TlWOSIGP(uJ{p-rqAziZagI&Uz(*0Fs}#iW2GbT&S9T7GS*OX!Sy>U!f?7l-*Z z_$w!OMmPRZy=_zBHbS~xJfU+ztZ#0!<0zpwE`zgrvb$%mgYS3GVM1T0Q{Qj4-rCKM zYbTVxC)DfDl#YCSv%h+i1Nv6PdQl4dmcI7=!t9Ha=GzzRt&Qr_!bB!61d44S z%`Opw*0VBwQ(DHHvz8Qc_`xKc(D_vXhm+L}bQSPnPf65Z!Y9u9%P`@0Y})frB_vY= zZ?^_{15qLYXw{ko@qB!IJcC;xxMz) zH11#+0vNGG1j0G$Mw1GGkC=K|1l;pHeGJqDdg&I_=dGqw-99~I)+)n+g(Km0Js0?| zS=y3-z!CGF(d0yUJl4ov!Z+b~rK@mCH4|WET~E!{Sltx3!DNI5cQPokzZ0{%<-Diz z+_<`suXbtz{ya!L1!mzMPIayeoTORN{KoKVSE=y5%uhC9O{cI=y+$?k#mqr$-|EDs zg*}0!SVN^0BlafKl2aha9NY@V#{hzd9tp&S&nhX2}v~9mMrk3ucTd z=ERieyxFHqDTY$9#@~t$Yj;oAPqZYJ_F#(-0wspyo@Y>0htZ}%_gLe z?ht2V#EG-)QwwpJ$b`;(AJ2t3fw17NtjfneKGnrIr$uq>A<^j;@s}?3q_0f`X$6qmXW!)p(d zi*dbR1MWVw^M*1fu=#%$iUT%3oO*JnSMM?PLV5>5ywt&l{c%O>5>AE^#(YLEt8XN} zmi0pIcnC$(E9hQy+qSzpUiv1VR!%TGhq9VB=r)mDwnm&co$I%plfGR~bqak(l|`V> zKsIgY0sKSQ16q@vD;M4IEn5Obeac_6NV8XV&%5#{cj!6#Y$jJJvgzf*8%i_j#7_ys zE%|>X3FDi7p9%Qxu(blkY$kS~=Juri$GYjZrH1ma2aR)Kv3FNUH2($(#O2Ov79d=X zEkxA7nH{iO;E7^~tK6y2cp#6{QE7Q#8-F13uf^KC8j(rM1pq~g0lC~!nP`~Z zO{jTr@)f0i81)^tY#;r?II_2(`8yo?|JtJa*5MT}Arrhv0$ zk1w>2llB^rfv04oZ=Vd2%gt(#`(%woUXL%jkK&lJ;E(D#`C=ye*7&TlI*lZ<+~V|u zOa&@mT{jaPic%LpyOK#LvwCan0YWtEg zOQ~JklU@B*`+DC8lO_99dLI;CA={19Tx{Kf`M6oB!fcXPLElu8iZHtb5Z{#Zn&wB= zG8MP5gfy~!Xlp!@@QbP-3Qmi~sHaW&{igi4%mRzV_a@2W=Dh&DsmD`N+gnLTyNCN& zmK6j4?nbpnYmMR>tt(^HRcpeK1pd)t`mc_Fk(_Ev7BhI3u}EIoV3VCBGCrXr>PI{0 zSr%6}n<~rY%&+CMioaJfA_LT+vK_a8<@>PNdw;cuN~Z_+gojaB@Bm6&3bO{IHGafz z8zcW)_Ycdw1OdEp3D6Gre`61NUN%A1tnZ;H7`60eR)q_BkGJ;_6UoPzTFM|@DbR3f+H&K=iYr+Vzbk4Z!_qK zWK^)xw@m}zD0U9m9s!+QB^eAVYWeN{^}S=DC*KU^`nQIL%PX@)ZO{~r7D?yK-pV62 zA|1;srGkaTBR3q&ixW>mW4VV-PKAvx6WdhMpC%AbQCHejDwXJM9bZcF%Tg{0U19^k zlFl%W2lWdVf581bgi8$>GN15rz`~Vd@@Ul@l*8k-I$tB@8?jEy0?S5LrD;2BLnZ||uT49pLkrUP=`7x@csmycLU>%Qj}RsPA)%g3acTY`-*?9NO9ZAvC7AC3rI zYaluCxaO$M7OFqG#l}bBv!^AE=5FFRM`LelueU9$7RT#R{Ftup{^;8J`sn8^+PxBBzrqn zjWPi|k*h3DR6KQ%>@WS9yg-6MRVF<+SaV{K4VruD`Pf4N4-hDb4$ zB%Fxd5ZynP8y)MX+6QNCKvEe5y_jdBJM6X6{na4bT$ck6 zQmBi^TbQni+W4H&IN(U}+njIsn7ewAm>BVBK|>>+PXnW|+TbXcBQ`!yo@6w4PFJ1j zF0aqvd~`ylY>(rsr3{*JqKR3XNY>@J@Dmc}tLdt%jUt{DDoG0Vn4%^mm%U>tDh}$R^H-1=J{@a^*n~c(XN&ek8 zYqLfDe*wdw%GzO!vpj2IXy%l(94~g2x}coLr=BMau({&7msXQQD;Po=7BA? zi%CCL$#th9%U=?fPuv6`06U`aUGD+q++mQsD(ZH0OoI_fbZ?kVq>sC~%NR8m>!(<1 z!#Y)$)-rmI6>~eeV@v%q-!hysSC9ji1**`sT$@XCye+bo*@(dimn{#M$@w))e<`VdQ5ZAE)=9I$fGL?Nr3Jdt+wv?bsNm3NfGBtS zQB3wZv{72zYKCBV;eVB~5IPxI4g9f9){4r;`}p}W>}wFSaAFmrnhZ?)Ltu7^B3X|j zDvmpZgo0aL#9Rvpdkl(0e-erk8di)ID-FuUMb#Y9j+fNhS7OYbk?NA+i0wwgF+VKE zCsfWh)JQOLMz3tu$WVHpjw`ifppr>U0GQZ<@QPh)<=WoT8J<=->}E!#R(O^x@}qH9 zlg_6&dodIDR;l<&EhafaITVc0(C0j4cpF+U&P@OmTj(*7W)A5dfY;zFAR1G+6zTa^ z9fzWS8ReX>!iw`+mZgRs?tDuJe)X{P>W(oph@`HsTO%LH%+0L zo2m>#7Ud{M~rt+2y&56DdC~Z;gg^QyO^PRCJ5;q;E*+^ z3tq%TLXm266b(lopN5M2b%t`W_je$_00{z>BPh%>`~Iy1amFS=)Tkn3hc7&-K~p>E z2g~p<1lYhuH=7LQCsEtc9VDwh@M!#|;~Q1~m2ytC^&_vJjaqx6jINjs1(xBMG^0mq zO5hHC!N>7{UL}PR_Ds6_tS(BQ0T2altN;WF?a3{Izc)`CEU zpV2fUT@^zcrn+Fg`W(^+$rTU)7lQ2Zf}DU^@@1U90!eU=Q-zemEmzAoH?7Fl=1(pv z=9`vkgv)#=Q@j!~Q_3_(diKRY?B-tdKBvb(9Vq`uNXczYYgPs!S($SVg5_I(3+hxZICvk*F8Z~{Ae{(o&?D@`NNZ1Ea9ZNn3FeQVrva{ z|Jd_g;)}b<0U7G&$>Ne11}90?&4TG4YMzu3vmD;F+Jp3F`Kj|Tx3~#_b@?ywTc=0uwO5aB&r{YVhPTm++s`K zra367{=3D$yA=l%5vWD*xu8Zvs^hq>blB+lO^K_Pi#%qL&RB`jWt zRX&K^GALWf&5|IPnK7XDS&HMhhrd-S0La`FEA+7@yxJ(VTB^!-B79Y>nOj(vuMi|P z_zhL;bvY|N9$ygawxDi3sRd1t1+(#nRUk8SL0h+xe_!%hNq7D!Ef%HlFVok0wqiV`4IuMKw6DZp%NfN2>`q%4<6(2 zQIZv|0y1`n8V(Hy{7zBx6jSr;a-(l@F~kgjXH1KbW?BsOuyVcDp0=R=4h?DfN|MR` zQdURml@4SkN~9LlX;!%FSNOd!78D>7a}J4>L4)Uwy)BEUZ>g#$mxi2my-SC&ih6fiM>CZ4WMXp(AHC++~thagB+GV^{M(ez2&(fiY>iEEUa#80`*KO z`BCYb=WP|qB#>qD!H|f(i&=G1{F5;V?XbtaWr7kHNb`VHrV@^R&#pV-l`m z$vM-bR5zp)Q`^W6PuKFGf&s$b0K%x(R3%BNxipDL{u4&nV1DUfS7Qf^llJr-A}bR2 zEBAPXA?INebfxbSzRty`*An~Idl*q;^`WXl z-kfb(YF~F1Vhae6Raci*>yZW^S1FIjYhb`M1iCax#x;<1M}f=Y$PCS3m$}l&*@wc} z#Z1j-df>}>?Y}w|bkBRt4i>Cps9oi`i>!c#jWIqfx#n!2E} z*!%Nw)L-Xy4_F;7N#oZR0YO&kI6W)QYg&5=i0IN$>jf$D9A%IU(C}Tb@xvC}TeR2( zzHu;=ac;|VN2$}P0_g9w7$sDhUgVjx7LcaDiPsNEEQdengd&#!VXdR|suLAG_1l(A z;g$fVRQVqp;*y>a*9>{4F(#`0C2-RcED-eB3nZnBM6)~1lT|u8p8?@n)Lj7b%?UpL z)Z(X zUs;kl+BQ)h60{toGJ%{MjxHRIL;^q%R_WSiE#lBrn!dnv_m~M`DjY1G(o%XEl=F$; zj3kC?$S(tO!20gQinFPKIx8?{cqz7MExvaxV0yKDYc*ImG-SB`-2m$`t3mJrU!JZ( zlcfReBN8DAfF*Wq{*^MVuTecMuf7>rZsDxEpsDvB_H}AKvs{1`0>QcAW$Y8^xYL3V zB*J5)u8Xki$V|?7JzdR=9Tu3qH;iXDHA8l#D{HfRxO4|@tj}9sg}APvR#fFaT7Z>uqvuAQZJ1D(dEuG>qp}07ALp^a{X)q)j-?_!oOB7;bF3VPFq4 z%c{!S#xfcA-|5QIIO#PzZ`;{?G~F@>Ro5tYjIjQBDUenS!fKn|rrI zmrQq}_R+YT zFhjOAmh#@YirN|2Uc-yi(`M1cNJ0XUPG(@M6Zq~>Q(K@5Sp3Su)y~@$sxsfZGl4Cc zkj?iq+_5uoz(2qv_No;+*eZJ`ktU#y`Rp{j_)8 zbMSu03MX%uuVM*Z0U*G6AQ*fgmu$7rvx+>n&vCiW)nLTaV5uH`D64iLkZdw8yHi~R zKu--7Obsns-g>7IhNNKjN&{h(gbGm~NC)XE!;aA1BjkwnX}K2;+qR7QY($8yr9N3) zQSN2R9*Y07;-Q?hmpj~!+_AB>b>P(WUpg|Z2sQg>!;NiwsB3K0ZezlDgzXcdt#+jA zdi2is$Utt>L(mp|WzY29_QQKEasewjHK0y|L1^&LDvk-(8F}8FQDj`;e+@<$*FS|D zwpp@wf zeYD_lyk4lw5BbSEJ3W+RB-~>p>f>OTeW9&Goa-^V?{OPUJ-9qvF8c$EeZ;3=yE1mA z;B9$jS*3#L*|z%ApzYOi9miV6gIcu-lb{tzvmcztNL*;)D{BXBW@qhs7Iw=S5}(c} zs%@`SojUa#Kz+v&Viu{8b9;o2N|9nHT<}~1&Z2a0=td(Mm7hBEr9QUpbwX`bz4uw8`TSLTEs?Gw{H69qanJ( zxBp7-cHC&)uW*vx4jGm(JKR|NudwwebRxUMOeDM}IS6yM)m*=~^{%~({YhtU9jr2u zFY%#*ZNt~8oGevEf8RJsz?G-oioo3IxXoB;&*0P)or#NqS>KSQ@?e(GgEqwAjT;jJ zpmq~V`5*a5{^iAAIE^28?|+pcd+;_IsVvhAm%e7BBS3Yn8f3JR^|Kf&I>DLhM7}?% z--XhdJJV$ycu8DUMarJ?nv!)^WAwnJNZpf)TzZ0cGDkcFPCV%S353VJwD!HS?ry0y zZsT3Ns)D^15^rfkm8uD0N%@n_H4R` z`n>0=m+qDQ?8v?7&wJ@R8uyOd|8hPe%zaSZeO3~E`iguMgr=R;L!H0-5FPs?z>D<0Bz#Kto*P%LfgJNPzmPe^#SL z`yc<#Vx~&{S@B+_Y9XN-_32vqC5F2xdLpCB^3h!>Y4->SGg@T$YFPau5=vEN*q53J z$8N4YUAkBP!GM7-HLOVTj-5NgaG|}ka)56woNo?D<*WId{b_*-l-#?6kfI4%ln*k~ z4O(f02?R~A6~AnJAK&~rv-Le_{?CgZFqlY$aF;xIHRTyx7usT1FqnsQ*Ct}tn&;7w>Wj>#twOhvt*MpIwvy#iguYP~= z|6m$$TMY8II+|)^BcU+rUv&pP0Wg+CED9lhO;+-EJLij)k3cpP^redWNw;kcdQhyFwoV&-?@$tOZ3Vcami z??1aCrBuAW7rg0*qhhB z^r~|GjUQ&ESsbD#O_{{x$Ibsl^6g<$f?v;Dvb!*9>smK9G#b9%KRPu9WwWA@@6*zt z)nYh2k{1@vz~*o&^5cQ#GJu z`_!P_^7sSL`?NoK*7xk8S=0OAn0lK0#(-a6Tjf_2VyTozsviZPXJ9y*`ne1~JVW3H zAD)%`errb-xO4CuZx|pW? zD_BAsxRZsKL?~03<0>uFZ+6)|itiV&!y23ppEZc}!}eB9+=mSeRI+)zqRRPm!JkXMa z0DouZJ*s08hT&Kj(`&@{f-dtXL`a0ZOd~iUjT(Fe%cQh%kDz=uM>~m>Ac(>M@^qJc zbp4&f7z)L~8H1Z#hQEytZIV@(&m_5up--Sj;V17>ut(7%3vX59d#oK>V8`cP<}Xib z_B+5s=N%1O;*sDvCwudDNS@n7*x_2#DbzgC%qs^f zSb}adj>PH-0kvmV(9%7cvM%Pb7u+5q=-Rgwo$*2VS&*C9Qil``YOsv(&P}$8Z0S$udr}1-D$U~5bGz1m4jP}fGDT5Vp{^({bdDa;ZrW>Map|pCG=el!98MkfBXHF2+ zc^~~W&HACTYHiWz0Q>O)^rY87oZVn4%Wg=1lUAXpgF=bNZjyGAHczHQU3g%UdPA0; zp6b&gIel!$q`a0qr^j?vc;HY_ZX~~=2Wz}@#)c@b?`#m4RV)J?U1&3x?^oI=E}Wf< z#f%q-|1@<8pxIT6p#0=qhFNx2Ic3CA@r|YBz1eovMmXwTnzdGcr#v^$>1w+Pj;_DR za^>j=`2OT^+pC+z1^tnrzFsHPd%JYyxtO4P&1=wiI6WYxSZ1CxL5=1{>1>kZ4x(G? zF9N(cd%GnNkgMc=ChBuX*ju&i;e@PZ!?Af}@{zmA_1r#w zz4$c!H3`@4TX*J;bkj%qU-fS8#;xBOSsb|jin@DQE$yORamuxHU*k7!e#iY#F(jhm zo@^uzmxNu4B`KwQo^_)2!ybxaa6t^kJzXY6(-XDlmN_k3FrH$O!MFmC!k^YtRDORO zawsD6Kt%`4LKPDUJNuviZ1tZ-dr8cq{!ILB^!;;tckl_RQ5d=3p&_howP5PBHbLUd zruc4MzsQHNQQ|z+`)Q?F)M|q_@N;<-+pgh+PPfokm>1KtUP|BTw_5%avSsG|!TRMv z`M+K92%dxSscppQ8=9LF!N5$3*+0XJ#MjC10*^%grS-kZ-bn8d)irceUeRB^JBjX9 zviauk-BS3K&@A9QL_A<;^WUHTcYk+`3r+9*$p;H69wL96+5e#X{&(r8+ie!t;ThBR zV?J@;Jxn=>uI?t=4lk@cDgU2VNAFUF*|*2N5Kp$Rh>Mfe>SvbjmB*iwBY)qH)dp(H z$;=u~0Sun=>4HW!Pa=Wu2|@Sx6j6~g%LHmmZzUv3fIIjoC?tHU=1Ydu0v6P0eR&XB zb2(q?`J@t*?t+4Ius zE^kFxVZiD5Y}UkG=_=Of#0KWXY|EhMboRGa-2VBB za`7u;HXq`LKHL~&!;j1#7u7z=YH&i0K7rM3WuP0H{S@i%qNAhnbd*v@@LmeuPb1`P zy63{p83kP#U2?PR7gIjjsh{8)1F`Vkt&_!Ko{Kk#Edx56)K$TJeI9vr4O z1qIQss65OPlc-W{%h>VDsZnN0!pYTq^A$wV4B@jLYBCr}rFf8^cww}18b8T{?4?~EFVfE7FKwc%OdgZLrLs|Opa|i?b!sFT_o&dZWd!u z4y8mF<%NF$*`Y+YKY_PQhD}i+GFEzhk@Mz1EIH&}xIg=FWWK#Q)_gpsJVJa=6;N-6O1~5=6ho);;KvP<2U{!@=0VZCyR3Cuxc}$8cyc!X4cCz z*1G89>U-3B#-jQavWA-qTJ$kuv@qOfKm{Wd=<8S|Sexs*p<yHWkAeJ7>$2dzus87#`FePpCvskRv-45KPEH{KyX8qwdgQ;QTF89^_L zzFU4`pXAJ%-)2enaN zciJ!Z{Bm|2bart#dqZ(e&LO&qXjs|rdKml3*_|p`0Yn-I$at{q>X#E>Kh&@s4C>!A z*^r~@%YzL=-sD2g?=P-sOkdK56!&l`+gHv;F3-DNF7Bzo`R}d-sEL0746IN>`hG%or~Gi&lOJbTTg-p6hpnQyuzQR+OqXjO>+-#! zZ-yG5Yn)!kQ?F*p%L~DiQSFlt>GOo!^Mc!8HP=6UZu7q;2+?%}unFLH^3tHMp6C{` zQRQjUkDuvUW$AXW1P3s)<>fn!$2TI+9vfa);xog6v8PL2Tm8}b`B2hxAU8;#>L;m@ zyC3nNxIFc+vwV&stXcP2(S~`r9!|=qg|4QYzliHMsNC3mS=a>s86;kVb6knoq2sph z_w8^z6*wL}WXzT|-{S(SjwQ+L`XQLBqUE!0ofsdP_}Le(Mly*%^`Em0x_`91|8^l4 zS50TkA)+2i&ffAi<-D?@nwJSlz>ZJ$qvySC4KUPIq?Tn_&TzBc9RVbTe%s;TYCiY> z#6C%}-{sP&x2EvjOc8Od_^oxe#*0InYOm|I=E9wG((ALT0WKO6Uf{1kO1H=wE)|UZ zy)`UE>@D|>Zsb@HAv!0m5Z8Poj!ITY9~fzKfqx6dB}AZMfrIDS$2*RpK_9_k;Ff6= zL1p+S)KHzoD96Bf*1+`X+<4U69}oUj&zr@{yAnT)BdcM#hUJf~C$Q)2jg03XMu9(! zcSRgUQ`00r+jMH@c^rC)-b)(3=|{LP+;A*v3ThkPmm2EWPVy2wHQ6z7V5$4W>E2f` zn7BFkRK<~o9TP|3 z(pu%#=?#?&PI<|^T0$Qy${fVe<^|c_u?c(r;;nV4BsLecNdJ#h-jIaaV9sg9_D-4&(o++vDDPXI zR`X%vt<1UA9~MJ((6!1_KJf@bF7(CM6y_o)`ZcUkn!^bj+_of)LUn zg8xmVf4ED>(LS}YrdiATEfWA^sI~fZaG3Dc#_$S&vRwOu7lAnDE z@2<+B)#2Ctm>X9qYYi%Q!%KBHj_!sQ)HU1I1Iw?m#Lw0!b$?XJd~KL7tlusD$xnHZ zqZkyBeg^9tO^YGQf!*aVb;%ob*CKx*pZj8^(1HNBDhKqKWXmb z9`F90`ZfANX3PqGyf|!}4}aq8bC-9(WCrCFogdyzVCvfVAu%o?dymdx)L;zKP|L}X z{`0Utbj0m>h%Xca75RU;hW`n!p=}4zwSoA$g?OC>@52#4h7qUZh_i{;y-396G~#Lo zaWjwjy@0q~MEw6;!>iTsKd2P^?@|Bn3A}O*$`rBE?(y&lGy>LFai(-I2A9An*SEwn z6yX10eK`0NYm|>#!h=FY%UXet?5=8R@CGMO?Bhfx&F`D!q5|QI#O8za3eqfAf$V3J z^m5G%YE9tsAa9CtF0aGDRGg=sI^u!f4VcO)oZRR;(mW_$`w(rKYSAz#p2ZVb<*dH zyUWGH6Pz)Ot9)xD%+1qw+FHBnbL*J-pLU*M4rkPf7T@gmFs_t6?2My@hBlX$p?YJX zs|oAiO{|6%u3us!Z8O9UgvTyTmfDSo_Umrv^VSBufn?J(G5PMDqW9h#>F*cC|BR0n zE4|FP=duZOqyfH-OXVW+J2W8|8MjXCp4L5}q^~*N&!?>UX=y}M4Q47hCLJ=% zuOILFB+b!48mei8%bZV4B5ET;ifU;Wo$|b{DdQ!iDjSW52_&-DU=UE$D%sA19tTC! zc7LEsn21^YEUc(>lE!LEW-Fhcj2Nnp`qV)9v(V{>5^apvsZv>ESB*DYgWKg_vS#At z_W7tTp5Y~LQmwaJA;ZlZCMFYoqXsPxBC*@43n+3f;lP?mmya70;7qJC=08Z+9BIIqi{4P6M1+T(MOYS#L49b{pf-MMISKirnq%+ zoWRXP_@KHNtn+Si2pVssJ6`YA#@Wpz_tRs8Q(lbpvio>T)%QeBHM88xVYbR zA59Xh2z0ji?JT!WS**>shw!?_HG3``S+bOQ>6jDg%A}X~Syd_7i5fw!rVK%C7}Gwqsn zT-rJ#*;2_7(g4S+-rz;Poi*O+In(R7e5^Ly((T!{yS{w7mgRAHCLLvxjQ&w4@77JW z_}MLJZ_TMuOkpPkIq-6j-0j(FoQq5P_iVz>iB`-PM18WSzNZecQYeVx7>fCO)ATC% ztvJ=;ES4iPwInjS#}mZg3K8Odwi-aHV;Jx1*EMD3%vJvB}%WDv#Hg0Y!x z0C$8jg8JdrWr+Rs1|ex6yi8f=ZZ%el_oYNo{iK17Ysr+r;i0j+7kA8%Eg*>87o@mR5-AW{bgF?eM2%9K$>YAm z{M&x0=I~mROOd8jDSf;vw-hTqPy@d?7mkhJki3FvaY}rjqpu{JZ9)5i%w}y|F zor*F=nI1tYzAu%q{yGEE;mJCz#CtXbg=V{yfF6sVJ!#QvJF$1oFXaCwW=tX%yl@?~A8L%$l$M4o?U;LExBZ1ZHvxd*Usu3qrq6;-u%aWoFXCF$8r0Uxa7OWmzhHjRiv_8|` z-a$z|;ap>+QGwO=@0`ePY?U!(+@ z2o2UZfl$-^&HN)v>a2;iOLD!2Nyup$fmg9BOLiGcMhJ=k2b%EM&taOhQ~2K*btjeS zBPOwkS?<O>(Wni0C-TJ)bEN!c|8g9Kz{!xqCy49(^mvm#j#-mtOwTIKcp}xy zZDH-VVYYGnlCwFp#@*E%p$e}4T_SGd0Mu+Q#%WsxIEPbR3pcusY-JM(+7*lVI>HEA z-0|wVc6Zu3$ze@(2Zh|F|G7F#2fI{TVXo-R=2}CLn`#3fn~n*~AnTX`y45KuovJyv3XSF|6; zMx6CHhA%4(!s@%!GJ=~wBtZsxxJbBAz_v&jfoi_y}SZKdRj zYICCtXJYxw%DqOE8@fm(Hwx1~c;9TBVL8I;MKarAIZ!g5J(uC(< z0XaXFvTe67)GT%Ky&q_rKo?yi;p3L~Uue+w{NG(Xy-V00HIueJ`eQk47eG6wn$8bo zutpBzK|vLAH)*xa{q2SpK{{a*CJv=YyLtPjGYGHB%G6zHaoO(1+psz+a6igWP$Psc zRX45eV+x~2!_Sa@JL6kHD}!Z1J$JCAH)vZYrEg!(RQKUroq8hQrs8htXfo-gJ4zAe~slkDBiPN&(l}`iNI5078K6`(9wh z;={1xf~*H+c6iBQq!x2jlCZSE5JsISOJ(Mtj4wkd8Chmpv7j9XymK~*V);r^5b`F zLjxhQ8Bzq5W#Sw*sHi%^kOOJ+J4sP~WUCVSN=xKSJOUMKF(!a?Cjq`Qz2dGfLGz;J z;hHF#SF&$~wRcnU1v5%6Twc^0)sQ=7T>(09kaR69@*4?RK8pz>%t6-%bmMel8#>5-Ix?Rb z1Eou({g&Pa(kmLJN(d~ZrdpuzAuDtZg6xN+M7lC6s{)0jv~l(j05j$clW8^{?QD!r?o?v)K$mQ%T9 zanVc(JYyQUlDHjBJpfHt4F*HeL5x(}B#NR0b{}>wP!io*s zw4eVLYprQ#TW9d=0DrMaV<;8h`xVEXD6$zyv9E=1BNGVEWxkpLu|V!&Y5Y$fd5-+W z?}^F?Pt`?9^PgDCwyiUmni6kB%6V_KA+VU|p<+mt_Ircu!^4Q62kje0X;LJ7IDxoh zhPn)Ev0Qw)qJOcnk@}8|n7SiKvqs&R^%FF{!gvBEaSVIu`n;W~y)6Tz(hv1b zj!X1y4zAbZwN?5&AYV==jp+WD--g{RfR8o&yrDks+JmiQVI|7t$M+UCb9c#EQc zQ(4G0YA65=D9WsDh@YzTIm5rEsitOTtfrDxI*P0w=3kTIUz1u>v3^<$t*MwfPArQ-AeXwYLE|5LLU42Q8D;YGIULU{p_&HBFz^@>-(| zKcb$7suI5Sfi_I#)=~z1c}M;Qf`EK^O*nju7kkccm{F+dajeH0k|Uq2-bdJLDb7M0rnM6T@tZ}RSQ*)$ai?Gud)k%myb5xl^>z;oN!z9>*I*TEo zMY*=saT0uS+Hfu^iN8p!tq@hDBzrf}oRZ(}lpyA^*-neu=|SF{@mTLfD&8a7POs4( zgsB#Z(do?gMM$|brvTVGA?2%0L;0(op#)#3JcezuB3P^oQqrDv)^6t1xjoT2-z_II zS=y=H`Cn~&)c;}cE}P;A|MkHS!{8F!-63d#TLyOvuEE{i5(am7cXxMp4Z+>rLvToD z`JHoW>uhb+KK(!0s(u6Abys)wb>H9571>T**!N9~kM6{#GISuNz#oUq6s#3SEeG2U z$;l0gSP$)$5BJD+^7$$$qt*$d7KzBV!T7erRt@XswP&siS;PtC`2ZQ;`2dRGd&cUo zzLjQEy&8f;JH$o8h$UO5GR9NYf^rok{B^ca=Gsy1gsu{uBU3U76(Rg;s_(q(ItFOy^U$djKJ@Du~7ePsm(P`ih!lt!4VZ#%{aE=t%@qIQ`0MT1b`^D9T)rovwAS&>0#170ILx;9tm!ShTHJ zl-BPMBNEF<7xe!PWUniuz5#kDd+`>u3KJ~M@&aA#7R=fgWj2=#HUsRFDC9VS!k)|Z z`)Uhwak1xMwF5@OTd*}Xb{wS)TAAQYaPS|~60~%D=J=J!Y_XVW;87vS+1pVq+fv$FP<P1-Pr^XBqSOo(LTr0ji}o%2e?{=Dsk4kRp~ZFRtBkeL(6NaH{^;V(Vl zu2D@pJitUg)QM2Kl{t*74%O^QW-$w(sH!k12ql?+4T@X1-YRVREL>-UIzKk9qk{myY-z!X_}j#hB{F*v%~;@&jy?r-?j@B4G6rU26J zs|G1ca?Lxh2TMAJbp=zG8s^k5QJ@@(<*IZo+HlPi%+ zJeciT>GsgJA=OzToP#nbH6>Y0j{Fu*`jyG_)i?LGT=?FU+Sj>VHn!C<3D)X}maYdq)zH_=4du z_)rWS-ncwe|Bq;RYV8Rn{TN(SXGvNh6UoZ!txmE%T*&_B{r%= z94W;JDU5m5-i!Law(|?E4OgbJ{iKR9Q>NifGshee(-{ea!KIfE#A9<%U2ymZ#19BRIpD7wox_7HS&K6DY zI7cm7 z*$@;k3!E8G4<_1ne(gp^`SWRVN7T~(Gr9gP3*sFzmWfjELs5J&vDt~85Kn2rZ1FqH z3Y}oAupg=&r+ePN9)m#}`#Fn=eHc0Ox&&P4rQ$IAI4iQQ7O4_|`qeTj+&XSvs^=;b zgHB3J;=Uyeng3oRjE~`-9 z&6D_D#b1fG$bpyo{Y1lpUM)O7gy@cagUSNyQqN!Qyc{v>pN&j$&Q@|WNA?g{qrfzA z_;yG$pXTc~`Qm#FeYyH%&px_F7Q;OS(${O+(8JE;&wiDHZ8MaFU8fX51ow|{K{m4E zgJDs5{vkPdTHtb@$TXvn4E&R^Fdrvw##Ie!qCnJ7mmjCl10s2K_)7eW8LUgQ$)MC$ z9=++=u7R_&Kr`J)(R_DV_rU0bV_#Em7A5VTYbuN_i@Os zaE+nP^I2=R$f5=^hQgDK^;5&A)jd0go2QYKjS(6e9_1mkb%gk<4visx8iRB$_Rw`w zMt+)@rHUN?G*DIRZ?g2U?3YdJhxJCEN1=-?K8&0|blw$kXOH`wjK^oG*iFPumDDNu zIR!Qn#tw1gO}CY4`7O=EVCrz{nt%phn4Cy0!|-vd8wM0o5=RPDguPtqTRx&O%Ftm_ zO91L$4lp{JVE_sDvGD7KxFzFLCs3TWC z4>0QxUylK7^q-ys=U^25Fp;P#`#_RA3Tg037YGiGvEC(5ih@BbeghJKw*W-tBIswf z+~xJ?M?@MyX#JxO^Bn~;__E^&j%Bw;|JO+l+vf;F&k6R!o$`lmS%JL$y#^+jfM0%a zVHOA3eD!kko(kKnEpg-grh`)4JB z0JQ-VaMJgp^7g;y;{NCjaj@{dl<8=*B(O|-g9^2*MGP3?A9fEXWjv)Ka@lV%wh>T0kVm zqqc%WfJ^Q^b17decBkJ2y*cN};oI9N1Rms)HoRc=*0%#NLjR1ah+&St!P5xmYXsAZ zvxA@JC`WX#6R=pdgXg%TKz5*3%70I%=;E#Fl3na^qSmcv-IKPo$V{(40}U5uwynKzfT-T!`oP{}2RR z!$;`aTwRP!`{1}o8@1jAfr~+JfE3^7%SFjxb{$TXi zIFU!25iQeq1Z#!Un#GS}>lK)DIF*~$!-%8x=KlWcYuNH`IZbfjK$sg4V1YZqWW7(f z{q`G~{vj1?kBGlI@zTy(5&~IEiN&>?NY$QU@8Bt02+IOlymBK5ugKm#zit!3vJZwo zgjw0V55Qa21QZJi^!kD32lnPX|@j)qpNfbugXcrOr+kJ zYVn@xWhXmisO~ptG%hmdAnUK}&<|s zmAx@N+s2$=q;iUFHXlYjX&VZ=1li{z5X7hxhIK-*?YDkWp`lW7GKjk2$L%fg9~>c- zLY$b+(#UAeCUuICqcD=R2LLc3?pf3T!1{wCD>Z}2s8x+ZZOBFgwUWztGs$naBZ)AB zUF4B()OZxD00eHRXT+fF#x%0`mTuko8<~v?`$jE2IHlmIuX1Vx^EZqu;$UTC=FP>` z+m!GylVJK}Kc9IP^`&o(9yD4?5 z-R;u3ZW8&|&sC-hlitQR|0bn0^GXHgw0f<-&Lf*o1!sx}7wYYvHJ9iYnZ`#BG< zErZdo+wP9(<5Iqt{x2NAWo+JtKaPn{_MUyO6uiDzBStpT3Vb_}3Vp%!M@067#Z3ak zz#)R+;%M)zg#MciSl{n{tjL=X{XFrhK7WsXf}-Q94@>M6z0I+U|AkJ4s&e}e$6KSMa=;ZL3 zWPS5t`-}a*-~fz1TrC)$hV*wh0G6rnan7GKts{FKn1%eM02oe;5n*M7Gxt8X9~TbQ z_fJ^biI{z5n%ZOhA3R`e@MBpIuTP7GfFQsTM${HY4CD_yNlAf-<;4vGO_-*T2RYul zKW$KO>fxkn4RS9eyZ8?hl|{x

    ok`66*#AcQ#$z4*WMEK=)1v#0@ZIN&KDfUD5?k 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
    l0`MX#zH+vO4XRoA4q}{TLCBPBcLj?R5#Fh~~
    n`(9^@>Nkb;xiK{jVLMTEg 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

    )+x+nvz{JWw0P)yt8l>CFM|loEYV{ySM&;lQ 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�LEsy75eBeD#w#d_P<&j7aoB&|cM z9e3b9s#$ueckF86Lx4@?hb7f7%NrE;VgaG2%6c!3z=y|Sq@D5mOYC-o_fKJuLU7wB zQFLGa%syvdxmQVqL~0U-Ek>FGOV5{1R^>#h9r~Q}Bm|~}_k_1mot%qljch*@wQ~IF zw8-Dy+14r^qGdNZv1aeM_9=S6{b`8skNn#WUPBmnA~QU3M96>{))03|!+Vg|x8F?^ z;R&UTVt|vYY^#Bu<7KAjA~~_ds82NCDJlPKsrR8k{b=@o!jd8eISV%ut2U==sDi(q z_o3(qw9e}cT-fNj7Z%L%5<{+ZtP%c<(Hv8fDeM3uqp-X5Ck_AjB%bpj>iuM*fw*e2o7*l?Xi<0x2zYV%3^H+tIaa5N zIm+1PtR(ofdeN2GX`$F8@1&U~u-B9rNUgipt@@*s2N?~eg2TcIFC?f5X`I({<+ZXo=h=hEnpBI&@dbqI;E;f}ZHZ5BMAT&a&Fv4ae z^Y??qGf9}}&IhZT4_cO)l1Hpsd?S3;Vf<|Lf_Tg!sl)GThu`DLn$i4+;i{qRj|5$KgU1QF4C5M~LCFb&^ zcw89?LfJ!ckdl+uS-w}q%!G7$kZv{1@^ z=+s~gDw2O$@d8JTbTg%;5V~foxKb^xd)#RkGa*h1#RjNvrVhOYl768=ds6m^yBAEH z-IY+VtTOx0a<r|AF6z_pbEg}i zKk#{MEprHyYI>GAS36<9(A1HL)NQ%d>!7Gy`UG*g;lEhuKSbcV1k`e#W}wG_+QV=~ z?Biom`Gv65-{mFdL7$g(M(r&CBi zB9|P2n0v|o@=ccwX%4O|!Dtnh=xvr#J(i-(lS%8t$r8cjmmiUzJ~|4sc8cKARAlnJ z)2uO!ch~{4>&Nuyue4N$qhmp%t&`2)!L{vIqnU%co5s@6ruW(?dHu^?@usd~EAO#% zJaMK3|I#?|D68SCRy}F6bCtliV>|NbV92ftX2j~$Pw8G#v4dAN@K++Xe;W%p32D)%dxlwz-D?R=oba!0fS>b)Q zrVzQ7u!#l^37Hg)q6i9UC5e{FXs(r+R|!IV!B4x#PV!~)S~oxpaTVDv4Jv{ARtw&4$h z&XDcmjP34>X+wP7kGoqf`&%tfTZ72k{ZwxQ7Qko*7~a4@l zYef%h6Wh)0H7Kyzj+8XIUNu=(-Rt64y=5mZBA@>K*Yw_G?;5@2hTQOsKmM`Fv>yt% zcw2RBe7iE)0X!Iwq9=^q$EN~~AG6bjh0I3TjYl)W=3K%BPQv&W_Bl=!i|+?1C6@G zAJ+IGfMK~3!jPt2yAaH<;-Z0=T7Y$IVpyqZ)VFF(pcU?8Z4k9>rn{SKn5OkFUat># zHb=$P$L2k^!TczlcBn1ILRgg}eb0Wro+*@kKg`*o!l7?b*Z`|WC6S-O;;Gl-JxHfH zf5~zV$NffQrew2VKg_q`!0%zxKPs-V#4d{-x?DaV{BLvc^k;Crp8qj3s#h|zM%jVbY5rg`WHv0eueQVrw%>W<3ScUxD)-FpXpt+*0+d#{a}o_FT-o>zH9e8DjA&7(!a0|o53q*jYKC}^vkd0F8#W-8*-QPh{~{SU!$F? z!5-tH`ErN8gg6hJRr*n2uE5fwsLa}A;{ie8_bA6@T`et>t78hrGS}skhsM*jg0s1} z!!g$%$4QqMiC2A)UvmZ5|2WZkuFln5jYCk52^{&Y##e_)X20vuGQmBtIci-lToS1c zB3`?Dy8Z3wfzi3;%3ZUz&j9;ZLFzh%VeT$dztnbqA+E0?VY0tlUE^!(&1#!w?vg`D{o&QW zi!#tHG3D)vt}2;23tf?>h^gm}!|h6-Ckf;2YR)aKyd&#gSfh87Rf{r=;0p=u%&+{) zU7mgBFBfCHoWEN|e?MNSSfkty5X?>cdl@w-Pdm}_noXlkP4n9otdgrrG-~2udW$qF zzvpE5u>M;>?{1{ShGdTiKTHDs(Ot)-sdWTJ<5BhQ=&m{3O~CL*J-X=&o{ui)CGEtW z<AgpWbzeKz1eH*DeBmX@B5>j^{S*0$aR$qikv(n6l@yWEhK z`a?J31r6rCox02po3Epuw3DE#tsfVH-@Sc*vIA$ARh5s;_yeciZw!{DbY~%JH^n6a z@1;2&8O}EcksqIOtDVHO{QP4hJl)F0V_W$n%dj5=(?2ZQFI4^!76E&l3iL-`9~-$E zf&3m6uzK1tWk^UqPvrDY^z(l`bHU(Il%xy@!u%DSbxxr9N6s!FSe;#UW??h)HfgVA z{xBddc_B~GQK;BhQvK6m}Woee*b((nGg*+`=Nb24V&rraO2U+smQcTSET%Sm=6 zC+aqq)F1S2n$JZM313z>pOM`zN&rDs*g^b^FX>0_ZR05IW`TqM0&ze65}<|aR#*P= z)Bo#uWqYSnFD7G`d}V*Kh)J}sri3CFrVm;FwBB_8mrhN!2%njLznQ96)Ry4Ez1P2W zOA~JQlY|ro(|3i8&t)VbeEgo1$;?xF><0`!b?)_fuXXyvgRoK(|D9iVG^2l0*F#i) z{>5h*GVTm{aP~jQ`Q4&EbXXN~svCO18TkG2Pu-ikEAZvOOoWrPi<6WEJkO)m_;Shl zh#w|%J>C;`=&zmS{fhc><=6jfJn(@MCcye>P~sCh5;6@42_>D{8gVcJl*mOFqj4Y| zh2z2(k$r6;6D!AIn0~TAgPn-R>oO7?|OeYW*X+Y_l`Fvfn$dFMEDF)+mB%5O)8LK5UD9x1m*6U7subvGMZtWb}N_}aBm$S*zkj5 zt-ywF0-0d(IK*-&v7`P`g2LQtW~$N7M0wh0sQ{RbyF{SD54WwsZ2Ck2fsRNxbFNM@ zcpvA1?{NGpO%_gEnNqo6u%UdsJSSEu*X(UD52|-+32SS;7 z?&FDFiohvpT10~#Q)LcEpiEiOZOwX7ndXEJ(m`7QL zZd9_Uv$YJ@Sk`frcj8}OFACA1S5B%#pYc`v6?ySo%H}9=E7JEO;~(b|z>3CqG->L< z_o%M0n|y6y^USUBJkv{AZ}Dj^_gem&w_EvxyhEW-EaYP65?ENff7WN?zZaYJ^@$)= zN5BA4#rk@~vmBrFrg>?MEI&%^3z5ytFn*HDRH0i?+X>;c^K)?ZaHUP(k5s3cY2%T9 z_NVXHOrI|Un;Tw!HnDQNAH%xd`3#381bN%|vYtX9xo%NmD(O$_LkQeKaHz1`DQKoF zOD}}La?t38n6N9^ z@PsW;bUKDUktaq{CLHw2RTGht0HZfQQlkbvNsrc?dZsIq&JSP}kfTlM_a0`}Fu{|} zcb&0Yo9lmaw`Qr2JU1|K#&J1Wl5Gf1p$^6^!|$|}g`J$YpUtUHK zHvkaQws@ywKCroxDnP<#ZhvvMRg>DzQ~O6w5t|Q1p2CyNQVPd|BcCow$!>Cu37$Il zXr{07ExYZQ;$7xEC9n35NR31p=2~P;uo~3_K;$xi7k)$!XXu_8**xcyGGfqgSi?|+ zEQ36UH>8U8p_cTIszHoarBSwGgq`$nS`~|IZn0Btr&5%t>6s~kBI4N9h6QyT5ADdMdPrF$Ba(RVwE;rn^`AJ)YP{FCCzIT``%cc~^G z)gsh^8nJ3^`H95R*jG98DYu^GI3*B_YW-?t88E7eyTf;=?_`8KZ<$4k!W#5`DXS&H ziI-kMwcr%5=4eIZed1~LLe5++h7PT4B(r(|m5!Y(Rrt-DW6%hyZu;C(jdPYCV31Cu)TJ$R z@2y_wpZPkL-hEFBEV4ifp6qZoYno_V_;$1z;QQ({qCza7gbWy|kPP3iuX?ruXr_@OjfU|=sRENM2_1ZE zOnFU+5Ji6F-9E&?Wm_e87e;MrUA{Mj0_hjOZj=J-qyWDzx+8wuH9s%iFF36NawVPjmD@9D7=hlwMS-Iu}OMC8w?yX$s>UWiK! zo}b>q9M4V#WR$5kW2K8PT^y9Vw+izk_fPHI`_s=-m_Q$(TZ-&&_>!MRD5$jGM_owDU_kSnZx&;U9g#tHtZ zP&}|3Fy~du+mq$mFu-w&rWzq+@;!Y0$#lN&G+ff;;+ef?98+Rtgtc$#;0>w z?aNCJvRPwBbOTmYk?TIgr@AN&`=3lm6f*Rvx$~MfiQ$}eZ8YR; z77Z62@OMYe8u7{S@doPow}{L&RbymGCnGh27so#CI2CM-To!8%j9><)xN*bCow_rz zxA1USGH_fGNck;zv8nOav@=d|u4-}&2dK#4P9`_WIA{LKITm*CmC;9IhzpmI1ybFkoZs^xLc(O?lobInD8sgN*TjX0md`J3c_Z8Eq@WWm}Q zewSd3lYv5ect!p^v0bt`bl|!N36|-Yn@Xa33Y42ipH_}seMk0F3@qyX6rSjF$>i+e zI*|5#lAJgVkwtnzdqEk)(x%vEnjBG__6=BCc-|H*4f|wSmwP~AlLFP5PQieV=EpJ} z#>BbGOyEp{{FB8Rda+W}5e0R+^zQ6x^^upDwoWkaQNqy&xpFuaIzxRrF`IHxm!nxo zITb%Zfdo>LjW6R$XdpbV=BQxPl~o5^R=@`qv}a>eY3kLRM>bDES7M6y(Nr3A=#tD- zWk~3jM)ML7^}m$UWuP4#t=|^VS6A3PTPqmJrD`(RXo*M7$W;7zHBd}k(Q(w#6&TRv zf!AsQD&I)LuK-D7bjc+p(d&@nz=PXDfGrIw@*>u4L7 zMTM%&ZR;RrYc0-TV|WZ_ZVQ)iY+IOU#{+L4$Kc?3?AwC!#=d*54B92GBFadG#Nv|+ z$p_aEC4L+$B$Fbp9Ss(cMC6mg_1DcMo9n-mWQSHvESayUW$3twH1W)FFu zgZxV}o0)L(wlNU0hr-)~6{rJz!>Fdr9?^(J#?k{ixP{`MaW6% z>G1*S?S<1&&#%;d1j}VH?EjN-rfN~KEhnUWow|LWA7qK9$eN<_i;iW1#=ZY zvRXb-A+cv6o>xh=Digb^Bl&#`QuW-_8uaXdE3>u*uNcMAn}nrQy1dj9%S#keCVl3q zz*4V!R&fUQTmd#T0Ud;G--_v0(nt2(l`U#^t>Wjte;{ofPC70FNv6@&rc)Jk>LUyI zUC{HYFOI^I=L(@SGC59$C9GXrtIZ6bJ9J@A4pOWgIF7v{=e?#*9cqm5?oNVn-x1!` z4RDNW=inRMu=dNnMa>5=y&>=_b?`(i$~WiwH{cM(#9eO(X&>N36x+muMs1zrc--<% zOx;APa~99Lf}^;>KIfs_jM1&n!_svln$EM9&JHHg1fqZzj&Ve^dLk7Dcolp?g#pSo z2s|Gv5}g$3>)^=ux)F}c5l_IHno~bwX7-k9YhB&Pn!1f7XZc?1-Sj%ONawAj`l-zN z%_PJH-}MDo$witAO&0e5Li(4(a?Yzf_3-BGNcQ#Gv8&TV7r4$~14Y1uCfn%S?@Y4c zP~d7r#Cgxe;}xcC*su$q|)kJ(1dQ632G>CH=I8bsdMT zfX?+h2geT)jw2p#PPSd+nr{^u$gnA}5DA;)?5wtBi*JH3) z(VY46Um`ehmw4X5+HgJz*-1Aubd90H81OPIXU4FUNVQZ(Mm!{DJ!Y;GigP`P{J526 z2MOJpiQZpO6*U_mwA5351|;J<6f|310SNQ$>=Diac+R}Pvyv)6yyZNLLo=1g^`laf z&Q%mp#b&(LaHfXh(Ox(|Tk5|$PeCepAPrcoS*(OTo{wX0~g6>**!K@wK^4}c^rKHq90mHg3= zC4{&UtTaPD(`p3GPlqrb{zxJI5Xp80g?2mb_8|K~oiwPfpN*!UkJj%KEu$zoD8Fs? zJ-FOQcbea%?OwCLecmxfpLc|OqFj)=3cGs4>j^RL^`{lvJ)agYbM1z^XA(xtnAKf2 zoPrECpQM<{g0RH@r%oLS+e%54{%%^ zaOoZP`5nx)0`N@_HvJv8(;d2t0$j0oE?TXwzXhye9oQR#i^mp(r&bGK+c2P= zxIEW^iK7N_LsZZX~NkS|^dy?)Tap!CsC z*^`jm>G1s7h>Ef3;>Fm~<(QhKg!(mT^HzHMHwXk49{%>J!)hV0x^P%iG^`~S)}0OO z&4*=of6x7Tl;3+iSPUC2hfP+)rfXrdb+E-I*m4VOs~h&M7gjuYRyur9GxfWE?y-64 zrF{+7{tec>1^c=K>-`4%J_tJ=g`G{pF5Y%iXJNnQV7H5~|AYMhe2@DWOf7$D8)O_ie~5S@8aa<4>N}sK=b#OAPwio}On^wMf+oX|7-8mU|E|*q<0rGs zl8M9+XD(*rs|viT=I5oX&hsZfFMN;g{AoIn~*9|Df?` zj7A+38Rp4!w_jpF<-v~~N#Ize7tRe|Qfi7db-f#SRYSNJa9SU2V70&aRG4t%!tgEh z;q)j?<*oH&t}6bn+L}<5*rDi?q=3G$;VMvmJp$iW_sap}ItH~uHm1~x z#iem8v3K9i1O;>tZIUwN%WT}oYU~Owd)KY3MJPsa)&63$jA3=)qb!&30o$z!9lWt4 z9NJaym&;X?gi74J5}8vn{TEk%=$o@Jrt0~G7?!wJDd`u~jvT=5j|&t2C^FV}9oL>W zc$hL2N&#mCWGYywr}nU{MDf$eE%AUlD#KfL>4a$=V_H}>^pQ1CpOLtAo!lh^J#?Iu zbLfX7(;8~SY3`G&ujURuKYCh@V_6Y9Z)<<`y{4_(hi6_-9{+hc0f)2z@vfPuEV3o@M@31V-=1uW7FF1Y!#$gawjM zh>UgDb5=VCt@BK~%}v^`!U@{t4S%f3wqMLEmT^5Vo<`j^?|)<>M-luJ29e*D##E`(7DGUGC^xaL zCNw4Qw`oV$F;l%qXV4A>VPx-Nb)&0A=hn)gyH*<;Se0O9dfR^Oc{r;ZH}G;2#5Hus z7C{O@BDOh79H$7dw~*WG`RyWiCAls2lEQ_bbm>S`IM?-olh1VcP*B@V8imoiF$5*s zE)?#FJgA{TfiWxjEF`0(=r_x1Uw6exQzGAGKQ@dK*a7y5A0!9Z z?GHQ!y27y&%q5~^Dv*0q6gs28^~dm1DtKSxjJGu5wi1D#P-djxW-`*eufNck$f$tx z?vi9gQV=w* zvKco7!KN(=B)+4?*o(3gKa@TH3B9ebLB)DaeWlx7-_Tv^3 zcSsJ1dfuc9Nmj6UXo%^4@icDEHzj&As3{LsWaN%WVUhlsaJ^zl&3B?-RiaY;%-tF% zh*k2C$~+}*iIIUcL&5X4bIMVZ-6|QijJRGG)=rYp3eQ+=`ps1%3Olz1(^mh0LVrT= zTTW9@)e1;#-e58)iM8mUjZye_z#O4RnjV;H08g4^Ddo)`z=Y4Nr1eEJ&sg4OEt88R5dnd~HwK#-968G1|L zf_SzrDhpaMLBQMl%Lle({-v>%`fN}RWAJU3sxLLZm(|PswpvbaqvH1WSu>49uWNL7 zRn;I>|09QPiuk)-OqNPE2!q{96{8^*Uom= zSjrizcjs9{1Z$Oz&-})~w6@A&F?V;XxTB-vGc&eRj|e@I&@4!6GF?hj+ewp99rv&I^&>6FGc z;=X>OlnB@0moN4im3N);4Gxe;6s_J{lqsOOS5ClyttQDb_VT{Ihwq^-_GRWwSKVM$QlY)t?d$B_b!L~+ zKXy-CXFUhbr-3X}*K|R0Cn{&^S>|G%%-(HT67{V9Y}DVrg1aV?{m&zqneBCxXcjy_ zAJ;sO+hsy#J2jWPhMsNw2zF;}tr@>=?_qd%;cq)rvuq7uWpyb2-daL1dufCZZRsFq zJ6C0VA0N8b*u%JeUW?dPB?b$zvzArU{zzf8+!7TqAQ#M#-+FfVuWPNx*ZgC?5)7A|H1hlE9?N8*aRR-Y+o<@cz=cRS#&)0uTZEw+fndo{E~mckSTWm z(+H>OO@dv*At~q5h}~Bg4y0GYwK~4k+6A->I=RBs#_}fCaVxEi9ItKIi-7I9n*5#GC=|rnN`h{=Pv;XCj;KWy43kk zKH^p41|yZK}fG2#P$Qopy|`!@lPiod4c=y`_lwzR@BF=+6G}&# z@Ioo{D>uv=@H&(*IytL5AvsCu(>0x7A-PcG7&|7}aDRS{3I(Nd@;py`b!#N+Ybk3< zL~T07wCdYrePIDSZ5@H<cPq1qvFdh~nr{k-ckQ7EBT+Q~ZT9You z^A?nhj_Ty>CSv?D;WJw)&=Z5@ZoyCUR%MFxY|~Tx2uJvv1`cb4kIo(X_bK-0E#F_J zs243ApkjiBwkkq5fu5%V&J97?gcPxToIM{0Z8yO`p_KJ3;h7_EKN?0pujGGrSdZE9 zon4HA__Q3b$#@dIaJe?_+&1mMvO%HQ>Z+|g%(VOnIXqT8gr}t`;<36?f5blg5t0pn z;*}|=;S#DS;x=k>{8&m~hRYy0jYf}-j{BG<_=nZ;oeer8BXUWaQ*7FlT_*oB)a5>y z3@(M>w^AdWD(r|EDFC1DfY~=E)c=$qkeM(zRy{|XKa-Ez!~q{unlme1D@r&qKrtSD z9UJMud3rRHr^bZ z87_;tPe^$&vFU9&ImxYHBqnm4JKUblJYQH zwGJ|Uut9FjSh+*yydSaIcn3m)P_d5kgtb9J8h0M%?_`ZbQnt%d-}T8^(u(Zw2!8YO zGmopk7~rrhQr!heEqD|i#c~`^7P(mz0Ksw`i`eU%1w^?eB#z<0{k)SyZqfibHz|;< zHgun{^iok;M>Yc1T{KlgPoYGJ@rC7evq;TLu0A$fj1c^uzmx)w-Li?l5RQk}ky_u1 zpUtB{rc2V*qd+aNz~HuAQ=~%szmUH=N?8F9%}6s#oC0~+9YI{1WW7wxb8EP=BfNqG z)Vegrs3qO(xsvn{D@+@H;57TEADmp17PO2Joj8T@`tZBweF2i{}Bi{d1lv#04}x~E&@50HtSkY8d{kf z4#UZHg*jz&G6eRqd>Iwh4`kqo@}3-^kIz)}(lJn>INT8XjVD2TqJIkyP=4Nq)m!_)S|gnv5g?Ujf6GHu$3OqLwql_ zg*Lv0>2u4)Sv!(O+lgnJ!RI#PyxM{=7Kapkt9JKot z;c@uOH43-G%q6#-l`L?U16VxPNLG^g@yI#Whv^ZHT?j8q5Y!ewNCRs;z*@QEGPfn* zMUES_T1mMTH?^obubXNs11X0-X&dXPrXd2Q%Z0m%?z&>Oy20D9N*3H1hAL%$B*k+S zUWHxm9QRdM@hcH4e@{?5-9oojUQ0<3VClU3l%?EyIcx5Po#I_yB8<0_B(^QlD#I)e z*FYFdyAMjB?XlS6w&jDnHL7~!)B9Nac{M80wEO#BzUmvmB{)@0o=7r(EOoLFMU_G1 zjle-PhBJH$7tvBgVv9!I318f9AgAhG+wLY`7+fOd$21$Fo3Hl%(EDgUvKA;(j&(*}_nkJ+&G+FSq~FMw}Iy6tNNU2KNz z!sti(SWmXG7rIy*kLVPnVHd-S#v`cZ2ydx#^MPUE z>;Hh~s^*heP&k@90LC>!p$Z%Z6_VKiJURdgeSi2LYtu*B7$SaU7*mFzWb7{{xl$c5 z+6XmEZAJC_{z;)RYv-|{owralz)58Wa1EU5nQ_?}q;Q`;El2oLC(#qk-)CHv=apiH z7OPUB*xF-p+EM-zuGVdwkh4-V8^~d&-LIq3&&xGcAvz^jCxJWh5es&@nCF;?i@&(Y7}Br52tZgq9<2%4 zYE-q7t1|9)rBVq#*6?qTIF{sUiV6}bbW$#O#Nc`oV_{Aq1gP{15CN zmdIyjmSuxhJ`6Lw*<xq%_d8A3EjO|*Sj-v$12OyW!LQc ztZw3;#`lhnbnrlI0MH2wsDTCi*Ndp}Rz7cfgR@u5UjgRk^QFNHSNZ)_3EO5=Nb2O1 zq|iP1Ia!f0`9}f&_|-6DU9nDw(86jSio<$9q<&?DRgmBA8ae>fw7bm?h@D+}YkrgE z<5Y8CyA>fK4v=U)~|gtAvI)$+Ksmj&usuwVoS zU#`#O@4{Vw=N1Pe#?77l zJDatU)e-$B`xYZo8vxq49^3Txy93q;ug`SAQ%1d#na-@b&${Z;ENHV%Z(Zz5w9;=e@r_BPdQl?w6|=fat3R*XGe^w6j@P8!KIH z9Q2FLd;Jk{v25l7&9sYuD?25AzU=}#{v7S|H0re~=0dm4R+0c#fG$v4G*p2s5+agN_p z$~IGYW2OAGn`L+A=>sX%#_0FPK<1Zpv$u4KmmrNX$_1c5%j5Bw+LO&=S9?f7_Cpf6 z;S7AdtDD*^x!kbAqj}byp|33RFL;vuyEHUJ3&{~r4TR=PfbhVU8aa?|_|#eB((5}G zvNJ{r#%g?7fepWC3|}F}tPeh@xiVTJ$|$K(Aol)Ud42_0{T-Gj8`06YH@^n-&)%h6 ztT=)9VCY!buO}NVveTKk@6`9rV}?iG;nF*+w0R6ijgSyKLH8A;%jA;rT(bSUny80y zMcuE>bB1h`GFUv=RGtpPqw~lCZvqqZAzXkuSUhLIixE_=AWVR*$aA2W&TZ6Z-Hk)P z5{)fuID*`AIG#YwEW$6mOqYzyp@qlSMGuPTRHKT3Xb^&kkiG1&EUu&Ca9Geu2C$7Q z1`~$m$Y$OhM!3R@_?%wFG?h^$v9sX|L=fGK{hX)oTZ3{B-60d#XeAT%HXn|VGA(DS zp0_x{lp`6%>F5kVU~r*0BN}C&76bsOQl+H&IAXQ2j&D;{T>l_|d8YpH0g*h=`*gWh zuk%U))L}rj>0vKCL2ygLYM1Nr}3XH&OXu63j zfZ{qbQiOw0gaO7_OOe+#G-8mK7fR3JmRY;3>}=*brv5tw?o zDKd2ZBu>5eTj5+FffB5f`YCUy77}{|Rv2>MgOkO)SS%G(k~U$Xv|);*4NY2RQxg_b z9z*l2H9{SB!WF?O%Z09~qRQGBfum-QDb4gD0|!;p?c!tC9{d}PL=jE)CYccVzM{pC zih@5SLwGs+5k#G#4X@PSgQtbfpV7Xojw_o!D@|Ok70=c(kftvBc^7kDB7QE0%O2Wj?FAl}jP2oQfBcbK`xJ&n~T_`3@zV1<-_UbZIDfDL5ve!QGNzfc22^E&TAEt=M zycBIB5$E1>Qj~4bH@>t#h|5N z+!^zB2+>M+%tdY>^Jv@k#%LiBJgtOjnf3Zen*9=Z*!;|P!v2M+lkE4ffL-x#1aZue zyQK(ChfRz>gRmGY+;-5ll-mtKrKruLlpAKGI0_#X!P4@$`pbL z=L+tGFpDzM10i{hwVR{>wgHMuJ~3_A=6E|gD9N}`HcudSqK*bF<91h(;Jfk)0 zEO(#~8Zsp6R2_~;Bhm~JH+a~20O#L_NILC(2wOD~Q#gSXGmH!Za?yaG1Y#+MJ3yhy zBw;k8!gHpH%*foxLxSPg6L=2;1;4k*Z;-p&sq>fJBOQ);%YBwF*L}f4K|Z!FRt=Ia1Erl833uV z$T)_nC26^TxIa?>iq#eugdCkx;{TEMw5_*K!NFeK_@m~3RgT28!L0tbtG#GTD@8VK z@TFx!GpnNwfqRun)x{8ypQ(u;J#nHU{G})vWS>Lh0#NMkEK2j_tOzwYHEKoCYC%!W z^Lab05}CaOW1?>GkaZ{o+d?96I=m~lF&9_>>zRRSu&OKPpMuQFDrQ|Mj!g&S?#J)g9Nj5mVY0#LQKrR%Y1a-_1(5ne<482_bL`0=OQHjaB&zEWX@(4)MZIkcv>vir@a8MS}(i&o*e zjhh2^ykV)xYE4S&FDzdgyjM_U-Q9sJcI; z{eVmKoW_lLy9pkTCg17-{+O?=ezHw~t(D4{gAB$!6yFZ%?feBp64f;UU*M9m2Pr;j zP1(bGzsxd8vkIyjv2#b2?0p$paJt!FOUHr`*vd^H?WPqyZekVt18c(JGY1LM+E^cg z2RW_6_onXzHhq8V5p)x5`nvqvaeHnPI?sRLB>Q)3Wrr1L7~B4vX`8b;RyPLnim~V` zPrpvm;73tKQTtOPGuiW~_qyAc{n@BVmg7r5jkGVK%3%WNTbB~RT&+4ue+0=F{@vr-Va$V$+Vgg1HKmUgO}l^lPz z_phwJ)=gaui01(p`v%&GH7*hFMBMvzrQSBYFB>ek@iuvNAI#LYE;@f;LgscTepWk4 zmDCHQ|4Id&RG)4S5+CQhm>!R8$4SN^dZpgomIdRpoB3OvK~w28l7c&jJdz+kWPJI$ zm_HZ6B6hO#X}d=dc)JF;w0me4Ww+CKCAbRCppi+2OKyUFV#^&nEKCg;8ogFdjtbOW8){1d z;PAjk;9g{)_993e+0pJL^dvNU2>pN9d#k9nzPNugAt6Aq;7)_Py9al7E$;46N)z1O zt+*8^?!Ojym*NzcBBg}_rIO)&|Ce(=Yu1{%JvV3VeR1|W-~D+$kJ7dIQO(YGtDYt= zf=eT6(T$7X`-mDE|LiY8r}zS_tHG@``l+x(t#(SxPGj^J{0glmV*D%}dgml5-R~;A*HHr0RCMX$DJL0n@QRQ_#B_ZG?2#f zFW|b70T2(!(7_?ZJm~G2=^d<7(!3Nk?SR8PjTLMakO>KvbgA0Z#! zlO)p42&WhE_8oGItf$5r)ZZY0?UPZTDGY%|Yo6*<-jBQ<9MMRU?_yPuQ&0fuDu8Vj zlq>V14oW`qRa?=gnOj84MFC`-i@-hr@#kAc7gmf$2=;B~tCiVFt zMBvqf-F>f-Nxxw4y7mCTRtm0QgxKCo)MOb`cb`C!atR-rm&G_$>1ga9Vn4xg!F>3K z#R&E?I%NM)=#RF%hb)1(OB#^qUgpMI#cUFq~e=qGxuTxjB`SH}1)~1iS(0K~S^+BQbO|K)ryC zK8gN9<+zp+b;ig^e@gSB;)nr_FpBXPm7^si#R6G!vbqJ%Ei-kx+4VhB#d{j-gJfk< zd1~~Li#S=6g0q~>8nQl`oeLU+mDoei>mP2w_M{*lwV$E#)c|3^O9)=_>J(u>=a}Qh zs7ry9@qk`$G)E*p-VF$X{O?J0rpFl#w>0vgAsb5}GiF4iI(=eOR;^QIde&c)`VmGM zmd0E+&v{lnERh|qnlppB@at&i2~5Y{K+|L~|2s?jZcyvL4K3EQxo_=>mz6p{1hvKK zi0%D}CcPtY^CFL_h{Z7@F-;=J%aSnn5OVD}NVpPFBaX1{qMQq57@y9EeC|tXfnz(3#U9m*@f+4D|w_`iiT>hK5D~tD@Nm{ZRwFiO*zQS^cI4!$k&IwV%~JmRaEuzBFs1 z=xA>?3^7&pn65}^q!y$Mjct$h18~U#-=tYdilI!%t0 zUJb>#&!zDlr>P)R$F^!CQ`1y_CwD_EQu(V!T$U;3plN)+X{O>vfaOLBi4HiRAaS)Y zX=h#VrwLXZS{jL|*r#3Jc{RF40LivB(>5S`Vz_wp zHJv#N@0OsZIoI*rl(%{J8zWXY8hN&fFo9|jo34tY(zpImdH;ngV$A71Q#&EddHeCL z^U|H9;?3k@+2n0h#Es_5=m~-)%fo$3yPrFfqpQ0OmItGjJ3?tIRVuVS5)#5@_DC>thO;Xv# zFwMiDzZ8j|Na%k5Ed67#8?HOuc=zSYEDm?xtD3r3ANs$%wxRytg0B0q`?*8*bVk;Ze>wU76eelKsnXp3scMuAD zfC4(Og;YWnV+{b@KgBMp^yFuzmcaw>Mr4O<-~?)02DWTbv!)~~+9Bi;+_XW|DpFPl zn`dMY9LZpivVNLL#v6tZmBRkIOOQpKgL;gd;B@o7U+_cPd^JOuo<&MP_*F$xB zuJN6R)lHQ(S~`DccIujt^)c+lc<15VWud-b+1zc*nzVC1vZz!zaj%H6TG(z!=kfDe zb;q;|j|_El7jRczNLpz#&AILDxG7w?bt?(>D7g-%*bk*p4hO1zQ@`xGKm9aT+8E;A zm*Y6BbsXj1RUX3b-p9BlX#0lWkt|`zo%kw(&ZC0QL$~^1<=&}1hy9T2VomsTeeNr2 z<0OC6v1{x47;ovSn8R%&M{^HSPo6RB%S;ej_#u?r-r3PrFzjN?ZuGSJ!&!{SS6chJ z0;fw)&o(xZ>lDx3f7d=QyiDv}e|Wm=USI1l68yYAmvl@m){qUxRvg`R8;ZR6{W;># z=OLV|>k7Jl5bB%%iyNTv@Ly>zbnP3=4{lX1-g>XS3*>7+HRpi}vX2LFHzRL3>AZuT z3w(_4IPV;^kGxOsZ-|`EiGz+vL}ZEH`j9`=_5W7V#XE_K;qk3tCwZqF(|%k$lS8ZA z_;S7g_DYgw-tzaq8^#(k3X>ny#G5!fiCKP$Ea+!ZY#nsBwqPRVfcyiu!ymE zletPR2p2XQdH6)M&az(!ba^(1-6^ekla>1~x89LIxCH&1YF8R=zxQVY1wg&-biYih zbY1DQbg1Mr?rR;(lvQG1wl9_l;?Ogy`8rRH1w4KZ;16oIstNGz4A7|eQE9m(#_6z| z&v_LztUwsp6Bt;g<{K#R)#4$Wocu1rhUL6MZ1?lM^8UTeL!fsJna`=$v&g|&M5X2W zzWnK)bv!FD_9kbnlT$r=QpogJU=(#AkGILtS_F?ERU#guVBWv zk5McSZrs7#Vvp01;OI4P(Rbc>m*4!?f@f%h(`CFfye`RQepQ?Yld-U*DK}=ZxDk*+ z$#FzUlpP3O9;NX361-$7#eY)Q^EhA*r8o^ie+YRF5>=9&)$oMIu}LclG8DhPqc(n0 z+jN{#s${gfXu@Fsd|m2c_0){>`{37;DbDMA;oSz2*G(^<+G`a3DV{omez&5&HDH|f z25Vt-r-}h0&x=3d+;5&W<{@qc6dh(EQ$VR&+3E#HnuWqzMX zYfj|;=^Y=L`taw2*5UB!*{pKqoL5*__@9YyYl0~`OP|74=EGKlF36vd9f)H(1l3P&(duvqQJOj2DQ;;icthCM(wP842luNQsIJxKlUcF zn02e8Saq>Svv`E21m)ToRMOD{XruN7alkBEFT-pyWan@w6$O2(g5|OCVsR-lc7}%C zH`-ayV{qR`SE^Gf9eM6-8Xg*VVT@Nxy%y%$=&;84bd|5jZCMfY9YwhNx|PRlfRzd_ z5c^?&zbD~}dyeDY$MlnZvS`}vF_2sg&so&jyG%BcLckTGD0=_FexQ5$#mC^t_Xa8cu6f|> zyH45L>+5bOzmx*U;)_3{+n zucwF6qa=)siDDmvb(F7r#z)YN#CS=}JEhjs92S!WGYDS&B}P#P)95}BIDs5`4q`0P zx{j1=DHW={9ciOW3zByxXl#haz$~)9C&rEhPW0K1HlYU-$BJH0b&8>QCg_78EjWo1 zxmi)mX!X(e>NGh|PeCUNrL?l>qHtG#S0!Kcj>GC=#~Sq7H&a>qq*WyauKvU=^&9W; zM-z5@I}#G!H`NN))PFE*ccp14B7C3IlAKZ>tz2bjNGhK^?_PYe{%49v<6>@f*9vgbj0{p)6FTvYkOq`6QlIL#rx%2hR31 zFBzR*v@o;1-;~>N((;_bPaJ`TFWCx$L85IMPy(EO*=Rz80mp;!meCUu8&GvL$c+0< zNTi<(UW@RS{KVcpR5ju%XWb$FP0ogT`QI&FkG8+}TfVUrohE^~$r~Fk4_6}F$YoK{ zo#@Pf2SoCVLBNTcNwOHIHAGrK)gOOy*beW?&1p-vmKJ>IHU1xL)F#!cR|Q3w`}DQ( z!_`Y&H@tjaZ7t?tiLLi-*IgI=h!c?~sx2%PZm_&nyea&CaQf+2NR*X*{2n-Sm>S!bH*$Py4<&ve8-r+8CCSpl z5{Q$-tJm=*?5C3tEFEq~VACxfT3}b_ip?#K0PzuU&`Zo{3?*wZJS=tZyHn}a(SfLc zemfUwLyX!|JnFiaDmd?1<$u`_$eR=I6Wub5{?%Pfu&>-Vn#0V)px1?IrB8uqt%<+t zmW3KsM2u?)Ql*IPVH+<2!DrAIrYAZyaZDVou%B&mme8R0w{lQkwn(BJZJbQOtN=oK zu2U&(X8T8brs1GT4Tw!9)m`Nb+>{ELXM@Tr)lI0=p^#s-(aS8dr{-i+rHWc<)lZEF zfJ@Pk)LAFk$fRWG7etRpI|4{=7BLRl0IX)k2!*U5h$@%hZXr>kh&FrtrHx2-qs8pw zHX@%nf3o;sB_0U76Tw`aT0oNk=G7l2j6=4W7ksrP9qLe~pJJo1o6O=y@EHosJ`bZX zz>c4(pmyFX!RD0plTD%pJ*|&7`rJu9lk{tyIl$CW$F$Y-a&i+Vx$ocGuy1}lyhYqE zNdzd=2qEh-}TTvz{`gy6+c{*HJoJW#k+rhX5ZlyvuWxsfc~r3uRkHGjR+J04?qGv z3L6eI-}SDI-jkGO39cM)tC*lxNLqp&&TM}bXnpFuY9S-MwBOi7FnOoEP_0E!84RG& z5f9+%n+y(wb1i)?ou?z6pz=Y z18DRE!3~1kh&NZiPtgA?d_qZiydHO5$8=lxFo)Yj{(jq}o8ocu^@;bp)CVUv46}tB z27j#L&@;~1`DV&aj^O`hdKKFi>*OlEUTYWH&LpoQJYxjVox`Fiv~6B2R#=??8lu)Z z#WUrhpvvP|Hw(XBkM6Nb$K07|^V86>;S-@3L6+{;c)<0DkBlv3#j-pK5*w@G4sDT8 z_i#C?jlQssx7jF|Te@Bu=Axhn`ioMuCuWKi-63r5HKC>s6BZfiH@aTX%m z;5lG6)k9j2q8J$~&$5+sFBzF0yMN%)oIcWJ{ z4IgS8>H1AD!^h7LvtISQkZ$;eErqIx$E)1!WKO8Mt}y5asy-|TlL z>8n565$Ytecvm_>rLl$~TKCjYkj8u;7P6qx6ihg1?l8Z%sPR`a4!)xLB`=r#r#4fu zH3oM)?hd}r%{ZoXE>$t?8+ttM`2rp|6*PwlE+~X*!V3S}LT6sMb1zlq1rzP;kxHf! zRVowrpkjrE5XQe?h3TvA`CI12t24wgDW#eKAOsISp1Kg#UYs^Zu*o|cpXj}haWY26 zuRU)V80z9YF1HBfJEBNfI?Xr+fqCA_pkoSu-sr$Q7fN^*(8&4Ng}8q?**PO1bG{^FS`mz8HE(yl** zsGt)HLBVlJ6V?XVrOFQ!igaQCa*N3ccQ}y+{lh+nsk<7Pl;+jhMEC$W0;*8nA7y;6 zU?@izPCeUNnrP|GAK<3M7)cX@Mqi{i5Ehvjpo2FgoLDNOp2mEZx*3cG?DuNwL9vS8f+%;4l=d} z32&b^Zm`a2Ph4n-b6&wH9C18`MY;OMJ++T!?lF7NJAzr6?ZlbwuMzg_)m>3Y2ixjX z4@W2FWv3WNJd-SXK3j&X0g%sgY{we>D9g|!8(`%W$V?Zc$08&?3fXq>SJR4ORST({ z=Mf)qeGbd|$4UvMzAh(_8(}GIa57=kBTuUdPyz(%RRpHg1nDsZ6V?U?It3K4gsM3j z6tRF+Si3KwL_Q}7yjrjd0{;;}=3Wc7W(|%=WJo3&B*wJx#V2cEO>8>*PlqWXr8=RL zHSzhPx;m;$p*GUBI+{P-j`=Jm@GRD|Htq#0zZ4Xt8uhjSbqaBZlUG(mgrB`^9t@xd z5;hOM1lPr?u~9{_VuYO|*;&IA7!AX9l3St4)pdz4bZ*k>ObX5m)Y1y7*$O-BQaI0} zgwHdL&TxHQvaMWle9v;!2C_og@`MSIo4P4VwM5Rf;0D&X2xns0V5Jg!WejV&_(>{1 z!O-4m!CrMy6DxG4t{|npXtSo~YkXMeS#1V;a)E2n34{Z0qMX0J!pgN$%e5-vtV#)9 z?K@B{t)m}2?X;^K)PyXGsU@Tvj8T%!Z3R*_vsNp?iM`=%O-OJ9uoX|;<+DaDf?d88 zNLDIqpH|zS+TuSRiT_OSM)Wc1N1q>#E9P`kB0v9_rp z+SCB;YVSYjz3(98>~y`*PSPM3WRGB91Rc`_{X4@``5F@eEo%i5!+;SnXM{qFq?K;& zOL&x>>gMY#9`!DhzJs+t;F!@+(>!vPLpO%-|oxWvCA2>nAv~mbJ7j;s_qD1 z$5G1tQCp`m;fpafo$+w@33d-K;*iFJ+3q<`&cA3YH~Lxbgp~FDl2(PF?^VtEE8_*d zr}7+x(T%R;mWhR~rde(cxV2p4ICaSA_Xo2ZS|m z&89$ft_;%jKIMn>NDpzjfg`<&;LuA!dK9|>Ob^6W*%7AdcG5WIE^CsO;_?+jmKLj+ z)`ZOSbSQ0#Y`6|pioA3Y(hJyp5}MROCH9uNr0 z(mTAvyBzq*{RkgzJ|w}XEml4x9ua_bcpmtn_k=a}YKlOrn+LsymvKC}Y2O+z9UcN+h0-VA z1@c&#f%)kO9%c>obXBNbs(t`t&pFkT?qksTvN1WnG+wG-THm;(I5N(@;*(>P9Rs5q z-=M!&g$O{QH3}GRufQy@y!LlHB&d=5{Mu6~FzEOwYC!3&eYD2c8&H2Uf%hvsSQhbz zV?v22ebJWtD|NDEFbPPR)~1Ej&j*B1p&(ME?Axa_S0N)BrNVzt zo#{jMT7f2QZ;0@ zpg*(3qE_~$)ocYB@K;&zhuZ&u`T70~=06bxureI8inOxH^Ap#!%C!Cfb+?8Vsc@3X zvgpsVa44~!`m)Ki-rxTK)%q&0BWVVRTUHO^$@M_a2J0b7u1A%pY((@lSBmEYtQAVM zElMJ9F$MFf*9@0e^L9lXQGRaTer(}wvXY~g(w<`P{B-O6*k0(}4~$8m(k16(2o`RI zy_TgU0HPNHgx>{dBoSij-(=jT1!f1}L9^}@?W;4ldfa#7hkl~p1jMx4#nzDI!5O~$ zQ~{TEZndjQHkm9XvD8P4)Mo<(n$DuScdULyMl*sg=(?f*tx|c@p7>{<6cJO82%Zkw zYvw|IrE}Ahpfub>0aX z6a7>+$2H*yI86)CFYM5%`DyU&PP?~5EDA3XI<=4JY)i~6@XL&*ux zvUfrsj5qk;p})J(n;$~#pD!1K!V4|dSb^d54`x?E3`C+rWtIs1V3kIZu>i-Ma|1c>poWi7r~}kD z6zcyDqW}L-{vX?cXXf9b;nxqQ|7HH;$ORlnlA_?NON zdG(9?N$>TYpc@H4>lIR2l?v`;`J_5-_a8Bn-{F>O*%mn7<1wXl0I|sOa zUNc_yEG`!IT!-3emdCNv3tw!wNkv@Jyk@`YZKz@PzI^y_G&zHXl1dWo{W)k*ZC4vc z)8|Jg{5A%4(&L9ikZm`yZTjwq){}&N(za@ker*A={y$9B#wX@~$i4k6Bj3p~he%w; z_0ntt1(?cEP6ybzz=ZnXltt? z%*7wAa|uEf4P)#x;)lFPEIX>an52WtlX>ZtXo~ozx_9h+PU`Z4fdp&8r?4#l5Az?|ikT-1gfcn5juY-ZD-U8V7;kkv+i#!^p~hx>^Nvq7i%jtx zBiHR!xY*aOvWQR+o@k!+5Ejc(8VIi9RBR!EcVzaP>_$m~rr9LVt9N)?(jcv8{Lny^!i}@a$tsL*bM~ z)Rv1C6+}6?+I~`GX$o$_MBg)T4uaZ583vNugit7F`6$sYxRym@9er&XB{edCBlOwA zJ6#S>WX~t+)B)49_L$MaVcgx$UuDF=BBR^oq`AM7HBDG9UW@&w+D0Re_nI)0C z%1K(+1okk{6K72oh4+UrW#o2Nvua)|b zxBvU)!avVCB&wzx%nI>{<44Cx^q8;U(!|o0uwaOE5uF>gf6hoZ^QT<4^f(RogKE5} zk6yDn$)YQCJ-%s(tAU%81PK$8>6&OlYhBAD$~D{*5%HWW?KrtCb2@Y3PfGU-7R)db zJY|PS%GL|8&u}@G8g!Cclmla2poC0lLXz9W-OZWNo?-1+OhwH%<8@f^OHF`EV2j(^ zfJ!{tAhG7io(7D-L{qLqVVRtL-1NBZFWX;ZX8MIP9G=lf2L0SF;t?FnlY~NAINOwf zAbx=H?`qn6Z%CeyK>Da)<&2T(Y%i9+h~uQU#0Aww|8dzNX!ukN z#6Dt2zZ4#9zO!vzt*P?^iU0NyM8>M5MNjzM)VZ08A2&fenbg1ZZ_ZQIT zsj!-Ey&f9ipo;Acn}!4BazTAo760tHhK*Wt1-do5EG8PSROp0T0t*c>d!fJW_bTnwVPTlyc z9@+{?RbbBDP*9SYufo=GYb{G% zZI*kDYT1qAoa3B7H#7GNWWBc_EGnc!=7FZnezwX^xZ5DjHil9B0xgNr?+1>=mwP+2 zs^a#!UU_UT9YAus`@|{Lg(X&p?@Pl=j?X;mu-dAsm*Xm@3(Xp*Hr4}WJGZ3Vb++<# zBKf^S&OA1-iX8eUh639RMlXYernlPJ`_-|C(tGMJZ1hS6e=Mr<#ZpeGjI%-20{!Tsu99H~7S{m;J+_8wBCjN=@3f0KPEcfL|C!7xZ#B zlX%JfD+axYvh7tL3lm`ZIOLX}P1^xwE<%~Cp$zVk#CNx^J$qq|mqZ01+|;<}C3 z=5(0W+ZZ&?NmA7o-~R94T9e2X$19i6?Hu}oYCxcGgmTziimjp7Eq3MBF0)9Q)n?Ks zMxLrz%GE#84|!aN1unmXTXopf{2TwHGLmVWkxvkx&c^dk2$a}n{C(ezUVZTaU((u2 z>Q{-&eZ%gU*$g}-G4s^5vhKZV7mT!}qxhrmE~lH3+Y3Kz6CIx3e?d_y5qQ}1^at6$ zd-(r5=c+5;y;m--+a#J;PWf{ckpA|{nc=tb0qJ;eHCB z%FgA(V;YPAPRJUvt60&QIq=GlG)|~G+v+*COV&?Y2HsV6d3+L8Zr{D_4f5&D>Ns4QuBsM zdVAq0LAQ)LW2J!^WjIqmwzqC>h7Wyk&4zzdqrNAn_Uy5tFlV}uw_F%+8ttounJ5h( znm%v}+_i*lzbt-;eECmhxAZaB4%9pT8tg2H<)~nPCx3e=FOd~`Z!B+aEB2K^Vql*N z!$8#mDxv2OHXBlAi$#>RD|{V7933Fc07$EGn1BLYL?8Ca592w?wWch8aV!23GfcT1 z;d=)S)>}_eC2~1r zR+N%;v_?0Hk~azTAVT1Xm0tyJSso)#E~8i*c|?zpI*a^SNiz_^WO%1?NUD+)E8l+0 zWD^m~QR|P87j5Bt(_g`i&}R>gQw>9js?t0}BgmOKOyo++h2!IBCy-3Wx^fAk+>PzA zokvO_RzVSEK?I++Vg=17LV&&~d!a&LF+GO|f1=4mpfFJ!F&)}BGAf#G<(9ng&TgI# z=S0jE?#6U>0R$}tLEI9tfYa{BQzh8FQ9`pOJI4*$)^KeOzIL ze1>rh-2o{jKQ+ZtgvpO&tOvF>m6Q&Fl&-vJfk+t0mZWY!<(o6?$GXT}Fl^q30sWSv z-h_7}IH4{$*~eF~&oQ}y)de0Liz}ECg(=F=%tL9)Z{{m3lBMeD2OC9_P#mzo@*y*7 zQ7X`b6Yr=0ZcWGV6%L8x_C$@OX9+;*kaXYHBe;9gO>EK{g3~cu(g?Ah$CK_4j)Kbh z^y*^i1TL}9g%8eUY-W5}GPmhiwqVS0Hb%I{I7w>}gR5dO4|4T}}%!J8y^$cQT8tOnpi*uZNfd!^eF)530EF+F(QUVuI2J zjhaRk?d|i_!dRZg4sFv3jkTNYn_PbTVuWxeN!14B$$GYal>b#L+>OO|#+YBFJolz1 zsiuxp!Fb@$qCL$V~yxbkkFo&#e@3Qz8x zd28w5U}8Txk1-#W)j@`Su>3cycNct_RzJ!PSj%bT%4uBEfL{}WAA`jryroaqVlFU25W==n@MOjnO!q_NiVbkP?2Sv|1Ci zGpX;!;_%(9i^k;Xpi42dt?v#g?^})swlnY}*=oe&Z*ptf)l!Nnc^D(AvR&(@LaQpEAnPquyOVG@A0IfEnX=Rp~K*L>0Ea zSE466p^NLk&0x+iyoq@3`KuBVOPMHWNS$iPdis$1)cA`%lXvQavtJ0?6!TqZzMNQX zcPK58IIE*RNhrT5F!pt+Q(1Us*%(WFxPCkhCA`H>?52RW^+1?WKQ$#6CN^1p-^*jX z2}Ge10HDMwn&viZQfDIE`w!9s71e6aAlZo4oya!{ ztzi|d;d1;^DiPrl65W!&KSW*t<1YS(Pmg+C)jlcpJsp`i)YS;;K|FV&Zix#KOL$Oq z;}dr|@^-2Gh{o{kdTTCSJ|wcg)FQaho1-spzok%d3$T9=D!Bzb)2GieYJ9k)oqC^* zL?_+=*kY?g-&|2A3%T`+Yd~Jo3?Q-|t@JHYY((Byyj?z@s8{GN#FbUz14nlhis~ax zT6a=n_e<}OXMNogiQS2@ptavJE^7+gZt=T?Wuoo>9cLovu>X7EtWfV1DRCrS0+Kx& z=Jq<|Zg3GBRR^8PcWT0)-zsfS1;GOVpZRou7)1L95O4#K@b1Hh58}Z=cu))@c)!mA zz)W32-vI3cNcKJPe-(#sOY?j!gCoR`94^Y`Zz_xR7?X_iA}FR*PYOROg?&uw`*@Pr zeX#{hd_R2cHp~uF2M;-tS001R!Wbt&y{rf@Cg>lN~ouckEdlt$+BlA!UL7jdI)B@NqY+T#`jV;&4 zp3%d}-{xjSJhEM7aV0jwK$<==dSoO(8my^|g9h^+Q7YEHF1aZ=QFF5^kY*H&$zEGH(&t0k2aq2#7{{9cJ zCTt`jaVjrL{u>Ur#nhZ)rALpF$Ja|0G7(R}Uo{VV#X~ernGtm8v$x!OkpK#OGXT_0 zTYPq>4^a)_-3-Kp4Ur)x%(lk1F9CDg-h`FNG9`3@A&H__hTDa z^0tYy>BvyLStM9kq?m>14gmRam!fbWxYp=wMHA2E1Qr*)xV#wF(4l~a8R}3_DB2ftaf zQ13K(4es6=*KP(<%mSUH)+OP~i|xVl{s!ek$R<>XJn2?8#*Y#P5g-3s3!M%V9)X;b zrFmtX|7|8nTLD480N|Swz1cY`yMFc>XMat{1w}Siq*t@K6LxkC!MlD~xd&J4UUuB} z*}INh+t3>@C8CdPcYL^UfO)2a!W&2dfcPzpi|b}3&xDQPeUoBqr*!k>)3*DP0=j4GL_2ba$7nyp0DH_v+NDe|2{i8I7_=8u2(-V zvpsi?GN=rcnK4+F0iX3>fD;>lc+GwIH@z{J1C)TB@_8Rm+oUMfg-@OP*CmC7T;f@yJZkZOwpN^>Rg98c^x^6~uciv<2jRF?ng_(V639 zt0Y3r^!WhK#)jz^R|cMuiNC8UB)?eBv9U(x^m6pshbeItn!XtcnZ zIS72!_+?AidJzhMzM+RhK{gm*8hLU~iy^?A9E8hkq15>(4ulCUQGk-uq2Z^&dXgB$ zS}}5oS$vCl7k@xfsDxF>>G&h#FbVkO_GZL}Pci9*;*-evB1d!yMLds8TnHT!XxS>| zu5`0q4WKN|);&u?5C9OZ6b|I=$A?WYV<0!8eN4xsO50m zOjWuN)o7LQhs^=l{kfMa)s0IeO*A04{EkOY{S>P}vpRk(GfT*L_$KI2jV?U;s>s+)1)r3D=8pa+sP9nm)3k;SN+JG4e;0huY&mY-?9CuqcsWCVh7jeluBE^#lb4TwcyogPhW zYJjo@$}7reU^2Mp@oB*Qj>`G@1Hf4ds`?BO5)88ko(646lKf*TEFHCaP#zk#<+Xn} zf?8tOQi6-h!6%eMCZ4(+oiX9~}xM1XXqQpB~ zE{b}Q(VQl>@#tnMcetcqtjhrHY;d%AG$_e|?J8q-p`KxC-s?j{L+q()iYUbTN<0f> z_2AI4zwlc1N~>eJfo8q;;=?d)-(}mfRo@kHY7E0Uq+#sWd2LPAre6)!+alnHK~jlZ zXP1&d7cmb0av%p~T+W54^?2vqW+MVKmL)Lu7z6S?KfOxcaFW zx&1vg=)xTHCh9>N*324?YpT-0$=l(M%Wj4f^_h?p5KAO$AAxNOC&|%40Y&@06geZ- z$`6Fl8FdD5*{zZIcgy{UDz1>DNP;i40aAq%2+YkbtG$mHAIa#IV+8-C;yxRG|L`?O zzQmy`CpM8IB>_aU+uNY2b^~6BLnGQUmmy>agV>HYi8wmt7_xEjJYCrYFK4Pm&VgE- zp|Svc7umJY047L3(8_SYm`2x$m2^)x^;>yG8T$Y|X)mv+w09Z(7gFiMZKzoK$~>M8 zaS;U^$3TWUn}LE2tZb&onjtxdqavUptu&H?jd{eDY&?NZ?fYEKdq}y}jSx`+r}{=2 z(V=S9jRTug-{Tx5EEpk(t8qQ9m&q!~ZGjRwCu&K0S)BMTtVSqt0(#OUW>`Lkno^8@ zQK`Gtql(KU8RUC(0b?RFU8joASY}bGBnv?TeAdF0=pDU3Gey}ibuUUHk4a7ddX8BC zYtP$vsD3-S_mkyrv@gQF^5iyI;YhY_pvN~iA|72Q}jUhEG;N?cRq3xj>S27`QM zt{c7V-S5%gvueb6eyNaOHy34twH{T3NK0MyYHljeSv;QJ6@SzeWKL#MvzuBW*Ef%2=9j=4qintKy!Af_M z9eEdIsiI>Km@9|yWr&ctOUaDVlrrZ?O#E`wP2TJur2mPE_F8>!NugHOd;POj-S7gw z>ZsG@_&LHC*TX^Ry|GmbYjlDh14(Tf6FR$WjvB8O$?l7_KJKyrL-N^DN^99BzOo=A zSi~^(XA|W)eau%TP0)V@b80UJyDP%7hCgPmx1=e1Eh}DY{2aD8ktXZ)>T9&}>)YDJ zd(n*p<-Tf2+eB{=Hg0^w)kG`)C1^wV!$128PeTDN-ufjST$jc5%K#P95e{R{A4`+m zFzb7WTi}Y>5PGu^t67zj=L))(cJXhU@9bn53VDT(f;c%ahafbif|VEs4z<63499j? zwIkpEw3boo2BNB(qs4M<8b;{`!bi%>S}T<|TJ;8*QSE$0-Z%ti==DInxXf>YXHZF7 zKV41>`Ir??osL3EvSR~>FJ?ejA%H<%Da+&@Z&3PPQJWZz(nku9rPyl1yh5pf zVbP14^n|;?gw9C--*o&8!ASGdSid8iem=r(WG{-C=@a*-{pnb(_NVF-N^wLP)^>pr znPHDQz7n=0i+lbH#2!D>!X@2TbuwITehl5rP&_>H4UoSMH#PM>#N)F$t}@$MdHFyO zbG3o#z=6C|BZAr;I0yJTEn9bpSB{M6ucW-A}W1>kV> z$3r)O`vyt&$9cm*bU0VzHjZkaA9SvPTV&<28fKnb;GUA*7h>Gm@c;I@&%P2Z_GWZnUwnw%5e{{ITApMH zST3sln*Uq)^Y4;^^eC`$03~@gM7jb?m9<8YuP>T?w16hMMAhc)YIPv^XUdm$Z&#LI z^&dfiZVuAxBf7t&8lRZy)dGJO$W$1PkJq{B{T zldD71YnBf_ydn{>6XaTJX!GR;?~ARMrX1?EdtRUWFZyy{!jy zFf@B(T<=`aUeW~?{&f5FV4j(inDq;kbt6CUz3&qZ-zSKF%AGtkbr1M85pWR+xRgM< zdJnvo&llUs@;c0CV2uzcP^C9a(!W9|P5)u4+ zgIoi^Jv+i}IEWiIltv(-zJVslOCCi5N0wzI5p?z*k`wOBz68s01qLq>FRD25d%$xIxL^K*qjE_uMS2#PyC~4n|NebYrq&@(mj@vxf1@@M-u!bnYb6up#4LLsWD_w$yOu_H^U?@lW}R33T}S`*?5KalR!xnY1((4)6-IE^0li6xI}1%2=g2P_5sc0t8I{?6!8Fju zTuT_1_&OUZrt5N(8k?0q;Y};NaF-|g1ZKH2oOBDd$0h}KCJbw`|iE#oO|xM zb@x8I_C0HUnN{=a7*%u5QUBlb{M5udNBI>Gz!RDM4w|y6Q2!i^e199$!=*Wy1b8f0 zr;^tkD#oR?nMCr5{Y)|WT5o!SLde zbD1SifKd$L{CGc0jXTZ5{qY*8yE%w66O^!V8-rlaP!(P#m~-&VAyi#E-3oHo+-@{* zIBJW~L4AvRtgaL=$IRYjU+@-=u76 zdFGRG?)hl^!%BWN3Lk|@Tengt*VJQx^E(F^6;!}12*BnKdr?JPJ3+7tYFNi!| zlB|of*2is%F0zKEY}&^?IQ*-Fv>A-Zvrfw@N@l5eyWZaQnOV;N_Jtt(!m)7j`WkT`-#R0JOzBo875OR6@HI$zd@sxwX-0P7AeA zCfeE~&G=ce^~#8?&9(;Ply?F9V2!AW)^SnBQHf?OSZ@sZa5X8-q}9%fhy$|DCX`> z(DteduOr{W)fcywul4|mds=ksDvMz{!m{(kSkzWf0|ipUM5sy)p{f+JTGR$Jj4-;r zm?AV+e~+-dDmRfi??lvk@wph$oAa?^_ALYQ6 zy|67sg{=Y2;VViDPRjN^s#=O79^6D~SiQJXCN*b-bilB9;9@~v$KllgHRwPhglE&g z#Rf+AG?XU?-IgL`@enbzV*AS09^cD8DA7K6IQvtxq*bSI26my271U|MP5}=~`P&f( z$*~yoaW~&_KcBsXt^<`rLR!dn^5X=Oh681R1Cz-y)z~q?#&OQh{^7gh1+5GdVJ>28 z;iY#Zj1ki0z9);F;%^mb7BU>yvdyc^#LIu1mG7RE{&uWWNc0lk#Hev-oZc!Ak!jAA zIdyRQ{_^x%->6-|s-woKK5C;)%BFVXbaxBBcW%w>o7=Q&2^y;)?>y$I(P2b8I7$GW!>EnKHMa;y`9a-a&=upv)9h5*}L1_*DyFj zbDZux-{C1c7R@;??T;0< zLh)SqyD-fUDZ8J!_Tw90hAwPB;khyS3rtGkxtX0Qen-A~os9nBA!#uv2}fQnf}^oU}WaD z(VS{SO6D8N=*ua1*Kd{rRb010_q}NLc}tdIx)dfRN*?i$*0HdHo}rFK=Bit!$Tw;J zq*&3c)<;(&BP`(F>lw7(jK~KuX6EK+OlPQuBN>2zFojrnYn}#wS=0Oi@w>kVO3ia; z+=n8z5n=cgVIB`j?HD$LD@#Yij;5!|l)`5Cl#yT6bOe`alqneYd@wge^lu+1k-k~~ zI?^^Zh>`dvq!(~cJY)!$NjJpJAP>lN)5-GN$wohZzV^-X^xOQyw|ngGl`j{4Kr!(Q zYs%0xs=8)1JEG`$5w%~cnu7CIaA$s_)pMW3YI;4kmF3`{fhW%2)hUB4g(VxwCu`8b zE%-s9p+VY9fgSkb!Ce?;;^eW`Y1E&YIOU{WxizeOmU9MWB5TBvrGqilewG&-47n3&zX+X{R4NakxBuzaw?<(_ln?oK3Qv2~VPY_q1!nw?|G`pdUcdn>OJS8KmbpP8bzP;0&NTG5o*DqH>h5lJANcscr) zt7T(k!Xh$@)z}(DX5;RwhZ2KB z&JW8(K?+NxeNM)|w{uxAz->z5I$OApG0aTP?Kp3wJu#9xYMr;mAv$i4@T~jgYYGhKL1)Ooknd45 zzDv=Hj99%woJ}HpHpSXjj~N<6ZFweYd;U4U)+BY~$Guv|Kpg#2W^h2}ffD`GJ;|5$ zJ{vvgA4oOUM6Tb0`r_`FTf1)8c>OlbYMWmw;|^M)5>tw3g`?n0Tn<9sHZREf;2Sri zMz|ykr@we+pS*;tbp;J4WLUKz*B~)gvW$>Z*DH9X=TgELO_v3-iUCRaF-0875AH;& z+O%!k@TbY`#t5#rnI(2qx0$^mwbTQmX!G~Vp%@6d+oU2dT5OWpL0RAt`0of2db-{( zGZyd%IQgd`u_Kon!}QDx;hqI?5g)8l>t=^C6z-@48k4x9-%%j zAR5ly1V-u5d0CogU;cY3xv8=L1f~AvV&J*5ALfuN^uiYHY2I~@%F||-4OKbK?GONO)(sq|~8BAn~vT9omo3&@Tx+7gemCf)hHWFv6c^^ z9QcJkjq;C%kJ2dXZ|x`zN#~YT(x<#a!4xKSj?h0YX{e#X1^4tiGd*$IZ9>D&>~oW0L43^&w@75 zaJ9ixA>Oij5akE&Z*m#9wCn|j-y7SySYxO{I(O8dWY#9V#Fqyt_$x%n_Zy$h9>*k`pD#VO=1TS%OH;&Mqb%y$E}BtH_snR1Z~@Ej}%jxx0?`2PQU^>gvTmiMRoHAMU}NX?Rdsarq>OReDw0~g&+M5H+tO_pjuHr206n~olJYFOL_IM zv@Eb(AC9%LO%$;8U|8-kESi)ZbGeoaE)J=Cf@76UL#s9QL@&7v%X}us6a*V}hUkqX zpBp>+;MD55JE7`4NA*01=PP|Z)(oebFC6y7xWq}P+@+d89po$m-&9Wur!NK~J*(_} zG4JsMv^Jwt)uyWII#k!OR!Q`%p{}7C?%t`#LHni#^72%w0vsuXXW5Dkd*V+Hj^xDH z4nl{n-ZNw$^-fX5>$WP_9n=d& zO=2)xx1Jt^vD;RZ95+g}H&cpl()qCpG@#4_5;fCt>ii=({Sk(I8&PVHjMHESyL?Bo z((_xE79M`>WJ<{LdA7u9NpSI3&H^=L|msGA|Ej32Ta!v z-&g>D?eNQd=YA*UQRM;d!zZF1k&>^R#HVF70Z7ZSG)U1|6i0&cC zP*|)EG@}E?Z{oo>zd^uv>=EDVH*dQ(e~r=qYG(K?6#Dy$UMYVIGT(=nF@z?86fS{B z%Z@>N)calNu|ypS*Y!1_2>7QYqL=2Z7lkGQO$0(L@mT$yaHOVaV!`;fX%xLs?)`pb z;fo0CHR^cx0x}JB@>~qx3`~lREQ+~7Gm6hq&KOkJ<77JwSQlH6+bw*ah*C^O!pdPn zRz?+G%P4!Ff72dsmzr%_|w<%faf z^l>6x2v9#?p_AXymGG{sWb}D86?)e(ZL~9y@5pf>M`_ROtd$n9Y0Jl1SYZ2}5e z4=mWk@Rs5W*$?tLuJaxP`q|B_*cFh_Z~GRtbJ?w!sqLAck>x&9z~hKTGM-1`JQ zFmo2>gGw#vnV3cILfIQ2^m@5VpirPvFaA$3xe|;Xx~FgrZubDUzuW;D3`GK&p+Dux zC!yp(Bz2u=Xjd^1EmGt6Zonu=eRWT52daGw?WvBIOJtCj=|wXFk;?%TqIQ&h_Y|Y{ zl+udzJVC(nVgbicgbolXmiVAq>!NrOpAf;H)a}}6yV1kO6`F8XAD-vq8 z)k*ae7WKOl^9$zX_PKdP@8?4xnjeB*iTILm>ASGtMkE^|?b=G{`)O-K@QuMT?wf>8RRHnfnQA z2-%c672Cjjb-zG1|5&ztWk68PzGCU2{bQ$kN7)irq;Y=9k{m>#p-(oxOgN;NB*&Jz z3F4N^Vp<6@4Pk%mQ4hI|U40iyrj=x$q3C*POXb~{cn6rKIE)*%Z*5abSS)v2D^I#R zFuy?9zxjQn)ywWW%6=M9B4k?{9mN!*LARg49+AZ!n^qb)Y!hd7te0;gQVCM=EnkW# z|CWrZSn1%eL8mZmla;l*1XCcNeq&}ds_BYNzSo=AK{vl;*|}F?YXQs~-jyvz&2Nb` z$-ybOiz{%ARC(<4a6Qh_Fv}LUd1q!d4&Kk~sd$IA2T@974`c@3KF$i#?`2T)$xO3* z?&@lkisn{6oLj2KEBgW!wchWXk`Bp%WAhcJxS8yK#z4$G+fb`P*tE8;yzmgzE8Ju24=9B0*#vDXiKg_Vr5 zT+RxDT)k3U9hIkDEvKCZMRwy=bQ(-5t5wm{RXx{Ej_fhSB8*1PQ*41OlP3iN$kV%W zo4+g2M$ePqhcY@csEmlA=R${}`HZs5CWE5d(W42}QqE11id!t)WVWcEtl~c5Ra3K$ zq6|9!e2F?$xwRF{J$=HZYO>q@jcar)K_NJjF7#dUT0UE$%QAZm=^|`rY;CP2TIVwR zRD!{Em3HgeWhC&O`q}y#9#4=d&C%`oXBXhw?=y;>2;+R0tx@1c+S-Oy&LJ1Vd29jT z9xSf~&_J+6IodNQoWbyJH+Hd)?1qS@&RQfReC3XHw z>Y7{U@zZY?PAU&>VF2DASj9hxcwY>D`9}5zxr(N9zxL=G5TU^PUE}h*;~P}`I{C)| z^1+;}`E>khg%TUBo58-DE@uk40=&VhQpN~*xi=p>wjhj&w6lPU*Q#YXh?$?Fy*Qou zxKBL7_IPD3d1)W&$N(PY7_O4&iMD6v`LV{NL}~~tTF}?N@Fl42mUS4^6OcCm_3+SB=jd= z0oH2*l#Jvy0uqXqI#`SripBK^B_0N;h(K07%vIgN`TLQ(ktb>#~H| zR2V;Qj3;9{Ka(2)=Tk=JPko%N*Pt>jF8XUqpBYv|{|lICis{lEva$?q^0;xLus#%6pJQ+G&ZKsl9#YyCVpd$X{#Hp-bctvJ zGA2@#B6>Q@SScW0g(f*MOE+{Qaj4xd>-y zOMY>amA(bb-^vX@Vagv+i>0H$rT)%X93;5R>yoimch)uyf zFU-@pkSO)XG;3$lioc+0V_t7Hwa?sUR?n%Ud|Ej7M!9V&qw(o5GC?8m87IWh`UKWd zyh=|_eyZ)GxzMCnm9Bf*SFUOy(x$IOJzw=l ze0XfU=;DwsjF`LEwn#yIJ#>AY+5B9ewz|B9Se^D!=D;vB0Bez6zAog>vQ2Q% zv}^6Xg7xd5Hw0_0w@g{tXz$JKtzR$LP&n7#E4AKh(t8HE38mqP*f05YthE{)wFck& z1tR=>>vLcq{6aqpot)pJvOi$*`G>U5gukJ3w zsV^T#*PJqO1I>yW*Os^2RHJRbTZTKaCxK&AlL3>&%4+8-IXVRbZpVA+=^SAW>Tl)Xkkp2h%fzm(VKU(@T{4YxX$bTjM^Zy6Z|N1{o z`iK85{r{H!e@p-W-O}IhZ|VQH^#5D>|DPlML;fG7|JL8q|36Fmhx{%5|Cav$WuHoL%|36In(-|S#ab9*4i1HV2zjCI4WA48RrTuAvL0HmD)KCs!*JH#cR_aI9 znh7Pyd6y&HMu2a|8*Tx8tkJ-b0rtmZ=?2SwHi9B4*bv}V2Pt89ELJ_?+rqu9MD96@ z5tFTFcoP(CNQi&*>@F+P5!Ora%C@SG`Tp$7o%uv5@2Psvd2olqQoe1og$OD z=V1$`lDXq!@-u}oXgf&A@&J;t>k6q>j)qZt`IrK7n454gM_=?bgoi*&7z`s?kc)X; z?7i}OD252I*Xjigt>A^Wua#sG&DXC9>hlFr#=5kGb#iubY;O7u$5nf@VxC4U8?7m) zsq=g0+;FjhW|bqD^aKo-=F2ehjEC)!Z?Z?^viY&WNVa%S^VV?e!B=fsP7N5@(P5j^ zrAfkn&WnOS|5%+@oj1-$)`JZc1eXlU8ssDE`zt-sN7KO`gqQdSZ%Z5pXsF2$MTrZR zv4j%$`1a`PDOOgf54C^FxxRHNgj8_pi|M9^z-{@Od)53zTjJ;*rT=;PBn`iQa>{(M z+Pd|l^w%*w5HK56E8r&;i2(86hGRKvn-;97$4Fo^0ftUx!kEI{sq|w~CXX$?e5?3^ z;UlpI!LvxfQc)$kLr9-QoSJ<((ZX6utEB+IF?=k8qTzK)gW(3_`v z969CU(86rg3%jZWEVb?UU{+W4+oLT2usstnyBm=SX%2Wtq#AN%9+15v0Y*M1Iv67? z`$aTpX$%Q0N(yt-K5w7v{t|3$pGmm*?A~d(e!bWlj>Ur#r7HfU+!yKnRH~C@Tvg2C z{fpLxCt%9{=L>32;;RJpWK9HxgBVj#uf|E^y1W~(36{J2vS^#r+>xAdV+|^jpZkQ~ zd^(KE=$c3X5gxGi(0#j%F6B2ZmXJ{S1uz)iTKE`VMY=7m(T0T7!W$*p`Y8P^dtXgH zO8=&jm6nwMf%H$3u>DK=-~T23O&+EH{y(Mvv#~9~^yKZFn?I$$hv!fZ$zRfcBsuO; z`nUZh{pbHF{h|Li(m##daO{6w`YUtT7Zq-`vzO}mjW#}ddvv)zI^ltFyFu#-ubkQ% z!}r*u02Axe#dh1pnxJ2&Xb^_^BHP7gXFtceNsrbjrq3kLr(A-@sMeaRnw`+D8_^|T zb|eKc2s7&IBya;P@^Sc^&&x*;jiBq5rz7$_@`V%rON?iq%$DPmpu~`+faIXJ$(20= z?~s75078`BAQ6o-X=?Gk0`E2=2A-=q?X?}GCCG5x*DoHZ!CSy*53^0}mr+l@9S}Y1 zw?UiBq>@`-twg%#(cEPsJ=SCrOj6oO8*;+&DTQe4gn50Z>2^9~>zEVR{1zyeoBDwm z@PzGS!ekEzRq3z5K9A%@wmBb`m+MPb^qnrZK%a`YwI`*bgo^^`7u6_ILd=+$i6?@* zoP@y?fx4k^Ca`msXdOp;BR^Ec?S?lt<#Mf`8#}(!8xQj#7<#WzN zr4es(X6P-ki=K8L=Yfc%UYLEYm<@j2BbY^!8Kv%=l@zIv!mzfbY)V1-J7#ZC;C&zF zn)n7u@%YDW{p65`b#(21jSn6?Ahn0}GNQ>BG{HA0j)5u2^ND&ie2hq`O>GGcaUa&4 z680yu+eGtj#6RdAf1ow~fZ>gI|A+SvJ&S{#hXcO<=%K=phG)K2M|zek8pb5j$l(Q} z-42Uq#|V#siCKi_F_Li;w7si9%65Rgux|W5(8r6WCo~l(0X2;3Acp^zeDQo~ro+s|1qLk76NzHIo zU;->m!ybxQkw@p~(QoRv{3K`OjBEUJP-i|#`w#4&E*Ffe;5}#+I_Q=uXIn3)_TOXw z<$qv*9O-{xf4)DkzuWtNVE=HYN9-@sZ)hyT&+(dBVwgQxhB_cMa1GS^jm{JZ2O^>gFue6fu)B!;CNccIkpr9)Ff77TXkt7p<#JV@N$`zX zbBwWX0i+2qA2oPZ{8;855}O0AS=Wf#N*EnXMzuacTSBs|9A`~@X#2ES@^dk3eSD$d zc=?)g$*r;!l1c$rTG}M>8w-@2;<1`Nl?=FYorLm~eIMI0OsqG_Mo=-|co2JDIgwXc zm;i(BG6s|cz7|{BC@+-C~u! z_ftzs6MsnmJ$1}W^(~U=Kcs(*@|&b7U|(;G>7(?A{UQCKQ_}V*TYpIZaA_^|oj;_% zMrXDf|Ck1FN@JBm>rwib0Y{OQwJ?9FPJw1V$E1k4_x*|eKmHT@@N4wl!~i?Gy_kyk-YnCAh^ zBNxnTtdFpOdbYiE?hi5V zuTN@4S91QI{C9x?=4E+BpOm+wNGNh@)-Mg9`r|f2vUb&Kh4CL8nkOCi4ax@%7OWR- z))p-H$8j+iag~;=MU&d0AImYyXCRzo ziBMVNkk?3x1B}a;5eYPu=^jT|t1U+w8|8T~zg%le5D$OdoPff&+&{Sdn>vFm5*9?N zD?DQuvM}|^r>~C2=*O*oaLIsJ{uFw7xVs0$*4dbjfovuiInM>MJU`}$nk?)k4@MfY zpr%-0e#HJ^jFBJiCRCVMUTf=_817M&MfR3+_f%Ay#0U*lo{tp4M@zn%Fan<^uynsW zH%^+w$R}OJVOeco813XzuXSFLn9oG(g$VC9qq~QpFE@)}cH&e_!HAV@1u^=m)vQb< zI~*FRF^J70RtYOwf)#u(png#*6gE*ps1Gt7 zkT*rwT0^s3>z9`sB^5_h&-dnAljZya`_D?Oi^~N7H+UspNbF|pPc28jAo_tV^;KYo zoongHX7N*k$!W>j{=&xjxybT4#auY}bOCvfd*kXQZvQ6{+V-|`r$4>FrAawyhR&pE z97cv-mrVC;C&>8o{{E)c?IvBskZ1J=q}<}43xjC69}XioQ1L8;g14w+w@^0Vzniys zEhSZ~z=_|?AF)3M*JQ-i+9%0vBr;1~CQJICn@Y--Fw^Y|XN%h#xH6wGHpg~NwI#gU zQfb0=>g_w3TTJUQs@=y7VgZ9x!D*|nRfIggyHDxpMbUavu(8C2EhUDn zR91EukF1|2{)zp2H?!R9DGS#zAF+Q?OXH0Qbpxhi6jV94K&b{gmC&!IF>uO_Q*gO= zglYrgz)=xiS6vL#t!dFSvnhCh7R2ls=I&{y?NjybG0#Ac7d{}|Db!*Kk1S2-GCNML zM6N67Y$FMwxm-3<)~6-gSCCFwyo_t{1B$+iU895BMyuQH1Lb5}f#L)A9$VsRTRXfA zAV{>IvzDTY2k#O4kNtuDkKfsuqSar|G4_w!-40~a{g!y8V9r@^*xhIs#zTX$XorZ1 zItVeaUUxcz8B~T2AHJ5dXQ@c$7;MQTX43WCbNXzjh==u?*ujeVSWMu!8*bqkx(@$DlxKltr7uW^<`2a?NQ| z4fQY7&zB2MJ&A-GnPwc&3=I#umK!K&g=35}rm%f+AI3ZM3UscXrY7-y zKE7c&YYohCV4=73FY-<-jbZqG? zUf7>f|0x$f@J+&v&MiV%_~t^AQ1uJhjUC!x=T|%@(*tJ$S+{9}FITp1$3AY?blVTp z`0fhzH;iG=KAr8B9}GtoKPAYc2z9SEyF`2Dg00DUQ0VS!;NCrUxe??p^41++^Rj37 zvSmY@2!H>RhSRH!QwjsuMe)m~4f_yGcS^sbp5Fr0(a!n@ZVYd(sKwk*zj?eL_Bfoq zVtQ47M7!PU%J)lQC;yT1A3Il(dDa^^3~g98);Ng$_T)As?K<{M^*ur8^8bjq}jO>lPL2N*|;H4IPCp#BZBV@v7-Q2Y$_M(fAIENM-H7>r*&9!B_WKo zF%Y@8eST-wJ{$@}J7<)eek(L!lD_f$&8g|;*RhMQUrN3zZNe=_P9qn-9`5^){q_mP z^bMu-z4L*2L1Nqp!`YTs(DT&^=v<}QDAZA3Xrjvm&3`r4917>4@TK=V=kfMp8~8od z?_<8G4(j$J@4qm8?pfv+)O7#C(9dMi4{cG;A8}uU>wiY;U(khtu$^34dKh-f`2+aB zz|V{%ozn#=_0!0_uuJ8I%Rd=>pq%wDID4SkmUoae(j^HfIx$?J* z3|LGJNcotYh3~9C764rPmWFuneFXj@rmBAcf1yX<9}^+nu)ExVnk*+dJW$hbbwP1h z{vEk1uvgCLMB=;p)pxD3z;toR_xDEC(m}fDB+Yr>>)e7G4#VQMn!PGSY}@&GQa0{x z40a_9XtpOACC;8EdbrX3Oix#FlKh#Mw>2c~1w2shj}G=YH)2-{jv98GxVONX{P`(v z+@t87lQI>~=XY{FBlXg1ZGNKf^(pA}Tx6H5mtNs5OB*4k)wbGOvNhRm7VTup{Fiyp zeqq)8+H&(^OI+SL3?7?$1paRq%pZZjK$Ot5+2n@xpp2}U@A`zv1y@i1ZHSlD=E2hM z>(n1PwmV{q2*!}{UC=86On$xz*y9fwZw87qQVi{LG@?DL%lyZj8H_)H{~$9ytqOcu zYhoytFv0z7`6?zk28EBGCWfFuCW?evBgcN$ayXh=G7!koV5$6;jhF}2Mr1V+OJS)4 z$4s`JN+M7^&};Lu{Ftl|+3^VcIT!x`{;)05us%9XO`^#HorA&nXYOJ@DX&J;sNJ?x zpcKAb&0h&9=?M7{teG}Mga@%}xZW&Qx0Hi6%4S$mtctd)%4|B0 zCa+6kru$Zw(=B2h>@xl5irKP#+sB6Tf|cPQ8htM9$P{<*HxMrF3}7~bV235m7AH5= zI?5-716U~&FN#9=J|%#$>;uPll5*zZ<0R7(Ds9`!%9ih^RRJ=rPi&jQ*c=1eeFvQ? ztB}Q6-wyjSs@I*z6ZJ**gs88k6OqQj+n&wn?e<*WD5p4O)6q0Sag=c$ zm7L*8+L{u>`M7g!50Rtohzk`E(J<Go zFe2hh$jID+`G#p;6%XJci;_ctQ$q5y4eXooUeiJ^SUq$peI##}!$Ar?YFLb*^OBXs%zc#UlccX*}6=Zbr>$TGyNgI z&dWFy4MRQjaq(ve6+(SzF3QISDEWpPv2RXM?#(f_f8jKsJHO26z&l8yG|0-({%UE3 z&)d27V@vX3r_rwan^!?Cq9*J-sEi}h_lg0_WgQ%=Re=-=>uok!m9tg8I09)JmgssM=O+w#*6LPl8uhT;K03;!d%O8kjs+Zp9BW<|A~k;(N5YoUeLKI5N8ZoN!uc2PFHw8s{k&ad;PLo%M+mvVV%U=Yv_`q7 z{s2a-A|;M)#?*Bxe_WInhsi}g*4HcoYATIbG1Y9^m*tRvZ>l+8Ig73an3WpKS|~xv zxo5!xm&lL2KPDOeC+~OHeMbg^mvV(krFu`m0-f?xRX#!<^T3q>2x$JxmZ{I-QF+F0h@&Wk@!3RkttVb=`g zi>;Mj3)fe8o~Kxd&$A%CsTP$ym3TaB<-@aV!3IC^{gd}21p&CI?uaOq#Ijn`4Y?gE zkJut8nVP#t)t??LJ}JG!Bkw6sdHS-`(Y$&4ne6u$WUn?S>JUV{y>edXPG#a1{00zd zk0dy%mE)odH>@)k^(nT}w{<0v6f;z>Vh!F; zk`={zO5N4QS2%1@kzWmqb2i`_sm;)%8)fxoZ=niKg4kc9so>eqv8BsZm|C5^-y!9b z+^$4cwfZueAu<14CcJba(5)g^u3~)L`2bQFz^Z6;V~BZl5W<*-;hF2joN8q!@kQq& z`^!fBjw)_62@VxaroVW8c#7x;pUk3I*c?uGL2fnEaOwH+CZ-AaS-1oSRuoUOv)9-lrw z;WH>J`SKf6vfR*O$|U4GM|yR-r>G|i`%ueoYDW*(O%4r*K4#5RHw}?#r(KohJFYEK zzqzS`Cz#Q;k><5MN!K&f*63cZ4h@&{F}ugFm07Fi#|ott)OPGnv7QAwIa7|+iK$v6 zl2<;mt~8xGpNCdr%j8d^REWb)XzBwM>sScDz!(*K&GEF zBYtJdX>iH?ULS!n5Hw_}Wqnm}!`WJ28A1}K141|PoXzhcuv-k^!)y8*xcQHQyzdG5 zKZKBej?pXl=NmrK{@_R24+&+!qs4io{osc`Xn!b{&Li#b{U-UR?DvoSOZLMNQwO}! zMk1EU8Kdi=a+PC|`I3W{UC(2c7)kh}Ny3!8gI|;OP?0qNUp!DnYQ>N*s*rT#qYvjB zPFmpNMHFx6<0UHK|7K9aD1eb{6Uu;zcr1x|$;51>zOl>*>e&L(B`!djSbG@Q#`D1b@~px;ERVGR0W!})$12854K5PApcUdw zWQ|2KoDXH29tXpfW?mKy>cvf}ZFBnKiEd0m@{77*ieh1-Vmu1s3J8-OJ!T=RT|uh^ zsqf6vjz!X*%y%z~*a8`tLbhnW7YctzVr>Ye=b~Hu7uw%TF9DUi2Df^ETlKB{_J9#< zR#sc`^3TnP-^c#P5)0ME3;C1D1z166M(M8s+}^WCKhd0Q)(8aHhIaynZ{(+ z!0OUJ>C|s~$P1KFIDje?+t}{WLra0qtagD1ZYp4Vm0tTaTe-*BMhzByDTuW~uMMY} zjS7Uw;?PnB?88~+X;ntzUb6EJ#GSaowhAR!204|MeQeruAyZqqERHFL22LM1Hk8e^ z9V++Q>4NRNHSByibAhljLr*&e1J7U8D|HeH5H(GNkBqgv3dFVrLfuws zpwep;SRUaCp&E^@hOJZDLr`3X{YDj>N+INJ_V|O7F0t&dO(tIFv&U{k#V(dR4VT3A zm&acW#tbXGj?LBM-?dUWV$nd@?{MTs;@L;J9@zvQMsspd*Y)Z6ZwZAJE6T7hYO&vY z3~75Z`>^K9CfcN@I2frh{+JvJA7yTKhv1EJ9J3@)XJKb+pviSPsP`1*%pDuSCf}{9 z=4wPL*>hxx9jCLJWw`cc2p5jZ^=5ij6e<9u0*7`in1p0t^k=Xumc-U$s~u>epeIt8 zXHlt@IZYZcT}g2&RgOK)Op{BlaK2)$sc=_NzUnU0WOyVVgkG&6pHC(CewezdK~q(N zt<-j>)c2&!_cL+K2{`Sf!j^LvYC#ibP7Bt&Q~v1qi2Bv=WlD#!t@7l^Y$DRC9)tit zv@xML7H7?a=>T*!8N|@h)t<&YmTY-eesyHkRaRFEYB%fFBuokUf{lU*_(37!!|;<{ z$0x06r>#+^{Kzcr{gzCDppJ&njxeOohAMlU7-9lO11?5 zYG^9C(%8}-7&}0xn4^Sd?av5lGs!y3@>t`dMCNK>RJ2Hn2qqi+IJ{0s8yQ)LONkXT zo^qz2@qR<8WVGRI%z#N?_&tsBJ1tZB<=BZgO$;o)=ZiQP#EXEfg0+>bXszDWV-gET zvh&0oO;?gg1v%{6659Yl(}O{m6?Ndsv@==%prLp5!XV~n*R{`LYx|d{!wX?ybOu4YO5 zVz|EM)Rjlxn+Gt*bGpW}lvy(hNk}QaIH>_1q(vO`^8j~3*F+}*V}|Xu%)Vnz>)+x+ zxGucNMhQd4c4Z}CzjteI ze|p#8q%>L!n|aC-^>lN~?K%9*-S`IcphB zOSs7jMaoH6gGkpA&J;8Sc=1)mklq8%HR?TE zI0L-2qlh}$nYz+tUV!!L$gz9zt_3 zf%z4X7N1ZWM);v_X!!EyHWDS!M3{xLSPu*Ak&Nm;a|!y0E2fEq7xVbaA=~@yyWQn1WrTA-~fC{Rlkb4n2I^>eI2&9)g!{8MSOjzgE}|LV?^%B zZ$||&wUzH>wB76LTeCAq~y18rHSc)&ah|py~?;lOSrRs z(gN)iZkzYCbrYr!YLUS8b)^?}xEFRp_&UBtGXL@q*AH7U_VQL=vNya)xA`~rvSf}6u2Ke#}5S~jA0o`wzk!v?LK70&+nt3 z_iI!C32)ECR$WERa82L9xHwpAD<5lg`?~Pc;}(ps zUQDWAg*R`6h9bhl5z*0z%234na70}+qTw~7Jp<95gUD##$?Dw8=|1SoM+_As#>x>B zm58bLh}k;Crv}7oJ7S|7k>7VxIB-@mep5YtUqAPwc@fdPfoNYvbgm(~HxU1G+JAU> zh}c1Vd9?k1>;C@)*$;T6{fd(rd`zKz;TXg*MmO?N@evsE@dSMCXoKO*{A69D9{FHG z{@@3Kous0qr%sC?j9&iGBq2YGjdoe+-?sX>Z|BTe#qmV5dbG*P_rCg12WZF$mp1kH5qAvl{C3Z|&#J z1}AQQc*SR-lt0H{(W}RRRodU?u@fH6%zWUV6iYJ_Px!lpUxa14NHG8zRlS4Fp|DK$ zCf?y~<*AUm_IQp%@!29FXgms4ocZ3h(bg}h>j|^9X@|>7f2t857iL$l@?PkyVS{;J zIOTKcNy?zz^R0Gk#0X5Z>!DBG4qIJP%;!YH=6X~*3;otH``L?UHsic6HJDK3$xYom zR|sAhv4D*FaV_}#$xNP??9X^Ij@FTxx{bM$y8@{&*60>op5^);yf}Dg^V#z59dtce z(du=!Wja9j_kI(dJ#@6JC|LBMVB}5Una40)(9wTm@2r~Q>H;>~f;8^#PH<@~!QF$q zyE}wHAh^4Ga1HM6F2NmwI|L5|czc+yYW~68Ox2tpuy0T8r}kQ_-rSdecQn}n%5@l; zY^<`F8bHh9J(!BJ?oxt8zhg3hWO5V$PD5QU)s!Zgnbm?&<@eEN+Y5wfIky9~#Us)y z##YT3)2t1@FdkJL=QEGUlE)mQSz$WlO+!Zr%iiF!;(Rhp!^pp3wvXaVSXJ7V+$3r( z*a>iECSe$V+YLpXvZdQG@-l)&4*ul72OL#16l0cVn16gS3Bjw5+^tjNJ*IM@!tSvC zF~NI&(Kw54S6IlLdmpMIiFvb$Dok{r%i*Y>*#_K#}QGADa5r z`(@#?#l0jBmeCf~P_NcFrKGgkLmF0~bO>_|`N0G;d*@}xi&Lrfl__+2K7Y1DXa@&I#5H|I2J~8n>8qSF+pea?q^bVw%S+FL-vpo;PgZa zHCZ=%QWF*beJCH3K|@36Jj_f}$nGvA8%T0~TtaeGhvAJ1hZ*eMK6x2vW=&c^tl&LR z=*b!FdawuVwHbhG8;eSa*`69JA7&-zLZs){CTJ~Z2F-9r=M-BIH)lvIBdaB(&|1*{ zlIj$O0~v|$4JI&I4QzzEg}BmM(#`Qt7+l>ZRS5>tJmZd=^*C5DLk8H!$3E#3)km8` z(}6!urEwbO0@`Vd7@fyMDdDIx$6resoB4$Wyy{aWktxgaKG515CA+WRTT&0NPCKu2 zXHH&-aZeA!ewkt~WB@$zxw8`t(NFWNx2l!X-b4riAF8Fb_=&r8Thq1 zq&aW7B5+U&OQ%dka4>Civ$|40FjPuKn|T!OvM>^5mQJ4KFzN+S0`T0j7ILvgF-4a? zs04r1C?NJM6C$frizL>_P-O-@-5=p+da0n1m_t5OvX@$Vz;nJGA+yOZ*V1#t zKWSvi97cwb-?M-DCVPqmwNz4aQ~QbY#-wYEyj+f8TB%V@i|1;mQTSg9Abk3R8AkT% z0JT-Zfej|x`m}x=r~9qjG2MrirLRU>(eHJ5WA-ZDsl12U62+`e zw{QtCY&)vP6RpU$J9A{w%%iz$n#D@sMOzsiUr+As!)J{1g*-0$_F19I&t)$Lr{d8r zKv|$zs+{T+TVto?{Z@J#Z7JX0d}G_DlW}vl>Sc>Yp23a{^_EXqOB!>s0n>b`8>W2K zty{<$JhN|bv_MqYZQHM?8q;irwNtkA{zWAxbJ}l)7ZZOQ$)so?1*^>PtYcmKIc1E9 zW9_KM8R;j7;`krOrAcjozI-|=sJAZjmj7B~=q2g&epT(`-iLB?s9y(vU0*yAUu~CT zZSc&cYn1c(lBvI?2}$)1=5&>tIBcq{_Mnpixz!I*`!~pZiWL5O2}Ch1Ec$78qC(Bv z2pCRB|HB(~F~lWb=P~zSu?PEH{;Kt{Y%}wQ-n@IZEeyJ>@8yn`4b> z5}}Y=rQ!bDzm$6ImU+H|0PY+>LK21k!s}{~WDr|lPzz?Omel-G;g{938P@Iq>-W?8&#%H{Og?^H`?^^pnb^wOETQ*m@}GQz;>fC}ejR?>(gsrr+R z6kpXi_x@sue+vKaoS%%l^H`h2S%_^F`dd~R7&i_9h=-YCD549C2Tms(WNZc)XfVXd zK^*#;DEq)Ye0B-c=4%`4>|uFI41q)@`e~){$pcY&fzeATglLvY%LzXR)8I;jz|Uy| za$Y``$%cLPXsltV9l+nh))fQ{HDV()K{^g$Jb+j_*U?5`n+19ErNESp76owy)^TGE zGseX>_NV1A_fi`QAO>>d%K|B{QmC=tl~5xvD7RUM3C^cJHvHQG1I&9u%jh9sT1O)Kroo?ch-!vU8=Dw{WLyId%hM_n832V^`}lfV%3IBK ze47wOnBV>MsF%@w?D&U2+JQcQmI8MGg^$^-`z2u0m-sXQ2fyo^C4vAA5SA4~=Qu|c z_yTWc^3dwyXJrj@JpPmLR}}-l_8Ti7U!R0uRMLOz(DDhk5r4Hb+r~ogUj%-TRl)@V z0N{kqq`|IxUiA6M&-jL9^9uodBNZYyK0LQ0>O+9)kfbFx8Lqd_e*~m{e3*Qk2yi!k zcw>QRPfnO)lH*AMNQ^WH{n%%JMLS!4P5Y^Y#`r%cQ|^y`@utF(S|u@QwbH~6IYkWV zr3xXyF=s8u(`*Zpg^(%eSPBw`nz%9`+5`i6$OWG8blt#8C&4}SqI(Sf@YEul2mxy} z{$C5|DLJVocQNs(FcZ=|ZJ)wAOi7%cNLEM0y9xsB)bJ)pfS zd4!~;;BB;hDOwFKdGajEkTb>pxM_{gB#Xnc ziq~2YOAhka=Z-?k59nI9SSSxzvWd*Fi3|~EeZlA6-%ViRN?aPm^W_Ht8h9*Md>^^u z^~wZ=_RZL(-EF=EF|Oi~oyHTlC0UyVKHhqArcwU%a^w#XVufiiFcIKtdDGXNM6v36 z8P?mcMqn;L5+N0g{N9*Ya{M@JWGF<5^ExTaV&Uehp%tS{6zU;FiQL<=Aha?e%@I0B zM90qXQ~`4^Vv&yx5~U|6gU%^y^@6ybxGie4m}^_|`%oy7Nn*c7>L>tqCQ1z%#2PwC z32jeE=}(DhPlp3Jg7;B>a*au6*2pAH4yF{A(Ev7d`A zsoHHe@EVVH7CQx)Gm`n^U;7X4L2P0mHgP%DB2sQ9QSKsA7I-3a{|n1c34DyCM4Y*Z z{~%Pv1>tT3crA$`HbDg?UvMo#kPB?;vHQl^{g854kaKM23pt33xIPv^ z^@>aXl%IUJ1@hXFNZpf)Yapb*PyLMKa4qUYb2E#G+Y`ZV z_!#qv`d`0Wsq#F|Xa0+b8yMu23gnJ=E46Tmcn&Le5hxHn34ZuOVtqp*=#&4WB6HQ1LQKh4`snmVGa`oWZv0wI+>QEoJX0?#IPF>B8|Tha-6j)57dMm&7~rpxI$V5 zY!hCQc~(M8nQqe0X}R;Ac!6_kj|5NVBgq0eNvj)a(RaM#Scx*uC$;S3znNqSWrzu7 zWY<++nX=GjJX)D3Hp<+Fh^u7kU5VV;NzI9;qP(i3ss`<<258dkD=SjZSToMvGwR9c zJJry->i3@ddvH4=ihuVEz|&VD^FNXGlYbSOMRYq!M=%iyhGZx^g1L2 z!L<{2(Pr{IMe3m5^}0@qCN172a6h|^XoP=bYdm*pVm2S z0CDW=v0s30pIY%=s&GhJ1UOo{)mk{Lf@~+bIp`ZMgPWn+Py=64V`iv#RjctQksBPc z&9kQTiKaiu2z(^9e?B5&>;OD>8ub9ck1ufVEqXEgrt5V8j|p7H1l)-pPXV#H%&e!( z;@1arx~3#yO)t2MQO8VrF}@1lHS;Xn=wt)&dJo?&H~V@ol2&Z{Rx*`(@;dqM4WZtR zkO5zxA^SENr~nHsvsADsAFRD|Uf-zguNkU%I*3~E(5K=?53F|$zySR3_&g>hy9@wm z7SNlI0?e%f@=eyT9|24#+tY~=(G!40D8Nsc0x~A?n%cfc54K<(sCJ=s8#8mSH)TVT zxF)?GgG(1B05s;?h4TXJjp`x|b0nJbBl#vu_D!5F1&aOp6_-@ZEp>nx?)!{Z`X73B zSrUYQC>@>vAc<%%W*^v~uJ?JeH`~4)-J}nCU9&sU$nyd)6YZ7g>NBW=Uzb#e@reI^ zRMBVdr=JzR-50-0rZnG_>ZURKfH~koI!g5lq>kwti5{?gg<4NZlDCXF!^s!mo5|sf zknoPErj6bV`Z&XI!YeYYZn1%wm_P?iAl43I$`pdC$~acQ&^0l_C+0qMQSf_(p1`GI ze;wf7*JzU8`w0Lftplb^fn}%Q5tdZDab+Gy9E`;28~02DY$zqlHM=F`HWrQDzD;>3 zw&I-EO>Y2sj!7-CraHN%IxOtFo0Qt8n7=xt_gsXcrck~Ycs{rYqzaB7b&bC#-bpbh z1?y_kC*Vp1C-QtIc9DDEVp~GS5sRx7^u?Zb5B~%zx;Wa&bOa z+*_I?P01dL|vu?*xC!?{GDN*K(;SHkdG(?YVjZcv2!fXTPh1$J1CQ&%_0oX$A7M zlmtYRi)nalPAKsioh%0I>;=^|rQ}c4)zEq7DBcI0fH@n-xfNaf$N8lg3vm-a0SKM& zBhAu}5MixY{)FQnacr^^boooe1}U_MFjLuc=c z;<#$v4AijquwfDj#5Xf&$FnGHK)rtL&eE$2Dk|zUo44Il)Jz{V?wp_0(3hZ_?Q+qt z2LRwz5|+tlH+pl+${}fy=A!7KmH|@gO=wOelFfxm(BfPY6xj z0dN3%E;mTx02nC8ot2b#^ed)pN4pY7v?<~R=8k%Cq6X-^Q4V9Kr246}b{a6L@t04% z!W%=^F95-}1x1cwA(SCq!EG5dpep8ga@X(sX|T+lP;;yta!~&bO*vT*C2`884zI9D zsg(7BoThTUty3$265zOf1Ofp1_2`~IGIP92*Tzli)1Lp3IfLq2`ox^MAdB^F+nVNC zs;BbmyR1Ij4?WutW6btQ^#QhL;6%E6_R#yHXAs0uJJLueWs0C~!wxJKA_d%mbnB#t zU)?Jrgd6EE-6Y?mNkI7~ar(L=aKL$oFn|QTbXBg(-FEDm?LFk9cU5Dj&Gtt)GVsBO z?l0TQRSLMl@G|8UPC;-8)1*UKACCUdrOVD`f>6!XzxG#@4yBo2jj$L^`D82BZRX!L zJWLZzp7m7vINwLjI_Yusntmz;3QkeDfOP8awP)`+DX+oo05#`pk}D9q%Y%*x2yr&j z)6Jb^N)tijewlQkYY?8-S%m45b%(ETGO<|Xdx=?vE&R|;1M5c01>#H0+NbMA`tP^f z+n|8opnbiH(YLV+mdOa?zhvKyVZ!0%)|oK180WQAy?+k(VEQNw>w+|Rg?M45C>4*_(A8#KX%bPFSqAi!@pU*n`Z;vvA;`naJZ7OBW&hBmIOOz-?QWf#aN11dOh;2_)QGd6$E(`(40L7hi zf{BnP0Gz!uOz8EgZQ@fr=YE2EoWKUL_e{|Veg+%&d7b%AL#08m0PAQD7MYF5WCbrv^aM0WeYVH!)Q z7{M7b8?V%R@4n2=yCGPm{U_k9VbxAmvl)o1Z@8lgF*gj*(sx~YpjYIXuGaXhiT1#t z_DQHYP~-RIvSxLUWxhDSzdT2)g#8^OdcuE8>I*8W76DPUo3jsv2#G8v$Ob?%aR?(t zR>R6==~l*meMo{B1UJQVS+VQZjC(ry>(Z)7LaZNAS2*U;qhwh8x7ET3+mg0rTIQf? zmG91AZ>c~cO2WY+M=gHq@H;<=Wj}U%*bWFqu>{D+Tp3plkHAtV+A_;gofTTgY|}z~}YdN6PnVs_Q*2>iz%|G}*+!x&Bw}ORT_^1V1>KUNwBWXS+ zN!CEis)W@ME%>|x3y6QAcrep7tUuKAPz?9mkMqh|JiNNTZ;R$sDAnOY4~Zo%UyG=A zZ@n5)=#*V&>`XC!Ar2BoSq7`$Q9>#x#j6uI9OxwrwD4Eo+Z}8{=vkB(Og00k$_Wvj z+|=02Tx@!wSV$g|ORX&XpK5h>sL4MJ5NFEt?kSCZ=|R~6-q3?7T2!1v1(s188Ms9L zb9LdLGHsd&9~D${j(^{JmhCI&IO1|omc8RW#I%8V^8 z*iLF!yu`Y-_-32Q5otR`4x?7jj7c%&HeH*fdUH!py`wA5OP1$@UTX=vAA)*5Og4{K zrgeps@w1v^(Ngw{;b#s=^^6tQHYpj{Hy&Vz!L?M@W6@@D*?{F4n4E50Ek=r|{#`-F z5_!1&HgS^=T-pc{)EbqnGRvh{qf|xhQe5DLPG)f{D-fXf1&E2kWQeO;JZdR&jVYDpGbunw`UFz{OH!YS* zhjTY3*}dMc2UI=sz$Bpj1D{FzLPBy+B-7g?rBX2KT?HHr8kP1R-aQ~yp~7ky1Y`tn!$-bE$Ep` zM=;u4(W1J{CoL>Ley|Wr7&;^86QiZmYyvnv zPgyCtM;+vT?X1b@r1_nJ3EvDh#@DuaTg0cQoxiYb?pw*Gml`?-u?(+pB0bhc$99-U zAJOPPLttnQO6AG|I}j$*V0o{;saI+r^aavO{o>6>vQEFqM~$-(kI=&TW_-$84idZTwbQN3j%u=hn6!I zqhszgno|xZAP(860`0{&Iu$pWwoKUc7zNU@STI``$Hxx}>T}&V+*Js)H`f2d@CAu@ zcff5a+UzyW9q!$-E+O4&Mqzh;sI>_<$YTrb_0ez3e`*`;zCv#IjlCzQ>3QjHSl)Um z^Mc*MF$e+_j2U`1spAj9XHI z$D!#LO{86;7|);>i3T6l;vm62w0&00Ix>yr6RGv?ASHB20xI^vF+k$bj}sHc%QDEV zILKu%DEm!9{+baN_ZohW9wIc#(<^|@;JSEp1v<}eA>@aIK7Zpn9M8cEAT zO2=Wiq-_MU3P`<OuCsZ|%fW6M5ck(1m_qC|Gec;-(zZPM{nlSrrHp%R^FSHT|A z-42hCaox=!@01`d2XI2j_`92-4K?V;<}eHg6aQ8Cr@3TM!f=~`K-oo5Th3$$i+o@L z{SaJ0w_^K8L2-*$1wz!R{sU0Qz0@Es!VT7?io2@%mrbko6Rhso9{Ii%}g z-iQENlSzoqbj&7*L@a_)CCUyeS1LMO91)}qRZ2@3&L5J4jkHaD#}#iq0k%MTlZ#qd z)+9VXDN}jK?p%O&S(MXHf`*0)Y}C7Q9iS&3D5n=eJH^W97Yh3!{Rcn!STd)#QY35C zk&Mozw_kz3V*)ZPkdVr!Ax}V7jYt|onMLnkVd|rExWN!cg=Es%w=M-!H86=*G3sN?KSS0GwAhPFFfQ1SsE7CQIkN{An1alT03PFRaz%7XvKLyS? zwBaeu;v33AB0$NTq9O@M!pV^gCg67UNHmr~!;l%jSHVw#U11zuw2~Nl4q^vWfmB^8 zbX!w6o1mePdDc_qHkXFss(EHd=syzE9k5dg!+2SgVyl zGR!()V{0bnGPH9r>x6Z3VX-NLSEE{l`B}nuaF`WE*D@0Pq#K>C%)6x zO0&zdJz1-Ot6Jdj%EW?paEVB`rcQvL7Hp_(HNxhnldYk%))UPoo=>T0POoH_siE`jDLlpW{%{Gnc(4@N+GBsW)XwH*F~| zoo6Xyn)eU0Zgz88o)UddqezBQ)w_m-`hD!@4(?~xH9bZD>&@4YzrLpiEgjaYE)lEQ z0@Ye}7vbr1P;Jz6=x5UjS!_t54T!dS1h8z{l!{ac(6jL4z2Fv9j6y3Gb9Xb0VPFQ?H# z=;}XxqeZe9i(BpZRHOe^(ai<6-M8L78|xQ-MptCpd+^4Vl}3Y|Mt7kqx%zd|Syh{8 z7)%w>X3vBJ53FN}#>>^lGN7Dg%k^kH!~ZPT_zE(=Kk)xsio4pS&#D)B!;6GFT7xgu zK|G=X(vyPnc3yKg@YsR4V94Z8^s+G}djIiWk9m8REt+ssGX`{LU&=Uhz7 z)$}uFc4Ew|aa?TMK_AF@U>v+qt`W17;XQ8UeYsB+kmWtzo(@{CZOREkB7bwYH*7(2 zZT1awX8Sd+wDoYvfjymtFz*4^h_)00k+hS!%zyF9j@#^~JH2xjjJBo@p|c8kIvi9M z%13yg|BL^Qb{NNM2|}kHqe|0YGgh^-T#hXmD*0$rEl?lI_lU<+d3fl(L2rX?{y3{| zAU$VFwJp7FR{vxPG%B{Y?bz9TA9}z8T43{Ov-`9M>m|S4bwdR=ay{$75BSvW+{c{_#HkJ1!&EYxCBMN5?9@I6er} z=sm}CtS1Oz$Nv7Au+Z&t_UF{mwM}E9gMl|L`DAAK9vf6?p~PkLOTekqd};F;UX0di z(vi*OgH0;iLDGzk;!K)woGp{nN$O(;=+R~=m5V9^n5fGP!r%E%$q?ndDF4x>Fb!DL za-4UxS#nicTDn&jcZQf}S2APke8ng&eYRbA2%mhQ<+LB~c%Vpcd9r0uU1OOgjnZ&L z(-?NntbCqobS}gj6QX6-Tyt)FW1hjg&*^n|?@81@V>^IwaVq36TEAa@#XIO_&ZX?o z^EHAi_=7ghYMkEzXK7lt@PRtcrOC5{+vSA>y5pSkDxa3)yqDuI-p0zYHq_IUgal)O zHQn#ij*BHduq5}z$Onr}bV1f5$EB8}-}H4McvrhKEqmx)+tOE+=Z;6@PFq@9C-g!G zvUt2jiNr`?_HUmwQjOb%EN{7u$&FSS9`r^8bpn<^+_OR4vP(R4&VM+Z1&G=c75+qp z{^|ZX7?9fXl;;m>2svTSz}u3T7*{1>D$o*pq^Km?;)*I z%CuEyiTA|lv!n!^m(`DU)3PgRAur>V@f9;H!`>|P$>07S_mQkMc0e|2g# zEd174KL1_XZn0tiGLkIj!Em}*`o+;$+TA$1s3GXfxThgvFrg|sd&z7>$m$cg3vb&| zK<){KVCc=hBpg0!dLi8`m?9sg{lMmL<_Xh|WLNcn6)dj*Y2X-ynz0hPgIz&7Fskmv z+pUu%E2cZ5jnJZZ2)C3j((mNh%0Sk2PV>mu{~PjPnEqq_ck0*tKW^E*E7>z&r8b@! zV;_`_|3x_aK>te-kWED+6l1CdzXvO2!^egVI&NAzemZUr3|_L%I(td@5YWC@d{G(k zm}mRZp5eRU7N^p-!rN|*(sBIM82{YV+tUrxZ-x23*-HcG6h&CRb+vw!s)*XM3BuY0 z?z^DsmOTz9xOs$jkz{O@GUFfT33^#a|1o&{rM&=1*PS25Uoh5P?EO1q{ni5T3p0#| z&B^r7J9Di6YFX@klXZS$MS9ygBpzEwyFv%E#GpVi=MG2*p4C4i{BfUO){ljCofwZ) zVR#&BIK{9AU&MQB{_$V_GISQ-a{g=m_P2k#C~Qv~CPm9JIm@Ru_6=L&AAnuN|4Gp5LVcPKt^JStT790Zi*6VFj{G+`Yj6v0^!i8B`fN7B_gne zv=(iWX_OMEWYPp9)ehy-kPHVx$}Nv%vWZ>Kni$nk#>M~QJMzwlo#rt7!k-%RAgpW$2DUKIa(zOx8NXCxDx_4 zBihx(qw%+v1Z#23iIVOM>;MRv^U}#lR7C;%-@g%wjpR$~coBsdLpZ}Q!J`ViAdBdfqu@~JGzaN8{) z#1vE+)ODFy1L%|lKH!0W#tskV;0bVy=FXnwhelxv-oU{nJL(b2xUU_8+ZG=92Y<%v zNn&+;y1~QIpp$|xl=!8&SZy^I%Is8h80S-ibz1YHA)(ri@~0(r>Ac!;_co)p+~D^7 zPcJ4CDIT1M;I#vIg14^^TY&>$l&u+~c?|DvMVbWG8WLD0MN3hHEqiJck1+oH8&<_= z27e}bq8#lv)L1PmEXy6j8ytPt^9k{?QA+f$;O11Fyft*5m`C$uq4Ui_6>L(>g5QA8 zQV#&Lpo;N=9sTK+>pbm9%d}l1RvyPGg;r^h)jp%KAq(FN<+i{3GLoIp%QhCb#1B{> zy8U2ert{$&(eTqwWSADhsE4D`%LlR^uoR1%{+zi zTld6^4o)?D=(q5CdFUvt{<<$boVYNi4ENXb2}f(@ z%wn-bZjKzI97r)KfY3%1o<1fB!yzABgxF8^RXz}MK?>rD=#Ob*_eWI`hy5cESwt-W zIAsjr9?1j};RhgBn~R}@1qe68fA-b{pxDJARsqZ~*oW7$=gkFsTcVBV_t% znNVF6f5zb;-b=D5Cq~J4Q3iStep+MA2U#g@k!*iyfuE|4g%<_EA6biIT{;69V<^_y z7HFuKtvgDy0T+Dx7|qQ~vSxhH2!zmTjx1Z6DiMvTQL^Ev-z{ibH zky{uitdZt75I)K9>|etw(!t91ulXRbWUJ=vjRyjmls?;e*jY1r{#KO^{l54ficxE_kvd)7XlwuO&5XoxO@i=th?Reg5gtA zcpANx*wnIRqVJPiDJ?i#HkEqR-54hT#j21n+H|BECbM`l$Dk!pG&DU9 zGmFeAU{_$2Dlr%CU(&#KfsP#LCD?p=2T$^vYa+{Z;V5Iw-p!TGAb^+q1GG%w7hBYA z3YE$s^C!y5_9{rj(0Bm5FWrH6q@2Dq)sNDWVOPl2)6#Zi7Ln!24zH z{Y^*(nF^Q_r3wkXjxcLCG>O}xKut|;+_$aooGSs2UcsIii+Y%Vjn%hYnsE@zCFMMT zHDsk{TUjN{&;c-=jyis&-IxtCWVBJ(m|4_{Xx0T;D$DdOzz2$!%NU;V7x+w~>G0$l zpq+o3{y3>s$5S(TQ1DSSf55autEC*i+FD@8QK_z3_IBEZIOI|JvkRyqdn3C_c34_0 zQwM#=&3yLqYfGKx3R9;9{r*reX!NLA<_G5x@4Kbljh^HG9nKpQi0%TIV-FH3JN*3pyq*7xG~I+ z0_ltbBER;QNJ;Yg8v$+yTo(~Ow1Wd@vg{i1HZ2|z>t6M%>yuIWN`y_5X!^z z`V8(_f4g}Aad=@=IA$CEZ<5$d1P zj42$hX-14(W(4rC*#yu4jJfW^@Cbx^1(LXA!O;d%$cvJ^24ZZRlD7am=ZxRxOd*x4 zxo@PYl(IPJA$ZDWw05H@Q0m8{RDvE!m*nmRH z|4f*Osfn(Bf6yW%aN8w(%!k`4V0+BRZ7O8j+x4jn#|+wufxy8_Q)%6g&?1O2sF`61 z7C6(=q_UX%L-)Cr&7e$U)+$8`n`Wp-W*E0-?DBo=kA)nCro_ZWJ}g5dR%9*Z`4ks> z{+q@W@-QGqOCa++4S{R`MUxmDEl^k*Aj(u&LR$Ps6{+@SoeKnyQwkKfGA9tFl|%r3 z7o_4NKWOI6-{mY$m)(<;w%}ExCD5^;wW6&o&&E%ZBfF0}9H$XkFA_c47ZxrM0Uan} zAN=hf!`DCwmkf*S~cgu=FJ+x5PZGK31QH*Dwl!ncroZeT!_crYGb?q}$_$t(|d9WfRuHFfPEUr|Ce7(?)E|(Y$Bd<+#YJ~`jNpc??*F-H5oqxp|o|3Vp(4`BulmIw0Q%7 zd_22l2~j3WVPy>CA+5_Js=AehKoZTpj;JWv|{`+Pp0Kz zBmT{1CNM3+PRiXjFwhGUbd?vlo}VIMb2)4hk~OR=Iy5|{hjs#pjzKDzE6*c^*#`B< zd|49pF46ndW+Pin6j-egN_&cXyOK>cnnDbW1O?$o*me=Zry1oBDeh``*iNaOhIXtZ zfT9!0D|DGEGB|9L^M;b8Ptycsen@F$?J*Mc3^z$`+B`4o3J#^B*{Z^Y9}5ucwx^3j z>`<}ox?<9jD-;Ut`Y8cHWc+=U&`JqGrkt42%=*dVj{SUe>4LbWg1x0uwzJ%bGpvL& zn_Rp6O1qMVvyz@ltWB}xZ>OQBqVGlUWy@$6pOvN*y-BE8G5JxdpY~95);LFBM!Q@j z2LQ)J#{kv7UVO6Nsi1)uZiL?+oKsortz8HbuUhM;beL)u*J*LG&+>qs=VDe#5T4g~ z5%h4`gEN>rr0olj^qWVRBMGBh+^Vp=?R$dGd;ZDyrr8(o0m(55*gk9w?2Wf)Nu>n_ zrp}4AG;QZ5MG_8?*BGv?U{&-^BfbAeH%#npcl4_)SqL32ioB*r!!DN4D7!LQDhe)! z0SZ!W=bbGM6}NF+BP>-s>$!_RL%bYjkQokd9LBY#eg)-DAfvpm{+qOp>nyC(>nw{$ zc{9qF8xKF1?E1+PfNYr<>L;4uCPkfYw8j`28{H{zM&y$K@G9|qpk1kg7a;2yy2&A$ z`z_p-MXWIez;ab>n7NJ20C(*;!kGi+uhBtuvc>PUdgatoy<7y*V;ZP>!h&b zKx<*bwY8Fe?&$D!ik)3dj{=)^iQ3 zQ?G-2`_5TyGP=niu=+Tg-PwGu#8WXK5q#mLw2fxYjY{U_aV zr5kk9O$j8==_gMSLrMYM>`B?Jslspmf}PCRaQ0Ig2iRJmLfI#w!AcFQuFd?SI2Hjq z_wm^*jo46kA|dWl`9>WTcO4Tqs5Q53YADzPcE=Zf2WtWdWV^p)gxM9}LA4t{ncsc1 zZxmeM=I0CGm(UUZ#4Tdns8ilJ34o%V^piXE6CD81cK}?U+dG>l*I>RH-utT`2`z=sQy&T0LszvU1~NKza|VImU6NOe=t-&Ipy;oR|Wlkh28?i zT4yDahl{-?8Q)O3aA;(Vha9+>2jxNDSX7n5Q}Nfm+HVh;bC30FsJ3P^Mu7*yIS@TV z6ltdqjnrK|Vfnw1`Tx8%yk|YVae<|53JQ01RpVy~y#16#5eC0K#lKJeM|)*@{$P~t zWNfTs1ANSd@Rkn9ncaOhH0HHB_B8*L=9MM-D9Ej6g3*$N+hS(@Xu02PtKvYu*@u=9 zfMn4m8Do&vKmT`TTJAe)4|>I92DU}Ttsa1m+cn)m5e8E*{D z7E^)0e*6OPMdte-7kx3;qA3OufSYm53QKFU>R-n}C6DtKqff1#uoj=9c&`QLFX78y z!du`TuuN{r}JDzdz0XfBkz$_3w82acKSr z)n6qVbWs!!p`tEKpxWOR!={x_sT<=AjKt=XC*?E?35g{_XI-x^I#LJ%aNrcn?OT=- z^Dq;vw+}X2X9kMiY(8g}*^mqQ%$#6B?$L?z1hnHKI~q!|GIeZcUT-ajVrpqPqNX9Y zVQbjDQ+phypwY-y2A2#p+oGCSETfyfH{`TJR9tKt`C|UTb8QkrtmLg=s94Tu0+o4R z0%ghmSVDzhj$%op^)w=9bR232O)CG7Pc&1C0t;pa=)HND=?)aK5+^@OGoOWxq{FQh_leK5alkQ4eJt8=r($-G)) zTx!XX2od9u-NCa_H!=6G9y#MFo<|f`8i0sEYcRcReqhCiHcHFdZr&xbaiZN+wAMt8 z5v-A2)y4kQaQE7ikZ4e5|)Nx^7~VTpz&VF(qMpWwUi<`2ty?$XoANnUF* zV13e(8o$H$kpA}a_d3c|LNCbyz(4lVS(fE674G!V7JFGyK8`5^bzPVX?zb3Uvr zk6UB?7|pcuG&4J%=fpVMqOkO$>4y*@YtA&tTczHQJg`j8c1!f6ARODSI6{EKj=Jb< zSp0FU8~%`TVHU)GsKZEsENr7 zDbo#Y!Mi6jX&TL4M4+L^2t@Z4m9T#+^*ZNszbCyFHVo8wAD^@@+S*IK5c24?1{% zbxw60*kiab;4cbQ5G=eN{L9g_v;UQky5qERBRJv&{b&2qw`(AT@%DvB@exo{@{hrU;C4d0?IqFq3)}(Go+6-| z+Xe%(M@&M^fG#hzz%&4kHV=ToD2j$1|3%V0`a+qv7duNu2@$CenYXP`GBn)h3T>h6xK?l^BF~@!|BKq`*gL*;(cI5Xt=u->bZf$-gdK zgtQP-+gr+;bs~(KW*2ExX8;$O6GGvz*zq%?3qNQ~#a;mS9y`5J>H|iExWx)`$ZDwY z-c3BSjX6g2DmY9)(e!5nxmwPX;4S1&yw5=qMY!xZlxZTELAEb&Y)tMsvmR0O;z!}~ zn3!r7L^3vKU*E{Gkmc$o#@j%Q!kTCj?<&#IfUp?PHvqv%c*-<8de8YJ1H9|#8Z8=g z$ina}uTto0UDRZb!gE@xtas=1L9&Qf9Wcb^Qh@SCQ;ZmkJ1kHcpZc~zL;SF+B+|nb zFSb+4?btp^%{I^4jHeA5n zG&Jt+?(Ux8?(V@MxVtp&1b26Lx1hn@3GN;=fsmvR@Am`F^i0m4bd9^#s@iMUbKSSg zaE!QX3v+feO|_J>!QymYwNuEu+7BgKDaN9}ki%utNbS)o7xJu#$x0)nsA=!A;q~?U3O{?=gltpjyJko17Nf%l!XV0--w}VNYK*oLHGx^q8QMWa z5Auq;RFCn~g2Cadie$Yu%a7F?Wm;?gf@`19Vljg=T$#hjY*yv1 zaZAYEPCvP&oeVRPqmac*%A=>@AK5l2^C}>ssu3yIu4nqosB*DZYqB#uqG65!s&>s_ z)#cbAWMk$bK})n9`p(o__SQwLh2O;@%%+)qm3>5{-85s|;1u}A9_!GK_e5C@!xkx&Jl9oigzPiQ^qG3}NFZMGQoi7;}EJiB6}ammp{F!6m- zmNJC2rs+zbrEFyDTFQy#@)2%>h;=4owe2*J{f}$d1e(>PS*DBrq+m|^s&xtd82AIr zuBFQs=7&|d#ARW0KfO{_M&OLJ+U9p3v-%nAUTErgC_-qa*~N#F z#FK(Yy+0(-r|vZyFC}SK>Zeijfv<&#$P~sRXDF+Kr}CrmzNhf7?((_K?pQE`fS--V zG+5X8&Jv$^drRT>*0a%zluK%rH1ZDkXJ4;y!;k&mIj@7x20vP+CWmpbECB-HRMXWL zPxu3=qmEocG+8^H*6j?aN_TR$|3(E>)((r!UFrcTK%_8!r z>ypbD`uaV)`?=XiS+>Sq)3f~t-{urqGj&q@3V0R?wBou~HoY*0#;L33*(F->o}^an%{YK(CBh=P$80 zpZQ6j|qPJ2sV`f^zv0Vaf1sEQGziMvl_{DBv$d)X_cCRJtR?P0GO zm<6@tS4BcX<{}?5u@LgvgP{tZL7!N{q7>QM*MHsie+X-SA~yQ`sA3~#=IsN zfBzXOaB^ihVIEKgebJP>1QeB3!*9S7HucSzTf>F?8kE^92Zb00c& zPihDO|DCYloi>3wy{S3@muWEe5JaRUlpMj5ZZV{{Gen#!l;#|dzKO@XIn;y_#0n(m zu%$KO3=7l^`*a_YokmCy9kK<(4RrB|zV}WK<&182x8rt2kQEJo5a`puU#ejAKVW3G z^~65KEpYRn&Lk(uWTvB($k1dL*YIU7CK((jTN97?(iu4oALQ{Ej&4Q4AsJAT!szE_ zZyaS#w@B{{-C+F{Y0c`!ZcLA7DF6fY@(hl`&t_oSm4%^ccCabN{9f+O`VgYqfrU%Y z)+bY8adw~3~o zUki#{jBC@OWwni7#gDW!bJ=(%C85*xTEt%AXIdYMo0UuWi5XYSZfhB;qD9I^~;VdWV$M-%Nt+z%sq$`bVd*mCL4wwiT8(I zcXkcCDUy`2iomNlDSR=>8lKhH0^_EOg-SmTPC|Lk6XV#L;!cj0MgQX_d_YOb7qD6? zU-y?cC_$3Y>z5!|4^yk8-xV=vg26AHNj6o1vg7Wv_?94>WS$p)NqwIe8#nfDLOS0R z+Sfz_L}%1zBbH4%{mm3RjdVsF@`!OV0sU0?q71>;F9I>C5}D+;mFz+M@zkannYNkU z^7P?DWI)^KdV)Ai8(0xeuyJLSuUW87btV-?25E6h+G+ZoPRbYg>?Fo7nT#2}Vc8K~ zF#+N*La!Mmz5sw=j&Cx4PbT{TLY8DE!GmmMW>;FeciM+>W)*R;dQ=vqnx6I`#8Vz- z)KCdei!Fe-}} zDxbMwmar`6X(98*flhYiT$jAHO$-MVMPRm zGGd@Uw?Z_R!ag@x*56non*f&ufRalgDo37>P@bD0l+V zX{F2pK*yz&HbqP;w+0iY;I)aP$jFZi7v78ml*VsE^rvy`ns8++E zT>Uq&!>?AWrl{4fCPjjMr?>{oH=^!$jYSS$fgfxUl7sXkO~F)c6;n*9T$BZ8W!e@1 z4Wrr{3GAO!$sq)f1^~v@fDHeG@<5e$A8%T21>Z z4MZa9Xk0eaWyaI@7cw+d34LtSienStZl^x=D2ysA(+G9pWS4cR66$UBcxUKpt(b$L zqn=hl>beVy>RVy7jLB9kUP9* zdMD_ZP2hL-HP;JP#{e!(gN)vz5HP^W$Y9iWg%16Xp%?OqfqZ^f3Ffv6V*rT-Di4yJM)qGlu{+j(7lScJhs zULAtt-Vyh&R_=l}A!L8v1{FZOQq+74E1)&xembMBcZq&$*d;Ppc_%b*5LdcqKY&J2 z#oY@Oo(9go4cz-1?v80^J{u^9;o%@Ar+4|k#Y*mLN^7OD9o^$0i1ea36lq*b-PRGaS2W?e;EbHw^BEndkMbe({ zl9{72mE0U(m)l$I%i;W{bZb&Cizi)r@T86=%cMk#xABs$jsL)5!Fo>?3b_8^vMm)c z(6v-B;+QbU0EgB9i6A59F5SK?Bdk-E%8(H*`&RGkzBLlKTjp`TUN}ce-DicGoe;rB zcQW#O7g>Pi4_TNU7%I18{b2_x6%w;IW-M|un6@pTCQ|b+hcRJ!V=7nJYZB=XAmvh= zd7$uoiX6j1pZc-JoN?@&*S)}1AKZ_!X*LCVj+c1EcYIB1j-(@+#b+kXQFSaA*xsGROJ&rdPn$H4 zrdW<6Jf@@2p^Sv3E~z4sAZFLbP{1r;q_a$9WsF+CJU+bKr47S%-^_ZDf5sR0Gp%>>tsqu#ZKTy|y(H-wV_RXO^Xk%3Eb-Dl=x$1pl!9Xyw3 z0dkcaxT3O7Mj!s-h|NH$$>@@5k+*^WIe!2Es<(SKTSRm~KWFi&t6X~rb@a(g(6rq9 zLVX7cUzvB-F%M!l9#xo8oZyb@I+^N+7{Q_p0{EuJc@;`MSR1@a;9`io*6e4qdKr>g z<~h7J#4_?n;gf-3f|MwO2Of(?SHR~!Gg`p^EdSsp=XWs zyk41L(cw`P1X3ju2nUJak&2Z*F}ePM#Z_t8WvUWVgVh<>cOKm5`qRG=>jLQ=2}J#R z|HeRctD{lMR}>xXPe{&57~gZ4!*gUt5xRK1DzmuUP7i_8bAbz(GhqV*K&HE=q(^M~ z@8JAA8hTp*zn>c$5ip9bl~D#$^ZMJCDoiF zyldX~aDx+_hJEB+m?o2flkfC0!|N<8r+0>z$_0&ykC^5Mi~>}!9|j?QFV1^Zw&A5$ z-r7T=MQ8rIXSx`mU^YM~+xa`{k0?0bN=&m%zAhiQ9&Wwb-oCnkzZT%Se$l;#uI28i zkoEk#?U(}zbNr}Hw5~UK7w4DA4JS0fNs5#M7ZxBU#a$2CS3}eHJI_e7c=`GPRYCXG)>b58=lpLE%umlU7rU|vGMJ{y1C z*S@=C<)}EY-8|G991lG zBzr|BH~L{XlVyhOpDul0h@B{{JA>+hY9)#-Ns^#A?d6R!S6*oX?ikVzCs zI)dzjNDU}h0v=$8Gg#423Bs2lk;z~b0v7$@BDrKZCp;WmO|h{gIL1tdd%f_9=}Z~R zsW!8+iUevwPrCy|&hd=GkG`jQjHwgxrScI71QcQb90u$H3D+$gx|tHb_QRFz)JnWU zu`z`*Tg+0KL{`Z}7GJKD&~#S9zQvbs4xm1zEFKKGg(8x0BtoHZxi#^zI6{7}KYHQf zxL}<-zA7KH#<4t98bv3Ut`Ms}`~(3&sXnJMG7EkaL1@Yp3=^DXW*LNr7K)sy*E&Z- zeK&EtC+$B?WA{{pLG>w|1%4lg338^E57VV!$?v>3*osDOY~W@Lt|qK=LM85SNP)B4 z`}ZR7a6Fay*>X32o!ho`M>z~%)uhxP%(UddKFTqS+ycHPN^0r7Yk?8jNMjJAS=;qv z?T4ulqY_=KX?3c|^@_U~sc#TgK_CoBG83c(0K|X*ItWY;VX5DuG}euFtM1LICGWKj5tDEUQ%C@Nf-(j5mD2A=)zRE zh0-qrgn5_*1D8iszFNJ(StOROgb0q=IOX?}8U|A!uAV8T;EvoM=%S=d@&ktYv0hrS zAb~~R{*t1xmKXql)<4BSnqcu%LwH*Ar~-c2Zk=EMhvKmy@n+dN!@XQqrvlz?1I!tn ziQuY=>K?h5i6>W4(27D+A3wJFobb-!?Gia7+Kd|(t#>w*d-Yk!Qmv>_2Ha5^;l+q~ zXnA~M`el@r;Xf&@Qt0lwdnRzBW#qPF#cwQA9#OlM)|Bq`9j+(BQ*RTG18>v5*vhNa zE|&;XnTKTu>KGy zw$9g22dpDJhlHU9L^lgJD0k@W*jC$5u;@|AZ^S##tlSB?sh%7a>zb5uUSJ&}llR?G zK8-Vyheh90eU z^6XFr7^^jbrj7Sy^SVHwrDRtc8UPvwGhXVDO_-!7C?2h?i=Gz2{K3CeJbvH=b?W2< zR@NYd>m~}wo(+s0@Mb6`wUZVWAz!u4N}JG@{XBa?^5@hOhqwd~b#`i+W3^(frx65Ii>xygm*^6<-H*kdy?= zQn5iJqP>rCp?1pz^JfcOOQo0|5MDodz~6 z578*B#4KnoQZpAdwRc*FX>e<2fPbz+^B4pr$Kp_Fw_mD-QZvak%jG8;RhM{`@>Ick z$pErywXGDEO0rTLUzaZQmwQ&*(aNCp&Iwm&NXVFVAH-^np6w(FG1i(3V12B$*DRz* z;8xs*S_}!I#qUzmsR+cYV;@cJ8N4;NWxVK3IUVc*;|yxO#-!-$=Uy=)zGt2PMBu@? zjt|P++RxCE8Wm0cSI15D)$0U7^y0={y?1NvA%$H!=EmWZ?)Np618Sa^XiOe1!b2BI zn8yzOd%Ds=jXS36d?0@guHTqJ8U-DPiE8C81KO8E$VGkhCLdme_$nJ z&=t)Pr(Ht=3Ceb!+(r>jWK4v=M>@(G%@Fdfd|06H9>U760l3K@K}U$2P=)!hI(vY@ zcZ6d+`l7iVkRVasuXOETd9z2n74#J2pZzW}>65Waf`gd@Ow>n$$J0 z`3+%Ty$?|5u}3w@y5hz|_L#|E+T)6EoWHzn<7;@=MFM}={dyWuE!-2F=|`8Y2#lv5 z1fnfu!n-yGCVNBQ$46_sxBC9dAF|u);Rg$BP0|0^MO6$Cch8bp0QP7hO#eBtAa9Qf zy1N@O4;V7!g~!MWgtdddZIAo>I{65_S^o5CH}@k9)*f(`AE1%^Gl!B`Zvt#u_YWEe zVUYX!-l`6IpDKC@VY_P>;_jQ|7Rg-xuyP55R40aHIXHVH2m}Zz4&k7+eSl9BLv9m8 z2@p%?9;N+1~F%b8MFrGlko?0F#TP7R(d4Z79?2Hh8c}G zW=cTh*I%I&Mq!j%V$?<;nlu0{%OG9AFx3-CD35)6T2w&mYpsSj0)`lxfEb8HLP|u8 zF>459G)SQ*c5^gvtJ!^MD9A!GB*!y?c^oQtEKzPoH1C_^+dVqEJgj^?iu5EUKl(vI zs}F}pO43M5+DHn~R>~kA074lg`17&KLbApmM%55RpElZM0TNDw0ZDxmxrX6!`Nno0 zqU|uYBE+pSJy`r5Mxb|euSU$?Qd&FUn@!p`WQVa?%FemhJm1Cl2V9@hpKn?`lCJUJ zK3fWMOL9ASbd#ZcGh>li5&C9nBt!Q!&K3>$pd@2lCfbP|FM%W0^5BAAe%zB~Qa6At zjb>cMXfnZL@+?Iv4Mo0(NIo*Jk-v1&|iOiC{7Vxv#qmDww0ze zZw`km%v2Zg^vj4s&B_!3u@taOq4P?Cdbyodua_aIXR2<7z)&o0 zX50=Lsn@(m351jyz`>VW8!$3jI4XPVFQ`y5nI$os+s3!H9qRsldO=G37!&*aNgquJ6o~ovQLFNj=9Rc-z2R0 z_k+qSm)iPad3;R>95;ghQpnU6kh64-v~D52wpKQ-?mCMbk9xjso9)LN62kUE*409` zOZ7`0{^Lr=a^C{B=m2IfnoBDGA;Kbl`T|kW!c@wlNv&FU4@(`E;PM0Ns2$^D-eS-1 zSjTCkK_iZbm2R2{4NR-0@>XUfi^Z3+CHlX7*kc-u+KafW4V?3Vl+#!weqW$ zSyq=MwVQ?Wxj$NIp}VdKuJXxib13}f>kEyM<6Z%!F84BpQFDM;UshUILb+dBIs0pO zDL_;lP3qER!raWMCVhnd#nf7D z6L(HKS}ti5`m0`u%Vz#;Ox8`Tn{w>o14ayQPd0M8C0u&l2Iio{7KH|W)hbf;m^yj& zmURCX`J}PAk!_i1dCnH!PJ>ZJ~sO|ULc&T4x$8(j^@eseVJ zI$^z-svUbsQx(+T5ztrqje!-xF~!=j+FrQ+w_-bD=Qw9)B`^*8{f2p0nQenNkt8B| zuiaR6*!XaD=QMDD=y|gyxol%+$JuX5DVKvRdzYko_jG3oZFcwk+2q#IIEI zb#IMSn}Kycd&#&>I`j3$q`7}F|8BnEB>A^vTFs^rIi&qSmApx(F|-75_vV;{4@^kDEnO5Ti;E&sSjHy5DPvV%Fdib=thALy(1 z6$#h=Fg6l3x#pRf*yqqQ+mLKdSF`;P{Oz#Q^U(L^uocb>%F$p>Td@V(VSsU99=N%) zOOYJ8qy4a|vub6WE4nGfw#%$%E1*x>n$3y z(t8IQONXMHU^3f71lwS~^DEl@5V~a#Hrt2~tI;OvPzKyaMvJ6rTfpE7TeEh96ZQU1 z504|rLTvZ^1MPXk1a}ghYVv>u0B=6w_B`dEEw9xDhx-LT-{<_K3!l=@*$eC(Su6!U z08WS~y`ttp%_{%x1!BboKCX(u_is3X>IEEOtftyt%X}qjmv5pyZ0>f9Coxq{vi~eO zYron3(=u<+(J23GmyV~tOmcO|d<7?b^&oYbVqhQaWUsCL89pnzWjUl4hLQd~ZpUR= zmfAv$Pu(GPCHptG^`maSW>c0$$Hc&LhqeQUBd4ck_c*w9f=+NMgK;{;Y<%@v<;G!r zZcoQ*V{&bCiSA(8>-(&A)7$`4OlnWdl@RL>9u5Eex|g zAYse)&|a3$y=ga`4cn;mb`8<~Q0Em5`R9traPRD&#MZxPoF=>%uV{DZz0UhgcXR&T z*_X~)CZ+)PIUP>OAOIu?fj>$%dEPB2UFXJyqW^e zs!Tk6Lik2c#`_}U^YWt3BbV;u#^*biY@*(qc1JcQT+wvIzH7cmpwF*5|KfVX}E9(ZkXs8M) z?=c7hKnM$vxM|1E-f?@J4_Ov%?_Df;7`is!ZP)BBi4mSh-(*NXDtgV>8PGG@lB=V> zT@G}3O^tYgpA@azCOEen|FymDGNJ68*gLemCql+vLzU^CJuu@L{q01rUE& z{u9eIXVGqa{`!I6yY5Gu?k7C^H?NA~a<=8Jk8kyjZ*=8$eU&yb?Ted^%F@Ai!?nw) zM=^~hadE>82|~)Gm2Ta8%d+kUYmQp9Mf8@6bEwJAb1Naih}r_TV;gVu$IoTH_^~T@S`sPVy11_(yoD?MtM84}~$0za}zA zU+>6Q$9QeBqoGfQ?+4xpWJX;MF@OUKSXSA19JBo<={PFXJr2{Q{XNA00$(o13+*}n{vwP7vFQ}y!PC7^hTV5RnFewlWPZ|pd$uXoBk-#* zlK}@+?c<@(9ITt{^6oFZi*yQgNe_MCx(UAC%8t1Y<0b?oO?E+QYe4Hs=s>UV5`iJ` zmp;P+RpPnOLWHy(ikqIM?^}qWXV*<@WAXq?r)8lMQ=V;8kzF3_;B|Vc=hATuAW(1` zhrlUtGy#w$1$Z(g{SV4@z4wfzbV1vqTVjb&TH0`w4?f!TK@2Yxm%8>H$0ZfHt9TT- zxn92+b#-DDmw`UVQ>f+2&R1;QXac@ug6@D=Z+md)qNTkwg363BfdP%u_#DA z+q%Tz+c#LO*w)uDjv@vt1$0#6jF`ZA2lY5>9fQMC+6(2kJ=$t*d@GomUU#!Hg)!F6 zTFXD#96aCp8DssYd)-%&;h6}D+&C}j+7Uj=#DQmZ1@`wr)LzpDJWVeSytyz$>NF}qcHg!lh}$gli%G~ztP zp|oKh$h&6XeY1ce31RgD;!sdNbZB+mmrCJd_k@ohd{G@GxPIH!db?r%xQYM4NBnw3 zX>1R=w{trkeE07ZKlS$xyN~Ts;hWL&R{#u0$g4u?-#dCr*njiZe87}fmVIiO$s3QT z-y~RRkg9oOC*V?V4we)G*JsjL;O`vO0T>)Y|4DeWuM!~|u^nkSgG_E5IQ!NdJR_m% z4q*NnN-LiYjs}{WC{CObm1rMqYA>XypYrA-elKiP6ISY?4>^*%-ylD-;()|u$ejd( zf)1bUfmCU06CJz*cq><&6vyAvz$HEN@{+p}2}6fD(gf<}s1PHC6`Z02*u%u1GSRand@}8c?;aP3YYXS5l-v zwV{h@icSEEKE`C*2xi(K5d^48MB6uwez%6r;R@}Wlql+;%9Qu zC>f8c?}VTy?!PxTnW`mFBIhG5>9d4mV#`=`1EYk}h(2pPhJ0#jGYD;4O2Cx`p&UyZ7S_GXk9gWEj_E!o~yM=tP*;y3Ob`?L)6p< zAz~e3WbgvwLZ~h}-hHL{s5xqEs4jM|T^5*MSt=#(c`!n6nbP{`w4_9|P3t{8Q>{ErEsYN{veO+jO#iR~QMh7Q zwyP-uzWV?T`DFxlcQ$(3fA>kkwBNxO;{QneiGdR`@N=v&==F^h3iBf9A%H+i#X%6> zL{Dk3!QxBhi3!hBjCk}{#ka*MtVUuGG5@*J7=9@Xyx|3jmgszftAK*(<{a^C19ewbZ(_8jS*TUDbJR(mf-z1LcY$YE}Q6-@TH4l z0n^79ImqR_$?pKe+s6z=;xnh*pZ!1%_N8*-cf!8kBJv`)H2daJAxwHH4nKot&<`|4 zrkjz!37VLzyK_oB3~%tpM7|&q5zy6G~gn_?s0@1fgs{MgGK04FJB-p<`V&cGl3 z-gzAOXS^VKy<<`&gmAcce>VJQvheRJ`M>TxXTi-U`GV*APq3DIKl2NJg%rLd7s6(d z|K`m9-As-y5_Km&c*0l+YfFw`SAb(#@Zc#9Yg=#@2{^E zc~i(cy~nX7!&lk=TU_+&S&UOgu@nNENVxH%SSpNH4@E`#DjEEFfdZpM9Dm;o{mBFm z366A)q&0gZ3PJ*C*(KjHLp>}edob%c*ckI9#_h>TtOw#@eZ$M4B#8V(n_~9Mmy*cj z6Kqu!d}O$si19-5C{j@IS;XF1L=jSu364|hb9%VsoOCi^WVu!D>f%R-H$^bhS3S4DV2%%R+9$x^;KtloRr zX$X_GIZ~`CQpzFAr5=({wr|WRV-EhCFDz*tbm*v?T6C@i?_22yDjDmDtoEU3<7DtA zV$SDnT)xAsjqU?6J2~+hGKr}*2_j1uLCa{d<&81QMKi$uIWb2=BC=yR!gC>!HrQ6PBvu`c zQvFS?mSY^#ug_kQO+sZw{IjTl(<;7bRJ@92PFhS+A$wL_Oo?n%Nd_N%qf9rHwswfP zM%+l(kK!rY#L%mJ*)v>ruw0uI&oe$7vZEE-pAq$Js>MW0X)qST0d9N7GvzD)C|Iu6 zVYJ0-X)Zxr@YgCH_SCt*T!koH906=R3@tYXlbImxh+m&nsmqGIj(MB|Y>{N#UH6R! zPA|kE9wN9}j1^XiWA-~*GAVHUOgNVZq~XmmPCpTyKN!aUseq21x|nFWc4($m={d8V zrN2s}cAeUPvo`3fxG0Wvyd-k+8;`u3Y+Kc~r5aWI9D>FHmJZZ0P0$aqO#37PQ8oFF zDHc-}z3x^Z_ovd|R5}FVJctUffRG`O z?mUp|Tt(pAN4zQ=T;;E^qOt*WM2NQ1!SzF6@D(ZWGuMh^l1ddAv`f%Uu*C61VW`xH z4GKwH_rdYvfn;({`p{INbyblJLKz@awkb;tBpVFDr&Tfugjo^mU-;6K++>r529rA& z8d)!Dm8%@*Y(Gg|B(TZKXfu8>|7>LY*$(r<%$G5a?sFCwW4855YC&~c%Npr6P_HSA z^F5jB?)__of{iF4e1pNds4Rg95JFnjs0^Pbf&{vbDCS3oHVpscbvg!k*B*(5)Lae4EqRhOq)(@+W4^n}| zSRYhVe8^PIW_MA{R0eZJ8b1`?ovsoP$;Kq!pFjGvPvyDn4OYQZkS9j zp!2!}0kL^=n-tjkK@HeNF36%2_7YpjQU>}m+Qss&L%lld{BMUfw#fyjh4o>$^;p(- z>|dT$KP%(7m2t6UeuKFW+$S4CP*M+OLBcK4z>U5!(UJ`WEA%hvju5>YVTD8jyny^A zqnC+okHrIXr$aX=_7Ppxkr2|cn?0_Q)5R^3y$PGNQtdex;)R65 zL;)MWI$KIz1IVZ0l*-|ns^Ks(=jOxU`G>e$B5}fFaWXk#M3jd439%D7;(E^(;jork?183jq6_QBms>nRX@7Y zre75rpe>D{u13(HbI*jcT!<3!X5&vLmw$fFLC=lLDeT=@jmH(vaNLNVICpPE_J8Ks zLEnFLh`3BIK>j^Azc{(rX1`l@;D46=UDdZKPSjytwJ9wIAxm=tUpr=?1C{8X!n=}i zkwC<-FHmW0oMtrtS)}wttmC^WBNue&ouxXbPm(jHq$4UtGZy##v#Un?G%ezhz&`^5DeItF{R<`_5b=^_>UVikc# z=#0RKv|t>*eK~jN7Q<^sx^QkX|M=t7%wx&QqxANppd?G+Ew}Jnt1xz(B!UP3`}Z2a zE$Ti5F>8>#H_Oo~X(O}=*D}hI@$q$(tuxx=JH}Kp3L=3Ek*&`i$QIBHoB~?dDf)QS zMe@AH@=lY8VbetD8lRaGz?RO@`QA>^%} zZ2QE}t}OZddimp94J&-7k4XV3cnk*G?}4yj^@3)oL6=>Ch!-`ic4zmx;%Y$JqpVjd+P67&T^!9Jasl)~8VbVa4W*Pj4k zS11Wsz#{PBFINgdSNP#~6kJ4UxT*qLc6!1z1z_KUFf%O z-wubMr(@8|N$B-7^mZ2dun2|jLWd5aBgfFQvoq)+^au36_20et|LgzJKkyy`;A_ii zLHEB9fR!qBsramLgfQ4-N{b1}XmEngIpVKx+i<_BbIzQu5UQBDW3MP(p zJb~hHWCDx#6auXR9cuxXa_;G*WYeu?D}R$3tNH4ILY@Kh+`AK}o68gSKisF}7|Q)$ z2td)D>G6ang-XG2x4ZRprljP*Yu72_`8>?T3L}k5)C5VL#Hx_Y^Z7!(mh(AtbIzlR z_+T5?n)1$sQYlB4fcL)0xdBj7 zzcj0n(1RjkBnmFC6?1Ab-aJHxC!G>4YyGZ0Pu84vBh|Kat1!gxj`XXfKKp9lT&!Qr zWXPNk%w+IboyX4CYYLo$S^#jQa9G67|FbZ93gYam-J2joO(Z~%&B#0w_R;r)?$x!gCkK} zWnsVL#^)G{%Si$x>ibE_<_R$Wb#ze10%fHf+_uBd52F zcg+j{KTz2Rzbn}k-?X#)RJy$NrjcGfJP&q9YSfsZtLKgua{$6(Fo~g#wqPGYSQcdyD&dnA4wJ_!HU_Mo78RJ4 zIhR!wNqI*Ze=2!Ec*j|PZCCw8c3BakPk$I?^n=Q!Y0)FVbI8Q9+qI%`MyfmIvRwcB@(&fx-7?NN9LZ`je|v7v z$Q0rFc`^BI7g9VtR2WGOxh~>(8f*hbPuDG=xm6(QCx|X)R{8y7=&=FjUQ?4*c!{BG z?)S@aW(+sFrfOgpo?*0y+a%c~-_KU2f<%cQ{wZt$KbVTxO=Y%uPWJ<{znOQA6mUr;SFwD7cxU2MBl&7|0oW>OZ4^Rv@ikk2c66gv@S#xqKtIkl* zmQ-=a1MQ{5mQ=LZWH>nKkfq&1OBds{>;9c2n9@mL5h}ZciLX|tm?@?ZZe^9kJ}W2t zn&(o#Z7`bdPykJqN|~O=WW%z{)p!Rn5QEI|J~zwB3YJ**CWV%~rrYYJ*cUU)N03to zjH7WhNhE@^shI;RQLGrO=tI(l&1sdhnEYrF&0~rIG4j^I6oWX!gmbP~`{?I5^g_$s zDxN*=c_&7dBAeNBIh(AeK_$y7cwEr(Yn)iM2SQ6)P&T#Vp_Pm4lvU4Zl$_v&d*SS& z9O<=bRLt4|90x-c?zJgwanb>JvznGy(FHETFE&TKv@F1DNfpZhBk$JoOc0S{*=5P2 zf;WLt*)dkL;HOp|SFa6W6GfV^nid~&wWRwu({RrCkP>eS1;iOFZE9096kSru_gWk+ zVwW`5Pt5bDKJGY;F;P{Hf|o%lJu4L-R?*bQhP52kR%^eFBdi~seUzubWf9Y?%c9ED z{~D=Nx&^G}Rl8L9cBc_E_Lz5^S1mX_nLTdsGyinP!HTn&y|)`y(0(xv(-xGUa2$c6 zv@@+>k(wGCPKgpF9IQP7!Ai3P}jO~r3N$`+AO zZyeA_$lv&Tar3lcm3Ka;k1>T`OAr6z`osCo50Nolcuw9#?y)P8wI#VOO6Sc zcnopYG_4k(6X(5Z@R`(~pH9qdxo6?Dd0b_NI93Vwy)FmyY0+*P(R1KrH>&6z?jPTV zXX*GZI{b{uWIX|!a9b}HJBSdIT$NEVBP#0smd~wU6Q_M^Ln<)|up|tgVnGzs#5ViA zlb4~Nf04!#b49qDJG>07_+!_sC@@-Wwe(r*jU+D2HP5O)k)m7GtHq7fVebqfP2G!Z zRl&ZBKac|tcarXoZjl07S5ANZJCrdg{5ZyR%{$5^aT@uh%T{vw>nD19r09A|cgMGjF`=Ulgz|Qc*v6dYx{) zJG5a;`z^JBDcfy#NYMb^-qArAPCi!r=^q|qNG|LI*-LfMcK$OM8GKDi@@Jn3(vAU0 zMicV2K78i={jzpE?Kg)&)@b*0^nI&2mBvLCNX>v6(Ij)IN24_sUCR_dNg3y22Y54@rlETYsS&>u>sAhIc^|nA z!V5d@`P`;;)V9x~$`n0MuEDOU12-*vY%AO@nIBwaoYe4vtJd4X6+Z?c(@KF1EIFH; zh8|qv=wX|TQ^x1`#xWISfNVYnM&NtxOHF`xH%Z z!|sYph?~{dKaYtiA+A-fsOxS2o|;rWki{iQ8T1gdrzg_cPhSTJaS*kjZiQ}x^e3{w zuf~(7|Eb{kC!PFdJ@|k;W2a76{Mt!mst~gL)91ba`|nCbk6kXpharcPfug8g@|~ROh%?m zdZ2#xNUS2UuJZjp?ucY&Qdo)zop`?_5{+2)Q&JYRRTRyM4io8pTRY==|`HuJ|t$Wi#dyDe47ci{23Ra3>EO@^^XANB0f0+aPmA`3%pxu=>z# z?iH=t7#{Qc+pAI$QLJNQ^$S}jtMDkX1aw$=4J_@!{tI zE*B7ujkwauw_?MPO<*EJ468_4yq}RM8X_jZD5=Xvw1(M!e=9JsJ2G&?v&At%*D={Z zIW}7CJ>JiV-AY@=DbKIJgGwi(R7F{`$jRFSNF0?@q|Q-JVuL#!Y^BcK8e$2mr;-L* zQ?IjCi`L^Ey^|n4Nkw)dNdv<(wGiHE{+T{WR}&dX`*eflvvSJ1wPdIWdPn1KyjOzaM~S1+#dhZnedVT zoxuS;7t&Cj^g}0&beoK1gNXSqjs7x??h^r zvvP8C^R%-H;<9+PEe(#cx4p6*#Ix-=vguOuYK^n4o${_%4DYqs+~W*W(X>k`SYQMs z3fB6FHj8#Rsse+)N;dTn1S?=f)fZIfSy4Cz&`|O0ElR1 zbMyWb9#RyEA-@xbWC!)M=UwFH*>C5;IkK&{fp&3uy_s+!d(^d(gtHm~@na5_bg#Ixz{(!?Ht26~(^#}0M`WxfJs zsc>jWINa2RRAq-9XF+v^cD#u9*wvY0Rx*$f8!0OmXplDtZ z9JyUadsx*@5N23Tv!2Nv9VrmhO8%ah9ece>@0WYL0by_jqunX7IVI3(sUm2p!U+H- zXs(qk2IE7}U1uuwmjHrG05VUYqByEhagK#&g+VVWPqY7hV+Uz&+#fJRtAiDFcRp<;c{y52w_ zMRR3BE~+@7(i?zQgVhYoM{Aa->IaJLmY9|Y5`Ui|S|g~LB8{Bx3f5WX0Q*W$sDLo~4o%6Df8zR1p!b^!Y?xW_oulkD zf7h>yD3m2siu@w$=}lh4w65D${_o32$P!UJCK{`A ziD7&v0fg)ctGO}0mZG+zKu)D!t)hxh8O>RtJBx<3I9&7_T~`F-M7ls#TMa_MP*)#i z8~eizM`JnWhjMW>FM$yr_{b1qWWypjOp#ss5X!#p))+(kTW2?ilraA zI;y~>qp}Sg-Pj#rjm>5wZ=;c^38Yfx%B*Sk5%vpqKqb*pL9#Nv+0fd`o?t`pB9^}fMm zOY3tQ;WKIlrqg4~32vDrdo|*Ci_SC302$UBDV*h?vqCYn0vq9?^4+1B;Q|1MC|3I@7W*hx z<{NfAC`9`yLBeHP1NBjVx&BbEi8H?atG5P?Sn}Kshy_Wp1#^#tm~Kgvh>~{lyDjKd^5I`ELh}xxI}(i)>lBx6Kq(x zZqU4L{`}(a0PxUnG~({soA2`8QFC0dEj&q8m~&?h^hJbk@30Zbz7Y24%f-)(r5Yod z`+Mel75a6kR%%;;)?4yJDA7Etn5Lk}E-Gmx50C(GfP1}3QU}(30t8v_bJK&a2LQJN z0355W;s5rymiK!ZByU!w7c{8XD#+d=hyZ**qL=U!DF6x{;Cta=r^BbHRpLK4duJgB zmu_2M_7A?&eA>WW-J)5&49>*)w|_K0eyTxDI7k>X4~U~#6&e85=TjL;Y@7GL2&jkJ z)H*Elz-?Cm?gIch?<#gP3fIzsYcoIv@aewrFvdF3K*2n;khoLMyf2M@P_sj+6;K<&lZ?JVjnyb+y_YB0(hlM`2N*) zN>12>p4ho(-t(;Lg>6CKb?6Tr<073wc%Bt{b@c=Qw8ma^GKmt+>w>5QzzbF`Nb~7d z3Ve%udOZ)&ExvT~Jbf5Q4_+pM(UK{(s<2U=Vfd#t+nJ5w0#L%vjCcV6Ps^&%w2x<7 zzxIh6czN4QFNHiWa|bWwmo7gvo|kG~Ar=4;$;VU47kI@NiH)eqc$W=k*YoeLXL7GA zk{2o#0N31^n0+AbqMU?FfES=d*rJ3i9&9^P+-(99m%(Af8NJ`lGD6%5E{eUW3`!-Qm|#>nVkeq6yv~Db5@>5(1;E}N~@^1d`BbEhS-V)M)$|tC}4Hg zmZ{W%r0S4q8#_jUGjvv7!c!0?shVNp&Nq(pcdn58UNUQia;fO01ilH(?|NRUT zrqqvX)3kWf&vi{wgjIY53dl%|>nWxb_BcVb15<9nksLF?o0)V|<+u@uk9P|fjaqU$ z(d*ZIomt+;HC0=|=|{sGVPy?aY_?S01xyl%RTu3D@oGC{K68F}qgq|Fhns9CefCSb zAd+yJ`Mk zr5}4?N{_)CIHkXM05j!CWC#-$9N7#b@$bO=+U^Fmck3exGYimI+O(>p5gEx+%<5P- z#EkFIb9ZsGRn-_jSzB#}x_Pf7xW$C`J&Y?zHdyO$xZ`vUf9oyFk`0lSB~%|?!zRr1 zxuwzK!|D)G*)SWP?phgFmf{iDnJx^(3c2Z__qQBQd$#fn_WcW-o?}|xbHNjO5qn+X z@GQRW-6-Pdx}%sgXBiv08=gbUkkMX@kFp57w^s5F(beZYXn6qw2wgJ<<@c}Bktpln zE1xEyXsx4_1)BePAWzhOaVdg@(O?(1)u}eSN-z$$6#HN+n3L7&t3Su7g9@wocB=7A zkSuy!1=Y!B?BR|}^SFIbbnBv~sq5sldtQrS$pHpa?WX|=?go;tk6+xmV)lUD*|AN7 zb=6EepEy9Ka(p5n)5DL^1GGT_v$~swZs>=eR&S@0a%#{BObrg&E&jkcs&Z}8Lp|)D z4Tcsz<_ZsDoEkqly<7S18#>Dp8k6AGO>f!#_d69v=v#D6t&ks4Mh+K0m~AYrekQq2 z76O0X;DxyGLxI{c(!9cBQsq0;Wzh6+VhmXf&DzBgQbkl8(j|;)q65^|zmWh885wkm zDFj*)Jqg;MNJBa-?FSp3q15FGkL^_ppmt6_eLX~$u-s~kdkcWGA`?OFJA^LF4kg6% z3cz%Y?PSkjM2GT)6V-pf=OG{ChVx_7`T}t6@5U*Fv`x!P)fIKDCTgC;VoXtNsVt3# z@XxK#naXWR+l$A!t$^4fiE+QK&Z$1H!vj|mN^ty$VKDu7;A|o|cjgvrq8zj&V6;YEv@xq^g82vzS=fkqSAz--ifYjzj$*%GsutVwTGwt=e*0akSs#;Fgwq?p4U?NX#sFWlPFjO3gb z8tKlP5%iPWiuQZ8Qmj1z`f2%vIQH8JDb|cMJBd}@_CJ}qj(jO=+{_AJt7Q|5U}eHR z*-9joE73MbC6Fv9QdZT4U`4AB&yk~VP@UVliP!YeL-0pOlsP+jfT6}y4wUo|AkCd1 zHXa~?h!%p5&OQgUP^LR2HUw8-rDRk7Jtt3;LF3*VDmfl2qi8=gpw0ZA956RR-U^Fu zuk}rX5y%mYS%Ij?OIYApMaIju2DvtfJo3C$Gg0HszH<^}0q2daC6aP$n6$axLF0>w z%g#oZGehI=#4z0wPW@UFk~)(!XEW!Xwq^+#FH=7Ns-AIVgUC@WWC#Ux3K@}-3H!hh z8Aep!JNZle(96URK$MfJAHA~_X*}fUw=JP=b39aOvUDp(=c1c`PLlr$$JNT3(>%?D ztn5Q!s`g$2!!4FiqsbaC-dNr6CD7pGXQ?CK^&oTa4bj0taHD6NjM<4apl3w4@htkY z*#+w+uK6B4=wHpQ)eFK;$$IM{dKd}0l1ah;jS{E*YY^u(SuA+3OpXpqooP=$$3)19 z!an$fdnczdKCuxEIde?Dsh7sn$xkczVDX!jVsZqzcAxz8G)p(SH7=Ljl76P9&EoTR zl;MFdRzd8T@cq%)h#LP@q@&6!nL})b{#sO_p-2dwSfta`XWBfhD2%@b8Dsmc)US>7 zQN9!x#Em%yG?~qHPyFa(O{y#Lpq_iQ_gXSh=OU#pRKR9OFJr-` z;?=&Be1d=DScMPh+RWtj7vlx$pEn<5>m63Ivu7FphP&I{I7^_LRuLQm&>wnGt^PCE zp5p!4qGIm+SZcB&I#{D3<>sdNW_SFsgURg_PAtB!Qo1!L(xYoWNAcc&t>G^(tyik6 zwczfSgu+kSNDYT~bW{h_8$ggqF#_@{zk7UN28r>x;cI~+0Ba%}K*)UOiTQg7ot1{Q z`Vz~TI=?T+^ziMZxTcr?qL{JZYvu`IP4$!@>Ql0h{IedfJ;SM9A3dpek5Jrt#;Wz7 zW54G_N0S~wodx2U9t@!+7Dh|S@1dIlIw@(BLDgz9xWTZ;NiB17i65h)Xu5N@q2 zg7KO!NVl6qPegJT$P*SOwZ#W4fFh-rIJ~{NTx|su9xKS@gvATwdS^zH`lMY^3+yl{ z9AqVJj^$Ek8Rg_<<5kDzRvG(um?Y;Ih0EJSgyh8ZW)?smIwuNvTgAh*0mMniRn}EB(64QhPQl~DWw-;)$A*ai~lH{IG!rlno5!Tk)OhT zdfZ@V{N|fNrYTf^Roc2#L3yvtv|fsxejI~u+?BW;5+9}?Tx%HAfsxaVRW67kIr%DM z%x7-GRi05pXY$k4M8OW55YEIFiTm+b2)4@WJz5qNEHFqR{t-xR zAE$^g69_MmH}8P(n7;)tF0;``0tQmG6JI$7ZwBapXn!3zIQ+r}$_Zq0U&6 ztD_V!SMJ0mJTue8HmVflEsz)~PfEnf22xHaYtMUN8Dz-)VytXmGg_ox{@=sLuQSzf z=&OP~l>|NJ-`3OWGl)v&#%xgU*FeCUN(BX=wWNSM(N|SfZMwCd8Mm}1qGGQoW~CJSNs<_F@T8>nIoKqh=oYs|LfK>m#nOWk-oupSzS0E^M#* zp2zWbWU|JHwKi<-Up#MzEBg$5?uMWS3Y{5xH#hY#JFPCd(m%HZs)~B7UcXZh&QwpM z)aYoRyO=>)fMd=I&?5gns(VtRa?_)_n+lx1t{j`>+F{SfSfC`=ENEvtkzddy zsywR~8fUD5KF((qYkn!`W|~?!9c#HYdsUHH^f^)Uo*Ly_X5*LFizn)fRHj-|;g$Jf zv`783QMH;>vFyd|?W)-I-I4JrX$Xret=m6~eGiL3+)9*=SBX&A9ZoJ<2PU#!6OaW% z`JsY6jsh}QD-hF0JJZ4of#D}Dp%*T(sh1NBOuBxn9wuNW`SFsqBjLP8-^Qs{dr_Cw zy1X#A{BcEM?sS^&#g*ExMm?aN5{~I0vC^Zi!lJQ6@2A5!5Qn?2&D^0w*D;#^I|t1R zh7WH2l8N~{G9C$+D572E&Zl49D8@psi&_7L>t;(V3z#npMzsjxE?xd% ztubQfPtuhs)D;YAl`JfJ&4WUlu=w?eRTiaw7X`tELM~T+UuCM6{OA@tOGR$j=cs6GY0vd<@SWkfaeWHWi@)c)X8fm z-?O!D(3EPSLBN^LTYbZ%yiNIV)u4gRw`X(CcGZ_9hVSPM!=4TD$;%T?rx|__p&_;c z%yq+YtC0QPMjmc!v39BQNtL2*TXXf=adt^*=~I~0+9$iDM-8JMeRC0w%_!lW z#4{tH;wJK0<1LL2s^&(Yid9C){^y%H)KDwUXM-sMcI=ULM3Sn}Lz_SC1(1}ld`w~`g2Eut>|^Qs$sxLu*OmZ~;p<~B{Z2Ay-(Oba&8FG=GZE$CAS>Ln)ORi65A{-GaSNa03H zNg=K_PVFunR;q|MtOxv3BXy&UYObyI8P6=Dx5tGKlfO`#YRfrZlfJ4xW0JPFeG_dg z)~S=5XAAwQCMT^a&ub%m%cUq%@uBZe8`G5&p6&6q`v5w}uCVh;ud(^5 z`RIELw?E6XIY-@X=5c8g2nrK?T3a09@-lDjLYcD?;G!ln5paAli`08BhzZI#8 zoAXsMPg5Fpm-2_$?56k)r=-z-f9!df+i?!Nb}4IBLb9y+wPBIj70Asw?Hg}(vQ(nx zY%S?dpRaR+bXUd+!br8S%Q38-)LE9+Ws=c3j907jcGlF_$#+%S@!GIw(76{)wXevz z+oJX7%MXmy;Un)=<4;~|&V0@#ny#s^20~hXgMskVWzzzF_@g>8?Odm#a9sUtsC4Bw z_z}^8(#*f>Zq$ysN_{}b)@r9n)8I8XN-Yr;E!$QY6IO|rq`c~vNo41Pl4&se)0K85 zUd_Q?XV~eD&UZI@LG`1`*5kqXXz1;JBYSq=E7NOjHfndFLFbc&tB>`aT^8;{rHVJS zn}@&%^xw^p9X`yz(q(uPzxv>8uI$fq)(MZcPkAlR*bUYGJ>r#L$r4(glE+Y1zJ9#^ zdL7gW_~jPaILgg_XF21Mv;S2t;w$n%y5IZGMPKz71+6YxOK1YXAQ9j&r!Yn;Y}`20 z*$&g-Ihy`92i$+X7%f}gSgkyIwj{I^TA)wPw)IWIiL%biN`1n6=3ZjYi|m)zcH%vK z)qQ-Ym-%b&yOn!Ai-Pko#St4rr?9m8V#%lUmn z`uoyg*(8G#oqOI-#@!p5A(PH z%y=c)giREo_A*2eAZv$^Kko-sHpelcN^q;-iQv5-tM*b>ex>Io8`_k28|xcwq&*BlZFGm~ zp-X*}qy3+Oe#C9OrGbV7SsT`2XC@!o`RUP!>>A|xAXJ{uJbO+mal*s<`hKgug=!?9 zZ%aJu<6jf_ z{lazJ7sC+JoqvCyO&$WYJiWs{D4Foo{rN)f#R8i_>v#blXA#_isgZ=GTxAAtz{RPlT`ST~v5s?91Y zwNsZ-(RJ!@1RN=7FXSk9_X?F1hua7;6&|&bO)G^=2bp+Zyu_me*WB0G)hD-?$Kg8tCT-Es%Oh|C5vP~(m z(x@|Gw6chB98WPC#2f|t5(?e)Qjr6+vl6*&%UQ#IlEd2inI$K&Wuwf|enHVP@73+E zicoi2;qye+X-tZ|KOvjuX5h+>3c`6=wlREMX(Iqwi9P0&n32${#v_6yjkJOhk6@xI zzYv|XI=FFC0l)g+Hfv4k)s}W$r8CJFXS$NwtN3>-kDN+BUgjUJ7t>lgm$<2yTr6CSPjG5E( zdFjDb*s-xj8pS4^#LhOwi30WeQN~CcGU;%`Z%$k%<=z@$00DHZf!=y175>plnt8T1 zGth!a5J|1WD?=9FJ{kgR7zwVKIt+>j%<| z*!zU~f)DTHe0|K9eGxR-t_XL9Tr;eO+221;eaZNL;Tmlffp3ki_}{7XhJ%dU$;?dKi%{QT6TSBhgz0Fpk^G5#_(m&&|BlzcVVbP z*BzUe(>5l>UL0%qoA?5pZpZ2f&?R$9P!I3IShrwI z@NMi$`L+6XD`!T*Lk0!P=158jnSfpwdQ#7r2tjY1q|M#Jl~a<+|ANn01WNK*_;aVZ zUDGp6%1v*Sy9KnbE|FXpI#`^7HL4ok=_v$vO!Q!tDJp6CSAxpSemLt>B+zg48THnr zFNY=!c^UNgbK$5%hmq)G!$5qmFtWrNxdhM(P#3id)gXt!Qv{I@SvuofbwJ~p%RqMo z9Rem(qXevu(3txV74=xrn6`#6G)k!4C#*mM4}w|ubNjEqywegq*8K4Iq3X1h5f)CF z`5x2UQSOLhh+AF{`{$l5sM2`e#oi}>|F69m)p2SKM|r{L2dKoaQUd>8B5X)1Du})r z9pf*5HN*X0fB6RgL5rS1*x6)b^LuUuND z#i9>D^A~YgNMFK{}%2;tYY&i%Ts{ar`wIJxo0;(M8fouW@Gn^LL)e! zYw?qWXuyXbt}r=C6O2q!>?(~0INhvC9d&zNDXeYJxh zBPMg6$Qu#vA;G|{#2*75p}*7)xPOcG18I5QW51psT`(9HOdg`W<~p@h3`3>9IKc~h z4S!DewMM%}5Vz|nnmS-_|pks{eb*yCJ{`8LIFRJ)&SmYWL4{U{PgejjP=^&FyNXeHqx-zi`W!8l=+yYLN6!|EobJ zx(lIK=Q@>L0cO2v`F*$h$9PhE*UJ4_Je2zFU_Sb5uY@{kv~fpa5j#sUnnGpIZ=IBs z04o`l?G+R^jv7?Gt3uhRbm=4sRTUE*a$Cwm2|20(Q{t??@i=Mp*#H&)y8+U@Bu05FM?fx z2Uo1`rWXgmnQf+Lbra^Je=xuaY9_}-|M`xyC3|5y7HlRibUBC?f080Iiz7H3ZBK)M zRkZppO^1Hdmg0d+u_-=2{C$il`C|Gh&*;=rbac+PF-oxB9GmY$7nd5P|Dk)=b(6H8 z{Hn#b&bH?p!_Vb=9<)OrSVJyRyG@bF_w@BC}eXMpwM z>~=)Y&r5&t8lR6rn%@qFhnnc)#Dm_k!!7a#uY*C-T29Nq3NGY5gsy}=EK6677NfiV zjdalKEf&3B4E}vaJMZx<_3CvmQzA{w=iKv_D`aB7r46#g<18R@r}wRfLfxhiTi8 zpNn$KISWzrICvyDghnt00G19>XbnAfZ*j;teO1E>B8?u0Ft4ic=V_<&hr}bRwBG;yoLbS@W4u4LLEUEn{j}j~%`-==%s@`)7m|5tnOG`HIa`nWyePRR zY;Nalcy6P-Fi*%CY#%*KwFy#h`m-6%(g-MkxWDnA#D*TXtoGsZ{MyKszN2LEmrbM% zLV{G6YJ5R5&j5FxiD2WzNZA1Q%$Bm}SUlNOA|3WeDC~4;UM9~_RvI9slPvWT^kA|q z4V8KG??iqFm&Q?%K&JG^)CuaTOprJLmh_);?c(F94Bngu>JWliJN>p^>uG67Q(RZp zC~kBNU*UBYTo{16eyTQcD%Yr`c2G`mda4P{c-OM{2UNj~TY*Jkr_V2|!}|hfo@qvmuuGAk**D^IFBo?18{|9#Kgli z8??h|vd<9zwbbB~x9d_1Z9EOjW49;bv-hlJg_E+8F3FNtCmLLg?W@}<$Qx{`>ma*VQMt(tWW(&8PAMK8fgwK?toA+=p0d4V z1ie?RexFwrM#vt7Mi?am3g)~B?vxFYu9kVI3XQIcNso%kW(#|%$5wm}Tu35clck9r z#;{7&$ia#EJ1#Gu4tA_`$t86|0QIm|0*%*Q?UQ6;ky9z8AbW$P&yh*s{ioKq)1gEZ-(v|8H@z4>&3gbYf;OeiQrhlBZ^JzFF!8?ELY?&W{c9A}A6DFRMy zZynPWFY_qTD!Xe^P&ocuxqKvd(lgE?*aDW}AuwWBay+LuamEzr&na89ND}d&>|;UD z$j^G9D%vp@?R2tCCwZZS5Y^fm9odSV($^9)m7$u|l^62CSCtl#E`^L@4V<;6k*oAD#(k{h z!ma13w@>Ojk5V81(r++7a?FK$;R0P!7)Igl(ZSlqQMB&f7#;!kan=tATw9274=7%1 z>2QBULz`UD8gk|y?yR3=bnQ#7=g$JtCL&%81sI7k-Kt=3>iBFkrMPU@KiskwW|Iu} z_KLXOiffRdTxN9h{$6_Tsqlvk2hpf&1k@y}RV= ztH8?pP>gRy3unAvZ*IqFBAakC0hn81xUX+@#MCeKlrF2k`ZhNmqQL*WUI)WgppWp^ z-nc88sazg)(fQ0seB+a(OT1UtKC0U!qIdE0G;wvb}~{E9Z1Iaywilr&d0*f zhg59_C^e&xdc+CT(!7B0nKGDs?y_+w5T4mgUI$|%Rcs>pj9T!w(uG#DAt*CQj0Uvt zN#uNFfO}Ktws2>~EpM)eyrr^J#a)adWFwTlxU2lxtTSRj4e}}_*lPV%R;wXfvTt3pvxPq>bVIL;&V>3vOzdm?k`OgKOXb zmcq*3@t4!L`_|MA z0QilCiHpJGn<>2jpy?I6#}&sLZw|J4Cev2>1aAgibT+Lynniis*dYwDTUtxVy7Ee; zgj%ghVw=_6L@bW1nTD*M27Lb3z#doP68_obI|Y|uoPdvm^PK4zSj-kzxQbm=s||jX zDe~EU-B-|@+eb(g*(Np$7GfhZhieFbY?E*hl=%3f7Wgi@=p)uOZn}iKtZw{X~g#Z!k2xC3a)^AR~V2zj}4tdM=5OEwRH^gTTx?feP4SOLU`zq@-U!Qm zy3hgnT~edrC#4*vgAFE^mE>M7O*(3H?w*)W4HGo}I{Ef@_e0*sk34c1`o_;j@S&`9ZpG%uW&gdz%JCEYM+LF2 zRqzSbWZI?7dl780PX2fPc$Z7?_hojUA@a>(_Fo_lK|ig-I@RMk;i%))O(5GdR(zj&cCi ze5Y?4fgc+@Kn>4-_ABXEd~8cJl8P>$rhuSb9Bg#Z|9hEy4-e%3N3i@~8_1^}PK>HH&%#@ z@89;-DoQLlV~NN_#Jc%Ejgu3>5M|`|vLo-oKTjz#PoT+f{I2%;1(i||Qu1G~F(2(= zd8o1;2k9F=afD7y_CJ`ayNsGGf*dccMHVTR^Ml$aIEX}G^ZAlQ`dfijR+FB8|0yJf z@R8h*69ypZzS0ESeLF*bGb@z17^*H7Z(O`Ip$}T0HvFWdDe)%$gP2j4zDIaYMGOTz ztwKR*=;*&sfl}h+43Xb4G3a2M)(!{o3++mpfPH<|BHK?iXf`o9f3jpCPbF4R{Py*1 zQ#@X*j^e}yl`e3kWJfF%Vg@3J#F9fxqYSFbn$UJJ{ZpdkWgntPWlVFqW$SFz$VQn8 zB~*bYyqf4{mQ9I^&4~*vj4_X+*0Dd&kFVHdjdyZ(fTR)JwvQJPGhW)@nZVPcv=_(E z2|h?c#Nk?Ugwx|?=86&~MN+L*N`_V}vFNmRdmGxBjzGI`=lI&8YOG}F%RBEzVlSLG zhmr4CV_G+yzch4@Tpn41!FOe8O1B*K*`cM)Risn#y#?wcwehv3=CyYh?aTkFQG!ep z{aLge9z4-Jb8Yl1FvsC4w4KO|YIgvBLM`5&1p;WAfv+w_WfRDQhlB z&92#BTGv>)Xf#o96Gqzd8&q%FDzR{yQ{T7;F?W5+?z4iOFbstfFO$Xk|9 z;aokbI$JBPX~^S+w7vtmLrpb=Nmi@u!IRwy$mi+6tPBCXprRslyLabvbp!9TdSoLr zaeY@ch~8?geI#f`kUh9AVHpq7zdhaFpm#DU4##Ws`2v%wI!Er}z{FwvG~Yf-!Kx`q3%$ z?5Yd|%CxCJ2-vcL@lNfsB-*hGJl@L*ke9P?n`Z=*G9;X+JRjOxoF>XS#pENOO>rHo z#H6mBV!%9#lbSQe61ZZJKZ~FN>v#XyE)J3RVkAuogQD+*VJOm%;MmK6_+t?m-I;c3 zi9@QfYt1;uj-Sj4{mZn`zGGC%v*76&cN;(<*{ySD+zNd2Sjk~5O5Lawu13-N2T{r6 z?F<|*dk#IUbGbj1AYgT|reA9YAR_j�iI1;KKK!YhO00U&ctSci(31fjKl{QW-O{ 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 qHgz5eTian?mUXA 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

    XLh**BKN`960_;o^s@T=}eIKdLR|kz5{I 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≪Z79giNot#7;b3NJoAzI&w!o#nfvRrZ5%OHBernZ) zD*KUY$*pSrp=zY^>Ofd3rrPSJ((13?>fDKHf^eg$_MfkMYO_+Ru)->_&MH-++{!I# zK5lFHd4y~-LH!Bgf>hw-MWE+FUZ)zLx#Au|*kKc_E6M!YjHK-@QuU z=M|Z|!mH<{>%NMsZ|WPzyyoj2kO3K#fPHE#w`xXN zWFL{u1;B;gxXFb;?#Ju}EN)21gcu>@4JXjihs%bn$PQcVnXE>lEWg?Z%aW)N!Yo~o z#mt6mTG(vK_9V{fY`pR;f($LtZpp{~tb-M;Z`>@>Qb`S9EDo4}3Ct&v5@}UvWVqGE zMwEpeCPbZ#?NH>bm088A{aMrcER~FH)0(Z=)=AuQNz%6Mb-XRyt}V{dZOhti;Noq| z$}QX;?zZeL*}8<-@-5-ct>J0}9&9ZRT<+zT*?cYrRM{ElzW*0-I7-VBnVj|7r$y&b z$e*(7_XbV31xKGfT=}kBzoqX3vaf^8+4kN9Ltu(_`~e_b3Z^74U^MUZ zx`g!J1@&6*Y9Mf900JN=3f62v9+ZI}^ucprZ1Xzr%Jl&mTxQ7AOV|-%nWo7DX#d%PNzS=6j-N1@ov=n20CBhE z@DBHI{7!KYr_2x|h!Ps8K_Iabj|mgMi;UIq7Tj>8d@vyVfkT|Z87S}{Z~>xE2fKmnmRhvKZVZi$Gw;IhpG z78C@BDj!xWJHaa_nex>yHP!L}w#;9dk}kVXrs%*T!*M5Xuo?V;AK*bY|A97_!6Z9x zC66*7Xfh`gG9qI#AcXQIpR+l)aUNK5HUk3n;{O3XN4T=d&K{ zb3YgKAP6);E43)^^EwxG9vF2t zA2Ju5zzIwSr{MsCcB3gq=79he9T=8LGfM=FQSRUrU9k;VSdRmR#rE{cJHZuJ5?7tv zwmgoYHuAP_(@YNpcL#k?asM_CAh*Z88BE+j2xl`0S2lX1w>F=)QK$A+KQ(KIc0OaW zPDeI9`!rDF!E0-EXK(duk2ZkI@O}&UA>%0iVo(}{gBJ*dBgYYO5QS&=Og;gIqY~c12dj{GAM`Y~rZ>tN ics-Byes{HJ1N46b_*5UVYs;`?;|F&c;5W(z1OPkVjTR07 literal 0 HcmV?d00001 From 46e2e676c6ccd95c2e4f0d298745ce61c0a187ed Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Mon, 26 May 2025 11:59:14 -0500 Subject: [PATCH 150/187] Make setobjextxy work with npc followers during ON_WARP map script (#6913) --- include/follower_npc.h | 3 ++- src/follower_npc.c | 20 ++++++++++++++++---- src/overworld.c | 2 +- src/scrcmd.c | 4 ++++ 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/follower_npc.h b/include/follower_npc.h index 90941e56cf..52355a78b7 100644 --- a/include/follower_npc.h +++ b/include/follower_npc.h @@ -44,7 +44,8 @@ enum FollowerNPCSpriteTypes enum FollowerNPCDoorStairsStates { FNPC_DOOR_NONE, - FNPC_DOOR_NEEDS_TO_EXIT + FNPC_DOOR_NEEDS_TO_EXIT, + FNPC_DOOR_NO_POS_SET }; enum FollowerNPCWarpEndStates diff --git a/src/follower_npc.c b/src/follower_npc.c index 3d24cb3942..47a2a94372 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -1022,6 +1022,10 @@ void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive) else if (ArePlayerFieldControlsLocked() && !ignoreScriptActive) return; + // Restore post warp behavior after setobjectxy. + if (GetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR) == FNPC_DOOR_NO_POS_SET) + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + // Follower changes to normal sprite after getting off surf blob. if (GetFollowerNPCData(FNPC_DATA_CURRENT_SPRITE) == FOLLOWER_NPC_SPRITE_INDEX_SURF && !CheckFollowerNPCFlag(PLAYER_AVATAR_FLAG_SURFING) && follower->fieldEffectSpriteId == 0) { @@ -1250,7 +1254,6 @@ void FollowerNPC_WarpSetEnd(void) { struct ObjectEvent *player; struct ObjectEvent *follower; - u32 toY; if (!PlayerHasFollowerNPC()) return; @@ -1258,11 +1261,20 @@ void FollowerNPC_WarpSetEnd(void) player = &gObjectEvents[gPlayerAvatar.objectEventId]; follower = &gObjectEvents[GetFollowerNPCObjectId()]; - SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); PlayerLogCoordinates(player); - toY = GetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR) == FNPC_DOOR_NEEDS_TO_EXIT ? (player->currentCoords.y - 1) : player->currentCoords.y; - MoveObjectEventToMapCoords(follower, player->currentCoords.x, toY); + // Skip setting position if setobjectxy was used during ON_WARP_INTO_MAP_TABLE. + if (GetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR) == FNPC_DOOR_NO_POS_SET) + { + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_NONE); + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); + } + else + { + u32 toY = GetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR) == FNPC_DOOR_NEEDS_TO_EXIT ? (player->currentCoords.y - 1) : player->currentCoords.y; + MoveObjectEventToMapCoords(follower, player->currentCoords.x, toY); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); + } if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) SetFollowerNPCSprite(FOLLOWER_NPC_SPRITE_INDEX_NORMAL); diff --git a/src/overworld.c b/src/overworld.c index 6ffe73c6ed..65890a94fe 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -2432,9 +2432,9 @@ static void InitObjectEventsLocal(void) SetPlayerAvatarTransitionFlags(player->transitionFlags); ResetInitialPlayerAvatarState(); TrySpawnObjectEvents(0, 0); + FollowerNPC_HandleSprite(); UpdateFollowingPokemon(); TryRunOnWarpIntoMapScript(); - FollowerNPC_HandleSprite(); } static void InitObjectEventsReturnToField(void) diff --git a/src/scrcmd.c b/src/scrcmd.c index c571885946..b1fa37fe49 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1421,6 +1421,10 @@ bool8 ScrCmd_setobjectxy(struct ScriptContext *ctx) Script_RequestEffects(SCREFF_V1 | SCREFF_HARDWARE); + // Don't do follower NPC post-warp position set after setobjectxy. + if (localId == OBJ_EVENT_ID_NPC_FOLLOWER) + SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NO_POS_SET); + TryMoveObjectEventToMapCoords(localId, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, x, y); return FALSE; } From 84118dec978881c9e686099243dd6658a343a157 Mon Sep 17 00:00:00 2001 From: ghoulslash <41651341+ghoulslash@users.noreply.github.com> Date: Mon, 26 May 2025 13:45:51 -0400 Subject: [PATCH 151/187] Fix heal bell test, add sparkly swirl test (#6262) Co-authored-by: ghoulslash Co-authored-by: Alex <93446519+AlexOn1ine@users.noreply.github.com> --- test/battle/move_effect/heal_bell.c | 32 +++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 7730879d45..6a8e5d5ed4 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -3,7 +3,35 @@ ASSUMPTIONS { - ASSUME(GetMoveEffect(MOVE_HEAL_BELL) == EFFECT_HEAL_BELL); + ASSUME(gMovesInfo[MOVE_HEAL_BELL].effect == EFFECT_HEAL_BELL); + ASSUME(gMovesInfo[MOVE_AROMATHERAPY].effect == EFFECT_HEAL_BELL); + ASSUME(MoveHasAdditionalEffect(MOVE_SPARKLY_SWIRL, MOVE_EFFECT_AROMATHERAPY)); +} + +DOUBLE_BATTLE_TEST("Sparkly Swirl cures the entire party") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + PLAYER(SPECIES_WOBBUFFET) { Status1(STATUS1_POISON); } + OPPONENT(SPECIES_WYNAUT); + OPPONENT(SPECIES_WYNAUT); + } WHEN { + TURN { MOVE(playerLeft, MOVE_SPARKLY_SWIRL, target: opponentLeft); } + TURN { SWITCH(playerLeft, 2); SWITCH(playerRight, 3); } + } SCENE { + int i; + + ANIMATION(ANIM_TYPE_MOVE, MOVE_SPARKLY_SWIRL, playerLeft); + STATUS_ICON(playerLeft, none: TRUE); + STATUS_ICON(playerRight, none: TRUE); + NOT MESSAGE("Wobbuffet was hurt by its poisoning!"); + for (i = 0; i < PARTY_SIZE; i++) + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_STATUS), STATUS1_NONE); + } } DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user from primary status effects") @@ -52,7 +80,7 @@ DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user fr case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; } for (j = 0; j < PARTY_SIZE; j++) - EXPECT_EQ(GetMonData(&gPlayerParty[0], MON_DATA_STATUS), STATUS1_NONE); + EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_STATUS), STATUS1_NONE); } } From 983f8e34a1db1dca31438b987529995e374eb2d1 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 26 May 2025 23:15:16 +0200 Subject: [PATCH 152/187] Fixes repeated learning of level up moves (#6981) --- include/battle.h | 3 ++- src/battle_script_commands.c | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/include/battle.h b/include/battle.h index 6de73a95f3..6b9609758b 100644 --- a/include/battle.h +++ b/include/battle.h @@ -385,7 +385,8 @@ struct BattleCallbacksStack struct StatsArray { u16 stats[NUM_STATS]; - u16 level; + u16 level:15; + u16 learnMultipleMoves:1; }; struct BattleResources diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f419d298cb..ec9dd03601 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -5155,6 +5155,7 @@ static void Cmd_getexp(void) gBattleResources->beforeLvlUp->stats[STAT_SPATK] = GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPATK); gBattleResources->beforeLvlUp->stats[STAT_SPDEF] = GetMonData(&gPlayerParty[*expMonId], MON_DATA_SPDEF); gBattleResources->beforeLvlUp->level = currLvl; + gBattleResources->beforeLvlUp->learnMultipleMoves = FALSE; BtlController_EmitExpUpdate(gBattleStruct->expGetterBattlerId, B_COMM_TO_CONTROLLER, *expMonId, gBattleStruct->battlerExpReward); MarkBattlerForControllerExec(gBattleStruct->expGetterBattlerId); @@ -8501,11 +8502,13 @@ static void Cmd_handlelearnnewmove(void) u16 learnMove = MOVE_NONE; u32 monId = gBattleStruct->expGetterMonId; + u32 currLvl = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); - if (B_LEVEL_UP_NOTIFICATION >= GEN_9) - { - u32 currLvl = GetMonData(&gPlayerParty[monId], MON_DATA_LEVEL); + if (!gBattleResources->beforeLvlUp->learnMultipleMoves && gBattleResources->beforeLvlUp->level != (currLvl - 1)) + gBattleResources->beforeLvlUp->learnMultipleMoves = TRUE; + if (B_LEVEL_UP_NOTIFICATION >= GEN_9 && gBattleResources->beforeLvlUp->learnMultipleMoves) + { while (gBattleResources->beforeLvlUp->level <= currLvl) { learnMove = MonTryLearningNewMoveAtLevel(&gPlayerParty[monId], cmd->isFirstMove, gBattleResources->beforeLvlUp->level); From a967f360919064945079f447d4bfe346efe7b263 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Mon, 26 May 2025 16:40:00 -0500 Subject: [PATCH 153/187] `removeobject` and `removeobjectat` macros work properly with npc followers (#6889) --- src/follower_npc.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/follower_npc.c b/src/follower_npc.c index 47a2a94372..870668a9d5 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -1022,6 +1022,13 @@ void NPCFollow(struct ObjectEvent *npc, u32 state, bool32 ignoreScriptActive) else if (ArePlayerFieldControlsLocked() && !ignoreScriptActive) return; + // If the follower's object has been removed, create a new one and set it to reappear. + if (!follower->active) + { + CreateFollowerNPCAvatar(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); + } + // Restore post warp behavior after setobjectxy. if (GetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR) == FNPC_DOOR_NO_POS_SET) SetFollowerNPCData(FNPC_DATA_COME_OUT_DOOR, FNPC_DOOR_NONE); From b49a3bbde5864545141e9882a541f48cd432b946 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 27 May 2025 10:09:12 +0200 Subject: [PATCH 154/187] Missed ItemId_GetDescription change (#6992) --- src/overworld.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/overworld.c b/src/overworld.c index 7f38405bac..a72a9d6295 100644 --- a/src/overworld.c +++ b/src/overworld.c @@ -3348,7 +3348,7 @@ static u8 ReformatItemDescription(u16 item, u8 *dest) u8 count = 0; u8 numLines = 1; u8 maxChars = 32; - u8 *desc = (u8 *)ItemId_GetDescription(item); + u8 *desc = (u8 *)GetItemDescription(item); while (*desc != EOS) { From d27a3575f229002cf97bea5ea981411cbd4df4b3 Mon Sep 17 00:00:00 2001 From: malad1211 <43647853+malad1211@users.noreply.github.com> Date: Tue, 27 May 2025 15:12:12 +0700 Subject: [PATCH 155/187] Cleanup identical if blocks (#6988) --- src/battle_script_commands.c | 6 +----- src/ereader_helpers.c | 12 ++---------- src/pokedex_plus_hgss.c | 32 +++++++------------------------- src/scrcmd.c | 5 +---- 4 files changed, 11 insertions(+), 44 deletions(-) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index 5cef6550de..f69ef38ad4 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -11228,11 +11228,7 @@ static void Cmd_various(void) else gSideTimers[GetBattlerSide(battler)].auroraVeilTimer = gBattleTurnCounter + 5; gSideTimers[GetBattlerSide(battler)].auroraVeilBattlerId = battler; - - if (IsDoubleBattle() && CountAliveMonsInBattle(BATTLE_ALIVE_SIDE, gBattlerAttacker) == 2) - gBattleCommunication[MULTISTRING_CHOOSER] = 5; - else - gBattleCommunication[MULTISTRING_CHOOSER] = 5; + gBattleCommunication[MULTISTRING_CHOOSER] = 5; } break; } diff --git a/src/ereader_helpers.c b/src/ereader_helpers.c index 139e861a34..b476c01caa 100755 --- a/src/ereader_helpers.c +++ b/src/ereader_helpers.c @@ -665,16 +665,8 @@ int EReaderHandleTransfer(u8 mode, size_t size, const void *data, void *recvBuff if (sSendRecvMgr.xferState != EREADER_XFER_CHK) { - if (sSendRecvMgr.isParent && sCounter1 > 2) - { - EnableSio(); - sSendRecvMgr.xferState = EREADER_XFER_CHK; - } - else - { - EnableSio(); - sSendRecvMgr.xferState = EREADER_XFER_CHK; - } + EnableSio(); + sSendRecvMgr.xferState = EREADER_XFER_CHK; } } break; diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 844aec9587..9039a774ee 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -4678,45 +4678,27 @@ static void LoadTilesetTilemapHGSS(u8 page) switch (page) { case INFO_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenInfo_Tilemap, 0, 0); break; case STATS_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_1_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenStats_Tilemap, 0, 0); break; case EVO_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); - CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); + CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenEvolution_Tilemap_PE, 0, 0); break; case FORMS_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_2_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenForms_Tilemap, 0, 0); break; case CRY_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenCry_Tilemap, 0, 0); break; case SIZE_SCREEN: - if (!HGSS_DECAPPED) - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); - else - DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); + DecompressAndLoadBgGfxUsingHeap(3, sPokedexPlusHGSS_Menu_3_Gfx, 0x2000, 0, 0); CopyToBgTilemapBuffer(3, sPokedexPlusHGSS_ScreenSize_Tilemap, 0, 0); break; } diff --git a/src/scrcmd.c b/src/scrcmd.c index 4f047b24ea..4e9be4e576 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -2541,10 +2541,7 @@ bool8 ScrCmd_setberrytree(struct ScriptContext *ctx) Script_RequestEffects(SCREFF_V1 | SCREFF_SAVE); - if (berry == 0) - PlantBerryTree(treeId, berry, growthStage, FALSE); - else - PlantBerryTree(treeId, berry, growthStage, FALSE); + PlantBerryTree(treeId, berry, growthStage, FALSE); return FALSE; } From 7d1833f277107291a166df139a56cb851e0f6edd Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 27 May 2025 20:33:27 +0200 Subject: [PATCH 156/187] 1.11.3 release --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 3 +- README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.11.x/1.11.3.md | 133 ++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 docs/changelogs/1.11.x/1.11.3.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 9d39f5e10a..93079a6439 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.2 (Latest release) + - 1.11.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.2 - 1.11.1 - 1.11.0 - 1.10.3 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 7de92c1960..5525931aaf 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.2 (Latest release) + - 1.11.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.2 - 1.11.1 - 1.11.0 - 1.10.3 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index b0c89c5d24..8adf1a6882 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.2 (Latest release) + - 1.11.3 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.2 - 1.11.1 - 1.11.0 - 1.10.3 diff --git a/README.md b/README.md index 05fde926b1..8737b96e44 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.11.2 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.11.3 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index f8dcba34db..1a551b955e 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -17,6 +17,7 @@ - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Changelog](./CHANGELOG.md) - [1.11.x]() + - [Version 1.11.3](changelogs/1.11.x/1.11.3.md) - [Version 1.11.2](changelogs/1.11.x/1.11.2.md) - [Version 1.11.1](changelogs/1.11.x/1.11.1.md) - [Version 1.11.0](changelogs/1.11.x/1.11.0.md) diff --git a/docs/changelogs/1.11.x/1.11.3.md b/docs/changelogs/1.11.x/1.11.3.md new file mode 100644 index 0000000000..41956a4b10 --- /dev/null +++ b/docs/changelogs/1.11.x/1.11.3.md @@ -0,0 +1,133 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.11.3 +`. +``` + + +## 🧬 General 🧬 +### Changed +* Remove old slide workaround by @hedara90 in [#6754](https://github.com/rh-hideout/pokeemerald-expansion/pull/6754) +* Changed github CI to use arm-none-eabi-gcc by @hedara90 in [#6829](https://github.com/rh-hideout/pokeemerald-expansion/pull/6829) +* Add move description data for Z-Moves and Max/G-Max moves by @kittenchilly in [#6852](https://github.com/rh-hideout/pokeemerald-expansion/pull/6852) +* Add CREDITS.md & FEATURES.md, rewrite README.md & INSTALL.md by @pkmnsnfrn in [#6700](https://github.com/rh-hideout/pokeemerald-expansion/pull/6700) +* Fixed URL for contributors badge on README.md by @pkmnsnfrn in [#6897](https://github.com/rh-hideout/pokeemerald-expansion/pull/6897) +* Fix typo in the readme by @Bassoonian in [#6908](https://github.com/rh-hideout/pokeemerald-expansion/pull/6908) +* Cleanup identical if blocks by @malad1211 in [#6988](https://github.com/rh-hideout/pokeemerald-expansion/pull/6988) + +### Fixed +* Add AUTO_GEN_TARGETS for .party files and map_groups_count, but on master by @hedara90 and @mrgriffin in [#6824](https://github.com/rh-hideout/pokeemerald-expansion/pull/6824) +* Make make clean work again by @hedara90 in [#6848](https://github.com/rh-hideout/pokeemerald-expansion/pull/6848) +* Fix trainers.party parser failing on apostrophes by @jfb1337 in [#6938](https://github.com/rh-hideout/pokeemerald-expansion/pull/6938) +* Explicit -std=gnu17 in CPPFLAGS to mirror CFLAGS by @mrgriffin in [#6839](https://github.com/rh-hideout/pokeemerald-expansion/pull/6839) +* Missed ItemId_GetDescription change by @AlexOn1ine in [#6992](https://github.com/rh-hideout/pokeemerald-expansion/pull/6992) + +## πŸ‰ PokΓ©mon πŸ‰ +### Changed +* New Lurantis animation by @Cafeei in [#6725](https://github.com/rh-hideout/pokeemerald-expansion/pull/6725) +* Added Egg Moves for Basculin White Striped by @PCG06 in [#6769](https://github.com/rh-hideout/pokeemerald-expansion/pull/6769) + - Added Egg Moves for Basculin White Striped. +* PokeCommunity sprites batch (April 2025) by @kittenchilly in [#6840](https://github.com/rh-hideout/pokeemerald-expansion/pull/6840) +* Improve a few Gen 9 Pokemon sprites by @kittenchilly in [#6885](https://github.com/rh-hideout/pokeemerald-expansion/pull/6885) + +### Fixed +* Fix rerolls overwriting Fixed Personality by @i0brendan0 in [#6774](https://github.com/rh-hideout/pokeemerald-expansion/pull/6774) + +## βš”οΈ Battle General βš”οΈ +### Changed +* Remove redundant script declaration in `battle_scripts.h` by @Bassoonian and @i0brendan0 in [#6837](https://github.com/rh-hideout/pokeemerald-expansion/pull/6837) +* BattleScript_BerryStatRaiseRet Ripen checks berry and cleanup by @ghoulslash in [#6835](https://github.com/rh-hideout/pokeemerald-expansion/pull/6835) + +### Fixed +* Bugfixes batch by @AlexOn1ine in [#6750](https://github.com/rh-hideout/pokeemerald-expansion/pull/6750) +* Fix Life Orb inflicting self damage when using status moves (#6767) by @spindrift64 in [#6773](https://github.com/rh-hideout/pokeemerald-expansion/pull/6773) +* Fixes Stomping Tantrum not boosting damage when missed due to Accuracy by @AlexOn1ine in [#6762](https://github.com/rh-hideout/pokeemerald-expansion/pull/6762) +* Fixes Symbiosis not triggering when a weakness berry was consumed by @AlexOn1ine in [#6782](https://github.com/rh-hideout/pokeemerald-expansion/pull/6782) +* Fix gems activating for moves that don't deal type damage by @spindrift64 in [#6789](https://github.com/rh-hideout/pokeemerald-expansion/pull/6789) (reverted in #6806) +* Fix Iron Ball type effectiveness check by @spindrift64 in [#6794](https://github.com/rh-hideout/pokeemerald-expansion/pull/6794) +* Toxic Spikes print whether the target is poisoned or badly poisoned by @spindrift64 in [#6814](https://github.com/rh-hideout/pokeemerald-expansion/pull/6814) +* Fixes Berserk Gene infinite loop by @AlexOn1ine in [#6813](https://github.com/rh-hideout/pokeemerald-expansion/pull/6813) +* Fixes restoretarget on empty stack when using G-Max Gravitas by @PhallenTree in [#6827](https://github.com/rh-hideout/pokeemerald-expansion/pull/6827) +* Fixed double battles send out breaking by @cawtds in [#6822](https://github.com/rh-hideout/pokeemerald-expansion/pull/6822) +* Fix potential bug in BattleScript_FriskActivates by @AlexOn1ine in [#6850](https://github.com/rh-hideout/pokeemerald-expansion/pull/6850) +* Reverts wrongly done gem fix and renames struggle effect by @AlexOn1ine in [#6806](https://github.com/rh-hideout/pokeemerald-expansion/pull/6806) +* add fail ptr arg to JumpIfMoveFailed, fix tryworryseed by @ghoulslash in [#6925](https://github.com/rh-hideout/pokeemerald-expansion/pull/6925) +* Fixes Life Orb damage still happening after attacker was unable to at… by @AlexOn1ine in [#6940](https://github.com/rh-hideout/pokeemerald-expansion/pull/6940) +* Fixes Dazzling abilities activating on all multi hit move hits by @AlexOn1ine in [#6943](https://github.com/rh-hideout/pokeemerald-expansion/pull/6943) +* Fixes ate type being ignored after checking summary screen by @AlexOn1ine in [#6888](https://github.com/rh-hideout/pokeemerald-expansion/pull/6888) +* Fixes Unnerve activation not limited to 1 per switch-in by @AlexOn1ine in [#6960](https://github.com/rh-hideout/pokeemerald-expansion/pull/6960) +* Fixes checking wrong move's Dynamic Move Type in Summary Screen by @PhallenTree in [#6975](https://github.com/rh-hideout/pokeemerald-expansion/pull/6975) +* Fix Wish healing even if the target is Heal Blocked by @DarkVexon in [#6979](https://github.com/rh-hideout/pokeemerald-expansion/pull/6979) + - Fixed Heal Block not applying to Wish moves that had already been used +* Prankster block check was missng the IsStatusMove check by @AlexOn1ine in [#6987](https://github.com/rh-hideout/pokeemerald-expansion/pull/6987) + +## πŸ€– Battle AI πŸ€– +### Fixed +* Fixes ai moves being recorded without correct index by @AlexOn1ine in [#6803](https://github.com/rh-hideout/pokeemerald-expansion/pull/6803) +* Fixes AI repeated use of weather set up moves by @AlexOn1ine in [#6963](https://github.com/rh-hideout/pokeemerald-expansion/pull/6963) +* Fixes AI not seeing primal weather and partner absorbing abilities by @AlexOn1ine in [#6936](https://github.com/rh-hideout/pokeemerald-expansion/pull/6936) + +## 🧹 Other Cleanup 🧹 +* Remove old slide workaround by @hedara90 in [#6754](https://github.com/rh-hideout/pokeemerald-expansion/pull/6754) +* Remove redundant script declaration in `battle_scripts.h` by @Bassoonian and @i0brendan0 in [#6837](https://github.com/rh-hideout/pokeemerald-expansion/pull/6837) +* BattleScript_BerryStatRaiseRet Ripen checks berry and cleanup by @ghoulslash in [#6835](https://github.com/rh-hideout/pokeemerald-expansion/pull/6835) +* Consolidated stat-priority ability tests by @AsparagusEduardo in [#6863](https://github.com/rh-hideout/pokeemerald-expansion/pull/6863) +* Fix typo in the readme by @Bassoonian in [#6908](https://github.com/rh-hideout/pokeemerald-expansion/pull/6908) +* add fail ptr arg to JumpIfMoveFailed, fix tryworryseed by @ghoulslash in [#6925](https://github.com/rh-hideout/pokeemerald-expansion/pull/6925) +* Rename AI test by @AlexOn1ine in [#6977](https://github.com/rh-hideout/pokeemerald-expansion/pull/6977) +* Missed ItemId_GetDescription change by @AlexOn1ine in [#6992](https://github.com/rh-hideout/pokeemerald-expansion/pull/6992) +* Cleanup identical if blocks by @malad1211 in [#6988](https://github.com/rh-hideout/pokeemerald-expansion/pull/6988) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Changed +* Changed Tackle for Scratch in tests by @AsparagusEduardo and @Pawkkie, @PurrfectDoodle, @hedara90 in [#6730](https://github.com/rh-hideout/pokeemerald-expansion/pull/6730) + - Tackle's power varies too much across generations. When writing new tests, please use Scratch instead. +* Adds RNG tags and tests for Moody and Starf Berry by @PhallenTree in [#6718](https://github.com/rh-hideout/pokeemerald-expansion/pull/6718) +* A lot of tests by @hedara90 in [#6734](https://github.com/rh-hideout/pokeemerald-expansion/pull/6734) +* Added Ability TODO tests - Volume B by @AsparagusEduardo in [#6836](https://github.com/rh-hideout/pokeemerald-expansion/pull/6836) +* Consolidated stat-priority ability tests by @AsparagusEduardo in [#6863](https://github.com/rh-hideout/pokeemerald-expansion/pull/6863) +* Create missing ability and move effect test files by @AsparagusEduardo in [#6845](https://github.com/rh-hideout/pokeemerald-expansion/pull/6845) +* Fix `KNOWN_FAILING` Bestow tests by @AsparagusEduardo in [#6947](https://github.com/rh-hideout/pokeemerald-expansion/pull/6947) +* Added check for gBattleStringsTable by @AsparagusEduardo in [#6948](https://github.com/rh-hideout/pokeemerald-expansion/pull/6948) +* Rename AI test by @AlexOn1ine in [#6977](https://github.com/rh-hideout/pokeemerald-expansion/pull/6977) +* Fix heal bell test, add sparkly swirl test by @ghoulslash in [#6262](https://github.com/rh-hideout/pokeemerald-expansion/pull/6262) + +### Fixed +* Fix test not referencing AI_TRAINER_NAME by @Pawkkie in [#6926](https://github.com/rh-hideout/pokeemerald-expansion/pull/6926) +* Backport #6712 Fix party data assignment by @Pawkkie in [#6980](https://github.com/rh-hideout/pokeemerald-expansion/pull/6980) + +## πŸ“š Documentation πŸ“š +* Fixed URL for contributors badge on README.md by @pkmnsnfrn in [#6897](https://github.com/rh-hideout/pokeemerald-expansion/pull/6897) + +## πŸ“¦ Branch Synchronisation πŸ“¦ +### pret +* 2nd of May 2025 in [#6752](https://github.com/rh-hideout/pokeemerald-expansion/pull/6752) + * Added missing include due to g++ changes by @hedara90 in [pret#2131](https://github.com/pret/pokeemerald/pull/2131) +* 15th of May, 2025 in [#6870](https://github.com/rh-hideout/pokeemerald-expansion/pull/6870) + * Identified task and sprite fields related to battle weather animations by @DavidJCobb in [pret#2128](https://github.com/pret/pokeemerald/pull/2128) + * Battle link reverse-engineering by @DavidJCobb in [pret#2125](https://github.com/pret/pokeemerald/pull/2125) + * `InitSpritePosToAnimAttacker` documentation by @AsparagusEduardo in [pret#2132](https://github.com/pret/pokeemerald/pull/2132) + * Rename battlerId to battler for consistency by @AlexOn1ine in [pret#2126](https://github.com/pret/pokeemerald/pull/2126) + * Replace: moveId -> move, moveIdx -> moveIndex by @AlexOn1ine in [pret#2134](https://github.com/pret/pokeemerald/pull/2134) + * Add BattlerId enum and document by @AlexOn1ine in [pret#2135](https://github.com/pret/pokeemerald/pull/2135) + * Remove files that should not have been committed in #2126 by @mrgriffin in [pret#2136](https://github.com/pret/pokeemerald/pull/2136) +* 24th of May, 2025 in [#6978](https://github.com/rh-hideout/pokeemerald-expansion/pull/6978) + * Warn on suspicious setvar usages by @mrgriffin in [pret#2137](https://github.com/pret/pokeemerald/pull/2137) + * Streamline pointer notation by @Bassoonian in [pret#2139](https://github.com/pret/pokeemerald/pull/2139) + * Fixes for C23 Support by @Kurausukun in [pret#2138](https://github.com/pret/pokeemerald/pull/2138) + * Update header files to match source files by @Bassoonian in [pret#2143](https://github.com/pret/pokeemerald/pull/2143) + * Correct C23 Checks by @Kurausukun in [pret#2144](https://github.com/pret/pokeemerald/pull/2144) + * Rename ItemId_GetX to GetItemX by @AlexOn1ine in [pret#2116](https://github.com/pret/pokeemerald/pull/2116) + * Remove files that were wrongly commited by @AlexOn1ine in [pret#2146](https://github.com/pret/pokeemerald/pull/2146) + +## New Contributors +* @i0brendan0 made their first contribution in [#6774](https://github.com/rh-hideout/pokeemerald-expansion/pull/6774) +* @allcontributors made their first contribution in [#6896](https://github.com/rh-hideout/pokeemerald-expansion/pull/6896) +* @DarkVexon made their first contribution in [#6979](https://github.com/rh-hideout/pokeemerald-expansion/pull/6979) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.11.2...expansion/1.11.3 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 4c7540bc0d..a90201e079 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.11.2 +// Last version: 1.11.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 11 #define EXPANSION_VERSION_PATCH 3 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From 156e0b394c1b68730590a6827b894b437eebf65f Mon Sep 17 00:00:00 2001 From: Hedara Date: Tue, 27 May 2025 20:34:28 +0200 Subject: [PATCH 157/187] Start of 1.11.4 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index a90201e079..ce8b3fdefa 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.11.3 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 11 -#define EXPANSION_VERSION_PATCH 3 +#define EXPANSION_VERSION_PATCH 4 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif From c489d36fc6732dfdf4b789b23a57ff92a5692e9b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Tue, 27 May 2025 23:36:00 +0200 Subject: [PATCH 158/187] Fixes Gen3 berry activation timing (#6993) --- asm/macros/battle_script.inc | 2 +- data/battle_scripts_1.s | 10 +++++----- include/battle_util.h | 1 + src/battle_end_turn.c | 16 ++++++++++++++++ src/battle_script_commands.c | 16 +++++----------- src/battle_util.c | 11 +++++++++++ test/battle/hold_effect/restore_hp.c | 17 +++++++++++++++++ 7 files changed, 56 insertions(+), 17 deletions(-) diff --git a/asm/macros/battle_script.inc b/asm/macros/battle_script.inc index 41b61288ac..e671bc1649 100644 --- a/asm/macros/battle_script.inc +++ b/asm/macros/battle_script.inc @@ -1012,7 +1012,7 @@ .4byte \jumpInstr .endm - .macro tryhealingitem + .macro tryrestorehpberry .byte 0xbb .endm diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index e38f7ba6f1..380213e22f 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -5716,7 +5716,7 @@ BattleScript_MagicRoomEnds:: setbyte gBattlerTarget, 0 BattleScript_MagicRoomHealingItemsLoop: copyarraywithindex gBattlerAttacker, gBattlerByTurnOrder, gBattlerTarget, 1 - tryhealingitem + tryrestorehpberry addbyte gBattlerTarget, 1 jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_MagicRoomHealingItemsLoop end2 @@ -6993,7 +6993,7 @@ BattleScript_DoTurnDmg: datahpupdate BS_ATTACKER tryfaintmon BS_ATTACKER checkteamslost BattleScript_DoTurnDmgEnd - tryhealingitem + tryrestorehpberry BattleScript_DoTurnDmgEnd: end2 @@ -7241,7 +7241,7 @@ BattleScript_YawnEnd: BattleScript_EmbargoEndTurn:: printstring STRINGID_EMBARGOENDS waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry end2 BattleScript_TelekinesisEndTurn:: @@ -7533,7 +7533,7 @@ BattleScript_PickupActivates:: call BattleScript_AbilityPopUp printstring STRINGID_XFOUNDONEY waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry BattleScript_PickupActivatesEnd: end3 @@ -7543,7 +7543,7 @@ BattleScript_HarvestActivates:: call BattleScript_AbilityPopUp printstring STRINGID_HARVESTBERRY waitmessage B_WAIT_TIME_LONG - tryhealingitem + tryrestorehpberry BattleScript_HarvestActivatesEnd: end3 diff --git a/include/battle_util.h b/include/battle_util.h index 6dececdf4d..2ce91c3f25 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -383,5 +383,6 @@ u32 RestoreWhiteHerbStats(u32 battler); bool32 IsFutureSightAttackerInParty(u32 battlerAtk, u32 battlerDef, u32 move); bool32 HadMoreThanHalfHpNowDoesnt(u32 battler); void UpdateStallMons(void); +bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId); #endif // GUARD_BATTLE_UTIL_H diff --git a/src/battle_end_turn.c b/src/battle_end_turn.c index 5ac9a69ee4..7e9f8b15f5 100644 --- a/src/battle_end_turn.c +++ b/src/battle_end_turn.c @@ -20,6 +20,7 @@ enum EndTurnResolutionOrder ENDTURN_VARIOUS, ENDTURN_WEATHER, ENDTURN_WEATHER_DAMAGE, + ENDTURN_GEN_3_BERRY_ACTIVATION, ENDTURN_EMERGENCY_EXIT_1, ENDTURN_AFFECTION, ENDTURN_FUTURE_SIGHT, @@ -283,6 +284,20 @@ static bool32 HandleEndTurnWeatherDamage(u32 battler) return effect; } +static bool32 HandleEndTurnGenThreeBerryActivation(u32 battler) +{ + bool32 effect = FALSE; + + if (B_HP_BERRIES >= GEN_4) // Skip handler for > Gen3 + { + gBattleStruct->endTurnEventsCounter++; + return effect; + } + gBattleStruct->turnEffectsBattlerId++; + effect = TryRestoreHPBerries(battler, ITEMEFFECT_NORMAL); + return effect; +} + static bool32 HandleEndTurnEmergencyExit(u32 battler) { bool32 effect = FALSE; @@ -1514,6 +1529,7 @@ static bool32 (*const sEndTurnEffectHandlers[])(u32 battler) = [ENDTURN_VARIOUS] = HandleEndTurnVarious, [ENDTURN_WEATHER] = HandleEndTurnWeather, [ENDTURN_WEATHER_DAMAGE] = HandleEndTurnWeatherDamage, + [ENDTURN_GEN_3_BERRY_ACTIVATION] = HandleEndTurnGenThreeBerryActivation, [ENDTURN_EMERGENCY_EXIT_1] = HandleEndTurnEmergencyExit, [ENDTURN_AFFECTION] = HandleEndTurnAffection, [ENDTURN_FUTURE_SIGHT] = HandleEndTurnFutureSight, diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index ec9dd03601..aaf479ad9d 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -533,7 +533,7 @@ static void Cmd_presentdamagecalculation(void); static void Cmd_setsafeguard(void); static void Cmd_magnitudedamagecalculation(void); static void Cmd_jumpifnopursuitswitchdmg(void); -static void Cmd_tryhealingitem(void); +static void Cmd_tryrestorehpberry(void); static void Cmd_halvehp(void); static void Cmd_copyfoestats(void); static void Cmd_rapidspinfree(void); @@ -792,7 +792,7 @@ void (*const gBattleScriptingCommandsTable[])(void) = Cmd_setsafeguard, //0xB8 Cmd_magnitudedamagecalculation, //0xB9 Cmd_jumpifnopursuitswitchdmg, //0xBA - Cmd_tryhealingitem, //0xBB + Cmd_tryrestorehpberry, //0xBB Cmd_halvehp, //0xBC Cmd_copyfoestats, //0xBD Cmd_rapidspinfree, //0xBE @@ -14274,17 +14274,11 @@ static void Cmd_jumpifnopursuitswitchdmg(void) } } -static void Cmd_tryhealingitem(void) +static void Cmd_tryrestorehpberry(void) { CMD_ARGS(); - - if (gItemsInfo[gBattleMons[gBattlerAttacker].item].pocket == POCKET_BERRIES - || GetBattlerHoldEffect(gBattlerAttacker, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice - { - if (ItemBattleEffects(ITEMEFFECT_TRY_HEALING, gBattlerAttacker, FALSE)) - return; - } - + if (TryRestoreHPBerries(gBattlerAttacker, ITEMEFFECT_TRY_HEALING)) + return; gBattlescriptCurrInstr = cmd->nextInstr; } diff --git a/src/battle_util.c b/src/battle_util.c index a3b58e3ea7..6d256dc998 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -11442,3 +11442,14 @@ void UpdateStallMons(void) } // Handling for moves that target multiple opponents in doubles not handled currently } + +bool32 TryRestoreHPBerries(u32 battler, enum ItemCaseId caseId) +{ + if (gItemsInfo[gBattleMons[battler].item].pocket == POCKET_BERRIES + || GetBattlerHoldEffect(battler, TRUE) == HOLD_EFFECT_RESTORE_HP) // Edge case for Berry Juice + { + if (ItemBattleEffects(caseId, battler, FALSE)) + return TRUE; + } + return FALSE; +} diff --git a/test/battle/hold_effect/restore_hp.c b/test/battle/hold_effect/restore_hp.c index ef96ead7e4..9db149c023 100644 --- a/test/battle/hold_effect/restore_hp.c +++ b/test/battle/hold_effect/restore_hp.c @@ -63,3 +63,20 @@ DOUBLE_BATTLE_TEST("Restore HP Item effects do not miss timing after a recoil mo ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); } } + +#if B_HP_BERRIES <= GEN_3 +SINGLE_BATTLE_TEST("Restore HP Berry triggers only during the end turn") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WYNAUT) { MaxHP(100); HP(51); Item(ITEM_ORAN_BERRY); } + } WHEN { + TURN { MOVE(player, MOVE_TACKLE); } + TURN {} + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_TACKLE, player); + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, opponent); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, opponent); + } +} +#endif From ecb20b2a25c277e84e8b42b0a4c76449b491cd81 Mon Sep 17 00:00:00 2001 From: Vex Date: Wed, 28 May 2025 03:43:38 -0700 Subject: [PATCH 159/187] Fix Eiscue not resetting back to Ice Face form after battle. (#6997) --- src/battle_script_commands.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/battle_script_commands.c b/src/battle_script_commands.c index f69ef38ad4..11d9cd376a 100644 --- a/src/battle_script_commands.c +++ b/src/battle_script_commands.c @@ -2802,6 +2802,9 @@ static void Cmd_resultmessage(void) if (gDisableStructs[gBattlerTarget].iceFaceActivationPrevention) { gDisableStructs[gBattlerTarget].iceFaceActivationPrevention = FALSE; + u32 side = GetBattlerSide(gBattlerTarget); + if (gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] == SPECIES_NONE) + gBattleStruct->changedSpecies[side][gBattlerPartyIndexes[gBattlerTarget]] = gBattleMons[gBattlerTarget].species; gBattleMons[gBattlerTarget].species = SPECIES_EISCUE_NOICE; gBattleScripting.battler = gBattlerTarget; // For STRINGID_PKMNTRANSFORMED BattleScriptPushCursor(); From 00f3c09a226d6dcba25ec52d92a03d54e766aa65 Mon Sep 17 00:00:00 2001 From: PCG <75729017+PCG06@users.noreply.github.com> Date: Wed, 28 May 2025 16:21:00 +0530 Subject: [PATCH 160/187] Fixed `CreateMon` param order in `CreateFacilityMon` (#6989) --- src/battle_tower.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_tower.c b/src/battle_tower.c index c20c59602b..73bea47899 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -1581,7 +1581,7 @@ void CreateFacilityMon(const struct TrainerMon *fmon, u16 level, u8 fixedIV, u32 } ModifyPersonalityForNature(&personality, fmon->nature); - CreateMon(dst, fmon->species, level, fixedIV, TRUE, personality, otID, OT_ID_PRESET); + CreateMon(dst, fmon->species, level, fixedIV, TRUE, personality, OT_ID_PRESET, otID); friendship = MAX_FRIENDSHIP; // Give the chosen PokΓ©mon its specified moves. From c8570d7c2b2def1d5fec9e037daf589624585286 Mon Sep 17 00:00:00 2001 From: Hedara Date: Wed, 28 May 2025 14:38:57 +0200 Subject: [PATCH 161/187] Remove incorrectly re-added ABILITYEFFECT_ cases --- include/battle_util.h | 4 ---- src/battle_util.c | 32 -------------------------------- 2 files changed, 36 deletions(-) diff --git a/include/battle_util.h b/include/battle_util.h index 836d31bb70..2ce91c3f25 100644 --- a/include/battle_util.h +++ b/include/battle_util.h @@ -48,10 +48,6 @@ enum { ABILITYEFFECT_ON_SWITCHIN, ABILITYEFFECT_ENDTURN, ABILITYEFFECT_MOVE_END_ATTACKER, - ABILITYEFFECT_WOULD_BLOCK, - ABILITYEFFECT_MOVES_BLOCK, - ABILITYEFFECT_WOULD_ABSORB, - ABILITYEFFECT_ABSORBING, ABILITYEFFECT_MOVE_END, ABILITYEFFECT_IMMUNITY, ABILITYEFFECT_SYNCHRONIZE, diff --git a/src/battle_util.c b/src/battle_util.c index 0efa13c869..6d256dc998 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -4345,38 +4345,6 @@ u32 AbilityBattleEffects(u32 caseID, u32 battler, u32 ability, u32 special, u32 } } break; - case ABILITYEFFECT_WOULD_BLOCK: - effect = CanAbilityBlockMove(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, gLastUsedAbility, move, ABILITY_CHECK_TRIGGER); - if (effect && gLastUsedAbility != 0xFFFF) - RecordAbilityBattle(battler, gLastUsedAbility); - return effect; - case ABILITYEFFECT_MOVES_BLOCK: - effect = CanAbilityBlockMove(gBattlerAttacker, battler, gBattleMons[gBattlerAttacker].ability, gLastUsedAbility, move, ABILITY_CHECK_TRIGGER); - - // prankster check - if (effect == 0 - && IsBattleMoveStatus(move) - && GetChosenMovePriority(gBattlerAttacker, gBattleMons[gBattlerAttacker].ability) > 0 - && BlocksPrankster(move, gBattlerAttacker, gBattlerTarget, TRUE) - && !(IsBattleMoveStatus(move) && (gLastUsedAbility == ABILITY_MAGIC_BOUNCE || gProtectStructs[gBattlerTarget].bounceMove))) - { - if (!IsDoubleBattle() - || !(GetBattlerMoveTargetType(gBattlerAttacker, move) & (MOVE_TARGET_BOTH | MOVE_TARGET_FOES_AND_ALLY))) - CancelMultiTurnMoves(gBattlerAttacker, SKY_DROP_IGNORE); // Don't cancel moves that can hit two targets bc one target might not be protected - gBattleScripting.battler = gBattlerAbility = gBattlerTarget; - gBattlescriptCurrInstr = BattleScript_DarkTypePreventsPrankster; - effect = 1; - } - break; - case ABILITYEFFECT_WOULD_ABSORB: - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_CHECK_TRIGGER); - gBattleStruct->pledgeMove = FALSE; - if (effect && gLastUsedAbility != 0xFFFF) - RecordAbilityBattle(battler, gLastUsedAbility); - return effect; - case ABILITYEFFECT_ABSORBING: - effect = CanAbilityAbsorbMove(gBattlerAttacker, battler, gLastUsedAbility, move, moveType, ABILITY_RUN_SCRIPT); - break; case ABILITYEFFECT_MOVE_END: // Think contact abilities. switch (gLastUsedAbility) { From cc8694d26d89e3e85bc81e90f6f3cfc5fb1d03ca Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Wed, 28 May 2025 08:22:11 -0700 Subject: [PATCH 162/187] Clarifies when to use each merge type for maintainers (#6999) Co-authored-by: hedara90 <90hedara@gmail.com> --- docs/team_procedures/merge_checklist.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/team_procedures/merge_checklist.md b/docs/team_procedures/merge_checklist.md index 107f5a0f9f..ae3ff60b19 100644 --- a/docs/team_procedures/merge_checklist.md +++ b/docs/team_procedures/merge_checklist.md @@ -60,7 +60,11 @@ This should be used for all PRs _except_ when merging from either: * `upcoming`, `master` or `pret/pokeemerald`. ## Create a merge commit -When the branch uses a publicly available feature branch from by the community, use "Create a merge commit" to preserve history for users. +Use the "Create a merge commit" to preserve history if: +- The branch is a publicly available feature branch from the community +- It's a upstream `pret` merge +- It's a `master` to `upcoming` merge +- It's a Release merge ## Rebase and merge We do not use this ever. From e605b87722ce23757626b756973681a6db73a175 Mon Sep 17 00:00:00 2001 From: Raymond Dodge Date: Thu, 29 May 2025 04:59:47 -0400 Subject: [PATCH 163/187] Fix out-of-bounds in Heal Bell Cures Entire Party test (#7011) --- test/battle/move_effect/heal_bell.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/battle/move_effect/heal_bell.c b/test/battle/move_effect/heal_bell.c index 6a8e5d5ed4..67bdfda1b8 100644 --- a/test/battle/move_effect/heal_bell.c +++ b/test/battle/move_effect/heal_bell.c @@ -80,7 +80,7 @@ DOUBLE_BATTLE_TEST("Heal Bell/Aromatherapy cures the entire party of the user fr case STATUS1_FROSTBITE: STATUS_ICON(playerLeft, frostbite: FALSE); STATUS_ICON(playerRight, frostbite: FALSE); break; } for (j = 0; j < PARTY_SIZE; j++) - EXPECT_EQ(GetMonData(&gPlayerParty[i], MON_DATA_STATUS), STATUS1_NONE); + EXPECT_EQ(GetMonData(&gPlayerParty[j], MON_DATA_STATUS), STATUS1_NONE); } } From 79abc885e72bab6644f8bdb269a14daa2fa12aeb Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Thu, 29 May 2025 04:04:41 -0500 Subject: [PATCH 164/187] Fixes follower NPC not changing state with player after warp (#7009) --- src/follower_npc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/follower_npc.c b/src/follower_npc.c index 870668a9d5..f41315f104 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -1284,7 +1284,15 @@ void FollowerNPC_WarpSetEnd(void) } if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ON_FOOT) + { SetFollowerNPCSprite(FOLLOWER_NPC_SPRITE_INDEX_NORMAL); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_NONE); + } + else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_SURFING) + { + SetFollowerNPCSprite(FOLLOWER_NPC_SPRITE_INDEX_SURF); + SetFollowerNPCData(FNPC_DATA_SURF_BLOB, FNPC_SURF_BLOB_RECREATE); + } follower->facingDirection = player->facingDirection; follower->movementDirection = player->movementDirection; From f2a3226b471289fbd295063b17b802c56cca0796 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Thu, 29 May 2025 04:05:23 -0500 Subject: [PATCH 165/187] Fixed follower NPC changing to surf sprite when choosing not to surface from dive (#7010) --- data/scripts/field_move_scripts.inc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/data/scripts/field_move_scripts.inc b/data/scripts/field_move_scripts.inc index 4cd069c7ee..1845e10297 100644 --- a/data/scripts/field_move_scripts.inc +++ b/data/scripts/field_move_scripts.inc @@ -354,7 +354,7 @@ EventScript_UseDiveUnderwater:: setfieldeffectargument 0, VAR_RESULT setfieldeffectargument 1, 1 msgbox Text_WantToSurface, MSGBOX_YESNO - goto_if_eq VAR_RESULT, NO, EventScript_EndSurface + goto_if_eq VAR_RESULT, NO, EventScript_NoSurface msgbox Text_MonUsedDive, MSGBOX_DEFAULT hidefollowernpc dofieldeffect FLDEFF_USE_DIVE @@ -369,6 +369,7 @@ EventScript_CantSurface:: EventScript_EndSurface:: callnative SetFollowerNPCSurfSpriteAfterDive +EventScript_NoSurface:: releaseall end From 213503dee96a1351d34e2d250572f3879bdf5d61 Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Thu, 29 May 2025 11:25:10 +0200 Subject: [PATCH 166/187] Fixes spread move fire types not defrosting all targets (#6998) --- include/constants/battle_script_commands.h | 2 +- test/battle/defrost.c | 18 ++++++++++++++++++ test/battle/spread_moves.c | 1 - 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 test/battle/defrost.c diff --git a/include/constants/battle_script_commands.h b/include/constants/battle_script_commands.h index d8e13baae1..ecd85700d8 100644 --- a/include/constants/battle_script_commands.h +++ b/include/constants/battle_script_commands.h @@ -278,9 +278,9 @@ enum MoveEndEffects MOVEEND_SKY_DROP_CONFUSE, MOVEEND_UPDATE_LAST_MOVES, MOVEEND_MIRROR_MOVE, + MOVEEND_DEFROST, MOVEEND_NEXT_TARGET, // Everything up until here is handled for each strike of a multi-hit move MOVEEND_MULTIHIT_MOVE, - MOVEEND_DEFROST, MOVEEND_RECOIL, MOVEEND_RAPID_SPIN, MOVEEND_ITEM_EFFECTS_ATTACKER, diff --git a/test/battle/defrost.c b/test/battle/defrost.c new file mode 100644 index 0000000000..3d456d6673 --- /dev/null +++ b/test/battle/defrost.c @@ -0,0 +1,18 @@ +#include "global.h" +#include "test/battle.h" + +DOUBLE_BATTLE_TEST("Defrost: A fire type spread move will thaw both targets") +{ + GIVEN { + PLAYER(SPECIES_WOBBUFFET); + PLAYER(SPECIES_WOBBUFFET); + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + OPPONENT(SPECIES_WOBBUFFET) { Status1(STATUS1_FREEZE); } + } WHEN { + TURN { MOVE(playerLeft, MOVE_HEAT_WAVE); } + } SCENE { + ANIMATION(ANIM_TYPE_MOVE, MOVE_HEAT_WAVE, playerLeft); + STATUS_ICON(opponentLeft, freeze: FALSE); + STATUS_ICON(opponentRight, freeze: FALSE); + } +} diff --git a/test/battle/spread_moves.c b/test/battle/spread_moves.c index f617bd69c1..869d5bbebb 100644 --- a/test/battle/spread_moves.c +++ b/test/battle/spread_moves.c @@ -3,7 +3,6 @@ DOUBLE_BATTLE_TEST("Spread Moves: Ability and Item effects activate correctly after a multi target move") { - // TODO: Might be a bug, verify on cardridge GIVEN { PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_LUM_BERRY); } PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_COVERT_CLOAK); } From e631f3baa9804e1ca43e06ac37f6abd00c8fc245 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Thu, 29 May 2025 11:17:54 -0500 Subject: [PATCH 167/187] Fix follower NPC not reappearing after Mossdeep gym warp (#7014) --- src/field_screen_effect.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/field_screen_effect.c b/src/field_screen_effect.c index e09b66d92e..9ac99465ca 100644 --- a/src/field_screen_effect.c +++ b/src/field_screen_effect.c @@ -593,6 +593,7 @@ void DoMossdeepGymWarp(void) SaveObjectEvents(); TryFadeOutOldMapMusic(); WarpFadeOutScreen(); + SetFollowerNPCData(FNPC_DATA_WARP_END, FNPC_WARP_REAPPEAR); PlaySE(SE_WARP_IN); CreateTask(Task_WarpAndLoadMap, 10); gFieldCallback = FieldCB_MossdeepGymWarpExit; From 5dd45a047979f4b075c7c8f6689de72e21d91183 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Thu, 29 May 2025 11:18:30 -0500 Subject: [PATCH 168/187] Fixed surf blob binding to invisible follower NPC on map reload (#7013) --- src/follower_npc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/follower_npc.c b/src/follower_npc.c index f41315f104..ae4cc795f0 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -1357,7 +1357,7 @@ void FollowerNPC_BindToSurfBlobOnReloadScreen(void) follower = &gObjectEvents[GetFollowerNPCObjectId()]; TryUpdateFollowerNPCSpriteUnderwater(); - if (GetFollowerNPCData(FNPC_DATA_SURF_BLOB) != FNPC_SURF_BLOB_RECREATE && GetFollowerNPCData(FNPC_DATA_SURF_BLOB) != FNPC_SURF_BLOB_DESTROY) + if (follower->invisible || (GetFollowerNPCData(FNPC_DATA_SURF_BLOB) != FNPC_SURF_BLOB_RECREATE && GetFollowerNPCData(FNPC_DATA_SURF_BLOB) != FNPC_SURF_BLOB_DESTROY)) return; // Spawn the surf blob under the follower. From 5bdab5163e82d833a24c003f4a0b365979f3a23c Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Fri, 30 May 2025 11:58:32 +0200 Subject: [PATCH 169/187] Update Supersweet Syrup with eject pack fix (#7015) --- data/battle_scripts_1.s | 3 ++- test/battle/hold_effect/eject_pack.c | 20 ++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/data/battle_scripts_1.s b/data/battle_scripts_1.s index 41afb65a5d..974a4a561c 100644 --- a/data/battle_scripts_1.s +++ b/data/battle_scripts_1.s @@ -7847,8 +7847,9 @@ BattleScript_SupersweetSyrupLoopIncrement: jumpifbytenotequal gBattlerTarget, gBattlersCount, BattleScript_SupersweetSyrupLoop copybyte sBATTLER, gBattlerAttacker destroyabilitypopup - restoretarget + restoretarget pause B_WAIT_TIME_MED + tryintimidatejectpack end3 BattleScript_SupersweetSyrupWontDecrease: diff --git a/test/battle/hold_effect/eject_pack.c b/test/battle/hold_effect/eject_pack.c index 0a21362a99..f33a59de21 100644 --- a/test/battle/hold_effect/eject_pack.c +++ b/test/battle/hold_effect/eject_pack.c @@ -161,12 +161,16 @@ SINGLE_BATTLE_TEST("Eject Pack will miss timing to switch out user if Eject Butt } } -DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after intimidate") +DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after an ability stat drop") { u32 speed; + u32 species, ability; - PARAMETRIZE { speed = 1; } - PARAMETRIZE { speed = 11; } + PARAMETRIZE { species = SPECIES_EKANS; ability = ABILITY_INTIMIDATE; speed = 1; } + PARAMETRIZE { species = SPECIES_EKANS; ability = ABILITY_INTIMIDATE; speed = 11; } + + PARAMETRIZE { species = SPECIES_DIPPLIN; ability = ABILITY_SUPERSWEET_SYRUP; speed = 1; } + PARAMETRIZE { species = SPECIES_DIPPLIN; ability = ABILITY_SUPERSWEET_SYRUP; speed = 11; } GIVEN { PLAYER(SPECIES_WOBBUFFET) { Speed(10); Item(ITEM_EJECT_PACK); } @@ -174,7 +178,7 @@ DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after PLAYER(SPECIES_WOBBUFFET) { Speed(3); } OPPONENT(SPECIES_WYNAUT) { Speed(4); } OPPONENT(SPECIES_WOBBUFFET) { Speed(5); } - OPPONENT(SPECIES_EKANS) { Speed(6); Ability(ABILITY_INTIMIDATE); } + OPPONENT(species) { Speed(6); Ability(ability); } } WHEN { TURN { SWITCH(opponentLeft, 2); @@ -184,14 +188,18 @@ DOUBLE_BATTLE_TEST("Eject Pack: Only the fastest Eject Pack will activate after SEND_OUT(playerLeft, 2); } } SCENE { - ABILITY_POPUP(opponentLeft, ABILITY_INTIMIDATE); + ABILITY_POPUP(opponentLeft, ability); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerLeft); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_STATS_CHANGE, playerRight); if (speed == 11) { + NOT ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerRight); ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); } else { - NOT ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + NONE_OF { + ANIMATION(ANIM_TYPE_MOVE, MOVE_CELEBRATE, playerLeft); + ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerRight); + } ANIMATION(ANIM_TYPE_GENERAL, B_ANIM_HELD_ITEM_EFFECT, playerLeft); } } From 1e32cf278c4ea0942ec5fbf78a7a9763ee3f5f39 Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Fri, 30 May 2025 16:31:38 +0200 Subject: [PATCH 170/187] fix battle controller macros (#7021) --- include/battle_controllers.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 0716ae2e54..3eddc95578 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -82,19 +82,19 @@ enum { (gBattleControllerExecFlags & (1u << battler)) #define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battler) \ - gBattleControllerExecFlags |= (1u << battler) << (32 - MAX_BATTLERS_COUNT) + gBattleControllerExecFlags |= ((1u << battler) << (32 - MAX_BATTLERS_COUNT)) #define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battler) \ gBattleControllerExecFlags &= ~((1 << 28) << (battler)) #define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ - gBattleControllerExecFlags |= (1u << battler) << ((playerId) << 2) + gBattleControllerExecFlags |= ((1u << battler) << ((playerId) << 2)) #define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId) \ - gBattleControllerExecFlags &= ~(1u << battler) << ((playerId) * 4) + gBattleControllerExecFlags &= ~((1u << battler) << ((playerId) * 4)) #define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ - (gBattleControllerExecFlags & (1u << battler) << ((playerId) * 4)) + (gBattleControllerExecFlags & ((1u << battler) << ((playerId) * 4))) // This actually checks if a specific controller is active on any player or if // *any* controller is pending sync over link communications, but the macro name From 9656400f888cbcbe6740d2f445668a34a5cbe0dd Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Fri, 30 May 2025 07:39:01 -0700 Subject: [PATCH 171/187] Moved time constants to dedicated files (#7019) --- data/event_scripts.s | 2 + include/constants/rtc.h | 96 +++++++++++++++++++ include/constants/siirtc.h | 43 +++++++++ include/rtc.h | 95 +----------------- include/siirtc.h | 40 +------- .../wild_encounters_to_header.py | 2 +- 6 files changed, 145 insertions(+), 133 deletions(-) create mode 100644 include/constants/rtc.h create mode 100644 include/constants/siirtc.h diff --git a/data/event_scripts.s b/data/event_scripts.s index 84a3011afc..db5d329b67 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -46,9 +46,11 @@ #include "constants/party_menu.h" #include "constants/pokedex.h" #include "constants/pokemon.h" +#include "constants/rtc.h" #include "constants/roulette.h" #include "constants/script_menu.h" #include "constants/secret_bases.h" +#include "constants/siirtc.h" #include "constants/songs.h" #include "constants/sound.h" #include "constants/species.h" diff --git a/include/constants/rtc.h b/include/constants/rtc.h new file mode 100644 index 0000000000..65ee9c35ed --- /dev/null +++ b/include/constants/rtc.h @@ -0,0 +1,96 @@ +#ifndef GUARD_CONSTANTS_RTC_H +#define GUARD_CONSTANTS_RTC_H + +#define RTC_INIT_ERROR 0x0001 +#define RTC_INIT_WARNING 0x0002 + +#define RTC_ERR_12HOUR_CLOCK 0x0010 +#define RTC_ERR_POWER_FAILURE 0x0020 +#define RTC_ERR_INVALID_YEAR 0x0040 +#define RTC_ERR_INVALID_MONTH 0x0080 +#define RTC_ERR_INVALID_DAY 0x0100 +#define RTC_ERR_INVALID_HOUR 0x0200 +#define RTC_ERR_INVALID_MINUTE 0x0400 +#define RTC_ERR_INVALID_SECOND 0x0800 + +#define RTC_ERR_FLAG_MASK 0x0FF0 + +//Morning and evening don't exist in Gen 3 +#if OW_TIMES_OF_DAY == GEN_3 + #define MORNING_HOUR_BEGIN 0 + #define MORNING_HOUR_END 0 + + #define DAY_HOUR_BEGIN 12 + #define DAY_HOUR_END HOURS_PER_DAY + + #define EVENING_HOUR_BEGIN 0 + #define EVENING_HOUR_END 0 + + #define NIGHT_HOUR_BEGIN 0 + #define NIGHT_HOUR_END 12 +//Evening doesn't exist in Gen 4 +#elif OW_TIMES_OF_DAY == GEN_4 + #define MORNING_HOUR_BEGIN 4 + #define MORNING_HOUR_END 10 + + #define DAY_HOUR_BEGIN 10 + #define DAY_HOUR_END 20 + + #define EVENING_HOUR_BEGIN 0 + #define EVENING_HOUR_END 0 + + #define NIGHT_HOUR_BEGIN 20 + #define NIGHT_HOUR_END 4 +//Gen 5 currently not included as the seasons change the times of day +#elif OW_TIMES_OF_DAY <= GEN_6 + #define MORNING_HOUR_BEGIN 4 + #define MORNING_HOUR_END 11 + + #define DAY_HOUR_BEGIN 11 + #define DAY_HOUR_END 18 + + #define EVENING_HOUR_BEGIN 18 + #define EVENING_HOUR_END 21 + + #define NIGHT_HOUR_BEGIN 21 + #define NIGHT_HOUR_END 4 +//These are the Sun/Ultra Sun times +#elif OW_TIMES_OF_DAY == GEN_7 + #define MORNING_HOUR_BEGIN 6 + #define MORNING_HOUR_END 10 + + #define DAY_HOUR_BEGIN 10 + #define DAY_HOUR_END 17 + + #define EVENING_HOUR_BEGIN 17 + #define EVENING_HOUR_END 18 + + #define NIGHT_HOUR_BEGIN 18 + #define NIGHT_HOUR_END 6 +#elif OW_TIMES_OF_DAY >= GEN_8 + #define MORNING_HOUR_BEGIN 6 + #define MORNING_HOUR_END 10 + + #define DAY_HOUR_BEGIN 10 + #define DAY_HOUR_END 19 + + #define EVENING_HOUR_BEGIN 19 + #define EVENING_HOUR_END 20 + + #define NIGHT_HOUR_BEGIN 20 + #define NIGHT_HOUR_END 6 +#endif + +// TIMES_OF_DAY_COUNT must be last +enum TimeOfDay +{ + TIME_MORNING, + TIME_DAY, + TIME_EVENING, + TIME_NIGHT, + TIMES_OF_DAY_COUNT, +}; + +#define TIME_OF_DAY_DEFAULT 0 + +#endif // GUARD_CONSTANTS_RTC_H diff --git a/include/constants/siirtc.h b/include/constants/siirtc.h new file mode 100644 index 0000000000..b806526de9 --- /dev/null +++ b/include/constants/siirtc.h @@ -0,0 +1,43 @@ +#ifndef GUARD_CONSTANTS_SIIRTC_H +#define GUARD_CONSTANTS_SIIRTC_H + +#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable +#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable +#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable +#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode +#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred + +#define HOURS_PER_DAY 24 +#define MINUTES_PER_HOUR 60 +#define SECONDS_PER_MINUTE 60 + +enum Weekday +{ + WEEKDAY_SUN, + WEEKDAY_MON, + WEEKDAY_TUE, + WEEKDAY_WED, + WEEKDAY_THU, + WEEKDAY_FRI, + WEEKDAY_SAT, + WEEKDAY_COUNT, +}; + +enum Month +{ + MONTH_JAN = 1, + MONTH_FEB, + MONTH_MAR, + MONTH_APR, + MONTH_MAY, + MONTH_JUN, + MONTH_JUL, + MONTH_AUG, + MONTH_SEP, + MONTH_OCT, + MONTH_NOV, + MONTH_DEC, + MONTH_COUNT = MONTH_DEC, +}; + +#endif // GUARD_CONSTANTS_SIIRTC_H diff --git a/include/rtc.h b/include/rtc.h index 13a1207b56..8ee3071615 100644 --- a/include/rtc.h +++ b/include/rtc.h @@ -4,101 +4,10 @@ #include "global.h" #include "siirtc.h" #include "config/overworld.h" - -#define RTC_INIT_ERROR 0x0001 -#define RTC_INIT_WARNING 0x0002 - -#define RTC_ERR_12HOUR_CLOCK 0x0010 -#define RTC_ERR_POWER_FAILURE 0x0020 -#define RTC_ERR_INVALID_YEAR 0x0040 -#define RTC_ERR_INVALID_MONTH 0x0080 -#define RTC_ERR_INVALID_DAY 0x0100 -#define RTC_ERR_INVALID_HOUR 0x0200 -#define RTC_ERR_INVALID_MINUTE 0x0400 -#define RTC_ERR_INVALID_SECOND 0x0800 - -#define RTC_ERR_FLAG_MASK 0x0FF0 - -//Morning and evening don't exist in Gen 3 -#if OW_TIMES_OF_DAY == GEN_3 - #define MORNING_HOUR_BEGIN 0 - #define MORNING_HOUR_END 0 - - #define DAY_HOUR_BEGIN 12 - #define DAY_HOUR_END HOURS_PER_DAY - - #define EVENING_HOUR_BEGIN 0 - #define EVENING_HOUR_END 0 - - #define NIGHT_HOUR_BEGIN 0 - #define NIGHT_HOUR_END 12 -//Evening doesn't exist in Gen 4 -#elif OW_TIMES_OF_DAY == GEN_4 - #define MORNING_HOUR_BEGIN 4 - #define MORNING_HOUR_END 10 - - #define DAY_HOUR_BEGIN 10 - #define DAY_HOUR_END 20 - - #define EVENING_HOUR_BEGIN 0 - #define EVENING_HOUR_END 0 - - #define NIGHT_HOUR_BEGIN 20 - #define NIGHT_HOUR_END 4 -//Gen 5 currently not included as the seasons change the times of day -#elif OW_TIMES_OF_DAY <= GEN_6 - #define MORNING_HOUR_BEGIN 4 - #define MORNING_HOUR_END 11 - - #define DAY_HOUR_BEGIN 11 - #define DAY_HOUR_END 18 - - #define EVENING_HOUR_BEGIN 18 - #define EVENING_HOUR_END 21 - - #define NIGHT_HOUR_BEGIN 21 - #define NIGHT_HOUR_END 4 -//These are the Sun/Ultra Sun times -#elif OW_TIMES_OF_DAY == GEN_7 - #define MORNING_HOUR_BEGIN 6 - #define MORNING_HOUR_END 10 - - #define DAY_HOUR_BEGIN 10 - #define DAY_HOUR_END 17 - - #define EVENING_HOUR_BEGIN 17 - #define EVENING_HOUR_END 18 - - #define NIGHT_HOUR_BEGIN 18 - #define NIGHT_HOUR_END 6 -#elif OW_TIMES_OF_DAY >= GEN_8 - #define MORNING_HOUR_BEGIN 6 - #define MORNING_HOUR_END 10 - - #define DAY_HOUR_BEGIN 10 - #define DAY_HOUR_END 19 - - #define EVENING_HOUR_BEGIN 19 - #define EVENING_HOUR_END 20 - - #define NIGHT_HOUR_BEGIN 20 - #define NIGHT_HOUR_END 6 -#endif - -// TIMES_OF_DAY_COUNT must be last -enum TimeOfDay -{ - TIME_MORNING, - TIME_DAY, - TIME_EVENING, - TIME_NIGHT, - TIMES_OF_DAY_COUNT, -}; - -#define TIME_OF_DAY_DEFAULT 0 +#include "constants/rtc.h" extern struct Time gLocalTime; -extern const s32 sNumDaysInMonths[12]; +extern const s32 sNumDaysInMonths[MONTH_COUNT]; void RtcDisableInterrupts(void); void RtcRestoreInterrupts(void); diff --git a/include/siirtc.h b/include/siirtc.h index 8e6958ca08..44dabfd11d 100644 --- a/include/siirtc.h +++ b/include/siirtc.h @@ -2,45 +2,7 @@ #define GUARD_RTC_H #include "gba/gba.h" - -#define SIIRTCINFO_INTFE 0x01 // frequency interrupt enable -#define SIIRTCINFO_INTME 0x02 // per-minute interrupt enable -#define SIIRTCINFO_INTAE 0x04 // alarm interrupt enable -#define SIIRTCINFO_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode -#define SIIRTCINFO_POWER 0x80 // power on or power failure occurred - -#define HOURS_PER_DAY 24 -#define MINUTES_PER_HOUR 60 -#define SECONDS_PER_MINUTE 60 - -enum Weekday -{ - WEEKDAY_SUN, - WEEKDAY_MON, - WEEKDAY_TUE, - WEEKDAY_WED, - WEEKDAY_THU, - WEEKDAY_FRI, - WEEKDAY_SAT, - WEEKDAY_COUNT, -}; - -enum Month -{ - MONTH_JAN = 1, - MONTH_FEB, - MONTH_MAR, - MONTH_APR, - MONTH_MAY, - MONTH_JUN, - MONTH_JUL, - MONTH_AUG, - MONTH_SEP, - MONTH_OCT, - MONTH_NOV, - MONTH_DEC, - MONTH_COUNT = MONTH_DEC -}; +#include "constants/siirtc.h" struct SiiRtcInfo { diff --git a/tools/wild_encounters/wild_encounters_to_header.py b/tools/wild_encounters/wild_encounters_to_header.py index cdf3777735..3aab5a2632 100644 --- a/tools/wild_encounters/wild_encounters_to_header.py +++ b/tools/wild_encounters/wild_encounters_to_header.py @@ -533,7 +533,7 @@ def IsConfigEnabled(): def GetTimeEnum(): DEFAULT_TIME_PAT = re.compile(r"enum\s+TimeOfDay\s*\{(?P[\s*\w+,\=\d*]+)\s*\}\s*\;") - with open("./include/rtc.h", "r") as rtc_include_file: + with open("./include/constants/rtc.h", "r") as rtc_include_file: include_rtc = rtc_include_file.read() include_enum = DEFAULT_TIME_PAT.search(include_rtc) return include_enum.group("rtc_val") From 38ba41b324e81214d4c57e1101930a00c006386e Mon Sep 17 00:00:00 2001 From: khbsd Date: Fri, 30 May 2025 15:22:05 +0000 Subject: [PATCH 172/187] fix: better area mons handling, no longer duplicates `hiddenMons` field (#6945) --- Makefile | 2 +- .../wild_encounters_to_header.py | 97 +++++++++++++------ 2 files changed, 67 insertions(+), 32 deletions(-) diff --git a/Makefile b/Makefile index 9f67efc54a..47503834c9 100644 --- a/Makefile +++ b/Makefile @@ -183,7 +183,7 @@ ALL_LEARNABLES_JSON := $(LEARNSET_HELPERS_BUILD_DIR)/all_learnables.json WILD_ENCOUNTERS_TOOL_DIR := $(TOOLS_DIR)/wild_encounters AUTO_GEN_TARGETS += $(DATA_SRC_SUBDIR)/wild_encounters.h -$(DATA_SRC_SUBDIR)/wild_encounters.h: $(DATA_SRC_SUBDIR)/wild_encounters.json $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py $(INCLUDE_DIRS)/config/overworld.h +$(DATA_SRC_SUBDIR)/wild_encounters.h: $(DATA_SRC_SUBDIR)/wild_encounters.json $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py $(INCLUDE_DIRS)/config/overworld.h $(INCLUDE_DIRS)/config/dexnav.h python3 $(WILD_ENCOUNTERS_TOOL_DIR)/wild_encounters_to_header.py > $@ $(C_BUILDDIR)/wild_encounter.o: c_dep += $(DATA_SRC_SUBDIR)/wild_encounters.h diff --git a/tools/wild_encounters/wild_encounters_to_header.py b/tools/wild_encounters/wild_encounters_to_header.py index 3aab5a2632..5de52fbea9 100644 --- a/tools/wild_encounters/wild_encounters_to_header.py +++ b/tools/wild_encounters/wild_encounters_to_header.py @@ -4,6 +4,7 @@ IS_ENABLED = False +DEXNAV_ENABLED = False # C string vars define = "#define" @@ -54,8 +55,6 @@ hForMaps = True headersArray = [headerIndex] - - # debug output control mainSwitch = True printWarningAndInclude = mainSwitch @@ -115,6 +114,9 @@ def ImportWildEncounterFile(): if IsConfigEnabled(): IS_ENABLED = True TIMES_OF_DAY_COUNT = len(TIME_OF_DAY) + + global DEXNAV_ENABLED + DEXNAV_ENABLED = IsDexnavEnabled() global fieldInfoStrings global fieldStrings @@ -160,26 +162,25 @@ def ImportWildEncounterFile(): if data["for_maps"]: hForMaps = wData["wild_encounter_groups"][headerIndex]["for_maps"] - - # for the encounter rate macros, so we don't worry about hidden mons here + if headerIndex == 0: wFields = wData["wild_encounter_groups"][headerIndex]["fields"] fieldCounter = 0 for field in wFields: - fieldData.append({}) - fieldData[fieldCounter]["name"] = field["type"] - fieldData[fieldCounter]["pascalName"] = GetPascalCase(field["type"]) - fieldData[fieldCounter]["snakeName"] = GetSnakeCase(field["type"]) - fieldData[fieldCounter]["encounter_rates"] = field["encounter_rates"] + if not CheckFieldDataDupes(field["type"]): + AddFieldData(fieldCounter, field["type"], field["encounter_rates"]) if "groups" in field: fieldData[fieldCounter]["groups"] = field["groups"] - if fieldCounter == len(wFields) - 1: - fieldData.append({}) - fieldData[fieldCounter + 1]["name"] = "hidden_mons" - fieldData[fieldCounter + 1]["pascalName"] = GetPascalCase("hidden_mons") - fieldData[fieldCounter + 1]["snakeName"] = GetSnakeCase("hidden_mons") + """ + hidden mons need a special bit of logic since they're not in the vanilla + wild_encounters.json file, but the code expects them to be there + """ + hidden_mons = "hidden_mons" + if (fieldCounter == len(wFields) - 1) and not CheckFieldDataDupes(hidden_mons): + hidden_dummy_rates = [1, 0] + AddFieldData(fieldCounter + 1, hidden_mons, hidden_dummy_rates) fieldCounter += 1 @@ -437,25 +438,28 @@ def PrintEncounterRateMacros(): return fieldCounter = 0 - # len(fieldData) - 1 here so we skip hidden_mons - while fieldCounter < len(fieldData) - 1: + while fieldCounter < len(fieldData): tempName = fieldData[fieldCounter]["name"].upper() if "groups" not in fieldData[fieldCounter]: rateCount = 0 - for percent in fieldData[fieldCounter]["encounter_rates"]: - if rateCount == 0: - print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {percent}") - else: - print( - f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount - 1} + {percent}" - ) - - if rateCount + 1 == len(fieldData[fieldCounter]["encounter_rates"]): - print( - f"{define} {ENCOUNTER_CHANCE}_{tempName}_{TOTAL} ({ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount})" - ) - - rateCount += 1 + if fieldData[fieldCounter]["encounter_rates"]: + for percent in fieldData[fieldCounter]["encounter_rates"]: + if not DEXNAV_ENABLED and tempName == "HIDDEN_MONS": + break + + if rateCount == 0: + print(f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {percent}") + else: + print( + f"{define} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount} {ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount - 1} + {percent}" + ) + + if rateCount + 1 == len(fieldData[fieldCounter]["encounter_rates"]): + print( + f"{define} {ENCOUNTER_CHANCE}_{tempName}_{TOTAL} ({ENCOUNTER_CHANCE}_{tempName}_{SLOT}_{rateCount})" + ) + + rateCount += 1 else: rates = fieldData[fieldCounter]["encounter_rates"] groups = fieldData[fieldCounter]["groups"] @@ -512,7 +516,7 @@ def GetMapGroupEnum(string, index = 0): """ get copied lhea :^ ) -- next three functions copied almost verbatim from @lhearachel's python scripts in tools/learnset_helpers +- next four functions copied almost verbatim from @lhearachel's python scripts in tools/learnset_helpers """ def PrintGeneratedWarningText(): print("//") @@ -530,6 +534,15 @@ def IsConfigEnabled(): return config_setting is not None and config_setting.group("cfg_val") in ("TRUE", "1") +def IsDexnavEnabled(): + CONFIG_ENABLED_PAT = re.compile(r"#define DEXNAV_ENABLED\s+(?P[^ ]*)") + + with open("./include/config/dexnav.h", "r") as overworld_config_file: + config_overworld = overworld_config_file.read() + config_setting = CONFIG_ENABLED_PAT.search(config_overworld) + return config_setting is not None and config_setting.group("cfg_val") in ("TRUE", "1") + + def GetTimeEnum(): DEFAULT_TIME_PAT = re.compile(r"enum\s+TimeOfDay\s*\{(?P[\s*\w+,\=\d*]+)\s*\}\s*\;") @@ -600,6 +613,21 @@ def GetSnakeCase(string): return snakeString +def CheckFieldDataDupes(name): + for field in fieldData: + if field["name"] == name: + return True + return False + + +def AddFieldData(index, fieldType, fieldRates): + fieldData.append({}) + fieldData[index]["name"] = fieldType + fieldData[index]["pascalName"] = GetPascalCase(fieldType) + fieldData[index]["snakeName"] = GetSnakeCase(fieldType) + fieldData[index]["encounter_rates"] = fieldRates + + def main(): pass @@ -651,6 +679,13 @@ def main(): #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) +- if DEXNAV_ENABLED is TRUE +- these macros are 1 and 0, respectively if hidden_mons isn't in the encounter + rate list at the top of wild_encounters.json +#define ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 1 +#define ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1 ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_0 + 0 +#define ENCOUNTER_CHANCE_HIDDEN_MONS_TOTAL (ENCOUNTER_CHANCE_HIDDEN_MONS_SLOT_1) + const struct WildPokemon gRoute101_LandMons_Day[] = { { 2, 2, SPECIES_WURMPLE }, From 37669e62aecf433bcf776df6c820e2eea56367c6 Mon Sep 17 00:00:00 2001 From: Bivurnum <147376167+Bivurnum@users.noreply.github.com> Date: Fri, 30 May 2025 10:41:02 -0500 Subject: [PATCH 173/187] Bug fix: setfollowernpc macro no longer runs when FNPC_ENABLE_NPC_FOLLOWERS is FALSE (#6755) Co-authored-by: Bassoonian --- asm/macros/event.inc | 41 +++++++++++++++++++++++++---------------- src/follower_npc.c | 37 ++++++++++++++++++++++--------------- 2 files changed, 47 insertions(+), 31 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 6514887aad..d3c1442f56 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -2573,28 +2573,37 @@ @ Follower flags are defined in include/constants/follower_npc.h @ If you want to specify a battle partner without specifying a custom script, you can set the script parameter to 0. .macro setfollowernpc localId:req, flags:req, script=0, battlePartner=0 - checkfollowernpc - goto_if_eq VAR_RESULT, TRUE, 1f - hidefollower - delay 16 - callnative ScriptSetFollowerNPC - .if \script == 0 - .set setScript, FALSE + .if FNPC_ENABLE_NPC_FOLLOWERS + checkfollowernpc + compare VAR_RESULT, FALSE + goto_if_ne 1f + hidefollower + waitmovement OBJ_EVENT_ID_FOLLOWER + callnative ScriptSetFollowerNPC + .if \script == 0 + .set setScript, FALSE + .else + .set setScript, TRUE + .endif + .byte \localId + .2byte \flags + .byte setScript + .2byte \battlePartner + .4byte \script + updatefollowingmon + 1: .else - .set setScript, TRUE + .error "setfollowernpc unavailable with FNPC_ENABLE_NPC_FOLLOWERS defined as FALSE" .endif - .byte \localId - .2byte \flags - .byte setScript - .2byte \battlePartner - .4byte \script - updatefollowingmon - 1: .endm @ Remove the follower NPC (assumes there will only ever be one). .macro destroyfollowernpc - callnative ScriptDestroyFollowerNPC + .if FNPC_ENABLE_NPC_FOLLOWERS + callnative ScriptDestroyFollowerNPC + .else + .error "destroyfollowernpc unavailable with FNPC_ENABLE_NPC_FOLLOWERS defined as FALSE" + .endif .endm @ Makes the player and follower NPC face one another. diff --git a/src/follower_npc.c b/src/follower_npc.c index ae4cc795f0..40b08cb365 100644 --- a/src/follower_npc.c +++ b/src/follower_npc.c @@ -1628,25 +1628,27 @@ void ScriptSetFollowerNPC(struct ScriptContext *ctx) void ScriptDestroyFollowerNPC(struct ScriptContext *ctx) { - if (PlayerHasFollowerNPC()) - { - RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); - FlagSet(GetFollowerNPCData(FNPC_DATA_EVENT_FLAG)); - ClearFollowerNPCData(); - } + if (!PlayerHasFollowerNPC()) + return; + RemoveObjectEvent(&gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]); + FlagSet(GetFollowerNPCData(FNPC_DATA_EVENT_FLAG)); + ClearFollowerNPCData(); UpdateFollowingPokemon(); } void ScriptFaceFollowerNPC(struct ScriptContext *ctx) { - if (PlayerHasFollowerNPC()) - { - u32 playerDirection, followerDirection; - struct ObjectEvent *player, *follower; + if (!FNPC_ENABLE_NPC_FOLLOWERS || !PlayerHasFollowerNPC()) + return; + + u32 playerDirection, followerDirection; + struct ObjectEvent *player, *follower; + player = &gObjectEvents[gPlayerAvatar.objectEventId]; + follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; - player = &gObjectEvents[gPlayerAvatar.objectEventId]; - follower = &gObjectEvents[GetFollowerNPCData(FNPC_DATA_OBJ_ID)]; + if (follower->invisible == FALSE) + { playerDirection = DetermineFollowerNPCDirection(player, follower); followerDirection = playerDirection; @@ -1682,10 +1684,13 @@ static const u8 *const FollowerNPCHideMovementsSpeedTable[][4] = void ScriptHideNPCFollower(struct ScriptContext *ctx) { + if (!FNPC_ENABLE_NPC_FOLLOWERS || !PlayerHasFollowerNPC()) + return; + u32 walkSpeed = ScriptReadByte(ctx); struct ObjectEvent *npc = &gObjectEvents[GetFollowerNPCObjectId()]; - if (PlayerHasFollowerNPC() && npc->invisible == FALSE) + if (npc->invisible == FALSE) { u32 direction = DetermineFollowerNPCDirection(&gObjectEvents[gPlayerAvatar.objectEventId], npc); @@ -1709,8 +1714,10 @@ void ScriptUpdateFollowingMon(struct ScriptContext *ctx) void ScriptChangeFollowerNPCBattlePartner(struct ScriptContext *ctx) { + if (!FNPC_ENABLE_NPC_FOLLOWERS || !PlayerHasFollowerNPC()) + return; + u32 newBattlePartner = ScriptReadHalfword(ctx); - if (PlayerHasFollowerNPC()) - SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, newBattlePartner); + SetFollowerNPCData(FNPC_DATA_BATTLE_PARTNER, newBattlePartner); } From 555bda4e6692daa761fa4a19831fe10e9eb2ce7d Mon Sep 17 00:00:00 2001 From: cawtds <38510667+cawtds@users.noreply.github.com> Date: Fri, 30 May 2025 20:00:25 +0200 Subject: [PATCH 174/187] Fix UB when using time menu (#7023) --- src/debug.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/debug.c b/src/debug.c index 5f05d4f50c..5a585ef62d 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1922,20 +1922,28 @@ static void DebugAction_Util_OpenTimeMenu(u8 taskId) static void DebugAction_TimeMenu_TimesOfDay(u8 taskId) { - Debug_DestroyMenu_Full(taskId); if (!OW_USE_FAKE_RTC) + { Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FakeRTCNotEnabled); + } else + { + Debug_DestroyMenu_Full(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_TimesOfDay, sDebugMenu_ListTemplate_TimeMenu_TimesOfDay); + } } static void DebugAction_TimeMenu_Weekdays(u8 taskId) { - Debug_DestroyMenu_Full(taskId); if (!OW_USE_FAKE_RTC) + { Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_FakeRTCNotEnabled); + } else + { + Debug_DestroyMenu_Full(taskId); Debug_ShowMenu(DebugTask_HandleMenuInput_TimeMenu_Weekdays, sDebugMenu_ListTemplate_TimeMenu_Weekdays); + } } static void DebugAction_OpenPlayerMenu(u8 taskId) @@ -2384,7 +2392,6 @@ void BufferExpansionVersion(struct ScriptContext *ctx) static void DebugAction_TimeMenu_PrintTime(u8 taskId) { - Debug_DestroyMenu_Full(taskId); LockPlayerFieldControls(); Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_TellTheTime); } @@ -2410,7 +2417,6 @@ void DebugMenu_CalculateTime(struct ScriptContext *ctx) static void DebugAction_TimeMenu_PrintTimeOfDay(u8 taskId) { - Debug_DestroyMenu_Full(taskId); LockPlayerFieldControls(); Debug_DestroyMenu_Full_Script(taskId, Debug_EventScript_PrintTimeOfDay); } From acb4a9cf6266ffad7b52ae33f18cfb09c490c555 Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 30 May 2025 20:15:56 +0200 Subject: [PATCH 175/187] Expansion 1.11.4 --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 3 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 3 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 4 +- README.md | 2 +- docs/SUMMARY.md | 1 + docs/changelogs/1.11.x/1.11.4.md | 45 +++++++++++++++++++ include/constants/expansion.h | 4 +- 7 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 docs/changelogs/1.11.x/1.11.4.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 93079a6439..3dc0735813 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.3 (Latest release) + - 1.11.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.3 - 1.11.2 - 1.11.1 - 1.11.0 diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index 5525931aaf..1053a2e805 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,9 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.3 (Latest release) + - 1.11.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.3 - 1.11.2 - 1.11.1 - 1.11.0 diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index 8adf1a6882..20c4984eb3 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,10 +43,10 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.3 (Latest release) + - 1.11.4 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) - - 1.11.2 + - 1.11.3 - 1.11.1 - 1.11.0 - 1.10.3 diff --git a/README.md b/README.md index 8737b96e44..da5af472fe 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.11.3 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.11.4 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 1a551b955e..5c23e99ad2 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -17,6 +17,7 @@ - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Changelog](./CHANGELOG.md) - [1.11.x]() + - [Version 1.11.4](changelogs/1.11.x/1.11.4.md) - [Version 1.11.3](changelogs/1.11.x/1.11.3.md) - [Version 1.11.2](changelogs/1.11.x/1.11.2.md) - [Version 1.11.1](changelogs/1.11.x/1.11.1.md) diff --git a/docs/changelogs/1.11.x/1.11.4.md b/docs/changelogs/1.11.x/1.11.4.md new file mode 100644 index 0000000000..051323075d --- /dev/null +++ b/docs/changelogs/1.11.x/1.11.4.md @@ -0,0 +1,45 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.11.4 +`. +``` + + +## πŸ‰ PokΓ©mon πŸ‰ +### Fixed +* Fixed `CreateMon` param order in `CreateFacilityMon` by @PCG06 in [#6989](https://github.com/rh-hideout/pokeemerald-expansion/pull/6989) + - Fixed `CreateMon` param order in `CreateFacilityMon`. + +## βš”οΈ Battle General βš”οΈ +### Fixed +* Fix Eiscue not resetting back to Ice Face form after battle. by @DarkVexon in [#6997](https://github.com/rh-hideout/pokeemerald-expansion/pull/6997) +* Fixes spread move fire types not defrosting all targets by @AlexOn1ine in [#6998](https://github.com/rh-hideout/pokeemerald-expansion/pull/6998) +* Update Supersweet Syrup with eject pack fix by @AlexOn1ine in [#7015](https://github.com/rh-hideout/pokeemerald-expansion/pull/7015) +* fix battle controller macros by @cawtds in [#7021](https://github.com/rh-hideout/pokeemerald-expansion/pull/7021) + + +## πŸ§ͺ Test Runner πŸ§ͺ +### Fixed +* Fix out-of-bounds in Heal Bell Cures Entire Party test by @rayrobdod in [#7011](https://github.com/rh-hideout/pokeemerald-expansion/pull/7011) + + +## πŸ“¦ Branch Synchronisation πŸ“¦ +### pret +* 27th of May, 2025 in [#6995](https://github.com/rh-hideout/pokeemerald-expansion/pull/6995) + * Fix defines in MAP_NUM and MAP_GROUP by @Bassoonian in [pret#2023](https://github.com/pret/pokeemerald/pull/2023) + * Change metatile behaviors to enum by @pkmnsnfrn in [pret#2027](https://github.com/pret/pokeemerald/pull/2027) + * Move heal locations data to their associated map.json by @GriffinRichards in [pret#2034](https://github.com/pret/pokeemerald/pull/2034) + * Generate local IDs from map.json files by @GriffinRichards in [pret#2047](https://github.com/pret/pokeemerald/pull/2047) + * Generate MAPSEC constants from JSON by @GriffinRichards in [pret#2063](https://github.com/pret/pokeemerald/pull/2063) + * Generate heal location constants automatically by @GriffinRichards in [pret#2101](https://github.com/pret/pokeemerald/pull/2101) + * Update for Porymap 6 by @GriffinRichards in [pret#2141](https://github.com/pret/pokeemerald/pull/2141) +* 29th of May, 2025 in [#7012](https://github.com/rh-hideout/pokeemerald-expansion/pull/7012) + * Update for Porymap 6 by @GriffinRichards in [pret#2141](https://github.com/pret/pokeemerald/pull/2141) + + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.11.3...expansion/1.11.4 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index ce8b3fdefa..59618ad155 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,13 +1,13 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.11.3 +// Last version: 1.11.4 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 11 #define EXPANSION_VERSION_PATCH 4 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE FALSE +#define EXPANSION_TAGGED_RELEASE TRUE #endif From efa2fb3be7ba31d2487990259b466d5095a04a9a Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 30 May 2025 20:53:32 +0200 Subject: [PATCH 176/187] Expansion 1.12.0 --- .../ISSUE_TEMPLATE/01_battle_engine_bugs.yaml | 9 +- .../ISSUE_TEMPLATE/02_battle_ai_issues.yaml | 9 +- .github/ISSUE_TEMPLATE/04_other_errors.yaml | 9 +- README.md | 2 +- docs/SUMMARY.md | 2 + docs/changelogs/1.12.x/1.12.0.md | 464 ++++++++++++++++++ include/constants/expansion.h | 2 +- 7 files changed, 477 insertions(+), 20 deletions(-) create mode 100644 docs/changelogs/1.12.x/1.12.0.md diff --git a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml index 710cb1706b..da15109c8c 100644 --- a/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml +++ b/.github/ISSUE_TEMPLATE/01_battle_engine_bugs.yaml @@ -42,18 +42,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.4 (Latest release) + - 1.12.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.4 - 1.11.3 - 1.11.2 - 1.11.1 - 1.11.0 - - 1.10.3 - - 1.10.2 - - 1.10.1 - - 1.10.0 - - pre-1.10.0 + - pre-1.11.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml index b711d2f047..7b1a489cfb 100644 --- a/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml +++ b/.github/ISSUE_TEMPLATE/02_battle_ai_issues.yaml @@ -43,18 +43,15 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.4 (Latest release) + - 1.12.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.4 - 1.11.3 - 1.11.2 - 1.11.1 - 1.11.0 - - 1.10.3 - - 1.10.2 - - 1.10.1 - - 1.10.0 - - pre-1.10.0 + - pre-1.11.0 validations: required: true - type: input diff --git a/.github/ISSUE_TEMPLATE/04_other_errors.yaml b/.github/ISSUE_TEMPLATE/04_other_errors.yaml index dbc1a5f8d3..197791a776 100644 --- a/.github/ISSUE_TEMPLATE/04_other_errors.yaml +++ b/.github/ISSUE_TEMPLATE/04_other_errors.yaml @@ -43,17 +43,14 @@ body: label: Version description: What version of pokeemerald-expansion are you using? options: - - 1.11.4 (Latest release) + - 1.12.0 (Latest release) - master (default, unreleased bugfixes) - upcoming (Edge) + - 1.11.4 - 1.11.3 - 1.11.1 - 1.11.0 - - 1.10.3 - - 1.10.2 - - 1.10.1 - - 1.10.0 - - pre-1.10.0 + - pre-1.11.0 validations: required: true - type: input diff --git a/README.md b/README.md index 13fee3a53e..626eea5d7e 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you use **`pokeemerald-expansion`**, please credit **RHH (Rom Hacking Hideout)**. Optionally, include the version number for clarity. ``` -Based off RHH's pokeemerald-expansion 1.11.4 https://github.com/rh-hideout/pokeemerald-expansion/ +Based off RHH's pokeemerald-expansion 1.12.0 https://github.com/rh-hideout/pokeemerald-expansion/ ``` Please consider [crediting all contributors](CREDITS.md) involved in the project! diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index 11d7f76d55..fa03ca20ee 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -19,6 +19,8 @@ - [How to add new Trainer Slides](tutorials/how_to_new_trainer_slide.md) - [Day/Night System FAQ](tutorials/dns.md) - [Changelog](./CHANGELOG.md) + - [1.12.x]() + - [Version 1.12.0](changelogs/1.12.x/1.12.0.md) - [1.11.x]() - [Version 1.11.4](changelogs/1.11.x/1.11.4.md) - [Version 1.11.3](changelogs/1.11.x/1.11.3.md) diff --git a/docs/changelogs/1.12.x/1.12.0.md b/docs/changelogs/1.12.x/1.12.0.md new file mode 100644 index 0000000000..b223e040da --- /dev/null +++ b/docs/changelogs/1.12.x/1.12.0.md @@ -0,0 +1,464 @@ +```md +## How to update +- If you haven't set up a remote, run the command `git remote add RHH https://github.com/rh-hideout/pokeemerald-expansion`. +- Once you have your remote set up, run the command `git pull RHH expansion/1.12.0 +`. +``` + +## πŸŒ‹ *REFACTORS* πŸŒ‹ +πŸ“œ = Uses a migration script. +* Minor Recoil Effect refactor by @AlexOn1ine in [#6409](https://github.com/rh-hideout/pokeemerald-expansion/pull/6409) +* Refactor HasWeatherEffect and IsUnnerveAbilityOnOpposingSide by @AlexOn1ine in [#6441](https://github.com/rh-hideout/pokeemerald-expansion/pull/6441) +* Refactor the function IsAbilityPreventingEscape by @AlexOn1ine in [#6439](https://github.com/rh-hideout/pokeemerald-expansion/pull/6439) +* Unifies dynamic move category checks by @AlexOn1ine in [#6443](https://github.com/rh-hideout/pokeemerald-expansion/pull/6443) +* Refactors faint target abilities and adds Battle Bond config by @AlexOn1ine in [#6519](https://github.com/rh-hideout/pokeemerald-expansion/pull/6519) +* Refactor protect to allow at least 126 different types of protect eff… by @AlexOn1ine in [#6506](https://github.com/rh-hideout/pokeemerald-expansion/pull/6506) +* Refactor / Simlify Cmd_adjustdamage and remove redundancy by @AlexOn1ine in [#6499](https://github.com/rh-hideout/pokeemerald-expansion/pull/6499) +* Refactors Move absorb / block function calls to remove redundancy by @AlexOn1ine in [#6490](https://github.com/rh-hideout/pokeemerald-expansion/pull/6490) +* Refactor fixed damage moves by @AlexOn1ine in [#6449](https://github.com/rh-hideout/pokeemerald-expansion/pull/6449) +* EndTurnEffectOrder Refactor by @AlexOn1ine in [#6224](https://github.com/rh-hideout/pokeemerald-expansion/pull/6224) +* Refactor hit escape moves to use moveend by @AlexOn1ine in [#6671](https://github.com/rh-hideout/pokeemerald-expansion/pull/6671) +* πŸ“œ Evolution Refactor by @khbsd, @AsparagusEduardo for everything he did, including #6530! and @AlexOn1ine for writing the migration script! in [#6556](https://github.com/rh-hideout/pokeemerald-expansion/pull/6556) + - make sure to back up your alcremie evolution data if you have it implemented already: pulling this will overwrite it +* Centralizes non volatile status effect checks by @AlexOn1ine in [#6533](https://github.com/rh-hideout/pokeemerald-expansion/pull/6533) +* Refactor battler flee and watch options + clean up by @AlexOn1ine in [#6724](https://github.com/rh-hideout/pokeemerald-expansion/pull/6724) +* Refactor AI flags to u64 by @Pawkkie and @DizzyEggg, @AlexOn1ine, @hedara90 in [#6753](https://github.com/rh-hideout/pokeemerald-expansion/pull/6753) +* Refactor battler message ids by @AlexOn1ine in [#6765](https://github.com/rh-hideout/pokeemerald-expansion/pull/6765) +* Refactor stockpile resets by @AlexOn1ine in [#6810](https://github.com/rh-hideout/pokeemerald-expansion/pull/6810) +* Move out ai structs out of BattleResources by @AlexOn1ine in [#6741](https://github.com/rh-hideout/pokeemerald-expansion/pull/6741) +* Consolidates a bunch of battle controller functions by @Bassoonian in [#6838](https://github.com/rh-hideout/pokeemerald-expansion/pull/6838) +* Further moveend changes (move blocks) by @AlexOn1ine in [#6820](https://github.com/rh-hideout/pokeemerald-expansion/pull/6820) +* Added weather accuracy move flags by @AsparagusEduardo in [#6857](https://github.com/rh-hideout/pokeemerald-expansion/pull/6857) + - Removed `EFFECT_THUNDER`, `EFFECT_BLIZZARD` and `EFFECT_RAIN_ALWAYS_HIT` effects in favor of `alwaysHitsInRain`, `alwaysHitsInHailSnow` and `accuracy50InSun` move flags. +* Remove non-volatile status EFFECTs by @AsparagusEduardo in [#6772](https://github.com/rh-hideout/pokeemerald-expansion/pull/6772) +* πŸ“œ Remove compressed palettes by @hedara90 in [#6455](https://github.com/rh-hideout/pokeemerald-expansion/pull/6455) + - All handling for compressed palettes has been removed, use `u16 *` for palettes instead. + - Has migration script to convert palettes to `u16`, `struct SpritePalette` and palette loading calls from their compressed variants. + +## 🧬 General 🧬 +### Added +* Low Health Beeps Configuration by @khbsd in [#6328](https://github.com/rh-hideout/pokeemerald-expansion/pull/6328) +* Adds SHOW_TYPES_SEEN to the B_SHOW_TYPES option by @khbsd in [#6561](https://github.com/rh-hideout/pokeemerald-expansion/pull/6561) + - this slightly alters how the flag `FLAG_GET_SEEN` is set, so keep that in mind if you have any functionality that relies on it being at the start of the battle. +* Type Effectiveness Indicators when selecting moves by @agsmgmaster64 in [#6559](https://github.com/rh-hideout/pokeemerald-expansion/pull/6559) +* FakeRtc datetime and ResetRtcScreen day increments by @cawtds in [#5695](https://github.com/rh-hideout/pokeemerald-expansion/pull/5695) +* Battle Transition: mugshots for multibattles by @grintoul1 and @AlexOn1ine for advice on simplifying the conditions that check for 2nd opponent and presence of battle partner, and general advice/troubleshooting in [#6567](https://github.com/rh-hideout/pokeemerald-expansion/pull/6567) +* Time menu for RTC in debug menu. by @RubyRaven6, @cawtds for RTC refactors that makes all of this easier, @HashtagMarky for helping me understand how the debug menu works, especially with destroying menus, @zetraphes, for helping with refactoring the redundant functions into a single function. and @makosear for originally getting me into the RTC hellhole in [#6634](https://github.com/rh-hideout/pokeemerald-expansion/pull/6634) + - In order to apply the new time the map is reloaded through The LoadMap Callback (CB2_LoadMap). As such, this will also do everything else that comes with loading map in. +* Pokedex Plus HGSS move configs by @PCG06 in [#6687](https://github.com/rh-hideout/pokeemerald-expansion/pull/6687) + Adds three configs for Pokedex Plus HGSS. + - To sort TM moves by num. + - To show egg moves for evolved PokΓ©mon. + - Creating a dynamic tutor moves array to use for tutor moves counting. +* Allow different flags for Badge boost by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6805](https://github.com/rh-hideout/pokeemerald-expansion/pull/6805) +* Timemacros by @RubyRaven6 in [#6696](https://github.com/rh-hideout/pokeemerald-expansion/pull/6696) + +### Changed +* Rename absentBattlerFlags to absent by @AlexOn1ine in [#6432](https://github.com/rh-hideout/pokeemerald-expansion/pull/6432) +* Removed unused debug EWRAM variables by @hedara90 in [#6468](https://github.com/rh-hideout/pokeemerald-expansion/pull/6468) +* Removes unused Special Status members by @AlexOn1ine in [#6479](https://github.com/rh-hideout/pokeemerald-expansion/pull/6479) +* Remove potential pitfall with saved damage for recoil moves by @AlexOn1ine in [#6485](https://github.com/rh-hideout/pokeemerald-expansion/pull/6485) +* Add CONTRIBUTING.md and STYLEGUIDE.md by @pkmnsnfrn and @Pawkkie, @garakmon in [#6340](https://github.com/rh-hideout/pokeemerald-expansion/pull/6340) +* Alcremie Evolution clean up follow up by @AlexOn1ine in [#6557](https://github.com/rh-hideout/pokeemerald-expansion/pull/6557) +* Fix broken links in merge_checklist.md by @pkmnsnfrn and @grintoul1 in [#6570](https://github.com/rh-hideout/pokeemerald-expansion/pull/6570) +* Converts some defines to enums by @Bassoonian in [#6592](https://github.com/rh-hideout/pokeemerald-expansion/pull/6592) +* Removes vestigial EWRAM variable from debug menu. by @RubyRaven6 in [#6686](https://github.com/rh-hideout/pokeemerald-expansion/pull/6686) +* Keep Steven Multi Debug Option at the Bottom Forever by @Pawkkie in [#6694](https://github.com/rh-hideout/pokeemerald-expansion/pull/6694) +* Better handling of battle coords by @AsparagusEduardo and @ghoulslash, @klemniops for the original code. in [#6787](https://github.com/rh-hideout/pokeemerald-expansion/pull/6787) +* `battle_main` enum cleanup by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6788](https://github.com/rh-hideout/pokeemerald-expansion/pull/6788) +* Add missing uses of `IsBattlerAlly` by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6793](https://github.com/rh-hideout/pokeemerald-expansion/pull/6793) +* Adds partyState to BattleStruct by @AlexOn1ine in [#6783](https://github.com/rh-hideout/pokeemerald-expansion/pull/6783) +* Rename `GetPartyBattlerData` to `GetBattlerMon` by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6800](https://github.com/rh-hideout/pokeemerald-expansion/pull/6800) +* Added JSON as the preferred data format by @hedara90 in [#6801](https://github.com/rh-hideout/pokeemerald-expansion/pull/6801) +* Remove non-existent functions from header files by @Bassoonian in [#6825](https://github.com/rh-hideout/pokeemerald-expansion/pull/6825) +* Added `IsOnPlayerSide` by @AsparagusEduardo in [#6832](https://github.com/rh-hideout/pokeemerald-expansion/pull/6832) +* Battle TV expansion by @AsparagusEduardo in [#6826](https://github.com/rh-hideout/pokeemerald-expansion/pull/6826) +* Prevent scaninc touching tests when `make`-ing non-test builds by @mudskipper13 in [#6812](https://github.com/rh-hideout/pokeemerald-expansion/pull/6812) +* Reword move and ability descriptions to improve clarity by @jfb1337 in [#6861](https://github.com/rh-hideout/pokeemerald-expansion/pull/6861) + - Updated move and ability descriptions to increase clarity. +* Optimized `PokemonUseItemEffects` function by @AsparagusEduardo in [#6878](https://github.com/rh-hideout/pokeemerald-expansion/pull/6878) +* Expand trainerproc to support additional battle types by @AsparagusEduardo in [#6770](https://github.com/rh-hideout/pokeemerald-expansion/pull/6770) +* Debug menu cleanup by @AsparagusEduardo in [#6881](https://github.com/rh-hideout/pokeemerald-expansion/pull/6881) +* Commenting in config files to explain limits of map popups and wild AI flags by @surskitty in [#6923](https://github.com/rh-hideout/pokeemerald-expansion/pull/6923) +* Documented usage of `createsprite gSimplePaletteBlendSpriteTemplate` by @AsparagusEduardo in [#6956](https://github.com/rh-hideout/pokeemerald-expansion/pull/6956) +* Documented usage of `createsprite gDirtPlumeSpriteTemplate` by @AsparagusEduardo in [#6954](https://github.com/rh-hideout/pokeemerald-expansion/pull/6954) +* Updated CONTRIBUTING.md and Merge Freeze definition by @pkmnsnfrn in [#6952](https://github.com/rh-hideout/pokeemerald-expansion/pull/6952) +* Documented usage of `createsprite gBasicHitSplatSpriteTemplate` by @AsparagusEduardo in [#6950](https://github.com/rh-hideout/pokeemerald-expansion/pull/6950) +* Documented usage of `createsprite gSparkElectricitySpriteTemplate` by @AsparagusEduardo in [#6955](https://github.com/rh-hideout/pokeemerald-expansion/pull/6955) +* Documented usage of `createsprite gSlideMonToOffsetSpriteTemplate` by @AsparagusEduardo in [#6953](https://github.com/rh-hideout/pokeemerald-expansion/pull/6953) +* Remove trailing whitespace by @AsparagusEduardo in [#6968](https://github.com/rh-hideout/pokeemerald-expansion/pull/6968) +* Beefing up the DNS tutorial for some of the common questions/errors. by @surskitty in [#6922](https://github.com/rh-hideout/pokeemerald-expansion/pull/6922) +* Clarifies when to use each merge type for maintainers by @pkmnsnfrn in [#6999](https://github.com/rh-hideout/pokeemerald-expansion/pull/6999) +* Moved time constants to dedicated files by @pkmnsnfrn in [#7019](https://github.com/rh-hideout/pokeemerald-expansion/pull/7019) + +### Fixed +* fix: missing break statement by @khbsd in [#6572](https://github.com/rh-hideout/pokeemerald-expansion/pull/6572) +* Fix dynamax message by @hedara90 in [#6589](https://github.com/rh-hideout/pokeemerald-expansion/pull/6589) +* Fix pc mon pic by @hedara90 in [#6709](https://github.com/rh-hideout/pokeemerald-expansion/pull/6709) +* Fixed upcoming not compiling in gcc 11.4.0 by @AsparagusEduardo in [#6710](https://github.com/rh-hideout/pokeemerald-expansion/pull/6710) +* Fix the Move Item option in the PC still expecting compressed palettes by @hedara90 in [#6739](https://github.com/rh-hideout/pokeemerald-expansion/pull/6739) +* Fix upcoming compile by @AsparagusEduardo in [#6804](https://github.com/rh-hideout/pokeemerald-expansion/pull/6804) +* Added missing root folder check in trainer battle type migration script by @AsparagusEduardo in [#6944](https://github.com/rh-hideout/pokeemerald-expansion/pull/6944) +* Fixed forfeit money for `B_WHITEOUT_MONEY <= GEN_3` by @AsparagusEduardo in [#6942](https://github.com/rh-hideout/pokeemerald-expansion/pull/6942) +* Fix UB when using time menu by @cawtds in [#7023](https://github.com/rh-hideout/pokeemerald-expansion/pull/7023) + +## πŸ—ΊοΈ Overworld πŸ—ΊοΈ +### Added +* Add OW_DEFOG_FIELD_MOVE to allow players to clear overworld Fog by @pkmnsnfrn in [#6477](https://github.com/rh-hideout/pokeemerald-expansion/pull/6477) + This behavior is enabled by setting `OW_DEFOG_FIELD_MOVE` to `TRUE`. +* Add Time-Based Encounters by @khbsd and @Pawkkie, @Artrios, @GriffinRichards, @ravepossum, @ghoulslash, @lhearachel probably more so tag me somewhere and ill add you! in [#6454](https://github.com/rh-hideout/pokeemerald-expansion/pull/6454) + - Comes with a new conversion script, `wild_encounters_to_header.py`. On my machine i timed it out to about .02s, hopefully it wont add too much to the compile time on anyone elses computers + - The conversion script can handle an unchanged `wild_encounters.json` just fine, but also plays nice with edited ones as far as I can tell + - The migration script takes one optional argument, `--copy` + - `--copy` will copy over all of the encounter tables (`land_mons`, `water_mons`, etc). default behavior just adds the `base_label` and if applicable, the `map`. +* Add B_RUN_TRAINER_BATTLE - players can run from Trainer Battles by @pkmnsnfrn and @wiz1989 [wrote the original feature](https://github.com/TeamAquasHideout/pokeemerald/commit/19c0c32e3718d4fab340cf4f15f29882916a829e). in [#6456](https://github.com/rh-hideout/pokeemerald-expansion/pull/6456) +* Integrated merrp's lighting branch (Day/Night System) by @hedara90, @AsparagusEduardo for doing most of this PR and @aarant for the original implementation and feature branch, @Greenphx9 for their help merging to current expansion. in [#6562](https://github.com/rh-hideout/pokeemerald-expansion/pull/6562) + - Changes from the base branch: + - Uses Expansion's Fake RTC and updates its tinting refresh rate alongside with it. + - Uses Expansion's constants (`TIME_NIGHT` instead of `TIME_OF_DAY_NIGHT`). This allows it to: + - Use different tinting for Morning vs Evening compared to the original branch. + - Use Expansion's `OW_TIMES_OF_DAY`config that allows users to set their own times by generation. + - Added option to disable object event shadows + - Added option to turn DNS on or off, `OW_ENABLE_DNS` + - Added option to for vanilla shadow behaviour, `OW_OBJECT_VANILLA_SHADOWS` + - Scripts containing consecutive `removeobject and `addobject ` needs a `delay 1` between the commands. + ```diff + removeobject MY_OBJECT + + delay 1 + addobject MY_OBJECT + ``` + - Changes to base Hoenn to integrate DNS can be enabled by reverting commit [a5b079d](https://github.com/rh-hideout/pokeemerald-expansion/pull/6562/commits/a5b079d833f18f66ebd53ac77f00227ae4a1f389) + - Other changes: + - Changed the BW Map Popup to update its time while active. +* Follower NPCs (follow-me) by @Bivurnum, @ghoulslash Much of their original code is still present. and @grintoul1 Invaluable play testing and feedback. in [#6500](https://github.com/rh-hideout/pokeemerald-expansion/pull/6500) + - Turn any NPC into a follower. + - Specify a battle partner to turn all trainer battles into multi battles automatically while an NPC follower is present. + +### Changed +* Add Time-Based Encounter Tutorial by @khbsd and @Pawkkie (ty for reviewing!!) in [#6568](https://github.com/rh-hideout/pokeemerald-expansion/pull/6568) +* Remove vestigial AdvanceScript function used for testing by @RubyRaven6 in [#6664](https://github.com/rh-hideout/pokeemerald-expansion/pull/6664) +* Rename follower npc macros for better specificity and to match documentation by @Bivurnum in [#6742](https://github.com/rh-hideout/pokeemerald-expansion/pull/6742) +* Add follower NPC documentation by @Bivurnum in [#6704](https://github.com/rh-hideout/pokeemerald-expansion/pull/6704) + +### Fixed +* Fixed DNS off config sometimes breaking palettes on map change by @hedara90 in [#6603](https://github.com/rh-hideout/pokeemerald-expansion/pull/6603) +* Fixed objects not getting unloaded properly when event flags are set by @Bivurnum in [#6715](https://github.com/rh-hideout/pokeemerald-expansion/pull/6715) +* Bug fix: add proper elevation handling for npc followers by @Bivurnum in [#6871](https://github.com/rh-hideout/pokeemerald-expansion/pull/6871) +* fix: avoid unexpected data shifting by removing preproc'd array size by @khbsd in [#6916](https://github.com/rh-hideout/pokeemerald-expansion/pull/6916) +* Fix OW_POPUP_BW_TIME_MODE burning a lot of cycles due to RTC queries. by @SBird1337 in [#6974](https://github.com/rh-hideout/pokeemerald-expansion/pull/6974) + - Fixed an issue that causes the game to lag in some configurations that involve `OW_POPUP_BW_TIME_MODE`. +* Make setobjextxy work with npc followers during ON_WARP map script by @Bivurnum in [#6913](https://github.com/rh-hideout/pokeemerald-expansion/pull/6913) +* `removeobject` and `removeobjectat` macros work properly with npc followers by @Bivurnum in [#6889](https://github.com/rh-hideout/pokeemerald-expansion/pull/6889) +* Fixes follower NPC not changing state with player after warp by @Bivurnum in [#7009](https://github.com/rh-hideout/pokeemerald-expansion/pull/7009) +* Fixed follower NPC changing to surf sprite when choosing not to surface from dive by @Bivurnum in [#7010](https://github.com/rh-hideout/pokeemerald-expansion/pull/7010) +* Fix follower NPC not reappearing after Mossdeep gym warp by @Bivurnum in [#7014](https://github.com/rh-hideout/pokeemerald-expansion/pull/7014) +* Fixed surf blob binding to invisible follower NPC on map reload by @Bivurnum in [#7013](https://github.com/rh-hideout/pokeemerald-expansion/pull/7013) +* fix: better area mons handling, no longer duplicates `hiddenMons` field by @khbsd in [#6945](https://github.com/rh-hideout/pokeemerald-expansion/pull/6945) +* Bug fix: setfollowernpc macro no longer runs when FNPC_ENABLE_NPC_FOLLOWERS is FALSE by @Bivurnum in [#6755](https://github.com/rh-hideout/pokeemerald-expansion/pull/6755) + +## πŸ‰ PokΓ©mon πŸ‰ +### Added +* Configuration to scale Critical Capture odds based on local Pokedex or estimated National Pokedex by @surskitty in [#6250](https://github.com/rh-hideout/pokeemerald-expansion/pull/6250) +* Add B_ANIMATE_MON_AFTER_KO - mons animate after scoring a KO by @pkmnsnfrn and @NicoSwag [wrote the original feature](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/Make-Pok%C3%A9mon-animate-after-a-KO). in [#6451](https://github.com/rh-hideout/pokeemerald-expansion/pull/6451) + - This can be disabled by setting `B_ANIMATE_MON_AFTER_KO` to `FALSE`. +* Add OW_DEFOG_FIELD_MOVE to allow players to clear overworld Fog by @pkmnsnfrn in [#6477](https://github.com/rh-hideout/pokeemerald-expansion/pull/6477) + This behavior is enabled by setting `OW_DEFOG_FIELD_MOVE` to `TRUE`. +* Add "Move Item" option in party menu by @AsparagusEduardo in [#6758](https://github.com/rh-hideout/pokeemerald-expansion/pull/6758) + +### Changed +* Implemented Alcremie Evolution Method by @AsparagusEduardo in [#6530](https://github.com/rh-hideout/pokeemerald-expansion/pull/6530) +* Make form change methods into enum + type checking by @Bassoonian in [#6631](https://github.com/rh-hideout/pokeemerald-expansion/pull/6631) +* Remove hardcoded values from wild_encounter.h generation by @khbsd and @moostoet and @/Nopinou on discord for reporting bugs and dealing with my ping spam <3 in [#6640](https://github.com/rh-hideout/pokeemerald-expansion/pull/6640) +* Evolution Refactor by @khbsd, @AsparagusEduardo for everything he did, including #6530! and @AlexOn1ine for writing the migration script! in [#6556](https://github.com/rh-hideout/pokeemerald-expansion/pull/6556) + - make sure to back up your alcremie evolution data if you have it implemented already: pulling this will overwrite it +* Disable `P_TUTOR_MOVES_ARRAY` config by @PCG06 in [#6693](https://github.com/rh-hideout/pokeemerald-expansion/pull/6693) + - `P_TUTOR_MOVES_ARRAY` set to `FALSE` by default. + +### Fixed +* Change HasTwoFramesAnimation to take into account species with 1 frame by @hedara90 in [#6655](https://github.com/rh-hideout/pokeemerald-expansion/pull/6655) +* Fix Rage Fist evolution method by @AsparagusEduardo in [#6937](https://github.com/rh-hideout/pokeemerald-expansion/pull/6937) +* Fixed `CreateMon` param order in `CreateFacilityMon` by @PCG06 in [#6989](https://github.com/rh-hideout/pokeemerald-expansion/pull/6989) + +## βš”οΈ Battle General βš”οΈ +### Added +* Gen 1's Special base stat by @AsparagusEduardo in [#6330](https://github.com/rh-hideout/pokeemerald-expansion/pull/6330) +* Add B_RUN_TRAINER_BATTLE - players can run from Trainer Battles by @pkmnsnfrn and @wiz1989 [wrote the original feature](https://github.com/TeamAquasHideout/pokeemerald/commit/19c0c32e3718d4fab340cf4f15f29882916a829e). in [#6456](https://github.com/rh-hideout/pokeemerald-expansion/pull/6456) +* Add B_LEVEL_UP_NOTIFICATION to improve player QoL when performing multiple level ups by @pkmnsnfrn in [#4901](https://github.com/rh-hideout/pokeemerald-expansion/pull/4901) +* "Aerilate"-esque Ability Tests and Config by @Pawkkie and @hedara90 in [#6313](https://github.com/rh-hideout/pokeemerald-expansion/pull/6313) + - Adds new `B_ATE_MULTIPLIER` config in `config/battle.h` +* Gen 1 no recharge on KO by @spindrift64 in [#6869](https://github.com/rh-hideout/pokeemerald-expansion/pull/6869) +* Add no-whiteout feature by @Bassoonian and @/Gudf in [#6795](https://github.com/rh-hideout/pokeemerald-expansion/pull/6795) + +### Changed +* "no additional effect" text for status Z moves without effects by @wiz1989 in [#6368](https://github.com/rh-hideout/pokeemerald-expansion/pull/6368) +* Configuration to make all Hail moves summon Snow or vis versa, to have only one ice weather by @surskitty in [#6149](https://github.com/rh-hideout/pokeemerald-expansion/pull/6149) + - Added a config to homogenize Ice weathers between Hail, Snow, or both. +* Create move end Sheer Force by @AlexOn1ine in [#6411](https://github.com/rh-hideout/pokeemerald-expansion/pull/6411) +* Added Dynamax/Gigantamax battle messages by @wiz1989 in [#6440](https://github.com/rh-hideout/pokeemerald-expansion/pull/6440) +* Refactor HasWeatherEffect and IsUnnerveAbilityOnOpposingSide by @AlexOn1ine in [#6441](https://github.com/rh-hideout/pokeemerald-expansion/pull/6441) +* Refactor the function IsAbilityPreventingEscape by @AlexOn1ine in [#6439](https://github.com/rh-hideout/pokeemerald-expansion/pull/6439) +* Unifies dynamic move category checks by @AlexOn1ine in [#6443](https://github.com/rh-hideout/pokeemerald-expansion/pull/6443) +* Refactors faint target abilities and adds Battle Bond config by @AlexOn1ine in [#6519](https://github.com/rh-hideout/pokeemerald-expansion/pull/6519) +* Refactor protect to allow at least 126 different types of protect eff… by @AlexOn1ine in [#6506](https://github.com/rh-hideout/pokeemerald-expansion/pull/6506) +* Refactor / Simlify Cmd_adjustdamage and remove redundancy by @AlexOn1ine in [#6499](https://github.com/rh-hideout/pokeemerald-expansion/pull/6499) +* Refactors Move absorb / block function calls to remove redundancy by @AlexOn1ine in [#6490](https://github.com/rh-hideout/pokeemerald-expansion/pull/6490) +* Refactor fixed damage moves by @AlexOn1ine in [#6449](https://github.com/rh-hideout/pokeemerald-expansion/pull/6449) +* Turn battle string ids into enums by @Bassoonian in [#6594](https://github.com/rh-hideout/pokeemerald-expansion/pull/6594) +* Remove redundant bit for Throat Spray by @AlexOn1ine in [#6593](https://github.com/rh-hideout/pokeemerald-expansion/pull/6593) +* Add type checking for hold item effects by @Bassoonian in [#6619](https://github.com/rh-hideout/pokeemerald-expansion/pull/6619) +* Adds move effect type checking by @Bassoonian in [#6618](https://github.com/rh-hideout/pokeemerald-expansion/pull/6618) +* Refactor hit escape moves to use moveend by @AlexOn1ine in [#6671](https://github.com/rh-hideout/pokeemerald-expansion/pull/6671) +* Fix party access in NoAliveMonsForBattlerSide by @AlexOn1ine in [#6677](https://github.com/rh-hideout/pokeemerald-expansion/pull/6677) +* Some Me First tests plus minor clean up by @AlexOn1ine in [#6678](https://github.com/rh-hideout/pokeemerald-expansion/pull/6678) +* Centralizes non volatile status effect checks by @AlexOn1ine in [#6533](https://github.com/rh-hideout/pokeemerald-expansion/pull/6533) +* Use `GetPartyBattlerData` where appropiate by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6779](https://github.com/rh-hideout/pokeemerald-expansion/pull/6779) +* Refactor battler message ids by @AlexOn1ine in [#6765](https://github.com/rh-hideout/pokeemerald-expansion/pull/6765) +* General MoveEnd clean up and Fell Stinger adjustments by @AlexOn1ine in [#6674](https://github.com/rh-hideout/pokeemerald-expansion/pull/6674) +* Adds partyState to BattleStruct by @AlexOn1ine in [#6783](https://github.com/rh-hideout/pokeemerald-expansion/pull/6783) +* Refactor stockpile resets by @AlexOn1ine in [#6810](https://github.com/rh-hideout/pokeemerald-expansion/pull/6810) +* Changed White Herb hold effect name by @AlexOn1ine in [#6815](https://github.com/rh-hideout/pokeemerald-expansion/pull/6815) +* Fixes a mistake made by me by @AlexOn1ine in [#6828](https://github.com/rh-hideout/pokeemerald-expansion/pull/6828) +* Combined type-enhancing hold effects by @AsparagusEduardo in [#6846](https://github.com/rh-hideout/pokeemerald-expansion/pull/6846) + - The following hold effects have been combined into `HOLD_EFFECT_TYPE_POWER`: + - `HOLD_EFFECT_BUG_POWER` + - `HOLD_EFFECT_STEEL_POWER` + - `HOLD_EFFECT_GROUND_POWER` + - `HOLD_EFFECT_ROCK_POWER` + - `HOLD_EFFECT_GRASS_POWER` + - `HOLD_EFFECT_DARK_POWER` + - `HOLD_EFFECT_FIGHTING_POWER` + - `HOLD_EFFECT_ELECTRIC_POWER` + - `HOLD_EFFECT_WATER_POWER` + - `HOLD_EFFECT_FLYING_POWER` + - `HOLD_EFFECT_POISON_POWER` + - `HOLD_EFFECT_ICE_POWER` + - `HOLD_EFFECT_GHOST_POWER` + - `HOLD_EFFECT_PSYCHIC_POWER` + - `HOLD_EFFECT_FIRE_POWER` + - `HOLD_EFFECT_DRAGON_POWER` + - `HOLD_EFFECT_NORMAL_POWER` + - `HOLD_EFFECT_FAIRY_POWER` +* Removed multiple instances of hardcoded move IDs by @AsparagusEduardo in [#6856](https://github.com/rh-hideout/pokeemerald-expansion/pull/6856) +* New animations for Mega Evolution, Primal Reversion, Ultra Burst, and Power Construct by @LinathanZel in [#6834](https://github.com/rh-hideout/pokeemerald-expansion/pull/6834) +* Consolidates a bunch of battle controller functions by @Bassoonian in [#6838](https://github.com/rh-hideout/pokeemerald-expansion/pull/6838) +* Further moveend changes (move blocks) by @AlexOn1ine in [#6820](https://github.com/rh-hideout/pokeemerald-expansion/pull/6820) +* Added weather accuracy move flags by @AsparagusEduardo in [#6857](https://github.com/rh-hideout/pokeemerald-expansion/pull/6857) + - Removed `EFFECT_THUNDER`, `EFFECT_BLIZZARD` and `EFFECT_RAIN_ALWAYS_HIT` effects in favor of `alwaysHitsInRain`, `alwaysHitsInHailSnow` and `accuracy50InSun` move flags. +* Consolidated HasMoveFlagX functions by @AlexOn1ine in [#6874](https://github.com/rh-hideout/pokeemerald-expansion/pull/6874) + +### Fixed +* Fix declaration after label for Psywave switch by @hedara90 in [#6595](https://github.com/rh-hideout/pokeemerald-expansion/pull/6595) +* Fix regression from EndTurnRefactor by @AlexOn1ine in [#6616](https://github.com/rh-hideout/pokeemerald-expansion/pull/6616) +* Fixes Z and Max moves dmg reduction against side protection - upcoming by @AlexOn1ine in [#6698](https://github.com/rh-hideout/pokeemerald-expansion/pull/6698) +* Illusion struct cleanup and many Illusion fixes by @PhallenTree in [#6798](https://github.com/rh-hideout/pokeemerald-expansion/pull/6798) +* Fixes wrongly usage of arguments without checking effect by @AlexOn1ine in [#6859](https://github.com/rh-hideout/pokeemerald-expansion/pull/6859) +* Fixes Magic Guard causing Wrap to end immediately by @PhallenTree in [#6876](https://github.com/rh-hideout/pokeemerald-expansion/pull/6876) +* Mugshot Transitions 2v1 fix by @grintoul1 in [#6911](https://github.com/rh-hideout/pokeemerald-expansion/pull/6911) +* Fixes Ice Body healing HP regardless of weather by @PhallenTree in [#6939](https://github.com/rh-hideout/pokeemerald-expansion/pull/6939) +* Fixes global usage in super fang effect. by @AlexOn1ine in [#6941](https://github.com/rh-hideout/pokeemerald-expansion/pull/6941) +* Fixes Knock Off/Smack Down effect on immune target/protect by @PhallenTree in [#6958](https://github.com/rh-hideout/pokeemerald-expansion/pull/6958) +* Fixes weather anim damage being applied to the wrong mon by @AlexOn1ine in [#6973](https://github.com/rh-hideout/pokeemerald-expansion/pull/6973) +* Fixes repeated learning of level up moves by @AlexOn1ine in [#6981](https://github.com/rh-hideout/pokeemerald-expansion/pull/6981) +* Fixes Gen3 berry activation timing by @AlexOn1ine in [#6993](https://github.com/rh-hideout/pokeemerald-expansion/pull/6993) +* Fix Eiscue not resetting back to Ice Face form after battle. by @DarkVexon in [#6997](https://github.com/rh-hideout/pokeemerald-expansion/pull/6997) +* Fixes spread move fire types not defrosting all targets by @AlexOn1ine in [#6998](https://github.com/rh-hideout/pokeemerald-expansion/pull/6998) +* Update Supersweet Syrup with eject pack fix by @AlexOn1ine in [#7015](https://github.com/rh-hideout/pokeemerald-expansion/pull/7015) +* fix battle controller macros by @cawtds in [#7021](https://github.com/rh-hideout/pokeemerald-expansion/pull/7021) + +## 🀹 Moves 🀹 +### Added +* Add B_ANIMATE_MON_AFTER_KO - mons animate after scoring a KO by @pkmnsnfrn and @NicoSwag [wrote the original feature](https://github.com/Pawkkie/Team-Aquas-Asset-Repo/wiki/Make-Pok%C3%A9mon-animate-after-a-KO). in [#6451](https://github.com/rh-hideout/pokeemerald-expansion/pull/6451) + - This can be disabled by setting `B_ANIMATE_MON_AFTER_KO` to `FALSE`. +* Add OW_DEFOG_FIELD_MOVE to allow players to clear overworld Fog by @pkmnsnfrn in [#6477](https://github.com/rh-hideout/pokeemerald-expansion/pull/6477) + - This behavior is enabled by setting `OW_DEFOG_FIELD_MOVE` to `TRUE`. + +### Changed +* Minor Recoil Effect refactor by @AlexOn1ine in [#6409](https://github.com/rh-hideout/pokeemerald-expansion/pull/6409) +* Replaced Blue Sky background for Rock Field by @SundayMoonday in [#6516](https://github.com/rh-hideout/pokeemerald-expansion/pull/6516) +* Use missing constants with GetBattlerSpriteCoord by @AsparagusEduardo in [#6778](https://github.com/rh-hideout/pokeemerald-expansion/pull/6778) +* `InitSpritePosToAnimAttacker` documentation by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6781](https://github.com/rh-hideout/pokeemerald-expansion/pull/6781) +* Document battler side in anim code by @AlexOn1ine in [#6780](https://github.com/rh-hideout/pokeemerald-expansion/pull/6780) +* New animations for Mega Evolution, Primal Reversion, Ultra Burst, and Power Construct by @LinathanZel in [#6834](https://github.com/rh-hideout/pokeemerald-expansion/pull/6834) + +### Fixed +* Fix to warnings pertaining to Mega Evolution and Ultra Burst RGB values by @LinathanZel in [#6883](https://github.com/rh-hideout/pokeemerald-expansion/pull/6883) + +## πŸ€– Battle AI πŸ€– +### Added +* Improve AI's handling of player's Encore by @Pawkkie and @iriv24 in [#6305](https://github.com/rh-hideout/pokeemerald-expansion/pull/6305) +* Switch AI will factor in player's choice lock when determining hits to KO by @Pawkkie in [#6343](https://github.com/rh-hideout/pokeemerald-expansion/pull/6343) +* Switch AI considers Wind Rider by @innocenthedgehog in [#6391](https://github.com/rh-hideout/pokeemerald-expansion/pull/6391) +* Fix AI using Scald / fire moves against frozen / frostbitten targets by @Pawkkie in [#6442](https://github.com/rh-hideout/pokeemerald-expansion/pull/6442) +* Improve "all moves bad" switching by @Pawkkie and @wiz1989 in [#6453](https://github.com/rh-hideout/pokeemerald-expansion/pull/6453) +* Fix Choice'd AI not switching if player immune to move by @Pawkkie in [#6464](https://github.com/rh-hideout/pokeemerald-expansion/pull/6464) +* Add basic Unaware check bad move scoring by @Pawkkie in [#6524](https://github.com/rh-hideout/pokeemerald-expansion/pull/6524) +* AI smarter status handling by @Pawkkie in [#6550](https://github.com/rh-hideout/pokeemerald-expansion/pull/6550) +* Improve AI's defense against Focus Punch by @Pawkkie in [#6713](https://github.com/rh-hideout/pokeemerald-expansion/pull/6713) +* Add AI_FLAG_PP_STALL_PREVENTION by @hedara90 in [#6743](https://github.com/rh-hideout/pokeemerald-expansion/pull/6743) + - Chance to trigger and score modifier can be changed in `include/config/ai.h` under the "AI PP Stall detection" section +* Adjust switch AI based on move scoring by @Pawkkie and @ghoulslash, @AlexOn1ine in [#6615](https://github.com/rh-hideout/pokeemerald-expansion/pull/6615) + - Change `AI_BAD_SCORE_THRESHOLD` and `AI_GOOD_SCORE_THRESHOLD` to modify what `ShouldSwitchIfAllScoresBad` considers, found in `config/ai.h` +* Add AI for Zero to Hero Palafin by @Pawkkie and @kittenchilly in [#6791](https://github.com/rh-hideout/pokeemerald-expansion/pull/6791) +* Add AI_FLAG_PREDICT_MOVES by @Pawkkie in [#6551](https://github.com/rh-hideout/pokeemerald-expansion/pull/6551) + - Use AI_FLAG_PREDICT_MOVES to enable behaviour + - Works best when used with AI_FLAG_OMNISCIENT + +### Changed +* Minor Clean up for AI_CalcDamage to remove some duplicate code by @AlexOn1ine in [#6397](https://github.com/rh-hideout/pokeemerald-expansion/pull/6397) +* Moved some AI stuff out of the battlestruct by @hedara90 in [#6405](https://github.com/rh-hideout/pokeemerald-expansion/pull/6405) + - AI data in `gBattleStruct` has been moved to `gAiBattleStructData`. +* Allow the AI to see the second hit of Parental Bond by @AlexOn1ine in [#6403](https://github.com/rh-hideout/pokeemerald-expansion/pull/6403) +* Split ai function IsBattlerTrapped by @AlexOn1ine in [#6438](https://github.com/rh-hideout/pokeemerald-expansion/pull/6438) +* Optimization / Clean up of AI move usability by @AlexOn1ine in [#6332](https://github.com/rh-hideout/pokeemerald-expansion/pull/6332) +* Clean up AI code duplication and unify checks by @AlexOn1ine in [#6348](https://github.com/rh-hideout/pokeemerald-expansion/pull/6348) +* Ability access cleanup for #6550 by @Pawkkie in [#6565](https://github.com/rh-hideout/pokeemerald-expansion/pull/6565) +* Adjust enum AIScore by @AlexOn1ine in [#6598](https://github.com/rh-hideout/pokeemerald-expansion/pull/6598) +* Refactor battler flee and watch options + clean up by @AlexOn1ine in [#6724](https://github.com/rh-hideout/pokeemerald-expansion/pull/6724) +* Add AI_FLAG_PP_STALL_PREVENTION to `ai_flags.md` by @Pawkkie in [#6756](https://github.com/rh-hideout/pokeemerald-expansion/pull/6756) +* Refactor AI flags to u64 by @Pawkkie and @DizzyEggg, @AlexOn1ine, @hedara90 in [#6753](https://github.com/rh-hideout/pokeemerald-expansion/pull/6753) +* Move out ai structs out of BattleResources by @AlexOn1ine in [#6741](https://github.com/rh-hideout/pokeemerald-expansion/pull/6741) +* Add prediction function by @AlexOn1ine in [#6858](https://github.com/rh-hideout/pokeemerald-expansion/pull/6858) +* AI double battle friendly fire logic improvements by @surskitty and @Pawkkie in [#6766](https://github.com/rh-hideout/pokeemerald-expansion/pull/6766) +* Remove non-volatile status EFFECTs by @AsparagusEduardo in [#6772](https://github.com/rh-hideout/pokeemerald-expansion/pull/6772) +* Fix misleading name by @AlexOn1ine in [#6865](https://github.com/rh-hideout/pokeemerald-expansion/pull/6865) +* Fix HasBattlerSideMoveWithEffect comment by @Pawkkie in [#6965](https://github.com/rh-hideout/pokeemerald-expansion/pull/6965) + +### Fixed +* Fix damage roll order for AI calcs by @AlexOn1ine in [#6356](https://github.com/rh-hideout/pokeemerald-expansion/pull/6356) +* Fix roll handling in AI damage calcs by @Pawkkie in [#6396](https://github.com/rh-hideout/pokeemerald-expansion/pull/6396) +* fixed damage calculations in CanTargetFaintAiWithMod() by @wiz1989 in [#6446](https://github.com/rh-hideout/pokeemerald-expansion/pull/6446) +* Fix bracket typo in AI_CheckBadMove conditional by @Pawkkie in [#6695](https://github.com/rh-hideout/pokeemerald-expansion/pull/6695) +* Fix party data assignment by @Pawkkie in [#6712](https://github.com/rh-hideout/pokeemerald-expansion/pull/6712) +* Fix Wonder Guard potential double switching by @Pawkkie in [#6737](https://github.com/rh-hideout/pokeemerald-expansion/pull/6737) +* Fix roll handling in AI party damage calcs by @Pawkkie in [#6733](https://github.com/rh-hideout/pokeemerald-expansion/pull/6733) +* Fix AI function table to match new u64 flags by @Pawkkie in [#6796](https://github.com/rh-hideout/pokeemerald-expansion/pull/6796) +* Fix FindMonThatAbsorbsOpponentsMove not seeing Mold Breaker or choice items by @Pawkkie in [#6864](https://github.com/rh-hideout/pokeemerald-expansion/pull/6864) +* Fix AI_FLAG_PREDICT_MOVES scoring bug by @Pawkkie and @innocenthedgehog for test in [#6867](https://github.com/rh-hideout/pokeemerald-expansion/pull/6867) +* Switch AI considers Bulletproof ability by @innocenthedgehog in [#6872](https://github.com/rh-hideout/pokeemerald-expansion/pull/6872) +* Fix AI boosting stats into mon with Haze by @Pawkkie in [#6894](https://github.com/rh-hideout/pokeemerald-expansion/pull/6894) +* Fix switch AI considering non-choiced SE moves when choiced by @Pawkkie in [#6892](https://github.com/rh-hideout/pokeemerald-expansion/pull/6892) +* Fix bad odds / defensive switchin double switch cases by @Pawkkie in [#6927](https://github.com/rh-hideout/pokeemerald-expansion/pull/6927) + +## 🧹 Other Cleanup 🧹 +* Moved PokΓ©mon Jump types to gSpeciesInfo by @AsparagusEduardo in [#5602](https://github.com/rh-hideout/pokeemerald-expansion/pull/5602) +* Change ability to abilityNum in CreateTrainerMon by @AlexOn1ine in [#6370](https://github.com/rh-hideout/pokeemerald-expansion/pull/6370) +* Small Code clean up in GetBattlerAbility (removes duplication) by @AlexOn1ine in [#6362](https://github.com/rh-hideout/pokeemerald-expansion/pull/6362) +* Minor Clean up for AI_CalcDamage to remove some duplicate code by @AlexOn1ine in [#6397](https://github.com/rh-hideout/pokeemerald-expansion/pull/6397) +* Create move end Sheer Force by @AlexOn1ine in [#6411](https://github.com/rh-hideout/pokeemerald-expansion/pull/6411) +* Rename absentBattlerFlags to absent by @AlexOn1ine in [#6432](https://github.com/rh-hideout/pokeemerald-expansion/pull/6432) +* Split ai function IsBattlerTrapped by @AlexOn1ine in [#6438](https://github.com/rh-hideout/pokeemerald-expansion/pull/6438) +* Optimization / Clean up of AI move usability by @AlexOn1ine in [#6332](https://github.com/rh-hideout/pokeemerald-expansion/pull/6332) +* Clean up AI code duplication and unify checks by @AlexOn1ine in [#6348](https://github.com/rh-hideout/pokeemerald-expansion/pull/6348) +* Removed unused debug EWRAM variables by @hedara90 in [#6468](https://github.com/rh-hideout/pokeemerald-expansion/pull/6468) +* Removes unused Special Status members by @AlexOn1ine in [#6479](https://github.com/rh-hideout/pokeemerald-expansion/pull/6479) +* Remove potential pitfall with saved damage for recoil moves by @AlexOn1ine in [#6485](https://github.com/rh-hideout/pokeemerald-expansion/pull/6485) +* Update maintainer list by @AsparagusEduardo in [#6521](https://github.com/rh-hideout/pokeemerald-expansion/pull/6521) +* Alcremie Evolution clean up follow up by @AlexOn1ine in [#6557](https://github.com/rh-hideout/pokeemerald-expansion/pull/6557) +* Ability access cleanup for #6550 by @Pawkkie in [#6565](https://github.com/rh-hideout/pokeemerald-expansion/pull/6565) +* Fix broken links in merge_checklist.md by @pkmnsnfrn and @grintoul1 in [#6570](https://github.com/rh-hideout/pokeemerald-expansion/pull/6570) +* Converts some defines to enums by @Bassoonian in [#6592](https://github.com/rh-hideout/pokeemerald-expansion/pull/6592) +* Turn battle string ids into enums by @Bassoonian in [#6594](https://github.com/rh-hideout/pokeemerald-expansion/pull/6594) +* Remove redundant bit for Throat Spray by @AlexOn1ine in [#6593](https://github.com/rh-hideout/pokeemerald-expansion/pull/6593) +* Adjust enum AIScore by @AlexOn1ine in [#6598](https://github.com/rh-hideout/pokeemerald-expansion/pull/6598) +* Add type checking for hold item effects by @Bassoonian in [#6619](https://github.com/rh-hideout/pokeemerald-expansion/pull/6619) +* Adds move effect type checking by @Bassoonian in [#6618](https://github.com/rh-hideout/pokeemerald-expansion/pull/6618) +* Remove hardcoded values from wild_encounter.h generation by @khbsd and @moostoet and @/Nopinou on discord for reporting bugs and dealing with my ping spam <3 in [#6640](https://github.com/rh-hideout/pokeemerald-expansion/pull/6640) +* Sky Drop clean up and tests by @AlexOn1ine in [#6218](https://github.com/rh-hideout/pokeemerald-expansion/pull/6218) +* Remove vestigial AdvanceScript function used for testing by @RubyRaven6 in [#6664](https://github.com/rh-hideout/pokeemerald-expansion/pull/6664) +* Fix party access in NoAliveMonsForBattlerSide by @AlexOn1ine in [#6677](https://github.com/rh-hideout/pokeemerald-expansion/pull/6677) +* Some Me First tests plus minor clean up by @AlexOn1ine in [#6678](https://github.com/rh-hideout/pokeemerald-expansion/pull/6678) +* Removes vestigial EWRAM variable from debug menu. by @RubyRaven6 in [#6686](https://github.com/rh-hideout/pokeemerald-expansion/pull/6686) +* Disable `P_TUTOR_MOVES_ARRAY` config by @PCG06 in [#6693](https://github.com/rh-hideout/pokeemerald-expansion/pull/6693) + - `P_TUTOR_MOVES_ARRAY` set to `FALSE` by default. +* Remove compressed palettes by @hedara90 in [#6455](https://github.com/rh-hideout/pokeemerald-expansion/pull/6455) + - All handling for compressed palettes has been removed, use `u16 *` for palettes instead. + - Has migration script to convert palettes to `u16`, `struct SpritePalette` and palette loading calls from their compressed variants. +* Rename follower npc macros for better specificity and to match documentation by @Bivurnum in [#6742](https://github.com/rh-hideout/pokeemerald-expansion/pull/6742) +* Use missing constants with GetBattlerSpriteCoord by @AsparagusEduardo in [#6778](https://github.com/rh-hideout/pokeemerald-expansion/pull/6778) +* Use `GetPartyBattlerData` where appropiate by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6779](https://github.com/rh-hideout/pokeemerald-expansion/pull/6779) +* `InitSpritePosToAnimAttacker` documentation by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6781](https://github.com/rh-hideout/pokeemerald-expansion/pull/6781) +* General MoveEnd clean up and Fell Stinger adjustments by @AlexOn1ine in [#6674](https://github.com/rh-hideout/pokeemerald-expansion/pull/6674) +* Better handling of battle coords by @AsparagusEduardo and @ghoulslash, @klemniops for the original code. in [#6787](https://github.com/rh-hideout/pokeemerald-expansion/pull/6787) +* `battle_main` enum cleanup by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6788](https://github.com/rh-hideout/pokeemerald-expansion/pull/6788) +* Add missing uses of `IsBattlerAlly` by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6793](https://github.com/rh-hideout/pokeemerald-expansion/pull/6793) +* Rename `GetPartyBattlerData` to `GetBattlerMon` by @AsparagusEduardo and @ghoulslash, @klemniops, whose' code I was using for comparison when I found these in [#6800](https://github.com/rh-hideout/pokeemerald-expansion/pull/6800) +* Changed White Herb hold effect name by @AlexOn1ine in [#6815](https://github.com/rh-hideout/pokeemerald-expansion/pull/6815) +* Fixes a mistake made by me by @AlexOn1ine in [#6828](https://github.com/rh-hideout/pokeemerald-expansion/pull/6828) +* Remove non-existent functions from header files by @Bassoonian in [#6825](https://github.com/rh-hideout/pokeemerald-expansion/pull/6825) +* Added `IsOnPlayerSide` by @AsparagusEduardo in [#6832](https://github.com/rh-hideout/pokeemerald-expansion/pull/6832) +* Battle TV expansion by @AsparagusEduardo in [#6826](https://github.com/rh-hideout/pokeemerald-expansion/pull/6826) +* Removed multiple instances of hardcoded move IDs by @AsparagusEduardo in [#6856](https://github.com/rh-hideout/pokeemerald-expansion/pull/6856) +* Add prediction function by @AlexOn1ine in [#6858](https://github.com/rh-hideout/pokeemerald-expansion/pull/6858) +* Reword move and ability descriptions to improve clarity by @jfb1337 in [#6861](https://github.com/rh-hideout/pokeemerald-expansion/pull/6861) + - Updated move and ability descriptions to increase clarity. +* Consolidated HasMoveFlagX functions by @AlexOn1ine in [#6874](https://github.com/rh-hideout/pokeemerald-expansion/pull/6874) +* Optimized `PokemonUseItemEffects` function by @AsparagusEduardo in [#6878](https://github.com/rh-hideout/pokeemerald-expansion/pull/6878) +* Fix misleading name by @AlexOn1ine in [#6865](https://github.com/rh-hideout/pokeemerald-expansion/pull/6865) +* Debug menu cleanup by @AsparagusEduardo in [#6881](https://github.com/rh-hideout/pokeemerald-expansion/pull/6881) +* Updated CONTRIBUTING.md and Merge Freeze definition by @pkmnsnfrn in [#6952](https://github.com/rh-hideout/pokeemerald-expansion/pull/6952) +* Fix HasBattlerSideMoveWithEffect comment by @Pawkkie in [#6965](https://github.com/rh-hideout/pokeemerald-expansion/pull/6965) +* Documented usage of `createsprite gSlideMonToOffsetSpriteTemplate` by @AsparagusEduardo in [#6953](https://github.com/rh-hideout/pokeemerald-expansion/pull/6953) +* Remove trailing whitespace by @AsparagusEduardo in [#6968](https://github.com/rh-hideout/pokeemerald-expansion/pull/6968) +* Moved time constants to dedicated files by @pkmnsnfrn in [#7019](https://github.com/rh-hideout/pokeemerald-expansion/pull/7019) + +## πŸ§ͺ Test Runner πŸ§ͺ +### Added +* "Aerilate"-esque Ability Tests and Config by @Pawkkie and @hedara90 in [#6313](https://github.com/rh-hideout/pokeemerald-expansion/pull/6313) + - Adds new `B_ATE_MULTIPLIER` config in `config/battle.h` + +### Changed +* Tests for checking all move animations by @hedara90 and @AsparagusEduardo wrote the original tests that I updated in [#6297](https://github.com/rh-hideout/pokeemerald-expansion/pull/6297) + - Set `T_SHOULD_RUN_MOVE_ANIM` to `TRUE` to run these tests, they take a long time to run. +* Update the All Move Animations test by @hedara90 in [#6460](https://github.com/rh-hideout/pokeemerald-expansion/pull/6460) +* Updated move animation tests by @hedara90 in [#6554](https://github.com/rh-hideout/pokeemerald-expansion/pull/6554) + +### Fixed +* Fix out-of-bounds in Heal Bell Cures Entire Party test by @rayrobdod in [#7011](https://github.com/rh-hideout/pokeemerald-expansion/pull/7011) + +## πŸ“š Documentation πŸ“š +* Add CONTRIBUTING.md and STYLEGUIDE.md by @pkmnsnfrn and @Pawkkie, @garakmon in [#6340](https://github.com/rh-hideout/pokeemerald-expansion/pull/6340) +* Update maintainer list by @AsparagusEduardo in [#6521](https://github.com/rh-hideout/pokeemerald-expansion/pull/6521) +* Fix broken links in merge_checklist.md by @pkmnsnfrn and @grintoul1 in [#6570](https://github.com/rh-hideout/pokeemerald-expansion/pull/6570) +* Turn battle string ids into enums by @Bassoonian in [#6594](https://github.com/rh-hideout/pokeemerald-expansion/pull/6594) +* Add Time-Based Encounter Tutorial by @khbsd and @Pawkkie (ty for reviewing!!) in [#6568](https://github.com/rh-hideout/pokeemerald-expansion/pull/6568) +* Add type checking for hold item effects by @Bassoonian in [#6619](https://github.com/rh-hideout/pokeemerald-expansion/pull/6619) +* Adds move effect type checking by @Bassoonian in [#6618](https://github.com/rh-hideout/pokeemerald-expansion/pull/6618) +* Make form change methods into enum + type checking by @Bassoonian in [#6631](https://github.com/rh-hideout/pokeemerald-expansion/pull/6631) +* Add AI_FLAG_PP_STALL_PREVENTION to `ai_flags.md` by @Pawkkie in [#6756](https://github.com/rh-hideout/pokeemerald-expansion/pull/6756) +* Document battler side in anim code by @AlexOn1ine in [#6780](https://github.com/rh-hideout/pokeemerald-expansion/pull/6780) +* Added JSON as the preferred data format by @hedara90 in [#6801](https://github.com/rh-hideout/pokeemerald-expansion/pull/6801) +* Commenting in config files to explain limits of map popups and wild AI flags by @surskitty in [#6923](https://github.com/rh-hideout/pokeemerald-expansion/pull/6923) +* Documented usage of `createsprite gSimplePaletteBlendSpriteTemplate` by @AsparagusEduardo in [#6956](https://github.com/rh-hideout/pokeemerald-expansion/pull/6956) +* Documented usage of `createsprite gDirtPlumeSpriteTemplate` by @AsparagusEduardo in [#6954](https://github.com/rh-hideout/pokeemerald-expansion/pull/6954) +* Updated CONTRIBUTING.md and Merge Freeze definition by @pkmnsnfrn in [#6952](https://github.com/rh-hideout/pokeemerald-expansion/pull/6952) +* Documented usage of `createsprite gBasicHitSplatSpriteTemplate` by @AsparagusEduardo in [#6950](https://github.com/rh-hideout/pokeemerald-expansion/pull/6950) +* Documented usage of `createsprite gSparkElectricitySpriteTemplate` by @AsparagusEduardo in [#6955](https://github.com/rh-hideout/pokeemerald-expansion/pull/6955) +* Beefing up the DNS tutorial for some of the common questions/errors. by @surskitty in [#6922](https://github.com/rh-hideout/pokeemerald-expansion/pull/6922) +* Add follower NPC documentation by @Bivurnum in [#6704](https://github.com/rh-hideout/pokeemerald-expansion/pull/6704) +* Clarifies when to use each merge type for maintainers by @pkmnsnfrn in [#6999](https://github.com/rh-hideout/pokeemerald-expansion/pull/6999) + +## πŸ“¦ Branch Synchronisation πŸ“¦ +### pret +* 27th of May, 2025 in [#6995](https://github.com/rh-hideout/pokeemerald-expansion/pull/6995) + * Fix defines in MAP_NUM and MAP_GROUP by @Bassoonian in [pret#2023](https://github.com/pret/pokeemerald/pull/2023) + * Change metatile behaviors to enum by @pkmnsnfrn in [pret#2027](https://github.com/pret/pokeemerald/pull/2027) + * Move heal locations data to their associated map.json by @GriffinRichards in [pret#2034](https://github.com/pret/pokeemerald/pull/2034) + * Generate local IDs from map.json files by @GriffinRichards in [pret#2047](https://github.com/pret/pokeemerald/pull/2047) + * Generate MAPSEC constants from JSON by @GriffinRichards in [pret#2063](https://github.com/pret/pokeemerald/pull/2063) + * Generate heal location constants automatically by @GriffinRichards in [pret#2101](https://github.com/pret/pokeemerald/pull/2101) + * Update for Porymap 6 by @GriffinRichards in [pret#2141](https://github.com/pret/pokeemerald/pull/2141) +* 29th of May, 2025 in [#7012](https://github.com/rh-hideout/pokeemerald-expansion/pull/7012) + * Update for Porymap 6 by @GriffinRichards in [pret#2141](https://github.com/pret/pokeemerald/pull/2141) + +## New Contributors +* @SundayMoonday made their first contribution in [#6516](https://github.com/rh-hideout/pokeemerald-expansion/pull/6516) +* @agsmgmaster64 made their first contribution in [#6559](https://github.com/rh-hideout/pokeemerald-expansion/pull/6559) +* @grintoul1 made their first contribution in [#6567](https://github.com/rh-hideout/pokeemerald-expansion/pull/6567) +* @LinathanZel made their first contribution in [#6834](https://github.com/rh-hideout/pokeemerald-expansion/pull/6834) +* @mudskipper13 made their first contribution in [#6812](https://github.com/rh-hideout/pokeemerald-expansion/pull/6812) + +**Full Changelog**: https://github.com/rh-hideout/pokeemerald-expansion/compare/expansion/1.11.3...expansion/1.12.0 + + + + diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 10572ec00e..84b1fed11a 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -1,7 +1,7 @@ #ifndef GUARD_CONSTANTS_EXPANSION_H #define GUARD_CONSTANTS_EXPANSION_H -// Last version: 1.11.4 +// Last version: 1.12.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 12 #define EXPANSION_VERSION_PATCH 0 From 98c03315a9777ee6276ce69a0655970c4a727067 Mon Sep 17 00:00:00 2001 From: Hedara Date: Fri, 30 May 2025 20:55:09 +0200 Subject: [PATCH 177/187] Start of 1.12.1 cycle --- include/constants/expansion.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/constants/expansion.h b/include/constants/expansion.h index 84b1fed11a..b0e7397b56 100644 --- a/include/constants/expansion.h +++ b/include/constants/expansion.h @@ -4,10 +4,10 @@ // Last version: 1.12.0 #define EXPANSION_VERSION_MAJOR 1 #define EXPANSION_VERSION_MINOR 12 -#define EXPANSION_VERSION_PATCH 0 +#define EXPANSION_VERSION_PATCH 1 // FALSE if this this version of Expansion is not a tagged commit, i.e. // it contains unreleased changes. -#define EXPANSION_TAGGED_RELEASE TRUE +#define EXPANSION_TAGGED_RELEASE FALSE #endif From 3255f232397161d976b74f7fd353c615aa92d2c7 Mon Sep 17 00:00:00 2001 From: grintoul <166724814+grintoul1@users.noreply.github.com> Date: Sat, 31 May 2025 08:50:41 +0100 Subject: [PATCH 178/187] Added line break between Trainer 1 name and Trainer 2 name in sText_TwoTrainersWantToBattle (#7028) --- src/battle_message.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_message.c b/src/battle_message.c index d46ead7669..4f19a79c2a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1470,7 +1470,7 @@ const u8 gText_Body[] = _("Body"); const u8 gText_Judgment[] = _("{B_BUFF1}{CLEAR 13}Judgment{CLEAR 13}{B_BUFF2}"); static const u8 sText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} sent out {B_OPPONENT_MON1_NAME}!\p{B_TRAINER2_NAME_WITH_CLASS} sent out {B_OPPONENT_MON2_NAME}!"); static const u8 sText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} sent out {B_BUFF1}!"); -static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by {B_TRAINER1_NAME_WITH_CLASS} and {B_TRAINER2_NAME_WITH_CLASS}!\p"); +static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by\n{B_TRAINER1_NAME_WITH_CLASS} and\l{B_TRAINER2_NAME_WITH_CLASS}!\p"); static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}! Go, {B_PLAYER_MON1_NAME}!"); const u16 gBattlePalaceFlavorTextTable[] = From 585793131f47429c43f45aa7735c38c43a1d1a1a Mon Sep 17 00:00:00 2001 From: PhallenTree <168426989+PhallenTree@users.noreply.github.com> Date: Sat, 31 May 2025 19:25:25 +0100 Subject: [PATCH 179/187] Fixes large battle messages being cut off instead of being prompted to advance 2 (#7036) --- src/battle_message.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/battle_message.c b/src/battle_message.c index 4f19a79c2a..71ec2b305a 100644 --- a/src/battle_message.c +++ b/src/battle_message.c @@ -1470,7 +1470,7 @@ const u8 gText_Body[] = _("Body"); const u8 gText_Judgment[] = _("{B_BUFF1}{CLEAR 13}Judgment{CLEAR 13}{B_BUFF2}"); static const u8 sText_TwoTrainersSentPkmn[] = _("{B_TRAINER1_NAME_WITH_CLASS} sent out {B_OPPONENT_MON1_NAME}!\p{B_TRAINER2_NAME_WITH_CLASS} sent out {B_OPPONENT_MON2_NAME}!"); static const u8 sText_Trainer2SentOutPkmn[] = _("{B_TRAINER2_NAME_WITH_CLASS} sent out {B_BUFF1}!"); -static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by\n{B_TRAINER1_NAME_WITH_CLASS} and\l{B_TRAINER2_NAME_WITH_CLASS}!\p"); +static const u8 sText_TwoTrainersWantToBattle[] = _("You are challenged by\n{B_TRAINER1_NAME_WITH_CLASS} and {B_TRAINER2_NAME_WITH_CLASS}!\p"); static const u8 sText_InGamePartnerSentOutZGoN[] = _("{B_PARTNER_NAME_WITH_CLASS} sent out {B_PLAYER_MON2_NAME}! Go, {B_PLAYER_MON1_NAME}!"); const u16 gBattlePalaceFlavorTextTable[] = @@ -3169,7 +3169,7 @@ u32 BattleStringExpandPlaceholders(const u8 *src, u8 *dst, u32 dstSize) dst[dstID] = *src; dstID++; - BreakStringAutomatic(dst, BATTLE_MSG_MAX_WIDTH, BATTLE_MSG_MAX_LINES, fontId, TRUE); + BreakStringAutomatic(dst, BATTLE_MSG_MAX_WIDTH, BATTLE_MSG_MAX_LINES, fontId, SHOW_SCROLL_PROMPT); return dstID; } From a93a17d490b93a43f9859e8d6c4f3ebe2e66b161 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sat, 31 May 2025 14:28:24 -0400 Subject: [PATCH 180/187] Fixed text width for a lot of forms in HGSS Dex (#7035) --- src/pokedex_plus_hgss.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/pokedex_plus_hgss.c b/src/pokedex_plus_hgss.c index 955c8f9b17..6541e9d3a7 100644 --- a/src/pokedex_plus_hgss.c +++ b/src/pokedex_plus_hgss.c @@ -6431,7 +6431,7 @@ u32 GetSpeciesNameWidthInChars(const u8 *speciesName) bool32 IsSpeciesAlcremie(u32 targetSpecies) { - return targetSpecies >= SPECIES_ALCREMIE_STRAWBERRY_VANILLA_CREAM && targetSpecies <= SPECIES_ALCREMIE_RIBBON_RAINBOW_SWIRL; + return GET_BASE_SPECIES_ID(targetSpecies) == SPECIES_ALCREMIE; } bool32 IsItemSweet(u32 item) @@ -6628,10 +6628,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case IF_PID_UPPER_MODULO_10_EQ: case IF_PID_UPPER_MODULO_10_LT: arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT + if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_GT && arg < 10 && arg >= 0) arg = 9 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ + else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_UPPER_MODULO_10_EQ && arg < 10 && arg >= 0) arg = 1; ConvertIntToDecimalStringN(gStringVar2, arg * 10, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -6741,10 +6741,10 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept case IF_PID_MODULO_100_EQ: case IF_PID_MODULO_100_LT: arg = evolutions[i].params[j].arg1; - if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_GT + if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_GT && arg < 100 && arg >= 0) arg = 99 - arg; - else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_EQ + else if ((enum EvolutionConditions)evolutions[i].params[j].condition == IF_PID_MODULO_100_EQ && arg < 100 && arg >= 0) arg = 1; ConvertIntToDecimalStringN(gStringVar2, arg, STR_CONV_MODE_LEFT_ALIGN, 3); @@ -6776,7 +6776,7 @@ static void PrintEvolutionTargetSpeciesAndMethod(u8 taskId, u16 species, u8 dept } if (isAlcremie) - fontId = FONT_NARROWER; + fontId = FONT_SMALL_NARROWER; else fontId = GetFontIdToFit(gStringVar4, FONT_SMALL, 0, maxScreenWidth); From 661a418960bda7e2da8f1d48cbc58d6727b8cc1b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Sun, 1 Jun 2025 13:08:37 +0200 Subject: [PATCH 181/187] Fixes multi battle party re-order (#7042) --- src/battle_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_main.c b/src/battle_main.c index 5bdf3fb8ec..d1bc8ed0c8 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4651,7 +4651,7 @@ static void HandleTurnActionSelectionState(void) for (i = 0; i < gBattlersCount; i++) { if (gChosenActionByBattler[i] == B_ACTION_SWITCH) - SwitchPartyOrderInGameMulti(i, gBattleStruct->monToSwitchIntoId[battler]); + SwitchPartyOrderInGameMulti(i, gBattleStruct->monToSwitchIntoId[i]); } } } From 46e09a9e46c1ea35588a2c2a37131470d0683deb Mon Sep 17 00:00:00 2001 From: hedara90 <90hedara@gmail.com> Date: Sun, 1 Jun 2025 21:02:52 +0200 Subject: [PATCH 182/187] Changed trainer tutorial to take into account removed palette compression (#7044) Co-authored-by: Hedara --- docs/tutorials/how_to_trainer_pic.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/tutorials/how_to_trainer_pic.md b/docs/tutorials/how_to_trainer_pic.md index 78f8a717e4..beddb641e4 100644 --- a/docs/tutorials/how_to_trainer_pic.md +++ b/docs/tutorials/how_to_trainer_pic.md @@ -31,13 +31,13 @@ Export the palette and place into the same folder. Sadly, just putting the image files into the graphics folder is not enough. To use the sprites we have to register them by linking the graphic files. [src/data/graphics/trainers](https://github.com/rh-hideout/pokeemerald-expansion/blob/master/src/data/graphics/trainers.h): ```diff -const u32 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal.lz"); +const u16 gTrainerPalette_RubySapphireBrendan[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_brendan.gbapal"); const u32 gTrainerFrontPic_RubySapphireMay[] = INCBIN_U32("graphics/trainers/front_pics/ruby_sapphire.4bpp.lz"); -const u32 gTrainerPalette_RubySapphireMay[] = INCBIN_U32("graphics/trainers/palettes/ruby_sapphire_may.gbapal.lz"); +const u16 gTrainerPalette_RubySapphireMay[] = INCBIN_U16("graphics/trainers/palettes/ruby_sapphire_may.gbapal"); + const u32 gTrainerFrontPic_myTrainerClass[] = INCBIN_U32("graphics/trainers/front_pics/myTrainerClass.4bpp.lz"); -+ const u32 gTrainerPalette_myTrainerClass[] = INCBIN_U32("graphics/trainers/palettes/myTrainerClass.gbapal.lz"); ++ const u16 gTrainerPalette_myTrainerClass[] = INCBIN_U16("graphics/trainers/palettes/myTrainerClass.gbapal"); const u8 gTrainerBackPic_Brendan[] = INCBIN_U8("graphics/trainers/back_pics/brendan.4bpp"); ``` From d33651bfd0e16bbeb8084dfa8cd84178386c5f9b Mon Sep 17 00:00:00 2001 From: Alex <93446519+AlexOn1ine@users.noreply.github.com> Date: Mon, 2 Jun 2025 14:22:11 +0200 Subject: [PATCH 183/187] Battle controller pret documentation (#7029) --- include/battle_controllers.h | 70 +++++++++++++++-------- src/battle_controller_link_opponent.c | 4 +- src/battle_controller_link_partner.c | 4 +- src/battle_controller_opponent.c | 4 +- src/battle_controller_player.c | 4 +- src/battle_controller_player_partner.c | 4 +- src/battle_controller_recorded_opponent.c | 4 +- src/battle_controller_recorded_player.c | 4 +- src/battle_controller_safari.c | 4 +- src/battle_controller_wally.c | 4 +- src/battle_controllers.c | 4 +- src/battle_main.c | 18 +++--- src/battle_util.c | 16 +++--- 13 files changed, 81 insertions(+), 63 deletions(-) diff --git a/include/battle_controllers.h b/include/battle_controllers.h index 8f2d78ed41..2ce28ca609 100644 --- a/include/battle_controllers.h +++ b/include/battle_controllers.h @@ -72,41 +72,63 @@ enum { // (e.g. MarkBattlerForControllerExec) instead of using these macros // directly. -#define MARK_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \ - gBattleControllerExecFlags |= (1u << battler) +static inline void MarkBattleControllerActiveOnLocal(u32 battler) +{ + gBattleControllerExecFlags |= (1u << battler); +} -#define MARK_BATTLE_CONTROLLER_IDLE_ON_LOCAL(battler) \ - gBattleControllerExecFlags &= ~(1u << battler) +static inline void MarkBattleControllerIdleOnLocal(u32 battler) +{ + gBattleControllerExecFlags &= ~(1u << battler); +} -#define IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler) \ - (gBattleControllerExecFlags & (1u << battler)) +static inline bool32 IsBattleControllerActiveOnLocal(u32 battler) +{ + return gBattleControllerExecFlags & (1u << battler); +} -#define MARK_BATTLE_CONTROLLER_MESSAGE_OUTBOUND_OVER_LINK(battler) \ - gBattleControllerExecFlags |= ((1u << battler) << (32 - MAX_BATTLERS_COUNT)) +static inline void MarkBattleControllerMessageOutboundOverLink(u32 battler) +{ + gBattleControllerExecFlags |= ((1u << battler) << (32 - MAX_BATTLERS_COUNT)); +} -#define MARK_BATTLE_CONTROLLER_MESSAGE_SYNCHRONIZED_OVER_LINK(battler) \ - gBattleControllerExecFlags &= ~((1 << 28) << (battler)) +static inline void MarkBattleControllerMessageSynchronizedOverLink(u32 battler) +{ + gBattleControllerExecFlags &= ~((1 << 28) << (battler)); +} -#define MARK_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ - gBattleControllerExecFlags |= ((1u << battler) << ((playerId) << 2)) +static inline bool32 IsBattleControllerMessageSynchronizedOverLink(u32 battler) +{ + return gBattleControllerExecFlags & (1u << (battler + 28)); +} -#define MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId) \ - gBattleControllerExecFlags &= ~((1u << battler) << ((playerId) * 4)) +static inline void MarkBattleControllerActiveForPlayer(u32 battler, u32 playerId) +{ + gBattleControllerExecFlags |= ((1u << battler) << ((playerId) << 2)); +} -#define IS_BATTLE_CONTROLLER_ACTIVE_FOR_PLAYER(battler, playerId) \ - (gBattleControllerExecFlags & ((1u << battler) << ((playerId) * 4))) +static inline void MarkBattleControllerIdleForPlayer(u32 battler, u32 playerId) +{ + gBattleControllerExecFlags &= ~((1u << battler) << ((playerId) * 4)); +} + +static inline bool32 IsBattleControllerActiveForPlayer(u32 battler, u32 playerId) +{ + return gBattleControllerExecFlags & ((1u << battler) << ((playerId) * 4)); +} // This actually checks if a specific controller is active on any player or if // *any* controller is pending sync over link communications, but the macro name // can only be so specific before it just gets ridiculous. -#define IS_BATTLE_CONTROLLER_ACTIVE_OR_PENDING_SYNC_ANYWHERE(battler) \ - (gBattleControllerExecFlags & ( \ - (1u << battler) \ - | (0xF << 28) \ - | (1u << battler << 4) \ - | (1u << battler << 8) \ - | (1u << battler << 12) \ - )) +static inline bool32 IsBattleControllerActiveOrPendingSyncAnywhere(u32 battler) +{ + return gBattleControllerExecFlags & ( + (1u << battler) + | (0xF << 28) + | (1u << battler << 4) + | (1u << battler << 8) + | (1u << battler << 12)); +} // Special arguments for Battle Controller functions. diff --git a/src/battle_controller_link_opponent.c b/src/battle_controller_link_opponent.c index c79588695d..a039a5b522 100644 --- a/src/battle_controller_link_opponent.c +++ b/src/battle_controller_link_opponent.c @@ -114,7 +114,7 @@ void SetControllerToLinkOpponent(u32 battler) static void LinkOpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkOpponentBufferCommands)) sLinkOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -320,7 +320,7 @@ static void LinkOpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_link_partner.c b/src/battle_controller_link_partner.c index f54ee0d220..9b27309bf6 100644 --- a/src/battle_controller_link_partner.c +++ b/src/battle_controller_link_partner.c @@ -113,7 +113,7 @@ void SetControllerToLinkPartner(u32 battler) static void LinkPartnerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sLinkPartnerBufferCommands)) sLinkPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -164,7 +164,7 @@ static void LinkPartnerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_opponent.c b/src/battle_controller_opponent.c index 03c78fb9e9..f6fae5ae57 100644 --- a/src/battle_controller_opponent.c +++ b/src/battle_controller_opponent.c @@ -127,7 +127,7 @@ void SetControllerToOpponent(u32 battler) static void OpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sOpponentBufferCommands)) sOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -364,7 +364,7 @@ static void OpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_player.c b/src/battle_controller_player.c index f374345206..f437d8ee13 100644 --- a/src/battle_controller_player.c +++ b/src/battle_controller_player.c @@ -182,13 +182,13 @@ static void PlayerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } static void PlayerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerBufferCommands)) sPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); diff --git a/src/battle_controller_player_partner.c b/src/battle_controller_player_partner.c index ad5aa15312..9929f421cc 100644 --- a/src/battle_controller_player_partner.c +++ b/src/battle_controller_player_partner.c @@ -117,7 +117,7 @@ void SetControllerToPlayerPartner(u32 battler) static void PlayerPartnerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sPlayerPartnerBufferCommands)) sPlayerPartnerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -236,7 +236,7 @@ static void PlayerPartnerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_recorded_opponent.c b/src/battle_controller_recorded_opponent.c index 1e471044d5..944cf6e072 100644 --- a/src/battle_controller_recorded_opponent.c +++ b/src/battle_controller_recorded_opponent.c @@ -120,7 +120,7 @@ void SetControllerToRecordedOpponent(u32 battler) static void RecordedOpponentBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedOpponentBufferCommands)) sRecordedOpponentBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -141,7 +141,7 @@ static void RecordedOpponentBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_recorded_player.c b/src/battle_controller_recorded_player.c index 2476929282..a3032db1a8 100644 --- a/src/battle_controller_recorded_player.c +++ b/src/battle_controller_recorded_player.c @@ -117,7 +117,7 @@ void SetControllerToRecordedPlayer(u32 battler) static void RecordedPlayerBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sRecordedPlayerBufferCommands)) sRecordedPlayerBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -313,7 +313,7 @@ static void RecordedPlayerBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_safari.c b/src/battle_controller_safari.c index 560a95cc5f..4a1fc3888c 100644 --- a/src/battle_controller_safari.c +++ b/src/battle_controller_safari.c @@ -109,7 +109,7 @@ void SetControllerToSafari(u32 battler) static void SafariBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sSafariBufferCommands)) sSafariBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -237,7 +237,7 @@ static void SafariBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controller_wally.c b/src/battle_controller_wally.c index 3381e5a5bd..6cba0fc3e7 100644 --- a/src/battle_controller_wally.c +++ b/src/battle_controller_wally.c @@ -125,7 +125,7 @@ void SetControllerToWally(u32 battler) static void WallyBufferRunCommand(u32 battler) { - if (gBattleControllerExecFlags & (1u << battler)) + if (IsBattleControllerActiveOnLocal(battler)) { if (gBattleResources->bufferA[battler][0] < ARRAY_COUNT(sWallyBufferCommands)) sWallyBufferCommands[gBattleResources->bufferA[battler][0]](battler); @@ -284,7 +284,7 @@ static void WallyBufferExecCompleted(u32 battler) } else { - gBattleControllerExecFlags &= ~(1u << battler); + MarkBattleControllerIdleOnLocal(battler); } } diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 9b6a74fc6e..4faec49613 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -956,7 +956,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) switch (BYTE_TO_RECEIVE(0)) { case B_COMM_TO_CONTROLLER: - if (IS_BATTLE_CONTROLLER_ACTIVE_ON_LOCAL(battler)) + if (IsBattleControllerActiveOnLocal(battler)) return; memcpy(gBattleResources->bufferA[battler], &BYTE_TO_RECEIVE(LINK_BUFF_DATA), blockSize); @@ -975,7 +975,7 @@ static void Task_HandleCopyReceivedLinkBuffersData(u8 taskId) break; case B_COMM_CONTROLLER_IS_DONE: playerId = BYTE_TO_RECEIVE(LINK_BUFF_DATA); - MARK_BATTLE_CONTROLLER_IDLE_FOR_PLAYER(battler, playerId); + MarkBattleControllerIdleForPlayer(battler, playerId); break; } diff --git a/src/battle_main.c b/src/battle_main.c index d1bc8ed0c8..8ea21a023d 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -4210,7 +4210,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CHOSEN: // Try to perform an action. - if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12)))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { RecordedBattle_SetBattlerAction(battler, gBattleResources->bufferB[battler][1]); gChosenActionByBattler[battler] = gBattleResources->bufferB[battler][1]; @@ -4414,7 +4414,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CASE_CHOSEN: - if (!(gBattleControllerExecFlags & (((1u << battler)) | (0xF << 28) | ((1u << battler) << 4) | ((1u << battler) << 8) | ((1u << battler) << 12)))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { switch (gChosenActionByBattler[battler]) { @@ -4544,11 +4544,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED_STANDBY: - if (!(gBattleControllerExecFlags & ((1u << battler) - | (0xF << 28) - | (1u << (battler + 4)) - | (1u << (battler + 8)) - | (1u << (battler + 12))))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { if (AllAtActionConfirmed()) i = TRUE; @@ -4570,7 +4566,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_ACTION_CONFIRMED: - if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { gBattleCommunication[ACTIONS_CONFIRMED_COUNT]++; } @@ -4584,7 +4580,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = battler; gBattlescriptCurrInstr = gSelectionBattleScripts[battler]; - if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } @@ -4592,7 +4588,7 @@ static void HandleTurnActionSelectionState(void) } break; case STATE_WAIT_SET_BEFORE_ACTION: - if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { gBattleCommunication[battler] = STATE_BEFORE_ACTION_CHOSEN; } @@ -4616,7 +4612,7 @@ static void HandleTurnActionSelectionState(void) { gBattlerAttacker = battler; gBattlescriptCurrInstr = gSelectionBattleScripts[battler]; - if (!(gBattleControllerExecFlags & ((1u << battler) | (0xF << 28) | (1u << (battler + 4)) | (1u << (battler + 8)) | (1u << (battler + 12))))) + if (!IsBattleControllerActiveOrPendingSyncAnywhere(battler)) { gBattleScriptingCommandsTable[gBattlescriptCurrInstr[0]](); } diff --git a/src/battle_util.c b/src/battle_util.c index 6d256dc998..3bf809d530 100644 --- a/src/battle_util.c +++ b/src/battle_util.c @@ -988,29 +988,29 @@ static void UNUSED MarkAllBattlersForControllerExec(void) if (gBattleTypeFlags & BATTLE_TYPE_LINK) { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= 1u << (i + 32 - MAX_BATTLERS_COUNT); + MarkBattleControllerMessageOutboundOverLink(i); } else { for (i = 0; i < gBattlersCount; i++) - gBattleControllerExecFlags |= 1u << i; + MarkBattleControllerActiveOnLocal(i); } } bool32 IsBattlerMarkedForControllerExec(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - return (gBattleControllerExecFlags & (1u << (battler + 28))) != 0; + return IsBattleControllerMessageSynchronizedOverLink(battler); else - return (gBattleControllerExecFlags & (1u << battler)) != 0; + return IsBattleControllerActiveOnLocal(battler); } void MarkBattlerForControllerExec(u32 battler) { if (gBattleTypeFlags & BATTLE_TYPE_LINK) - gBattleControllerExecFlags |= 1u << (battler + 32 - MAX_BATTLERS_COUNT); + MarkBattleControllerMessageOutboundOverLink(battler); else - gBattleControllerExecFlags |= 1u << battler; + MarkBattleControllerActiveOnLocal(battler); } void MarkBattlerReceivedLinkData(u32 battler) @@ -1018,9 +1018,9 @@ void MarkBattlerReceivedLinkData(u32 battler) s32 i; for (i = 0; i < GetLinkPlayerCount(); i++) - gBattleControllerExecFlags |= 1u << (battler + (i << 2)); + MarkBattleControllerActiveForPlayer(battler, i); - gBattleControllerExecFlags &= ~(1u << (28 + battler)); + MarkBattleControllerMessageSynchronizedOverLink(battler); } const u8 *CheckSkyDropState(u32 battler, enum SkyDropState skyDropState) From 7263bb188600411d20bc8fca1e5c3aa1315fc69c Mon Sep 17 00:00:00 2001 From: psf <77138753+pkmnsnfrn@users.noreply.github.com> Date: Mon, 2 Jun 2025 06:41:05 -0700 Subject: [PATCH 184/187] Update CI to ignore allcontributors commits (#7046) --- .all-contributorsrc | 3 +-- .github/workflows/build.yml | 9 +++++++++ .github/workflows/labels.yml | 9 +++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index e5ecce9602..540d534f0b 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -259,6 +259,5 @@ ], "contributorsPerLine": 7, "linkToUsage": true, - "commitType": "docs", - "skipCi": true + "commitType": "docs" } diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c3040f55c7..3304101d4f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -9,6 +9,7 @@ on: jobs: build: + if: github.actor != 'allcontributors' runs-on: ubuntu-latest env: GAME_VERSION: EMERALD @@ -36,3 +37,11 @@ jobs: TEST: 1 run: | make -j${nproc} check + allcontributors: + if: github.actor == 'allcontributors' + runs-on: ubuntu-latest + needs: [] + steps: + - name: Automatically pass for allcontributors + run: echo "CI automatically passes for allcontributors" && exit 0 + diff --git a/.github/workflows/labels.yml b/.github/workflows/labels.yml index 85800211ef..7315082cb6 100644 --- a/.github/workflows/labels.yml +++ b/.github/workflows/labels.yml @@ -6,6 +6,7 @@ on: jobs: label: + if: github.actor != 'allcontributors' runs-on: ubuntu-latest steps: - name: check labels @@ -27,3 +28,11 @@ jobs: category: pokemon category: sprite-issue type: documentation + allcontributors: + if: github.actor == 'allcontributors' + runs-on: ubuntu-latest + needs: [] + steps: + - name: Automatically pass for allcontributors + run: echo "CI automatically passes for allcontributors" && exit 0 + From 8b52e100b9e733ae3c01f973c16e5497013091a7 Mon Sep 17 00:00:00 2001 From: TLM-PsIQ <87483364+TLM-PsIQ@users.noreply.github.com> Date: Tue, 3 Jun 2025 22:25:29 +0200 Subject: [PATCH 185/187] Fix ScaryFace anim for Bitter Malice (#6476) --- src/battle_anim_effects_2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index e0583c7cf8..10080dc84b 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -3395,7 +3395,7 @@ void AnimTask_ScaryFace(u8 taskId) bool32 onPlayer; if (gAnimMoveIndex == MOVE_BITTER_MALICE) - onPlayer = IsOnPlayerSide(gBattleAnimAttacker); + onPlayer = !IsOnPlayerSide(gBattleAnimAttacker); else onPlayer = !IsOnPlayerSide(gBattleAnimTarget); From 48b88899d14035ad8b37ee41ee79d5122760ca19 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 23:12:38 +0200 Subject: [PATCH 186/187] add bassforte123 as a contributor for code (#7003) Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 11 ++++++++++- CREDITS.md | 11 ++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 540d534f0b..e1db3fe48d 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -223,7 +223,7 @@ "name": "Ruby", "avatar_url": "https://avatars.githubusercontent.com/u/178652077?v=4", "profile": "https://github.com/RubyRaven6", - "contributions": [ + "contributions": [ "code", "doc" ] @@ -255,6 +255,15 @@ "contributions": [ "code" ] + }, + { + "login": "bassforte123", + "name": "bassforte123", + "avatar_url": "https://avatars.githubusercontent.com/u/130828119?v=4", + "profile": "https://github.com/bassforte123", + "contributions": [ + "code" + ] } ], "contributorsPerLine": 7, diff --git a/CREDITS.md b/CREDITS.md index 6045f2301a..d928bad0a6 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -31,23 +31,24 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Philipp AUER
    Philipp AUER

    🚧 πŸ’» tertu
    tertu

    🚧 πŸ’» psf
    psf

    🚧 πŸ’» + wiz1989
    wiz1989

    πŸ’» PCG
    PCG

    πŸ’» kittenchilly
    kittenchilly

    πŸ’» πŸ”¬ πŸ”£ - ExpoSeed
    ExpoSeed

    πŸ’» 🚧 πŸ‘€ + ExpoSeed
    ExpoSeed

    πŸ’» 🚧 πŸ‘€ Linathan
    Linathan

    πŸ’» Eduardo Quezada
    Eduardo Quezada

    πŸ’» πŸ”£ πŸ“– πŸš‡ 🚧 πŸ“† πŸ“£ πŸ”¬ πŸ‘€ ⚠️ βœ… πŸ““ khbsd
    khbsd

    πŸ“– πŸ’» Cafe
    Cafe

    🎨 agsmgmaster64
    agsmgmaster64

    πŸ’» - mudskipper13
    mudskipper13

    πŸ’» πŸ“– - Ruby
    Ruby

    πŸ’» πŸ“– + Ruby
    Ruby

    πŸ’» πŸ“– - surskitty
    surskitty

    πŸ’» - wiz1989
    wiz1989

    πŸ’» + mudskipper13
    mudskipper13

    πŸ’» πŸ“– + surskitty
    surskitty

    πŸ’» grintoul
    grintoul

    πŸ’» + bassforte123
    bassforte123

    πŸ’» From bc9a1872a1588804b30d12ff79a63909da553026 Mon Sep 17 00:00:00 2001 From: RubyRaven6 Date: Wed, 4 Jun 2025 10:50:02 +0800 Subject: [PATCH 187/187] changed build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0f988ac159..ffc4fda863 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,7 +4,7 @@ on: push: branches: - master - - upcoming + - pwt-upcoming pull_request: jobs:

  • DNjjIuwygt{~Q3zd1}tTrVtRF27PlZ- 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 ?-HY{g#`>o8wTQWuiH+zv6ZmYj0`3 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