From 08fe3b21ed4011a64878e442df267c9570f33373 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Mon, 12 Aug 2019 11:43:31 +0200 Subject: Fix modern Fixes freeze on entering Pokemon Storage System --- src/pokemon_storage_system.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/pokemon_storage_system.c b/src/pokemon_storage_system.c index 59ec8f4f1..4cd1a4772 100644 --- a/src/pokemon_storage_system.c +++ b/src/pokemon_storage_system.c @@ -464,9 +464,6 @@ EWRAM_DATA static u8 sMovingMonOrigBoxPos = 0; EWRAM_DATA static bool8 sCanOnlyMove = 0; // This file's functions. -#if !defined(NONMATCHING) && MODERN -#define static -#endif static void CreatePCMenu(u8 whichMenu, s16 *windowIdPtr); static void Cb2_EnterPSS(u8 boxOption); static u8 GetCurrentBoxOption(void); -- cgit v1.2.3 From 3c2576d3a3b1fd315042b6529822b0c925f1f9a8 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 16 Aug 2019 13:48:45 -0400 Subject: trainer rematch macro --- src/battle_setup.c | 163 ++++++++++++++++++++++++++++------------------------- 1 file changed, 85 insertions(+), 78 deletions(-) diff --git a/src/battle_setup.c b/src/battle_setup.c index 288fdb3e9..c2d7cb6c6 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -231,86 +231,93 @@ static const struct TrainerBattleParameter sTrainerBContinueScriptBattleParams[] {&sTrainerBattleEndScript, TRAINER_PARAM_LOAD_SCRIPT_RET_ADDR}, }; +#define REMATCH(trainer1, trainer2, trainer3, trainer4, trainer5, map) \ +{ \ + .trainerIds = {trainer1, trainer2, trainer3, trainer4, trainer5}, \ + .mapGroup = MAP_GROUP(map), \ + .mapNum = MAP_NUM(map), \ +} + const struct RematchTrainer gRematchTable[REMATCH_TABLE_ENTRIES] = { - [REMATCH_ROSE] = {{TRAINER_ROSE_1, TRAINER_ROSE_2, TRAINER_ROSE_3, TRAINER_ROSE_4, TRAINER_ROSE_5}, 0x0, 0x21}, - [REMATCH_ANDRES] = {{TRAINER_ANDRES_1, TRAINER_ANDRES_2, TRAINER_ANDRES_3, TRAINER_ANDRES_4, TRAINER_ANDRES_5}, 0x0, 0x14}, - [REMATCH_DUSTY] = {{TRAINER_DUSTY_1, TRAINER_DUSTY_2, TRAINER_DUSTY_3, TRAINER_DUSTY_4, TRAINER_DUSTY_5}, 0x0, 0x1a}, - [REMATCH_LOLA] = {{TRAINER_LOLA_1, TRAINER_LOLA_2, TRAINER_LOLA_3, TRAINER_LOLA_4, TRAINER_LOLA_5}, 0x0, 0x18}, - [REMATCH_RICKY] = {{TRAINER_RICKY_1, TRAINER_RICKY_2, TRAINER_RICKY_3, TRAINER_RICKY_4, TRAINER_RICKY_5}, 0x0, 0x18}, - [REMATCH_LILA_AND_ROY] = {{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}, 0x0, 0x27}, - [REMATCH_CRISTIN] = {{TRAINER_CRISTIN_1, TRAINER_CRISTIN_2, TRAINER_CRISTIN_3, TRAINER_CRISTIN_4, TRAINER_CRISTIN_5}, 0x0, 0x24}, - [REMATCH_BROOKE] = {{TRAINER_BROOKE_1, TRAINER_BROOKE_2, TRAINER_BROOKE_3, TRAINER_BROOKE_4, TRAINER_BROOKE_5}, 0x0, 0x1a}, - [REMATCH_WILTON] = {{TRAINER_WILTON_1, TRAINER_WILTON_2, TRAINER_WILTON_3, TRAINER_WILTON_4, TRAINER_WILTON_5}, 0x0, 0x1a}, - [REMATCH_VALERIE] = {{TRAINER_VALERIE_1, TRAINER_VALERIE_2, TRAINER_VALERIE_3, TRAINER_VALERIE_4, TRAINER_VALERIE_5}, 0x18, 0x14}, - [REMATCH_CINDY] = {{TRAINER_CINDY_1, TRAINER_CINDY_3, TRAINER_CINDY_4, TRAINER_CINDY_5, TRAINER_CINDY_6}, 0x0, 0x13}, - [REMATCH_THALIA] = {{TRAINER_THALIA_1, TRAINER_THALIA_2, TRAINER_THALIA_3, TRAINER_THALIA_4, TRAINER_THALIA_5}, 0x18, 0x38}, - [REMATCH_JESSICA] = {{TRAINER_JESSICA_1, TRAINER_JESSICA_2, TRAINER_JESSICA_3, TRAINER_JESSICA_4, TRAINER_JESSICA_5}, 0x0, 0x24}, - [REMATCH_WINSTON] = {{TRAINER_WINSTON_1, TRAINER_WINSTON_2, TRAINER_WINSTON_3, TRAINER_WINSTON_4, TRAINER_WINSTON_5}, 0x0, 0x13}, - [REMATCH_STEVE] = {{TRAINER_STEVE_1, TRAINER_STEVE_2, TRAINER_STEVE_3, TRAINER_STEVE_4, TRAINER_STEVE_5}, 0x0, 0x1d}, - [REMATCH_TONY] = {{TRAINER_TONY_1, TRAINER_TONY_2, TRAINER_TONY_3, TRAINER_TONY_4, TRAINER_TONY_5}, 0x0, 0x16}, - [REMATCH_NOB] = {{TRAINER_NOB_1, TRAINER_NOB_2, TRAINER_NOB_3, TRAINER_NOB_4, TRAINER_NOB_5}, 0x0, 0x1e}, - [REMATCH_KOJI] = {{TRAINER_KOJI_1, TRAINER_KOJI_2, TRAINER_KOJI_3, TRAINER_KOJI_4, TRAINER_KOJI_5}, 0x0, 0x2a}, - [REMATCH_FERNANDO] = {{TRAINER_FERNANDO_1, TRAINER_FERNANDO_2, TRAINER_FERNANDO_3, TRAINER_FERNANDO_4, TRAINER_FERNANDO_5}, 0x0, 0x26}, - [REMATCH_DALTON] = {{TRAINER_DALTON_1, TRAINER_DALTON_2, TRAINER_DALTON_3, TRAINER_DALTON_4, TRAINER_DALTON_5}, 0x0, 0x21}, - [REMATCH_BERNIE] = {{TRAINER_BERNIE_1, TRAINER_BERNIE_2, TRAINER_BERNIE_3, TRAINER_BERNIE_4, TRAINER_BERNIE_5}, 0x0, 0x1d}, - [REMATCH_ETHAN] = {{TRAINER_ETHAN_1, TRAINER_ETHAN_2, TRAINER_ETHAN_3, TRAINER_ETHAN_4, TRAINER_ETHAN_5}, 0x18, 0xd}, - [REMATCH_JOHN_AND_JAY] = {{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}, 0x18, 0x1}, - [REMATCH_JEFFREY] = {{TRAINER_JEFFREY_1, TRAINER_JEFFREY_2, TRAINER_JEFFREY_3, TRAINER_JEFFREY_4, TRAINER_JEFFREY_5}, 0x0, 0x23}, - [REMATCH_CAMERON] = {{TRAINER_CAMERON_1, TRAINER_CAMERON_2, TRAINER_CAMERON_3, TRAINER_CAMERON_4, TRAINER_CAMERON_5}, 0x0, 0x26}, - [REMATCH_JACKI] = {{TRAINER_JACKI_1, TRAINER_JACKI_2, TRAINER_JACKI_3, TRAINER_JACKI_4, TRAINER_JACKI_5}, 0x0, 0x26}, - [REMATCH_WALTER] = {{TRAINER_WALTER_1, TRAINER_WALTER_2, TRAINER_WALTER_3, TRAINER_WALTER_4, TRAINER_WALTER_5}, 0x0, 0x24}, - [REMATCH_KAREN] = {{TRAINER_KAREN_1, TRAINER_KAREN_2, TRAINER_KAREN_3, TRAINER_KAREN_4, TRAINER_KAREN_5}, 0x0, 0x1f}, - [REMATCH_JERRY] = {{TRAINER_JERRY_1, TRAINER_JERRY_2, TRAINER_JERRY_3, TRAINER_JERRY_4, TRAINER_JERRY_5}, 0x0, 0x1f}, - [REMATCH_ANNA_AND_MEG] = {{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}, 0x0, 0x20}, - [REMATCH_ISABEL] = {{TRAINER_ISABEL_1, TRAINER_ISABEL_2, TRAINER_ISABEL_3, TRAINER_ISABEL_4, TRAINER_ISABEL_5}, 0x0, 0x19}, - [REMATCH_MIGUEL] = {{TRAINER_MIGUEL_1, TRAINER_MIGUEL_2, TRAINER_MIGUEL_3, TRAINER_MIGUEL_4, TRAINER_MIGUEL_5}, 0x0, 0x12}, - [REMATCH_TIMOTHY] = {{TRAINER_TIMOTHY_1, TRAINER_TIMOTHY_2, TRAINER_TIMOTHY_3, TRAINER_TIMOTHY_4, TRAINER_TIMOTHY_5}, 0x0, 0x1e}, - [REMATCH_SHELBY] = {{TRAINER_SHELBY_1, TRAINER_SHELBY_2, TRAINER_SHELBY_3, TRAINER_SHELBY_4, TRAINER_SHELBY_5}, 0x18, 0xc}, - [REMATCH_CALVIN] = {{TRAINER_CALVIN_1, TRAINER_CALVIN_2, TRAINER_CALVIN_3, TRAINER_CALVIN_4, TRAINER_CALVIN_5}, 0x0, 0x11}, - [REMATCH_ELLIOT] = {{TRAINER_ELLIOT_1, TRAINER_ELLIOT_2, TRAINER_ELLIOT_3, TRAINER_ELLIOT_4, TRAINER_ELLIOT_5}, 0x0, 0x15}, - [REMATCH_ISAIAH] = {{TRAINER_ISAIAH_1, TRAINER_ISAIAH_2, TRAINER_ISAIAH_3, TRAINER_ISAIAH_4, TRAINER_ISAIAH_5}, 0x0, 0x2b}, - [REMATCH_MARIA] = {{TRAINER_MARIA_1, TRAINER_MARIA_2, TRAINER_MARIA_3, TRAINER_MARIA_4, TRAINER_MARIA_5}, 0x0, 0x20}, - [REMATCH_ABIGAIL] = {{TRAINER_ABIGAIL_1, TRAINER_ABIGAIL_2, TRAINER_ABIGAIL_3, TRAINER_ABIGAIL_4, TRAINER_ABIGAIL_5}, 0x0, 0x19}, - [REMATCH_DYLAN] = {{TRAINER_DYLAN_1, TRAINER_DYLAN_2, TRAINER_DYLAN_3, TRAINER_DYLAN_4, TRAINER_DYLAN_5}, 0x0, 0x20}, - [REMATCH_KATELYN] = {{TRAINER_KATELYN_1, TRAINER_KATELYN_2, TRAINER_KATELYN_3, TRAINER_KATELYN_4, TRAINER_KATELYN_5}, 0x0, 0x2b}, - [REMATCH_BENJAMIN] = {{TRAINER_BENJAMIN_1, TRAINER_BENJAMIN_2, TRAINER_BENJAMIN_3, TRAINER_BENJAMIN_4, TRAINER_BENJAMIN_5}, 0x0, 0x19}, - [REMATCH_PABLO] = {{TRAINER_PABLO_1, TRAINER_PABLO_2, TRAINER_PABLO_3, TRAINER_PABLO_4, TRAINER_PABLO_5}, 0x0, 0x29}, - [REMATCH_NICOLAS] = {{TRAINER_NICOLAS_1, TRAINER_NICOLAS_2, TRAINER_NICOLAS_3, TRAINER_NICOLAS_4, TRAINER_NICOLAS_5}, 0x18, 0x1}, - [REMATCH_ROBERT] = {{TRAINER_ROBERT_1, TRAINER_ROBERT_2, TRAINER_ROBERT_3, TRAINER_ROBERT_4, TRAINER_ROBERT_5}, 0x0, 0x23}, - [REMATCH_LAO] = {{TRAINER_LAO_1, TRAINER_LAO_2, TRAINER_LAO_3, TRAINER_LAO_4, TRAINER_LAO_5}, 0x0, 0x1c}, - [REMATCH_CYNDY] = {{TRAINER_CYNDY_1, TRAINER_CYNDY_2, TRAINER_CYNDY_3, TRAINER_CYNDY_4, TRAINER_CYNDY_5}, 0x0, 0x1e}, - [REMATCH_MADELINE] = {{TRAINER_MADELINE_1, TRAINER_MADELINE_2, TRAINER_MADELINE_3, TRAINER_MADELINE_4, TRAINER_MADELINE_5}, 0x0, 0x1c}, - [REMATCH_JENNY] = {{TRAINER_JENNY_1, TRAINER_JENNY_2, TRAINER_JENNY_3, TRAINER_JENNY_4, TRAINER_JENNY_5}, 0x0, 0x27}, - [REMATCH_DIANA] = {{TRAINER_DIANA_1, TRAINER_DIANA_2, TRAINER_DIANA_3, TRAINER_DIANA_4, TRAINER_DIANA_5}, 0x18, 0xd}, - [REMATCH_AMY_AND_LIV] = {{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}, 0x0, 0x12}, - [REMATCH_ERNEST] = {{TRAINER_ERNEST_1, TRAINER_ERNEST_2, TRAINER_ERNEST_3, TRAINER_ERNEST_4, TRAINER_ERNEST_5}, 0x0, 0x28}, - [REMATCH_CORY] = {{TRAINER_CORY_1, TRAINER_CORY_2, TRAINER_CORY_3, TRAINER_CORY_4, TRAINER_CORY_5}, 0x0, 0x17}, - [REMATCH_EDWIN] = {{TRAINER_EDWIN_1, TRAINER_EDWIN_2, TRAINER_EDWIN_3, TRAINER_EDWIN_4, TRAINER_EDWIN_5}, 0x0, 0x19}, - [REMATCH_LYDIA] = {{TRAINER_LYDIA_1, TRAINER_LYDIA_2, TRAINER_LYDIA_3, TRAINER_LYDIA_4, TRAINER_LYDIA_5}, 0x0, 0x20}, - [REMATCH_ISAAC] = {{TRAINER_ISAAC_1, TRAINER_ISAAC_2, TRAINER_ISAAC_3, TRAINER_ISAAC_4, TRAINER_ISAAC_5}, 0x0, 0x20}, - [REMATCH_GABRIELLE] = {{TRAINER_GABRIELLE_1, TRAINER_GABRIELLE_2, TRAINER_GABRIELLE_3, TRAINER_GABRIELLE_4, TRAINER_GABRIELLE_5}, 0x18, 0x11}, - [REMATCH_CATHERINE] = {{TRAINER_CATHERINE_1, TRAINER_CATHERINE_2, TRAINER_CATHERINE_3, TRAINER_CATHERINE_4, TRAINER_CATHERINE_5}, 0x0, 0x22}, - [REMATCH_JACKSON] = {{TRAINER_JACKSON_1, TRAINER_JACKSON_2, TRAINER_JACKSON_3, TRAINER_JACKSON_4, TRAINER_JACKSON_5}, 0x0, 0x22}, - [REMATCH_HALEY] = {{TRAINER_HALEY_1, TRAINER_HALEY_2, TRAINER_HALEY_3, TRAINER_HALEY_4, TRAINER_HALEY_5}, 0x0, 0x13}, - [REMATCH_JAMES] = {{TRAINER_JAMES_1, TRAINER_JAMES_2, TRAINER_JAMES_3, TRAINER_JAMES_4, TRAINER_JAMES_5}, 0x18, 0xb}, - [REMATCH_TRENT] = {{TRAINER_TRENT_1, TRAINER_TRENT_2, TRAINER_TRENT_3, TRAINER_TRENT_4, TRAINER_TRENT_5}, 0x0, 0x1b}, - [REMATCH_SAWYER] = {{TRAINER_SAWYER_1, TRAINER_SAWYER_2, TRAINER_SAWYER_3, TRAINER_SAWYER_4, TRAINER_SAWYER_5}, 0x18, 0xc}, - [REMATCH_KIRA_AND_DAN] = {{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}, 0x18, 0x3e}, - [REMATCH_WALLY_3] = {{TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6}, 0x18, 0x2b}, - [REMATCH_ROXANNE] = {{TRAINER_ROXANNE_1, TRAINER_ROXANNE_2, TRAINER_ROXANNE_3, TRAINER_ROXANNE_4, TRAINER_ROXANNE_5}, 0x0, 0x3}, - [REMATCH_BRAWLY] = {{TRAINER_BRAWLY_1, TRAINER_BRAWLY_2, TRAINER_BRAWLY_3, TRAINER_BRAWLY_4, TRAINER_BRAWLY_5}, 0x0, 0xb}, - [REMATCH_WATTSON] = {{TRAINER_WATTSON_1, TRAINER_WATTSON_2, TRAINER_WATTSON_3, TRAINER_WATTSON_4, TRAINER_WATTSON_5}, 0x0, 0x2}, - [REMATCH_FLANNERY] = {{TRAINER_FLANNERY_1, TRAINER_FLANNERY_2, TRAINER_FLANNERY_3, TRAINER_FLANNERY_4, TRAINER_FLANNERY_5}, 0x0, 0xc}, - [REMATCH_NORMAN] = {{TRAINER_NORMAN_1, TRAINER_NORMAN_2, TRAINER_NORMAN_3, TRAINER_NORMAN_4, TRAINER_NORMAN_5}, 0x0, 0x0}, - [REMATCH_WINONA] = {{TRAINER_WINONA_1, TRAINER_WINONA_2, TRAINER_WINONA_3, TRAINER_WINONA_4, TRAINER_WINONA_5}, 0x0, 0x4}, - [REMATCH_TATE_AND_LIZA] = {{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}, 0x0, 0x6}, - [REMATCH_JUAN] = {{TRAINER_JUAN_1, TRAINER_JUAN_2, TRAINER_JUAN_3, TRAINER_JUAN_4, TRAINER_JUAN_5}, 0x0, 0x7}, - [REMATCH_SIDNEY] = {{TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY, TRAINER_SIDNEY}, 0x0, 0x8}, - [REMATCH_PHOEBE] = {{TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE, TRAINER_PHOEBE}, 0x0, 0x8}, - [REMATCH_GLACIA] = {{TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA, TRAINER_GLACIA}, 0x0, 0x8}, - [REMATCH_DRAKE] = {{TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE, TRAINER_DRAKE}, 0x0, 0x8}, - [REMATCH_WALLACE] = {{TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE, TRAINER_WALLACE}, 0x0, 0x8}, + [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_3] = REMATCH(TRAINER_WALLY_3, TRAINER_WALLY_4, TRAINER_WALLY_5, TRAINER_WALLY_6, TRAINER_WALLY_6, 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), }; static const u16 sBadgeFlags[8] = -- cgit v1.2.3 From ea724278b7c9cf44a64ed7969298d4568c11c245 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 10:32:37 -0400 Subject: Juan text buffer overflow note --- data/maps/SootopolisCity_Gym_1F/scripts.inc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/maps/SootopolisCity_Gym_1F/scripts.inc b/data/maps/SootopolisCity_Gym_1F/scripts.inc index 99b9fb2ba..8db708e9c 100644 --- a/data/maps/SootopolisCity_Gym_1F/scripts.inc +++ b/data/maps/SootopolisCity_Gym_1F/scripts.inc @@ -222,6 +222,10 @@ SootopolisCity_Gym_1F_Text_225268: @ 8225268 .string "A grand illusion of water sculpted\n" .string "by POKéMON and myself!$" +@ NOTE: This defeat text actually causes a buffer overflow. It's about 50 bytes too long for +@ the gDisplayedStringBattle buffer that it's put into, and it stomps all over the gBattleTextBuffs +@ after, as well as the otherwise unused array after that. One wonders if that's the reason for +@ the existence of that unused array of ints. SootopolisCity_Gym_1F_Text_225432: @ 8225432 .string "Ahahaha, excellent!\n" .string "Very well, you are the winner.\p" -- cgit v1.2.3 From 6508469259cc7eb37c37814f16b2f3a29e9d9555 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 10:38:02 -0400 Subject: Rename movobjectoffscreen to copyobjectxytoperm Renaming the command to something that makes more sense as to what the command actually does. The command copies the current xy of the instantiated object back to its template, so that the object remains in the same place if the player walks away and despawns the object, and then comes back. "moveobjectoffscreen" implies that it might be taking the object and moving it physically to an off-screen location somehow. --- asm/macros/event.inc | 3 ++- data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc | 2 +- data/maps/DewfordTown/scripts.inc | 2 +- data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc | 4 ++-- data/maps/FarawayIsland_Interior/scripts.inc | 2 +- data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc | 2 +- data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc | 6 +++--- data/maps/Route104/scripts.inc | 6 +++--- data/maps/Route109/scripts.inc | 2 +- data/maps/Route119_WeatherInstitute_2F/scripts.inc | 2 +- data/maps/RustboroCity/scripts.inc | 2 +- data/maps/RusturfTunnel/scripts.inc | 4 ++-- data/maps/SeafloorCavern_Entrance/scripts.inc | 2 +- data/maps/SlateportCity_Harbor/scripts.inc | 2 +- data/maps/SootopolisCity/scripts.inc | 4 ++-- data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc | 2 +- data/maps/VictoryRoad_1F/scripts.inc | 2 +- data/script_cmd_table.inc | 2 +- src/scrcmd.c | 2 +- 19 files changed, 27 insertions(+), 26 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index e00bdb600..15889b1c6 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -765,7 +765,8 @@ .2byte \y .endm - .macro moveobjectoffscreen index:req + @ Copies a live event object's xy position to its template, so that if the sprite goes off screen, it'll still be there when it comes back on screen. + .macro copyobjectxytoperm index:req .byte 0x64 .2byte \index .endm diff --git a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc index 0bc74b1bd..f09166f5a 100644 --- a/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleTowerMultiBattleRoom/scripts.inc @@ -63,7 +63,7 @@ BattleFrontier_BattleTowerMultiBattleRoom_EventScript_243E41:: @ 8243E41 waitmovement 0 applymovement 1, BattleFrontier_BattleTowerMultiBattleRoom_Movement_243E77 waitmovement 0 - moveobjectoffscreen 1 + copyobjectxytoperm 1 applymovement EVENT_OBJ_ID_PLAYER, Common_Movement_WalkInPlaceUp waitmovement 0 msgbox BattleFrontier_BattleTowerMultiBattleRoom_Text_244056, MSGBOX_DEFAULT diff --git a/data/maps/DewfordTown/scripts.inc b/data/maps/DewfordTown/scripts.inc index f56411104..fa29f4099 100644 --- a/data/maps/DewfordTown/scripts.inc +++ b/data/maps/DewfordTown/scripts.inc @@ -180,7 +180,7 @@ DewfordTown_EventScript_1E96E7:: @ 81E96E7 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_DEWFORD_TOWN resetobjectpriority 2, MAP_ROUTE109 - moveobjectoffscreen 2 + copyobjectxytoperm 2 release end diff --git a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc index 959153d8a..f688918ea 100644 --- a/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc +++ b/data/maps/EverGrandeCity_PokemonLeague_1F/scripts.inc @@ -67,8 +67,8 @@ EverGrandeCity_PokemonLeague_1F_EventScript_229636:: @ 8229636 waitmessage waitfanfare closemessage - moveobjectoffscreen 3 - moveobjectoffscreen 4 + copyobjectxytoperm 3 + copyobjectxytoperm 4 setflag FLAG_ENTERED_ELITE_FOUR releaseall end diff --git a/data/maps/FarawayIsland_Interior/scripts.inc b/data/maps/FarawayIsland_Interior/scripts.inc index b6a278b03..de6545ec3 100644 --- a/data/maps/FarawayIsland_Interior/scripts.inc +++ b/data/maps/FarawayIsland_Interior/scripts.inc @@ -62,7 +62,7 @@ FarawayIsland_Interior_EventScript_267DA2:: @ 8267DA2 waitmovement 0 applymovement 1, FarawayIsland_Interior_Movement_267DCE waitmovement 0 - moveobjectoffscreen 1 + copyobjectxytoperm 1 setvar VAR_TEMP_1, 1 releaseall end diff --git a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc index b129e137e..144113d72 100644 --- a/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_1F/scripts.inc @@ -236,7 +236,7 @@ MossdeepCity_SpaceCenter_1F_EventScript_22321F:: @ 822321F msgbox MossdeepCity_SpaceCenter_1F_Text_223B90, MSGBOX_DEFAULT trainerbattle_no_intro TRAINER_GRUNT_23, MossdeepCity_SpaceCenter_1F_Text_223BC2 setflag FLAG_DEFEATED_GRUNT_SPACE_CENTER_1F - moveobjectoffscreen 9 + copyobjectxytoperm 9 switch VAR_FACING case 3, MossdeepCity_SpaceCenter_1F_EventScript_223278 case 3, MossdeepCity_SpaceCenter_1F_EventScript_223289 diff --git a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc index 11abafa0c..8dcc74116 100644 --- a/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc +++ b/data/maps/MossdeepCity_SpaceCenter_2F/scripts.inc @@ -70,9 +70,9 @@ MossdeepCity_SpaceCenter_2F_EventScript_223E09:: @ 8223E09 applymovement 7, MossdeepCity_SpaceCenter_2F_Movement_223E89 waitmovement 0 setvar VAR_MOSSDEEP_SPACE_CENTER_STATE_2, 2 - moveobjectoffscreen 5 - moveobjectoffscreen 7 - moveobjectoffscreen 6 + copyobjectxytoperm 5 + copyobjectxytoperm 7 + copyobjectxytoperm 6 releaseall end diff --git a/data/maps/Route104/scripts.inc b/data/maps/Route104/scripts.inc index 1a677001d..fd195b973 100644 --- a/data/maps/Route104/scripts.inc +++ b/data/maps/Route104/scripts.inc @@ -114,7 +114,7 @@ Route104_EventScript_1ECD4B:: @ 81ECD4B waitmovement 0 applymovement 34, Route104_Movement_1ECDCA waitmovement 0 - moveobjectoffscreen 34 + copyobjectxytoperm 34 msgbox Route104_Text_1EDCED, MSGBOX_YESNO compare VAR_RESULT, 1 goto_if_eq Route104_EventScript_1ECDED @@ -203,7 +203,7 @@ Route104_EventScript_1ECE6F:: @ 81ECE6F waitmovement 0 applymovement 34, Route104_Movement_1ECDCA waitmovement 0 - moveobjectoffscreen 34 + copyobjectxytoperm 34 msgbox Route104_Text_1EE009, MSGBOX_YESNO compare VAR_RESULT, 1 goto_if_eq Route104_EventScript_1ECF09 @@ -416,7 +416,7 @@ Route104_EventScript_1ED139:: @ 81ED139 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_ROUTE104 resetobjectpriority 2, MAP_DEWFORD_TOWN - moveobjectoffscreen 2 + copyobjectxytoperm 2 setvar VAR_BOARD_BRINEY_BOAT_STATE, 0 goto_if_unset FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_1ED1B4 goto_if_set FLAG_DELIVERED_STEVEN_LETTER, Route104_EventScript_1ED1BE diff --git a/data/maps/Route109/scripts.inc b/data/maps/Route109/scripts.inc index a036296e3..6447b49c5 100644 --- a/data/maps/Route109/scripts.inc +++ b/data/maps/Route109/scripts.inc @@ -58,7 +58,7 @@ Route109_EventScript_1EE7D5:: @ 81EE7D5 copyvar VAR_BRINEY_LOCATION, VAR_0x8008 resetobjectpriority EVENT_OBJ_ID_PLAYER, MAP_ROUTE109 resetobjectpriority 2, MAP_DEWFORD_TOWN - moveobjectoffscreen 2 + copyobjectxytoperm 2 release end diff --git a/data/maps/Route119_WeatherInstitute_2F/scripts.inc b/data/maps/Route119_WeatherInstitute_2F/scripts.inc index d5a2de5ce..9257b3a64 100644 --- a/data/maps/Route119_WeatherInstitute_2F/scripts.inc +++ b/data/maps/Route119_WeatherInstitute_2F/scripts.inc @@ -77,7 +77,7 @@ Route119_WeatherInstitute_2F_EventScript_26FFC8:: @ 826FFC8 fadescreen 0 applymovement 5, Route119_WeatherInstitute_2F_Movement_270187 waitmovement 0 - moveobjectoffscreen 5 + copyobjectxytoperm 5 goto Route119_WeatherInstitute_2F_EventScript_27004D end diff --git a/data/maps/RustboroCity/scripts.inc b/data/maps/RustboroCity/scripts.inc index cd5f4c84d..22177c783 100644 --- a/data/maps/RustboroCity/scripts.inc +++ b/data/maps/RustboroCity/scripts.inc @@ -494,7 +494,7 @@ RustboroCity_EventScript_1E0B2E:: @ 81E0B2E call_if_eq RustboroCity_EventScript_1E0BF3 setflag FLAG_INTERACTED_WITH_DEVON_EMPLOYEE_GOODS_STOLEN setvar VAR_RUSTBORO_CITY_STATE, 3 - moveobjectoffscreen 9 + copyobjectxytoperm 9 msgbox RustboroCity_Text_1E183E, MSGBOX_DEFAULT releaseall end diff --git a/data/maps/RusturfTunnel/scripts.inc b/data/maps/RusturfTunnel/scripts.inc index 8d2a4be80..8cb20e372 100644 --- a/data/maps/RusturfTunnel/scripts.inc +++ b/data/maps/RusturfTunnel/scripts.inc @@ -285,8 +285,8 @@ RusturfTunnel_EventScript_22D083:: @ 822D083 applymovement 6, RusturfTunnel_Movement_22D0AB applymovement 7, RusturfTunnel_Movement_22D0AB waitmovement 0 - moveobjectoffscreen 6 - moveobjectoffscreen 7 + copyobjectxytoperm 6 + copyobjectxytoperm 7 setvar VAR_RUSTURF_TUNNEL_STATE, 3 releaseall end diff --git a/data/maps/SeafloorCavern_Entrance/scripts.inc b/data/maps/SeafloorCavern_Entrance/scripts.inc index 1bf570549..bc4f04b7f 100644 --- a/data/maps/SeafloorCavern_Entrance/scripts.inc +++ b/data/maps/SeafloorCavern_Entrance/scripts.inc @@ -26,7 +26,7 @@ SeafloorCavern_Entrance_EventScript_234485:: @ 8234485 call_if_eq SeafloorCavern_Entrance_EventScript_234539 delay 30 setvar VAR_HAS_TALKED_TO_SEAFLOOR_CAVERN_ENTRANCE_GRUNT, 1 - moveobjectoffscreen 1 + copyobjectxytoperm 1 msgbox SeafloorCavern_Entrance_Text_234544, MSGBOX_DEFAULT closemessage applymovement 1, Common_Movement_WalkInPlaceUp diff --git a/data/maps/SlateportCity_Harbor/scripts.inc b/data/maps/SlateportCity_Harbor/scripts.inc index 32fa9fa5d..c46923bb0 100644 --- a/data/maps/SlateportCity_Harbor/scripts.inc +++ b/data/maps/SlateportCity_Harbor/scripts.inc @@ -77,7 +77,7 @@ SlateportCity_Harbor_EventScript_20C9F5:: @ 820C9F5 closemessage setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_1_BLOCKING_ENTRANCE setflag FLAG_HIDE_AQUA_HIDEOUT_1F_GRUNT_2_BLOCKING_ENTRANCE - moveobjectoffscreen 4 + copyobjectxytoperm 4 setobjectmovementtype 4, MOVEMENT_TYPE_FACE_RIGHT releaseall end diff --git a/data/maps/SootopolisCity/scripts.inc b/data/maps/SootopolisCity/scripts.inc index 7d2143346..2f3ef0434 100644 --- a/data/maps/SootopolisCity/scripts.inc +++ b/data/maps/SootopolisCity/scripts.inc @@ -1366,14 +1366,14 @@ SootopolisCity_EventScript_1E646F:: @ 81E646F SootopolisCity_EventScript_1E64B2:: @ 81E64B2 applymovement 18, SootopolisCity_Movement_1E64EC waitmovement 0 - moveobjectoffscreen 18 + copyobjectxytoperm 18 setvar VAR_SOOTOPOLIS_WALLACE_STATE, 1 return SootopolisCity_EventScript_1E64C5:: @ 81E64C5 applymovement 18, SootopolisCity_Movement_1E64EF waitmovement 0 - moveobjectoffscreen 18 + copyobjectxytoperm 18 setvar VAR_SOOTOPOLIS_WALLACE_STATE, 2 return diff --git a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc index 5f2352645..78938b7d8 100644 --- a/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc +++ b/data/maps/SootopolisCity_MysteryEventsHouse_1F/scripts.inc @@ -36,7 +36,7 @@ SootopolisCity_MysteryEventsHouse_1F_EventScript_2279B7:: @ 82279B7 waitmovement 0 applymovement 1, SootopolisCity_MysteryEventsHouse_1F_Movement_227A21 waitmovement 0 - moveobjectoffscreen 1 + copyobjectxytoperm 1 applymovement EVENT_OBJ_ID_PLAYER, Common_Movement_WalkInPlaceUp waitmovement 0 compare VAR_SOOTOPOLIS_MYSTERY_EVENTS_STATE, 1 diff --git a/data/maps/VictoryRoad_1F/scripts.inc b/data/maps/VictoryRoad_1F/scripts.inc index 5214edc44..b6983eac0 100644 --- a/data/maps/VictoryRoad_1F/scripts.inc +++ b/data/maps/VictoryRoad_1F/scripts.inc @@ -44,7 +44,7 @@ VictoryRoad_1F_EventScript_235DE1:: @ 8235DE1 trainerbattle_no_intro TRAINER_WALLY_1, VictoryRoad_1F_Text_235FFC msgbox VictoryRoad_1F_Text_236020, MSGBOX_DEFAULT clearflag FLAG_HIDE_VICTORY_ROAD_ENTRANCE_WALLY - moveobjectoffscreen 4 + copyobjectxytoperm 4 setflag FLAG_DEFEATED_WALLY_VICTORY_ROAD copyvar VAR_VICTORY_ROAD_1F_STATE, VAR_0x8008 releaseall diff --git a/data/script_cmd_table.inc b/data/script_cmd_table.inc index e9a14437a..910227a92 100644 --- a/data/script_cmd_table.inc +++ b/data/script_cmd_table.inc @@ -100,7 +100,7 @@ gScriptCmdTable:: @ 81DB67C .4byte ScrCmd_settrainerflag .4byte ScrCmd_cleartrainerflag .4byte ScrCmd_setobjectxyperm - .4byte ScrCmd_moveobjectoffscreen + .4byte ScrCmd_copyobjectxytoperm .4byte ScrCmd_setobjectmovementtype .4byte ScrCmd_waitmessage .4byte ScrCmd_message diff --git a/src/scrcmd.c b/src/scrcmd.c index 57cd3edbe..8746e0cfb 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1102,7 +1102,7 @@ bool8 ScrCmd_setobjectxyperm(struct ScriptContext *ctx) return FALSE; } -bool8 ScrCmd_moveobjectoffscreen(struct ScriptContext *ctx) +bool8 ScrCmd_copyobjectxytoperm(struct ScriptContext *ctx) { u16 localId = VarGet(ScriptReadHalfword(ctx)); -- cgit v1.2.3 From 9bcd39d86c06882c1c17909ee72ebc2b2819254b Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 10:38:48 -0400 Subject: Document the braille window id. --- src/scrcmd.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/scrcmd.c b/src/scrcmd.c index 8746e0cfb..aa03181e6 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -62,7 +62,7 @@ static EWRAM_DATA u16 sMovingNpcMapBank = 0; static EWRAM_DATA u16 sMovingNpcMapId = 0; static EWRAM_DATA u16 sFieldEffectScriptId = 0; -static u8 gUnknown_03000F30; +static u8 gBrailleWindowId; extern const SpecialFunc gSpecials[]; extern const u8 *gStdScripts[]; @@ -1515,13 +1515,13 @@ bool8 ScrCmd_braillemessage(struct ScriptContext *ctx) yText = (yText - yWindow - 1) * 8; winTemplate = CreateWindowTemplate(0, xWindow, yWindow + 1, width, height, 0xF, 0x1); - gUnknown_03000F30 = AddWindow(&winTemplate); - LoadUserWindowBorderGfx(gUnknown_03000F30, 0x214, 0xE0); - DrawStdWindowFrame(gUnknown_03000F30, 0); - PutWindowTilemap(gUnknown_03000F30); - FillWindowPixelBuffer(gUnknown_03000F30, PIXEL_FILL(1)); - AddTextPrinterParameterized(gUnknown_03000F30, 6, gStringVar4, xText, yText, 0xFF, 0x0); - CopyWindowToVram(gUnknown_03000F30, 3); + gBrailleWindowId = AddWindow(&winTemplate); + LoadUserWindowBorderGfx(gBrailleWindowId, 0x214, 0xE0); + DrawStdWindowFrame(gBrailleWindowId, 0); + PutWindowTilemap(gBrailleWindowId); + FillWindowPixelBuffer(gBrailleWindowId, PIXEL_FILL(1)); + AddTextPrinterParameterized(gBrailleWindowId, 6, gStringVar4, xText, yText, 0xFF, 0x0); + CopyWindowToVram(gBrailleWindowId, 3); return FALSE; } @@ -2254,8 +2254,8 @@ bool8 ScrCmd_setmonmetlocation(struct ScriptContext *ctx) void sub_809BDB4(void) { - ClearStdWindowAndFrame(gUnknown_03000F30, 1); - RemoveWindow(gUnknown_03000F30); + ClearStdWindowAndFrame(gBrailleWindowId, 1); + RemoveWindow(gBrailleWindowId); } bool8 ScrCmd_buffertrainerclassname(struct ScriptContext *ctx) -- cgit v1.2.3 From f4d4424618b8b357af23978ef543fd033dece7e9 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 13:25:36 -0400 Subject: Folded nops into hidemoneybox and updatemoneybox The nops are essential to the hidemoneybox and updatemoneybox commands when using vanilla versions of those commands. Even though they're not actually used parameters in the command implementation, they are still consumed, which means if someone were to get rid of the nops (as I did in TriHard) it causes the commands to consume bytecode that are not theirs, resulting in undefined behavior usually leading to softlocks. Folding the extra bytes into the macros means there's no chance of the extra bytes getting losts in scripts. --- asm/macros/event.inc | 3 +++ .../maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc | 5 +---- data/maps/MauvilleCity_GameCorner/scripts.inc | 16 ++-------------- data/maps/MtChimney/scripts.inc | 11 +---------- data/maps/Route109_SeashoreHouse/scripts.inc | 11 +---------- data/maps/Route121_SafariZoneEntrance/scripts.inc | 7 +------ data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc | 11 +---------- 7 files changed, 10 insertions(+), 54 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 15889b1c6..14051999f 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1083,6 +1083,8 @@ @ Hides the secondary box spawned by showmoney. .macro hidemoneybox .byte 0x94 + .byte 0 @ leftovers from ruby/sapphire. x, y params not used + .byte 0 .endm @ Updates the secondary box spawned by showmoney. Consumes but does not use arguments. @@ -1090,6 +1092,7 @@ .byte 0x95 .byte \x .byte \y + .byte 0 @ 1 = don't perform this command. Always 0 in vanilla. Why this is a thing is beyond me. .endm @ Gets the price reduction for the index given. In FireRed, this command is a nop. diff --git a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc index 42ced50b9..4bd4dc01c 100644 --- a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc +++ b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc @@ -143,8 +143,7 @@ LilycoveCity_DepartmentStoreRooftop_EventScript_22032F:: @ 822032F call_if_eq LilycoveCity_DepartmentStoreRooftop_EventScript_220321 compare VAR_TEMP_1, 2 call_if_eq LilycoveCity_DepartmentStoreRooftop_EventScript_220328 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 bufferitemname 0, VAR_TEMP_0 playse SE_JIHANKI msgbox LilycoveCity_DepartmentStoreRooftop_Text_2205A1, MSGBOX_DEFAULT @@ -197,8 +196,6 @@ LilycoveCity_DepartmentStoreRooftop_EventScript_220450:: @ 8220450 LilycoveCity_DepartmentStoreRooftop_EventScript_22045E:: @ 822045E hidemoneybox - nop - nop releaseall end diff --git a/data/maps/MauvilleCity_GameCorner/scripts.inc b/data/maps/MauvilleCity_GameCorner/scripts.inc index 88b1ded16..257479372 100644 --- a/data/maps/MauvilleCity_GameCorner/scripts.inc +++ b/data/maps/MauvilleCity_GameCorner/scripts.inc @@ -39,14 +39,11 @@ MauvilleCity_GameCorner_EventScript_20FC33:: @ 820FC33 goto_if_eq MauvilleCity_GameCorner_EventScript_20FCC1 givecoins 50 takemoney 0x3e8, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 updatecoinsbox 1, 6 playse SE_REGI msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT hidemoneybox - nop - nop hidecoinsbox 0, 5 release end @@ -60,14 +57,11 @@ MauvilleCity_GameCorner_EventScript_20FC75:: @ 820FC75 goto_if_eq MauvilleCity_GameCorner_EventScript_20FCC1 givecoins 500 takemoney 0x2710, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 updatecoinsbox 1, 6 playse SE_REGI msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT hidemoneybox - nop - nop hidecoinsbox 0, 5 release end @@ -80,8 +74,6 @@ MauvilleCity_GameCorner_EventScript_20FCB7:: @ 820FCB7 MauvilleCity_GameCorner_EventScript_20FCC1:: @ 820FCC1 msgbox MauvilleCity_GameCorner_Text_210553, MSGBOX_DEFAULT hidemoneybox - nop - nop hidecoinsbox 0, 5 release end @@ -89,8 +81,6 @@ MauvilleCity_GameCorner_EventScript_20FCC1:: @ 820FCC1 MauvilleCity_GameCorner_EventScript_20FCD1:: @ 820FCD1 msgbox MauvilleCity_GameCorner_Text_21059A, MSGBOX_DEFAULT hidemoneybox - nop - nop hidecoinsbox 0, 5 release end @@ -98,8 +88,6 @@ MauvilleCity_GameCorner_EventScript_20FCD1:: @ 820FCD1 MauvilleCity_GameCorner_EventScript_20FCE1:: @ 820FCE1 msgbox MauvilleCity_GameCorner_Text_21057E, MSGBOX_DEFAULT hidemoneybox - nop - nop hidecoinsbox 0, 5 release end diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index d770f095c..e89a8b437 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -115,38 +115,29 @@ MtChimney_EventScript_22EEF3:: @ 822EEF3 compare VAR_RESULT, 0 goto_if_eq MtChimney_EventScript_22EF51 hidemoneybox - nop - nop release end MtChimney_EventScript_22EF51:: @ 822EF51 msgbox gText_TooBadBagIsFull, MSGBOX_DEFAULT hidemoneybox - nop - nop release end MtChimney_EventScript_22EF5E:: @ 822EF5E takemoney 0xc8, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 return MtChimney_EventScript_22EF69:: @ 822EF69 msgbox MtChimney_Text_22FE9B, MSGBOX_DEFAULT hidemoneybox - nop - nop release end MtChimney_EventScript_22EF76:: @ 822EF76 msgbox MtChimney_Text_22FE5E, MSGBOX_DEFAULT hidemoneybox - nop - nop release end diff --git a/data/maps/Route109_SeashoreHouse/scripts.inc b/data/maps/Route109_SeashoreHouse/scripts.inc index e52ab08f9..594b17f84 100644 --- a/data/maps/Route109_SeashoreHouse/scripts.inc +++ b/data/maps/Route109_SeashoreHouse/scripts.inc @@ -43,8 +43,6 @@ Route109_SeashoreHouse_EventScript_269460:: @ 8269460 goto_if_eq Route109_SeashoreHouse_EventScript_269484 msgbox Route109_SeashoreHouse_Text_2697EF, MSGBOX_DEFAULT hidemoneybox - nop - nop release end @@ -57,28 +55,21 @@ Route109_SeashoreHouse_EventScript_269484:: @ 8269484 goto_if_eq Route109_SeashoreHouse_EventScript_2694D5 msgbox Route109_SeashoreHouse_Text_2697C8, MSGBOX_DEFAULT takemoney 0x12c, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 giveitem_std ITEM_SODA_POP hidemoneybox - nop - nop release end Route109_SeashoreHouse_EventScript_2694C8:: @ 82694C8 msgbox Route109_SeashoreHouse_Text_2697D5, MSGBOX_DEFAULT hidemoneybox - nop - nop release end Route109_SeashoreHouse_EventScript_2694D5:: @ 82694D5 msgbox gText_TooBadBagIsFull, MSGBOX_DEFAULT hidemoneybox - nop - nop release end diff --git a/data/maps/Route121_SafariZoneEntrance/scripts.inc b/data/maps/Route121_SafariZoneEntrance/scripts.inc index 69f5ea80d..001f80b15 100644 --- a/data/maps/Route121_SafariZoneEntrance/scripts.inc +++ b/data/maps/Route121_SafariZoneEntrance/scripts.inc @@ -67,8 +67,7 @@ Route121_SafariZoneEntrance_EventScript_22BC48:: @ 822BC48 playse SE_REGI msgbox Route121_SafariZoneEntrance_Text_2A501B, MSGBOX_DEFAULT takemoney 0x1f4, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 msgbox Route121_SafariZoneEntrance_Text_2A5036, MSGBOX_DEFAULT playfanfare MUS_FANFA4 message Route121_SafariZoneEntrance_Text_2A5052 @@ -76,8 +75,6 @@ Route121_SafariZoneEntrance_EventScript_22BC48:: @ 822BC48 msgbox Route121_SafariZoneEntrance_Text_2A506F, MSGBOX_DEFAULT closemessage hidemoneybox - nop - nop applymovement EVENT_OBJ_ID_PLAYER, Route121_SafariZoneEntrance_Movement_22BD18 waitmovement 0 special EnterSafariMode @@ -114,8 +111,6 @@ Route121_SafariZoneEntrance_EventScript_22BCF8:: @ 822BCF8 Route121_SafariZoneEntrance_EventScript_22BD06:: @ 822BD06 closemessage hidemoneybox - nop - nop applymovement EVENT_OBJ_ID_PLAYER, Route121_SafariZoneEntrance_Movement_22BD16 waitmovement 0 releaseall diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc index 5a4947c8a..6dc4f2242 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc @@ -26,8 +26,6 @@ SlateportCity_OceanicMuseum_1F_EventScript_20ADC1:: @ 820ADC1 goto_if_eq SlateportCity_OceanicMuseum_1F_EventScript_20ADE8 closemessage hidemoneybox - nop - nop applymovement EVENT_OBJ_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_20AE4B waitmovement 0 releaseall @@ -39,13 +37,10 @@ SlateportCity_OceanicMuseum_1F_EventScript_20ADE8:: @ 820ADE8 goto_if_eq SlateportCity_OceanicMuseum_1F_EventScript_20AE18 playse SE_REGI takemoney 0x32, 0 - updatemoneybox 0, 0 - nop + updatemoneybox 0,0 msgbox SlateportCity_OceanicMuseum_1F_Text_20B026, MSGBOX_DEFAULT setvar VAR_SLATEPORT_MUSEUM_1F_STATE, 1 hidemoneybox - nop - nop releaseall end @@ -54,8 +49,6 @@ SlateportCity_OceanicMuseum_1F_EventScript_20AE18:: @ 820AE18 msgbox SlateportCity_OceanicMuseum_1F_Text_20B03D, MSGBOX_DEFAULT closemessage hidemoneybox - nop - nop applymovement EVENT_OBJ_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_20AE4B waitmovement 0 releaseall @@ -65,8 +58,6 @@ SlateportCity_OceanicMuseum_1F_EventScript_20AE39:: @ 820AE39 msgbox SlateportCity_OceanicMuseum_1F_Text_20B075, MSGBOX_DEFAULT setvar VAR_SLATEPORT_MUSEUM_1F_STATE, 1 hidemoneybox - nop - nop releaseall end -- cgit v1.2.3 From bac8974ce375bc464c6374cfeb4d74e4dc98a20a Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 11:16:54 -0400 Subject: Added note about addvar The contest scripts actually use addvar to add a -1 to a variable instead of using subvar to subtract a positive number. This is fine in vanilla, where addvar script command does NOT support adding the value of a variable to another variable (like subvar supports), but should anyone want to change it, contests will be inexplicably broken. --- src/scrcmd.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/scrcmd.c b/src/scrcmd.c index aa03181e6..e31be848a 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -466,6 +466,9 @@ bool8 ScrCmd_addvar(struct ScriptContext *ctx) { u16 *ptr = GetVarPointer(ScriptReadHalfword(ctx)); *ptr += ScriptReadHalfword(ctx); + // Note: addvar doesn't support adding from a variable in vanilla. If you were to + // add a VarGet() to the above, make sure you change the `addvar VAR_0x8006, 65535` + // in the contest scripts to `subvar VAR_0x8006, 1`, else contests will break. return FALSE; } -- cgit v1.2.3 From d12a8c10ee045baead789f947160fea78913e7e0 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 12:01:38 -0400 Subject: Documenting credits a bit --- include/credits.h | 2 +- src/credits.c | 475 +++++++++++++++++++++++++++-------------------------- src/hall_of_fame.c | 2 +- 3 files changed, 241 insertions(+), 238 deletions(-) diff --git a/include/credits.h b/include/credits.h index e7e58415b..f7dfa9997 100644 --- a/include/credits.h +++ b/include/credits.h @@ -7,6 +7,6 @@ extern EWRAM_DATA bool8 gHasHallOfFameRecords; // Exported ROM declarations -void sub_8175620(void); +void CB2_StartCreditsSequence(void); #endif // GUARD_CREDITS_H diff --git a/src/credits.c b/src/credits.c index 1e96514b1..99c89dc8f 100644 --- a/src/credits.c +++ b/src/credits.c @@ -143,7 +143,7 @@ struct Unk201C000 struct CreditsEntry { u8 var_0; - u8 var_1; + u8 isTitle; const u8 *text; }; @@ -165,7 +165,7 @@ static const u32 gCreditsCopyrightEnd_Gfx[] = INCBIN_U32("graphics/credits/the_e static void sub_81772B8(struct Sprite *sprite); -static const u8 gUnknown_085E5BAC[] = +static const u8 sTheEnd_LetterTMap[] = { 0, 1, 0, 0xFF, 1, 0xFF, @@ -174,7 +174,7 @@ static const u8 gUnknown_085E5BAC[] = 0xFF, 1, 0xFF, }; -static const u8 gUnknown_085E5BBB[] = +static const u8 sTheEnd_LetterHMap[] = { 1, 0xFF, 1, 1, 0xFF, 1, @@ -183,7 +183,7 @@ static const u8 gUnknown_085E5BBB[] = 1, 0xFF, 1, }; -static const u8 gUnknown_085E5BCA[] = +static const u8 sTheEnd_LetterEMap[] = { 1, 0, 0, 1, 0xFF, 0xFF, @@ -192,7 +192,7 @@ static const u8 gUnknown_085E5BCA[] = 1, 0x80, 0x80, }; -static const u8 gUnknown_085E5BD9[] = +static const u8 sTheEnd_LetterNMap[] = { 1, 3, 1, 1, 4, 1, @@ -201,7 +201,7 @@ static const u8 gUnknown_085E5BD9[] = 1, 0xC3, 1, }; -static const u8 gUnknown_085E5BE8[] = +static const u8 sTheEnd_LetterDMap[] = { 1, 6, 7, 1, 8, 9, @@ -369,165 +369,165 @@ static const u8 gCreditsText_MotoyasuTojima[] = _("Motoyasu Tojima"); static const u8 gCreditsText_NicolaPrattBarlow[] = _("Nicola Pratt-Barlow"); static const u8 gCreditsText_ShellieDow[] = _("Shellie Dow"); static const u8 gCreditsText_ErikJohnson[] = _("Erik Johnson"); -static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, 0, gCreditsText_EmptyString}; -static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, 1, gCreditsText_PkmnEmeraldVersion}; -static const struct CreditsEntry gCreditsEntry_Credits[] = {11, 1, gCreditsText_Credits}; -static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, 1, gCreditsText_ExecutiveDirector}; -static const struct CreditsEntry gCreditsEntry_Director[] = {12, 1, gCreditsText_Director}; -static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, 1, gCreditsText_ArtDirector}; -static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, 1, gCreditsText_BattleDirector}; -static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, 1, gCreditsText_MainProgrammer}; -static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, 1, gCreditsText_BattleSystemPgrms}; -static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, 1, gCreditsText_FieldSystemPgrms}; -static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, 1, gCreditsText_Programmers}; -static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, 1, gCreditsText_MainGraphicDesigner}; -static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, 1, gCreditsText_GraphicDesigners}; -static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, 1, gCreditsText_PkmnDesigners}; -static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, 1, gCreditsText_MusicComposition}; -static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, 1, gCreditsText_SoundEffectsAndPkmnVoices}; -static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, 1, gCreditsText_GameDesigners}; -static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, 1, gCreditsText_ScenarioPlot}; -static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, 1, gCreditsText_Scenario}; -static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, 1, gCreditsText_ScriptDesigners}; -static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, 1, gCreditsText_MapDesigners}; -static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, 1, gCreditsText_MapDataDesigners}; -static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, 1, gCreditsText_ParametricDesigners}; -static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, 1, gCreditsText_PokedexText}; -static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, 1, gCreditsText_EnvAndToolPgrms}; -static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, 1, gCreditsText_NCLProductTesting}; -static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, 1, gCreditsText_SpecialThanks}; -static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, 1, gCreditsText_Coordinators}; -static const struct CreditsEntry gCreditsEntry_Producers[] = {11, 1, gCreditsText_Producers}; -static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, 1, gCreditsText_ExecProducers}; -static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, 1, gCreditsText_InfoSupervisors}; -static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, 1, gCreditsText_TaskManagers}; -static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, 1, gCreditsText_BrailleCodeCheck}; -static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, 1, gCreditsText_WorldDirector}; -static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, 1, gCreditsText_BattleFrontierData}; -static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, 1, gCreditsText_SupportProgrammers}; -static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, 1, gCreditsText_Artwork}; -static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, 1, gCreditsText_LeadProgrammer}; -static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, 1, gCreditsText_LeadGraphicArtist}; -static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, 0, gCreditsText_SatoshiTajiri}; -static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, 0, gCreditsText_JunichiMasuda}; -static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, 0, gCreditsText_KenSugimori}; -static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, 0, gCreditsText_ShigekiMorimoto}; -static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, 0, gCreditsText_TetsuyaWatanabe}; -static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, 0, gCreditsText_HisashiSogabe}; -static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, 0, gCreditsText_SosukeTamada}; -static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, 0, gCreditsText_AkitoMori}; -static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, 0, gCreditsText_KeitaKagaya}; -static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, 0, gCreditsText_YoshinoriMatsuda}; -static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, 0, gCreditsText_HiroyukiNakamura}; -static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, 0, gCreditsText_MasaoTaya}; -static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, 0, gCreditsText_SatoshiNohara}; -static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, 0, gCreditsText_TomomichiOhta}; -static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, 0, gCreditsText_MiyukiIwasawa}; -static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, 0, gCreditsText_TakenoriOhta}; -static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, 0, gCreditsText_HironobuYoshida}; -static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, 0, gCreditsText_MotofumiFujiwara}; -static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, 0, gCreditsText_SatoshiOhta}; -static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, 0, gCreditsText_AsukaIwashita}; -static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, 0, gCreditsText_AimiTomita}; -static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, 0, gCreditsText_TakaoUnno}; -static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, 0, gCreditsText_KanakoEo}; -static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, 0, gCreditsText_JunOkutani}; -static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, 0, gCreditsText_AtsukoNishida}; -static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, 0, gCreditsText_MuneoSaito}; -static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, 0, gCreditsText_RenaYoshikawa}; -static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, 0, gCreditsText_GoIchinose}; -static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, 0, gCreditsText_MorikazuAoki}; -static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, 0, gCreditsText_KojiNishino}; -static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, 0, gCreditsText_KenjiMatsushima}; -static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, 0, gCreditsText_TetsujiOhta}; -static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, 0, gCreditsText_HitomiSato}; -static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, 0, gCreditsText_TakeshiKawachimaru}; -static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, 0, gCreditsText_TeruyukiShimoyamada}; -static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, 0, gCreditsText_ShigeruOhmori}; -static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, 0, gCreditsText_TadashiTakahashi}; -static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, 0, gCreditsText_ToshinobuMatsumiya}; -static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, 0, gCreditsText_AkihitoTomisawa}; -static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, 0, gCreditsText_HirokiEnomoto}; -static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, 0, gCreditsText_KazuyukiTerada}; -static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, 0, gCreditsText_YuriSakurai}; -static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, 0, gCreditsText_HiromiSagawa}; -static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, 0, gCreditsText_KenjiTominaga}; -static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, 0, gCreditsText_YoshioTajiri}; -static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, 0, gCreditsText_TeikoSasaki}; -static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, 0, gCreditsText_SachikoHamano}; -static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, 0, gCreditsText_ChieMatsumiya}; -static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, 0, gCreditsText_AkikoShinozaki}; -static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, 0, gCreditsText_AstukoFujii}; -static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, 0, gCreditsText_NozomuSaito}; -static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, 0, gCreditsText_KenkichiToyama}; -static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, 0, gCreditsText_SuguruNakatsui}; -static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, 0, gCreditsText_YumiFunasaka}; -static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, 0, gCreditsText_NaokoYanase}; -static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, 0, gCreditsText_NCLSuperMarioClub}; -static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, 0, gCreditsText_AtsushiTada}; -static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, 0, gCreditsText_TakahiroOhnishi}; -static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, 0, gCreditsText_NorihideOkamura}; -static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, 0, gCreditsText_HiroNakamura}; -static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, 0, gCreditsText_HiroyukiUesugi}; -static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, 0, gCreditsText_TerukiMurakawa}; -static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, 0, gCreditsText_AkiraKinashi}; -static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, 0, gCreditsText_MichikoTakizawa}; -static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, 0, gCreditsText_MakikoTakada}; -static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, 0, gCreditsText_TakanaoKondo}; -static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, 0, gCreditsText_AiMashima}; -static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, 0, gCreditsText_GakujiNomoto}; -static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, 0, gCreditsText_TakehiroIzushi}; -static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, 0, gCreditsText_HitoshiYamagami}; -static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, 0, gCreditsText_KyokoWatanabe}; -static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, 0, gCreditsText_TakaoNakano}; -static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, 0, gCreditsText_HiroyukiJinnai}; -static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, 0, gCreditsText_HiroakiTsuru}; -static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, 0, gCreditsText_TsunekazIshihara}; -static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, 0, gCreditsText_SatoruIwata}; -static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, 0, gCreditsText_KazuyaSuyama}; -static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, 0, gCreditsText_SatoshiMitsuhara}; -static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, 0, gCreditsText_JapanBrailleLibrary}; -static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, 0, gCreditsText_TomotakaKomura}; -static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, 0, gCreditsText_MikikoOhhashi}; -static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, 0, gCreditsText_DaisukeHoshino}; -static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, 0, gCreditsText_KenjiroIto}; -static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, 0, gCreditsText_RuiKawaguchi}; -static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, 0, gCreditsText_ShunsukeKohori}; -static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, 0, gCreditsText_SachikoNakamichi}; -static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, 0, gCreditsText_FujikoNomura}; -static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, 0, gCreditsText_KazukiYoshihara}; -static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, 0, gCreditsText_RetsujiNomoto}; -static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, 0, gCreditsText_AzusaTajima}; -static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, 0, gCreditsText_ShusakuEgami}; -static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, 1, gCreditsText_PackageAndManual}; -static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, 1, gCreditsText_EnglishVersion}; -static const struct CreditsEntry gCreditsEntry_Translator[] = {0, 1, gCreditsText_Translator}; -static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, 1, gCreditsText_TextEditor}; -static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, 1, gCreditsText_NCLCoordinator}; -static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, 1, gCreditsText_GraphicDesigner}; -static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, 1, gCreditsText_NOAProductTesting}; -static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, 0, gCreditsText_HideyukiNakajima}; -static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, 0, gCreditsText_HidenoriSaeki}; -static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, 0, gCreditsText_YokoWatanabe}; -static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, 0, gCreditsText_SakaeKimura}; -static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, 0, gCreditsText_ChiakiShinkai}; -static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, 0, gCreditsText_SethMcMahill}; -static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, 0, gCreditsText_NobOgasawara}; -static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, 0, gCreditsText_TeresaLillygren}; -static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, 0, gCreditsText_KimikoNakamichi}; -static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, 0, gCreditsText_SouichiYamamoto}; -static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, 0, gCreditsText_YuichiroIto}; -static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, 0, gCreditsText_ThomasHertzog}; -static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, 0, gCreditsText_MikaKurosawa}; -static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, 0, gCreditsText_NationalFederationBlind}; -static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, 0, gCreditsText_PatriciaAMaurer}; -static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, 0, gCreditsText_EuropeanBlindUnion}; -static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, 0, gCreditsText_AustralianBrailleAuthority}; -static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, 0, gCreditsText_RoyalNewZealandFederationBlind}; -static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, 0, gCreditsText_MotoyasuTojima}; -static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, 0, gCreditsText_NicolaPrattBarlow}; -static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, 0, gCreditsText_ShellieDow}; -static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, 0, gCreditsText_ErikJohnson}; +static const struct CreditsEntry gCreditsEntry_EmptyString[] = {0, FALSE, gCreditsText_EmptyString}; +static const struct CreditsEntry gCreditsEntry_PkmnEmeraldVersion[] = {7, TRUE, gCreditsText_PkmnEmeraldVersion}; +static const struct CreditsEntry gCreditsEntry_Credits[] = {11, TRUE, gCreditsText_Credits}; +static const struct CreditsEntry gCreditsEntry_ExecutiveDirector[] = {8, TRUE, gCreditsText_ExecutiveDirector}; +static const struct CreditsEntry gCreditsEntry_Director[] = {12, TRUE, gCreditsText_Director}; +static const struct CreditsEntry gCreditsEntry_ArtDirector[] = {10, TRUE, gCreditsText_ArtDirector}; +static const struct CreditsEntry gCreditsEntry_BattleDirector[] = {10, TRUE, gCreditsText_BattleDirector}; +static const struct CreditsEntry gCreditsEntry_MainProgrammer[] = {10, TRUE, gCreditsText_MainProgrammer}; +static const struct CreditsEntry gCreditsEntry_BattleSystemPgrms[] = {8, TRUE, gCreditsText_BattleSystemPgrms}; +static const struct CreditsEntry gCreditsEntry_FieldSystemPgrms[] = {7, TRUE, gCreditsText_FieldSystemPgrms}; +static const struct CreditsEntry gCreditsEntry_Programmers[] = {12, TRUE, gCreditsText_Programmers}; +static const struct CreditsEntry gCreditsEntry_MainGraphicDesigner[] = {7, TRUE, gCreditsText_MainGraphicDesigner}; +static const struct CreditsEntry gCreditsEntry_GraphicDesigners[] = {9, TRUE, gCreditsText_GraphicDesigners}; +static const struct CreditsEntry gCreditsEntry_PkmnDesigners[] = {10, TRUE, gCreditsText_PkmnDesigners}; +static const struct CreditsEntry gCreditsEntry_MusicComposition[] = {13, TRUE, gCreditsText_MusicComposition}; +static const struct CreditsEntry gCreditsEntry_SoundEffectsAndPkmnVoices[] = {4, TRUE, gCreditsText_SoundEffectsAndPkmnVoices}; +static const struct CreditsEntry gCreditsEntry_GameDesigners[] = {11, TRUE, gCreditsText_GameDesigners}; +static const struct CreditsEntry gCreditsEntry_ScenarioPlot[] = {11, TRUE, gCreditsText_ScenarioPlot}; +static const struct CreditsEntry gCreditsEntry_Scenario[] = {13, TRUE, gCreditsText_Scenario}; +static const struct CreditsEntry gCreditsEntry_ScriptDesigners[] = {10, TRUE, gCreditsText_ScriptDesigners}; +static const struct CreditsEntry gCreditsEntry_MapDesigners[] = {11, TRUE, gCreditsText_MapDesigners}; +static const struct CreditsEntry gCreditsEntry_MapDataDesigners[] = {9, TRUE, gCreditsText_MapDataDesigners}; +static const struct CreditsEntry gCreditsEntry_ParametricDesigners[] = {9, TRUE, gCreditsText_ParametricDesigners}; +static const struct CreditsEntry gCreditsEntry_PokedexText[] = {11, TRUE, gCreditsText_PokedexText}; +static const struct CreditsEntry gCreditsEntry_EnvAndToolPgrms[] = {6, TRUE, gCreditsText_EnvAndToolPgrms}; +static const struct CreditsEntry gCreditsEntry_NCLProductTesting[] = {11, TRUE, gCreditsText_NCLProductTesting}; +static const struct CreditsEntry gCreditsEntry_SpecialThanks[] = {10, TRUE, gCreditsText_SpecialThanks}; +static const struct CreditsEntry gCreditsEntry_Coordinators[] = {11, TRUE, gCreditsText_Coordinators}; +static const struct CreditsEntry gCreditsEntry_Producers[] = {11, TRUE, gCreditsText_Producers}; +static const struct CreditsEntry gCreditsEntry_ExecProducers[] = {7, TRUE, gCreditsText_ExecProducers}; +static const struct CreditsEntry gCreditsEntry_InfoSupervisors[] = {10, TRUE, gCreditsText_InfoSupervisors}; +static const struct CreditsEntry gCreditsEntry_TaskManagers[] = {8, TRUE, gCreditsText_TaskManagers}; +static const struct CreditsEntry gCreditsEntry_BrailleCodeCheck[] = {10, TRUE, gCreditsText_BrailleCodeCheck}; +static const struct CreditsEntry gCreditsEntry_WorldDirector[] = {10, TRUE, gCreditsText_WorldDirector}; +static const struct CreditsEntry gCreditsEntry_BattleFrontierData[] = {8, TRUE, gCreditsText_BattleFrontierData}; +static const struct CreditsEntry gCreditsEntry_SupportProgrammers[] = {10, TRUE, gCreditsText_SupportProgrammers}; +static const struct CreditsEntry gCreditsEntry_Artwork[] = {12, TRUE, gCreditsText_Artwork}; +static const struct CreditsEntry gCreditsEntry_LeadProgrammer[] = {10, TRUE, gCreditsText_LeadProgrammer}; +static const struct CreditsEntry gCreditsEntry_LeadGraphicArtist[] = {9, TRUE, gCreditsText_LeadGraphicArtist}; +static const struct CreditsEntry gCreditsEntry_SatoshiTajiri[] = {11, FALSE, gCreditsText_SatoshiTajiri}; +static const struct CreditsEntry gCreditsEntry_JunichiMasuda[] = {11, FALSE, gCreditsText_JunichiMasuda}; +static const struct CreditsEntry gCreditsEntry_KenSugimori[] = {11, FALSE, gCreditsText_KenSugimori}; +static const struct CreditsEntry gCreditsEntry_ShigekiMorimoto[] = {11, FALSE, gCreditsText_ShigekiMorimoto}; +static const struct CreditsEntry gCreditsEntry_TetsuyaWatanabe[] = {11, FALSE, gCreditsText_TetsuyaWatanabe}; +static const struct CreditsEntry gCreditsEntry_HisashiSogabe[] = {11, FALSE, gCreditsText_HisashiSogabe}; +static const struct CreditsEntry gCreditsEntry_SosukeTamada[] = {11, FALSE, gCreditsText_SosukeTamada}; +static const struct CreditsEntry gCreditsEntry_AkitoMori[] = {11, FALSE, gCreditsText_AkitoMori}; +static const struct CreditsEntry gCreditsEntry_KeitaKagaya[] = {11, FALSE, gCreditsText_KeitaKagaya}; +static const struct CreditsEntry gCreditsEntry_YoshinoriMatsuda[] = {11, FALSE, gCreditsText_YoshinoriMatsuda}; +static const struct CreditsEntry gCreditsEntry_HiroyukiNakamura[] = {11, FALSE, gCreditsText_HiroyukiNakamura}; +static const struct CreditsEntry gCreditsEntry_MasaoTaya[] = {11, FALSE, gCreditsText_MasaoTaya}; +static const struct CreditsEntry gCreditsEntry_SatoshiNohara[] = {11, FALSE, gCreditsText_SatoshiNohara}; +static const struct CreditsEntry gCreditsEntry_TomomichiOhta[] = {11, FALSE, gCreditsText_TomomichiOhta}; +static const struct CreditsEntry gCreditsEntry_MiyukiIwasawa[] = {11, FALSE, gCreditsText_MiyukiIwasawa}; +static const struct CreditsEntry gCreditsEntry_TakenoriOhta[] = {11, FALSE, gCreditsText_TakenoriOhta}; +static const struct CreditsEntry gCreditsEntry_HironobuYoshida[] = {11, FALSE, gCreditsText_HironobuYoshida}; +static const struct CreditsEntry gCreditsEntry_MotofumiFujiwara[] = {11, FALSE, gCreditsText_MotofumiFujiwara}; +static const struct CreditsEntry gCreditsEntry_SatoshiOhta[] = {11, FALSE, gCreditsText_SatoshiOhta}; +static const struct CreditsEntry gCreditsEntry_AsukaIwashita[] = {11, FALSE, gCreditsText_AsukaIwashita}; +static const struct CreditsEntry gCreditsEntry_AimiTomita[] = {11, FALSE, gCreditsText_AimiTomita}; +static const struct CreditsEntry gCreditsEntry_TakaoUnno[] = {11, FALSE, gCreditsText_TakaoUnno}; +static const struct CreditsEntry gCreditsEntry_KanakoEo[] = {11, FALSE, gCreditsText_KanakoEo}; +static const struct CreditsEntry gCreditsEntry_JunOkutani[] = {11, FALSE, gCreditsText_JunOkutani}; +static const struct CreditsEntry gCreditsEntry_AtsukoNishida[] = {11, FALSE, gCreditsText_AtsukoNishida}; +static const struct CreditsEntry gCreditsEntry_MuneoSaito[] = {11, FALSE, gCreditsText_MuneoSaito}; +static const struct CreditsEntry gCreditsEntry_RenaYoshikawa[] = {11, FALSE, gCreditsText_RenaYoshikawa}; +static const struct CreditsEntry gCreditsEntry_GoIchinose[] = {11, FALSE, gCreditsText_GoIchinose}; +static const struct CreditsEntry gCreditsEntry_MorikazuAoki[] = {11, FALSE, gCreditsText_MorikazuAoki}; +static const struct CreditsEntry gCreditsEntry_KojiNishino[] = {11, FALSE, gCreditsText_KojiNishino}; +static const struct CreditsEntry gCreditsEntry_KenjiMatsushima[] = {11, FALSE, gCreditsText_KenjiMatsushima}; +static const struct CreditsEntry gCreditsEntry_TetsujiOhta[] = {11, FALSE, gCreditsText_TetsujiOhta}; +static const struct CreditsEntry gCreditsEntry_HitomiSato[] = {11, FALSE, gCreditsText_HitomiSato}; +static const struct CreditsEntry gCreditsEntry_TakeshiKawachimaru[] = {11, FALSE, gCreditsText_TakeshiKawachimaru}; +static const struct CreditsEntry gCreditsEntry_TeruyukiShimoyamada[] = {11, FALSE, gCreditsText_TeruyukiShimoyamada}; +static const struct CreditsEntry gCreditsEntry_ShigeruOhmori[] = {11, FALSE, gCreditsText_ShigeruOhmori}; +static const struct CreditsEntry gCreditsEntry_TadashiTakahashi[] = {11, FALSE, gCreditsText_TadashiTakahashi}; +static const struct CreditsEntry gCreditsEntry_ToshinobuMatsumiya[] = {11, FALSE, gCreditsText_ToshinobuMatsumiya}; +static const struct CreditsEntry gCreditsEntry_AkihitoTomisawa[] = {11, FALSE, gCreditsText_AkihitoTomisawa}; +static const struct CreditsEntry gCreditsEntry_HirokiEnomoto[] = {11, FALSE, gCreditsText_HirokiEnomoto}; +static const struct CreditsEntry gCreditsEntry_KazuyukiTerada[] = {11, FALSE, gCreditsText_KazuyukiTerada}; +static const struct CreditsEntry gCreditsEntry_YuriSakurai[] = {11, FALSE, gCreditsText_YuriSakurai}; +static const struct CreditsEntry gCreditsEntry_HiromiSagawa[] = {11, FALSE, gCreditsText_HiromiSagawa}; +static const struct CreditsEntry gCreditsEntry_KenjiTominaga[] = {11, FALSE, gCreditsText_KenjiTominaga}; +static const struct CreditsEntry gCreditsEntry_YoshioTajiri[] = {11, FALSE, gCreditsText_YoshioTajiri}; +static const struct CreditsEntry gCreditsEntry_TeikoSasaki[] = {11, FALSE, gCreditsText_TeikoSasaki}; +static const struct CreditsEntry gCreditsEntry_SachikoHamano[] = {11, FALSE, gCreditsText_SachikoHamano}; +static const struct CreditsEntry gCreditsEntry_ChieMatsumiya[] = {11, FALSE, gCreditsText_ChieMatsumiya}; +static const struct CreditsEntry gCreditsEntry_AkikoShinozaki[] = {11, FALSE, gCreditsText_AkikoShinozaki}; +static const struct CreditsEntry gCreditsEntry_AstukoFujii[] = {11, FALSE, gCreditsText_AstukoFujii}; +static const struct CreditsEntry gCreditsEntry_NozomuSaito[] = {11, FALSE, gCreditsText_NozomuSaito}; +static const struct CreditsEntry gCreditsEntry_KenkichiToyama[] = {11, FALSE, gCreditsText_KenkichiToyama}; +static const struct CreditsEntry gCreditsEntry_SuguruNakatsui[] = {11, FALSE, gCreditsText_SuguruNakatsui}; +static const struct CreditsEntry gCreditsEntry_YumiFunasaka[] = {11, FALSE, gCreditsText_YumiFunasaka}; +static const struct CreditsEntry gCreditsEntry_NaokoYanase[] = {11, FALSE, gCreditsText_NaokoYanase}; +static const struct CreditsEntry gCreditsEntry_NCLSuperMarioClub[] = {11, FALSE, gCreditsText_NCLSuperMarioClub}; +static const struct CreditsEntry gCreditsEntry_AtsushiTada[] = {11, FALSE, gCreditsText_AtsushiTada}; +static const struct CreditsEntry gCreditsEntry_TakahiroOhnishi[] = {11, FALSE, gCreditsText_TakahiroOhnishi}; +static const struct CreditsEntry gCreditsEntry_NorihideOkamura[] = {11, FALSE, gCreditsText_NorihideOkamura}; +static const struct CreditsEntry gCreditsEntry_HiroNakamura[] = {11, FALSE, gCreditsText_HiroNakamura}; +static const struct CreditsEntry gCreditsEntry_HiroyukiUesugi[] = {11, FALSE, gCreditsText_HiroyukiUesugi}; +static const struct CreditsEntry gCreditsEntry_TerukiMurakawa[] = {11, FALSE, gCreditsText_TerukiMurakawa}; +static const struct CreditsEntry gCreditsEntry_AkiraKinashi[] = {11, FALSE, gCreditsText_AkiraKinashi}; +static const struct CreditsEntry gCreditsEntry_MichikoTakizawa[] = {11, FALSE, gCreditsText_MichikoTakizawa}; +static const struct CreditsEntry gCreditsEntry_MakikoTakada[] = {11, FALSE, gCreditsText_MakikoTakada}; +static const struct CreditsEntry gCreditsEntry_TakanaoKondo[] = {11, FALSE, gCreditsText_TakanaoKondo}; +static const struct CreditsEntry gCreditsEntry_AiMashima[] = {11, FALSE, gCreditsText_AiMashima}; +static const struct CreditsEntry gCreditsEntry_GakujiNomoto[] = {11, FALSE, gCreditsText_GakujiNomoto}; +static const struct CreditsEntry gCreditsEntry_TakehiroIzushi[] = {11, FALSE, gCreditsText_TakehiroIzushi}; +static const struct CreditsEntry gCreditsEntry_HitoshiYamagami[] = {11, FALSE, gCreditsText_HitoshiYamagami}; +static const struct CreditsEntry gCreditsEntry_KyokoWatanabe[] = {11, FALSE, gCreditsText_KyokoWatanabe}; +static const struct CreditsEntry gCreditsEntry_TakaoNakano[] = {11, FALSE, gCreditsText_TakaoNakano}; +static const struct CreditsEntry gCreditsEntry_HiroyukiJinnai[] = {11, FALSE, gCreditsText_HiroyukiJinnai}; +static const struct CreditsEntry gCreditsEntry_HiroakiTsuru[] = {11, FALSE, gCreditsText_HiroakiTsuru}; +static const struct CreditsEntry gCreditsEntry_TsunekazIshihara[] = {11, FALSE, gCreditsText_TsunekazIshihara}; +static const struct CreditsEntry gCreditsEntry_SatoruIwata[] = {11, FALSE, gCreditsText_SatoruIwata}; +static const struct CreditsEntry gCreditsEntry_KazuyaSuyama[] = {11, FALSE, gCreditsText_KazuyaSuyama}; +static const struct CreditsEntry gCreditsEntry_SatoshiMitsuhara[] = {11, FALSE, gCreditsText_SatoshiMitsuhara}; +static const struct CreditsEntry gCreditsEntry_JapanBrailleLibrary[] = {9, FALSE, gCreditsText_JapanBrailleLibrary}; +static const struct CreditsEntry gCreditsEntry_TomotakaKomura[] = {11, FALSE, gCreditsText_TomotakaKomura}; +static const struct CreditsEntry gCreditsEntry_MikikoOhhashi[] = {11, FALSE, gCreditsText_MikikoOhhashi}; +static const struct CreditsEntry gCreditsEntry_DaisukeHoshino[] = {11, FALSE, gCreditsText_DaisukeHoshino}; +static const struct CreditsEntry gCreditsEntry_KenjiroIto[] = {11, FALSE, gCreditsText_KenjiroIto}; +static const struct CreditsEntry gCreditsEntry_RuiKawaguchi[] = {11, FALSE, gCreditsText_RuiKawaguchi}; +static const struct CreditsEntry gCreditsEntry_ShunsukeKohori[] = {11, FALSE, gCreditsText_ShunsukeKohori}; +static const struct CreditsEntry gCreditsEntry_SachikoNakamichi[] = {11, FALSE, gCreditsText_SachikoNakamichi}; +static const struct CreditsEntry gCreditsEntry_FujikoNomura[] = {11, FALSE, gCreditsText_FujikoNomura}; +static const struct CreditsEntry gCreditsEntry_KazukiYoshihara[] = {11, FALSE, gCreditsText_KazukiYoshihara}; +static const struct CreditsEntry gCreditsEntry_RetsujiNomoto[] = {11, FALSE, gCreditsText_RetsujiNomoto}; +static const struct CreditsEntry gCreditsEntry_AzusaTajima[] = {11, FALSE, gCreditsText_AzusaTajima}; +static const struct CreditsEntry gCreditsEntry_ShusakuEgami[] = {11, FALSE, gCreditsText_ShusakuEgami}; +static const struct CreditsEntry gCreditsEntry_PackageAndManual[] = {0, TRUE, gCreditsText_PackageAndManual}; +static const struct CreditsEntry gCreditsEntry_EnglishVersion[] = {0, TRUE, gCreditsText_EnglishVersion}; +static const struct CreditsEntry gCreditsEntry_Translator[] = {0, TRUE, gCreditsText_Translator}; +static const struct CreditsEntry gCreditsEntry_TextEditor[] = {0, TRUE, gCreditsText_TextEditor}; +static const struct CreditsEntry gCreditsEntry_NCLCoordinator[] = {0, TRUE, gCreditsText_NCLCoordinator}; +static const struct CreditsEntry gCreditsEntry_GraphicDesigner[] = {0, TRUE, gCreditsText_GraphicDesigner}; +static const struct CreditsEntry gCreditsEntry_NOAProductTesting[] = {0, TRUE, gCreditsText_NOAProductTesting}; +static const struct CreditsEntry gCreditsEntry_HideyukiNakajima[] = {0, FALSE, gCreditsText_HideyukiNakajima}; +static const struct CreditsEntry gCreditsEntry_HidenoriSaeki[] = {0, FALSE, gCreditsText_HidenoriSaeki}; +static const struct CreditsEntry gCreditsEntry_YokoWatanabe[] = {0, FALSE, gCreditsText_YokoWatanabe}; +static const struct CreditsEntry gCreditsEntry_SakaeKimura[] = {0, FALSE, gCreditsText_SakaeKimura}; +static const struct CreditsEntry gCreditsEntry_ChiakiShinkai[] = {0, FALSE, gCreditsText_ChiakiShinkai}; +static const struct CreditsEntry gCreditsEntry_SethMcMahill[] = {0, FALSE, gCreditsText_SethMcMahill}; +static const struct CreditsEntry gCreditsEntry_NobOgasawara[] = {0, FALSE, gCreditsText_NobOgasawara}; +static const struct CreditsEntry gCreditsEntry_TeresaLillygren[] = {0, FALSE, gCreditsText_TeresaLillygren}; +static const struct CreditsEntry gCreditsEntry_KimikoNakamichi[] = {0, FALSE, gCreditsText_KimikoNakamichi}; +static const struct CreditsEntry gCreditsEntry_SouichiYamamoto[] = {0, FALSE, gCreditsText_SouichiYamamoto}; +static const struct CreditsEntry gCreditsEntry_YuichiroIto[] = {0, FALSE, gCreditsText_YuichiroIto}; +static const struct CreditsEntry gCreditsEntry_ThomasHertzog[] = {0, FALSE, gCreditsText_ThomasHertzog}; +static const struct CreditsEntry gCreditsEntry_MikaKurosawa[] = {0, FALSE, gCreditsText_MikaKurosawa}; +static const struct CreditsEntry gCreditsEntry_NationalFederationBlind[] = {0, FALSE, gCreditsText_NationalFederationBlind}; +static const struct CreditsEntry gCreditsEntry_PatriciaAMaurer[] = {0, FALSE, gCreditsText_PatriciaAMaurer}; +static const struct CreditsEntry gCreditsEntry_EuropeanBlindUnion[] = {0, FALSE, gCreditsText_EuropeanBlindUnion}; +static const struct CreditsEntry gCreditsEntry_AustralianBrailleAuthority[] = {0, FALSE, gCreditsText_AustralianBrailleAuthority}; +static const struct CreditsEntry gCreditsEntry_RoyalNewZealandFederationBlind[] = {0, FALSE, gCreditsText_RoyalNewZealandFederationBlind}; +static const struct CreditsEntry gCreditsEntry_MotoyasuTojima[] = {0, FALSE, gCreditsText_MotoyasuTojima}; +static const struct CreditsEntry gCreditsEntry_NicolaPrattBarlow[] = {0, FALSE, gCreditsText_NicolaPrattBarlow}; +static const struct CreditsEntry gCreditsEntry_ShellieDow[] = {0, FALSE, gCreditsText_ShellieDow}; +static const struct CreditsEntry gCreditsEntry_ErikJohnson[] = {0, FALSE, gCreditsText_ErikJohnson}; #define _ gCreditsEntry_EmptyString static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] = @@ -934,7 +934,7 @@ static const struct CreditsEntry *const gCreditsEntryPointerTable[][5] = }; #undef _ -static const struct BgTemplate gUnknown_085E6F68[] = +static const struct BgTemplate sBackgroundTemplates[] = { { .bg = 0, @@ -946,7 +946,7 @@ static const struct BgTemplate gUnknown_085E6F68[] = .baseTile = 0 }, }; -static const struct WindowTemplate gUnknown_085E6F6C[] = +static const struct WindowTemplate sWindowTemplates[] = { { .bg = 0, @@ -1102,51 +1102,51 @@ static const struct SpriteTemplate gUnknown_085E7068 = .callback = sub_81772B8, }; -static void sub_8175744(u8 taskIdA); -static void sub_8175774(u8 taskIdA); +static void Task_WaitPaletteFade(u8 taskIdA); +static void Task_ProgressCreditTasks(u8 taskIdA); static void sub_8175808(u8 taskIdA); static void c2_080C9BFC(u8 taskIdA); -static void sub_81758E4(u8 taskIdA); +static void Task_CreditsLoadGrassScene(u8 taskIdA); static void sub_81758A4(u8 taskIdA); -static void sub_8175A9C(u8 taskIdA); -static void sub_8175AE4(u8 taskIdA); -static void sub_8175B1C(u8 taskIdA); -static void sub_8175B90(u8 taskIdA); -static void sub_8175BD8(u8 taskIdA); -static void sub_8175C34(u8 taskIdA); -static void sub_8175CC8(u8 taskIdA); -static void sub_8175CE4(void); +static void Task_CreditsTheEnd1(u8 taskIdA); +static void Task_CreditsTheEnd2(u8 taskIdA); +static void Task_CreditsTheEnd3(u8 taskIdA); +static void Task_CreditsTheEnd4(u8 taskIdA); +static void Task_CreditsTheEnd5(u8 taskIdA); +static void Task_CreditsTheEnd6(u8 taskIdA); +static void Task_CreditsSoftReset(u8 taskIdA); +static void ResetGpuAndVram(void); static void sub_8175DA0(u8 taskIdB); -static u8 sub_817603C(u8 page, u8 taskIdA); +static u8 CheckChangeScene(u8 page, u8 taskIdA); static void sub_81760FC(u8 taskIdA); static void sub_817651C(u8 taskIdA); static void sub_817624C(u8 taskIdA); static bool8 sub_8176AB0(u8 data, u8 taskIdA); -static void sub_8176CA0(u8 taskIdA); -static void sub_8176D1C(u16, u16, u16); +static void ResetCreditsTasks(u8 taskIdA); +static void LoadTheEndScreen(u16, u16, u16); static void sub_8176E40(u16 arg0, u16 palette); static void sub_8176EE8(struct Sprite *sprite); static void sub_8176F90(struct Sprite *sprite); static u8 sub_8177224(u16 species, s16 x, s16 y, u16 position); static void sub_8177388(void); -static void sub_81754C8(void) +static void CreditsVBlankCallback(void) { LoadOam(); ProcessSpriteCopyRequests(); TransferPlttBuffer(); } -static void sub_81754DC(void) +static void CB2_RunCreditsSequence(void) { RunTasks(); AnimateSprites(); if ((gMain.heldKeys & B_BUTTON) && gHasHallOfFameRecords != 0 - && gTasks[gUnknown_0203BCE2].func == sub_8175774) + && gTasks[gUnknown_0203BCE2].func == Task_ProgressCreditTasks) { - sub_81754C8(); + CreditsVBlankCallback(); RunTasks(); AnimateSprites(); gUnknown_0203BCE5 = 1; @@ -1158,10 +1158,10 @@ static void sub_81754DC(void) static void sub_8175548(void) { ResetBgsAndClearDma3BusyFlags(0); - InitBgsFromTemplates(0, gUnknown_085E6F68, 1); + InitBgsFromTemplates(0, sBackgroundTemplates, 1); SetBgTilemapBuffer(0, AllocZeroed(0x800)); LoadPalette(gUnknown_085E56F0, 0x80, 0x40); - InitWindows(gUnknown_085E6F6C); + InitWindows(sWindowTemplates); DeactivateAllTextPrinters(); PutWindowTilemap(0); CopyWindowToVram(0, 3); @@ -1177,14 +1177,14 @@ static void sub_81755A4(void) Free(ptr); } -static void sub_81755BC(const u8 *string, u8 y, u8 a2) +static void PrintCreditsText(const u8 *string, u8 y, u8 isTitle) { u8 x; u8 color[3]; color[0] = 0; - if (a2 == 1) + if (isTitle == 1) { color[1] = 3; color[2] = 4; @@ -1199,20 +1199,20 @@ static void sub_81755BC(const u8 *string, u8 y, u8 a2) AddTextPrinterParameterized4(0, 1, x, y, 1, 0, color, -1, string); } -void sub_8175620(void) +void CB2_StartCreditsSequence(void) { u8 taskIdA; s16 taskIdC; u8 taskIdB; - sub_8175CE4(); + ResetGpuAndVram(); SetVBlankCallback(NULL); InitHeap(gHeap, HEAP_SIZE); ResetPaletteFade(); ResetTasks(); sub_8175548(); - taskIdA = CreateTask(sub_8175744, 0); + taskIdA = CreateTask(Task_WaitPaletteFade, 0); gTasks[taskIdA].data[TDA_4] = 0; gTasks[taskIdA].data[TDA_7] = 0; @@ -1237,9 +1237,9 @@ void sub_8175620(void) BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(sub_81754C8); + SetVBlankCallback(CreditsVBlankCallback); m4aSongNumStart(MUS_THANKFOR); - SetMainCallback2(sub_81754DC); + SetMainCallback2(CB2_RunCreditsSequence); gUnknown_0203BCE5 = 0; gUnknown_0203BCE8 = AllocZeroed(sizeof(struct Unk201C000)); @@ -1252,13 +1252,13 @@ void sub_8175620(void) gUnknown_0203BCE2 = taskIdA; } -static void sub_8175744(u8 taskIdA) +static void Task_WaitPaletteFade(u8 taskIdA) { if (!gPaletteFade.active) - gTasks[taskIdA].func = sub_8175774; + gTasks[taskIdA].func = Task_ProgressCreditTasks; } -static void sub_8175774(u8 taskIdA) +static void Task_ProgressCreditTasks(u8 taskIdA) { u16 data1; @@ -1270,7 +1270,7 @@ static void sub_8175774(u8 taskIdA) gTasks[taskIdC].data[TDC_0] = 30; gTasks[taskIdA].data[TDA_12] = 0x100; - gTasks[taskIdA].func = sub_8175A9C; + gTasks[taskIdA].func = Task_CreditsTheEnd1; return; } @@ -1298,7 +1298,7 @@ static void sub_8175808(u8 taskIdA) if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - sub_8176CA0(taskIdA); + ResetCreditsTasks(taskIdA); gTasks[taskIdA].func = c2_080C9BFC; } } @@ -1313,8 +1313,8 @@ static void c2_080C9BFC(u8 taskIdA) { BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, RGB_BLACK); EnableInterrupts(INTR_FLAG_VBLANK); - SetVBlankCallback(sub_81754C8); - gTasks[taskIdA].func = sub_8175744; + SetVBlankCallback(CreditsVBlankCallback); + gTasks[taskIdA].func = Task_WaitPaletteFade; } } @@ -1323,12 +1323,12 @@ static void sub_81758A4(u8 taskIdA) if (!gPaletteFade.active) { SetGpuReg(REG_OFFSET_DISPCNT, 0); - sub_8176CA0(taskIdA); - gTasks[taskIdA].func = sub_81758E4; + ResetCreditsTasks(taskIdA); + gTasks[taskIdA].func = Task_CreditsLoadGrassScene; } } -static void sub_81758E4(u8 taskIdA) +static void Task_CreditsLoadGrassScene(u8 taskIdA) { switch (gMain.state) { @@ -1387,12 +1387,12 @@ static void sub_81758E4(u8 taskIdA) gMain.state = 0; gUnknown_0203BD28 = 0; - gTasks[taskIdA].func = sub_8175744; + gTasks[taskIdA].func = Task_WaitPaletteFade; break; } } -static void sub_8175A9C(u8 taskIdA) +static void Task_CreditsTheEnd1(u8 taskIdA) { if (gTasks[taskIdA].data[TDA_12]) { @@ -1401,23 +1401,23 @@ static void sub_8175A9C(u8 taskIdA) } BeginNormalPaletteFade(0xFFFFFFFF, 12, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = sub_8175AE4; + gTasks[taskIdA].func = Task_CreditsTheEnd2; } -static void sub_8175AE4(u8 taskIdA) +static void Task_CreditsTheEnd2(u8 taskIdA) { if (!gPaletteFade.active) { - sub_8176CA0(taskIdA); - gTasks[taskIdA].func = sub_8175B1C; + ResetCreditsTasks(taskIdA); + gTasks[taskIdA].func = Task_CreditsTheEnd3; } } -static void sub_8175B1C(u8 taskIdA) +static void Task_CreditsTheEnd3(u8 taskIdA) { - sub_8175CE4(); + ResetGpuAndVram(); ResetPaletteFade(); - sub_8176D1C(0, 0x3800, 0); + LoadTheEndScreen(0, 0x3800, 0); ResetSpriteData(); FreeAllSpritePalettes(); BeginNormalPaletteFade(0xFFFFFFFF, 8, 16, 0, RGB_BLACK); @@ -1432,11 +1432,11 @@ static void sub_8175B1C(u8 taskIdA) | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON); - gTasks[taskIdA].data[TDA_0] = 0xEB; - gTasks[taskIdA].func = sub_8175B90; + gTasks[taskIdA].data[TDA_0] = 235; //set this to 215 to actually show "THE END" in time to the last song beat + gTasks[taskIdA].func = Task_CreditsTheEnd4; } -static void sub_8175B90(u8 taskIdA) +static void Task_CreditsTheEnd4(u8 taskIdA) { if (gTasks[taskIdA].data[TDA_0]) { @@ -1445,10 +1445,10 @@ static void sub_8175B90(u8 taskIdA) } BeginNormalPaletteFade(0xFFFFFFFF, 6, 0, 16, RGB_BLACK); - gTasks[taskIdA].func = sub_8175BD8; + gTasks[taskIdA].func = Task_CreditsTheEnd5; } -static void sub_8175BD8(u8 taskIdA) +static void Task_CreditsTheEnd5(u8 taskIdA) { if (!gPaletteFade.active) { @@ -1456,11 +1456,11 @@ static void sub_8175BD8(u8 taskIdA) BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0, RGB_BLACK); gTasks[taskIdA].data[TDA_0] = 7200; - gTasks[taskIdA].func = sub_8175C34; + gTasks[taskIdA].func = Task_CreditsTheEnd6; } } -static void sub_8175C34(u8 taskIdA) +static void Task_CreditsTheEnd6(u8 taskIdA) { if (!gPaletteFade.active) { @@ -1468,7 +1468,7 @@ static void sub_8175C34(u8 taskIdA) { FadeOutBGM(4); BeginNormalPaletteFade(0xFFFFFFFF, 8, 0, 16, RGB_WHITEALPHA); - gTasks[taskIdA].func = sub_8175CC8; + gTasks[taskIdA].func = Task_CreditsSoftReset; return; } @@ -1482,13 +1482,13 @@ static void sub_8175C34(u8 taskIdA) } } -static void sub_8175CC8(u8 taskIdA) +static void Task_CreditsSoftReset(u8 taskIdA) { if (!gPaletteFade.active) SoftReset(0xFF); } -static void sub_8175CE4(void) +static void ResetGpuAndVram(void) { SetGpuReg(REG_OFFSET_DISPCNT, 0); @@ -1539,12 +1539,15 @@ static void sub_8175DA0(u8 taskIdB) gTasks[taskIdB].data[TDB_0] += 1; return; case 2: - if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == sub_8175774) + if (gTasks[gTasks[taskIdB].data[TDB_TASK_A_ID]].func == Task_ProgressCreditTasks) { if (gTasks[taskIdB].data[TDB_CURRENT_PAGE] < PAGE_COUNT) { for (i = 0; i < 5; i++) - sub_81755BC(gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, 5 + i * 16, gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->var_1); + PrintCreditsText( + gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->text, + 5 + i * 16, + gCreditsEntryPointerTable[gTasks[taskIdB].data[TDB_CURRENT_PAGE]][i]->isTitle); CopyWindowToVram(0, 2); @@ -1578,7 +1581,7 @@ static void sub_8175DA0(u8 taskIdB) return; } - if (sub_817603C((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) + if (CheckChangeScene((u8)gTasks[taskIdB].data[TDB_CURRENT_PAGE], (u8)gTasks[taskIdB].data[TDB_TASK_A_ID])) { gTasks[taskIdB].data[TDB_0] += 1; return; @@ -1606,7 +1609,7 @@ static void sub_8175DA0(u8 taskIdB) } } -static u8 sub_817603C(u8 page, u8 taskIdA) +static u8 CheckChangeScene(u8 page, u8 taskIdA) { // Starts with bike + ocean + morning @@ -1685,7 +1688,7 @@ static void sub_81760FC(u8 taskIdD) gTasks[taskIdD].data[TDD_STATE]++; break; case 2: - if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != sub_8175774) + if (gUnknown_0203BCE8->unk8E == 71 || gTasks[gTasks[taskIdD].data[TDD_TASK_A_ID]].func != Task_ProgressCreditTasks) break; r2 = sub_8177224(gUnknown_0203BCE8->unk0[gUnknown_0203BCE8->unk92], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][0], gUnknown_085E6F7C[gUnknown_0203BCE8->unk90][1], gUnknown_0203BCE8->unk90); if (gUnknown_0203BCE8->unk92 < gUnknown_0203BCE8->unk94 - 1) @@ -2006,7 +2009,7 @@ static bool8 sub_8176AB0(u8 data, u8 taskIdA) return FALSE; } -static void sub_8176CA0(u8 taskIdA) +static void ResetCreditsTasks(u8 taskIdA) { if (gTasks[taskIdA].data[TDA_0] != 0) { @@ -2035,7 +2038,7 @@ static void sub_8176CA0(u8 taskIdA) gUnknown_0203BD28 = 1; } -static void sub_8176D1C(u16 arg0, u16 arg1, u16 arg2) +static void LoadTheEndScreen(u16 arg0, u16 arg1, u16 arg2) { u16 baseTile; u16 i; @@ -2084,12 +2087,12 @@ static void sub_8176E40(u16 arg0, u16 palette) for (pos = 0; pos < 32 * 32; pos++) ((u16 *) (VRAM + arg0))[pos] = baseTile + 1; - sub_8176DBC(gUnknown_085E5BAC, 3, 7, arg0, palette); - sub_8176DBC(gUnknown_085E5BBB, 7, 7, arg0, palette); - sub_8176DBC(gUnknown_085E5BCA, 11, 7, arg0, palette); - sub_8176DBC(gUnknown_085E5BCA, 16, 7, arg0, palette); - sub_8176DBC(gUnknown_085E5BD9, 20, 7, arg0, palette); - sub_8176DBC(gUnknown_085E5BE8, 24, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterTMap, 3, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterHMap, 7, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterEMap, 11, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterEMap, 16, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterNMap, 20, 7, arg0, palette); + sub_8176DBC(sTheEnd_LetterDMap, 24, 7, arg0, palette); } static void sub_8176EE8(struct Sprite *sprite) diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c index fdf2020ff..ac37b2ece 100644 --- a/src/hall_of_fame.c +++ b/src/hall_of_fame.c @@ -755,7 +755,7 @@ static void Task_Hof_HandleExit(u8 taskId) static void SetCallback2AfterHallOfFameDisplay(void) { - SetMainCallback2(sub_8175620); + SetMainCallback2(CB2_StartCreditsSequence); } #undef tDontSaveData -- cgit v1.2.3 From 1069adae46a4e8eb6fdc953c60d0381c394a8e55 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 12:08:08 -0400 Subject: Renaming unknown link room ids to be the same as name This descrepency was causing a lot of annoyance when using porymap, because porymap generated the ids in map_groups.h from the name, and mapjson was generating map_groups.h from the id in the json files. So just name them the same already like every other map in the repo. --- data/maps/UnknownLinkContestRoom_25_29/map.json | 2 +- data/maps/UnknownLinkContestRoom_25_30/map.json | 2 +- data/maps/UnknownLinkContestRoom_25_31/map.json | 2 +- data/maps/UnknownLinkContestRoom_25_32/map.json | 2 +- data/maps/UnknownLinkContestRoom_25_33/map.json | 2 +- data/maps/UnknownLinkContestRoom_25_34/map.json | 2 +- include/constants/map_groups.h | 122 ++++++++++++------------ 7 files changed, 67 insertions(+), 67 deletions(-) diff --git a/data/maps/UnknownLinkContestRoom_25_29/map.json b/data/maps/UnknownLinkContestRoom_25_29/map.json index 956a68158..3e4387b6a 100644 --- a/data/maps/UnknownLinkContestRoom_25_29/map.json +++ b/data/maps/UnknownLinkContestRoom_25_29/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_29", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_29", "name": "UnknownLinkContestRoom_25_29", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_29", "music": "MUS_NIBI", diff --git a/data/maps/UnknownLinkContestRoom_25_30/map.json b/data/maps/UnknownLinkContestRoom_25_30/map.json index 526c6de2a..42a719c17 100644 --- a/data/maps/UnknownLinkContestRoom_25_30/map.json +++ b/data/maps/UnknownLinkContestRoom_25_30/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_30", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_30", "name": "UnknownLinkContestRoom_25_30", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_30", "music": "MUS_NIBI", diff --git a/data/maps/UnknownLinkContestRoom_25_31/map.json b/data/maps/UnknownLinkContestRoom_25_31/map.json index 9548c1125..ad18b00af 100644 --- a/data/maps/UnknownLinkContestRoom_25_31/map.json +++ b/data/maps/UnknownLinkContestRoom_25_31/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_31", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_31", "name": "UnknownLinkContestRoom_25_31", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_31", "music": "MUS_NIBI", diff --git a/data/maps/UnknownLinkContestRoom_25_32/map.json b/data/maps/UnknownLinkContestRoom_25_32/map.json index 27411d28e..0e1528e59 100644 --- a/data/maps/UnknownLinkContestRoom_25_32/map.json +++ b/data/maps/UnknownLinkContestRoom_25_32/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_32", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_32", "name": "UnknownLinkContestRoom_25_32", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_32", "music": "MUS_NIBI", diff --git a/data/maps/UnknownLinkContestRoom_25_33/map.json b/data/maps/UnknownLinkContestRoom_25_33/map.json index 1a15ae6d6..8765e9771 100644 --- a/data/maps/UnknownLinkContestRoom_25_33/map.json +++ b/data/maps/UnknownLinkContestRoom_25_33/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_33", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_33", "name": "UnknownLinkContestRoom_25_33", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_33", "music": "MUS_NIBI", diff --git a/data/maps/UnknownLinkContestRoom_25_34/map.json b/data/maps/UnknownLinkContestRoom_25_34/map.json index 4c90858b9..c7220897b 100644 --- a/data/maps/UnknownLinkContestRoom_25_34/map.json +++ b/data/maps/UnknownLinkContestRoom_25_34/map.json @@ -1,5 +1,5 @@ { - "id": "MAP_UNKNOWN_MAP_25_34", + "id": "MAP_UNKNOWN_LINK_CONTEST_ROOM_25_34", "name": "UnknownLinkContestRoom_25_34", "layout": "LAYOUT_UNKNOWN_LINK_CONTEST_ROOM_25_34", "music": "MUS_NIBI", diff --git a/include/constants/map_groups.h b/include/constants/map_groups.h index dc2ac2f32..6a3276b44 100755 --- a/include/constants/map_groups.h +++ b/include/constants/map_groups.h @@ -398,67 +398,67 @@ #define MAP_METEOR_FALLS_STEVENS_CAVE (107 | (24 << 8)) // Map Group 25 -#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8)) -#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8)) -#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8)) -#define MAP_SECRET_BASE_YELLOW_CAVE1 (3 | (25 << 8)) -#define MAP_SECRET_BASE_TREE1 (4 | (25 << 8)) -#define MAP_SECRET_BASE_SHRUB1 (5 | (25 << 8)) -#define MAP_SECRET_BASE_RED_CAVE2 (6 | (25 << 8)) -#define MAP_SECRET_BASE_BROWN_CAVE2 (7 | (25 << 8)) -#define MAP_SECRET_BASE_BLUE_CAVE2 (8 | (25 << 8)) -#define MAP_SECRET_BASE_YELLOW_CAVE2 (9 | (25 << 8)) -#define MAP_SECRET_BASE_TREE2 (10 | (25 << 8)) -#define MAP_SECRET_BASE_SHRUB2 (11 | (25 << 8)) -#define MAP_SECRET_BASE_RED_CAVE3 (12 | (25 << 8)) -#define MAP_SECRET_BASE_BROWN_CAVE3 (13 | (25 << 8)) -#define MAP_SECRET_BASE_BLUE_CAVE3 (14 | (25 << 8)) -#define MAP_SECRET_BASE_YELLOW_CAVE3 (15 | (25 << 8)) -#define MAP_SECRET_BASE_TREE3 (16 | (25 << 8)) -#define MAP_SECRET_BASE_SHRUB3 (17 | (25 << 8)) -#define MAP_SECRET_BASE_RED_CAVE4 (18 | (25 << 8)) -#define MAP_SECRET_BASE_BROWN_CAVE4 (19 | (25 << 8)) -#define MAP_SECRET_BASE_BLUE_CAVE4 (20 | (25 << 8)) -#define MAP_SECRET_BASE_YELLOW_CAVE4 (21 | (25 << 8)) -#define MAP_SECRET_BASE_TREE4 (22 | (25 << 8)) -#define MAP_SECRET_BASE_SHRUB4 (23 | (25 << 8)) -#define MAP_SINGLE_BATTLE_COLOSSEUM (24 | (25 << 8)) -#define MAP_TRADE_CENTER (25 | (25 << 8)) -#define MAP_RECORD_CORNER (26 | (25 << 8)) -#define MAP_DOUBLE_BATTLE_COLOSSEUM (27 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM1 (28 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_29 (29 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_30 (30 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_31 (31 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_32 (32 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_33 (33 | (25 << 8)) -#define MAP_UNKNOWN_MAP_25_34 (34 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM2 (35 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM3 (36 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM4 (37 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM5 (38 | (25 << 8)) -#define MAP_LINK_CONTEST_ROOM6 (39 | (25 << 8)) -#define MAP_INSIDE_OF_TRUCK (40 | (25 << 8)) -#define MAP_SS_TIDAL_CORRIDOR (41 | (25 << 8)) -#define MAP_SS_TIDAL_LOWER_DECK (42 | (25 << 8)) -#define MAP_SS_TIDAL_ROOMS (43 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE01 (44 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE02 (45 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE03 (46 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE04 (47 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE05 (48 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE06 (49 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE07 (50 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE08 (51 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE09 (52 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE10 (53 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE11 (54 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE12 (55 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE13 (56 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE14 (57 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE15 (58 | (25 << 8)) -#define MAP_BATTLE_PYRAMID_SQUARE16 (59 | (25 << 8)) -#define MAP_UNION_ROOM (60 | (25 << 8)) +#define MAP_SECRET_BASE_RED_CAVE1 (0 | (25 << 8)) +#define MAP_SECRET_BASE_BROWN_CAVE1 (1 | (25 << 8)) +#define MAP_SECRET_BASE_BLUE_CAVE1 (2 | (25 << 8)) +#define MAP_SECRET_BASE_YELLOW_CAVE1 (3 | (25 << 8)) +#define MAP_SECRET_BASE_TREE1 (4 | (25 << 8)) +#define MAP_SECRET_BASE_SHRUB1 (5 | (25 << 8)) +#define MAP_SECRET_BASE_RED_CAVE2 (6 | (25 << 8)) +#define MAP_SECRET_BASE_BROWN_CAVE2 (7 | (25 << 8)) +#define MAP_SECRET_BASE_BLUE_CAVE2 (8 | (25 << 8)) +#define MAP_SECRET_BASE_YELLOW_CAVE2 (9 | (25 << 8)) +#define MAP_SECRET_BASE_TREE2 (10 | (25 << 8)) +#define MAP_SECRET_BASE_SHRUB2 (11 | (25 << 8)) +#define MAP_SECRET_BASE_RED_CAVE3 (12 | (25 << 8)) +#define MAP_SECRET_BASE_BROWN_CAVE3 (13 | (25 << 8)) +#define MAP_SECRET_BASE_BLUE_CAVE3 (14 | (25 << 8)) +#define MAP_SECRET_BASE_YELLOW_CAVE3 (15 | (25 << 8)) +#define MAP_SECRET_BASE_TREE3 (16 | (25 << 8)) +#define MAP_SECRET_BASE_SHRUB3 (17 | (25 << 8)) +#define MAP_SECRET_BASE_RED_CAVE4 (18 | (25 << 8)) +#define MAP_SECRET_BASE_BROWN_CAVE4 (19 | (25 << 8)) +#define MAP_SECRET_BASE_BLUE_CAVE4 (20 | (25 << 8)) +#define MAP_SECRET_BASE_YELLOW_CAVE4 (21 | (25 << 8)) +#define MAP_SECRET_BASE_TREE4 (22 | (25 << 8)) +#define MAP_SECRET_BASE_SHRUB4 (23 | (25 << 8)) +#define MAP_SINGLE_BATTLE_COLOSSEUM (24 | (25 << 8)) +#define MAP_TRADE_CENTER (25 | (25 << 8)) +#define MAP_RECORD_CORNER (26 | (25 << 8)) +#define MAP_DOUBLE_BATTLE_COLOSSEUM (27 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM1 (28 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_29 (29 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_30 (30 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_31 (31 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_32 (32 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_33 (33 | (25 << 8)) +#define MAP_UNKNOWN_LINK_CONTEST_ROOM_25_34 (34 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM2 (35 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM3 (36 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM4 (37 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM5 (38 | (25 << 8)) +#define MAP_LINK_CONTEST_ROOM6 (39 | (25 << 8)) +#define MAP_INSIDE_OF_TRUCK (40 | (25 << 8)) +#define MAP_SS_TIDAL_CORRIDOR (41 | (25 << 8)) +#define MAP_SS_TIDAL_LOWER_DECK (42 | (25 << 8)) +#define MAP_SS_TIDAL_ROOMS (43 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE01 (44 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE02 (45 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE03 (46 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE04 (47 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE05 (48 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE06 (49 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE07 (50 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE08 (51 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE09 (52 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE10 (53 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE11 (54 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE12 (55 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE13 (56 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE14 (57 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE15 (58 | (25 << 8)) +#define MAP_BATTLE_PYRAMID_SQUARE16 (59 | (25 << 8)) +#define MAP_UNION_ROOM (60 | (25 << 8)) // Map Group 26 #define MAP_SAFARI_ZONE_NORTHWEST (0 | (26 << 8)) -- cgit v1.2.3 From a708caac6d55aee1f0a6537707db3514d54b499e Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 13:32:26 -0400 Subject: Suggested changes from review --- src/credits.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/credits.c b/src/credits.c index 99c89dc8f..44fa2002c 100644 --- a/src/credits.c +++ b/src/credits.c @@ -143,7 +143,7 @@ struct Unk201C000 struct CreditsEntry { u8 var_0; - u8 isTitle; + bool8 isTitle; const u8 *text; }; @@ -1177,14 +1177,14 @@ static void sub_81755A4(void) Free(ptr); } -static void PrintCreditsText(const u8 *string, u8 y, u8 isTitle) +static void PrintCreditsText(const u8 *string, u8 y, bool8 isTitle) { u8 x; u8 color[3]; color[0] = 0; - if (isTitle == 1) + if (isTitle == TRUE) { color[1] = 3; color[2] = 4; -- cgit v1.2.3 From d63a8ba817e4d3373e06d4ae5cbe5987e9a68cc6 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 13:38:13 -0400 Subject: Replaced createvobject numbers with EVENT_OBJ_GTX defines Doing this allows someone to renumber the event object graphics and still have working contests. --- data/maps/LinkContestRoom1/scripts.inc | 64 +++++++++++++++++----------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/data/maps/LinkContestRoom1/scripts.inc b/data/maps/LinkContestRoom1/scripts.inc index e0cd24eff..e58c08c50 100644 --- a/data/maps/LinkContestRoom1/scripts.inc +++ b/data/maps/LinkContestRoom1/scripts.inc @@ -172,131 +172,131 @@ LinkContestRoom1_EventScript_23B8F8:: @ 823B8F8 end LinkContestRoom1_EventScript_23BA6B:: @ 823BA6B - setvar VAR_TEMP_1, 5 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_NINJA_BOY return LinkContestRoom1_EventScript_23BA71:: @ 823BA71 - setvar VAR_TEMP_1, 6 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_TWIN return LinkContestRoom1_EventScript_23BA77:: @ 823BA77 - setvar VAR_TEMP_1, 7 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_BOY_1 return LinkContestRoom1_EventScript_23BA7D:: @ 823BA7D - setvar VAR_TEMP_1, 8 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_1 return LinkContestRoom1_EventScript_23BA83:: @ 823BA83 - setvar VAR_TEMP_1, 10 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_2 return LinkContestRoom1_EventScript_23BA89:: @ 823BA89 - setvar VAR_TEMP_1, 11 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_LITTLE_BOY return LinkContestRoom1_EventScript_23BA8F:: @ 823BA8F - setvar VAR_TEMP_1, 12 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_LITTLE_GIRL return LinkContestRoom1_EventScript_23BA95:: @ 823BA95 - setvar VAR_TEMP_1, 13 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_BOY_3 return LinkContestRoom1_EventScript_23BA9B:: @ 823BA9B - setvar VAR_TEMP_1, 14 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_GIRL_3 return LinkContestRoom1_EventScript_23BAA1:: @ 823BAA1 - setvar VAR_TEMP_1, 15 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_RICH_BOY return LinkContestRoom1_EventScript_23BAA7:: @ 823BAA7 - setvar VAR_TEMP_1, 17 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_FAT_MAN return LinkContestRoom1_EventScript_23BAAD:: @ 823BAAD - setvar VAR_TEMP_1, 18 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_POKEFAN_F return LinkContestRoom1_EventScript_23BAB3:: @ 823BAB3 - setvar VAR_TEMP_1, 19 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_MAN_1 return LinkContestRoom1_EventScript_23BAB9:: @ 823BAB9 - setvar VAR_TEMP_1, 20 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_2 return LinkContestRoom1_EventScript_23BABF:: @ 823BABF - setvar VAR_TEMP_1, 21 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_EXPERT_M return LinkContestRoom1_EventScript_23BAC5:: @ 823BAC5 - setvar VAR_TEMP_1, 22 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_EXPERT_F return LinkContestRoom1_EventScript_23BACB:: @ 823BACB - setvar VAR_TEMP_1, 25 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_POKEFAN_M return LinkContestRoom1_EventScript_23BAD1:: @ 823BAD1 - setvar VAR_TEMP_1, 26 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_4 return LinkContestRoom1_EventScript_23BAD7:: @ 823BAD7 - setvar VAR_TEMP_1, 27 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_COOK return LinkContestRoom1_EventScript_23BADD:: @ 823BADD - setvar VAR_TEMP_1, 47 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_LASS return LinkContestRoom1_EventScript_23BAE3:: @ 823BAE3 - setvar VAR_TEMP_1, 30 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_OLD_WOMAN return LinkContestRoom1_EventScript_23BAE9:: @ 823BAE9 - setvar VAR_TEMP_1, 31 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_CAMPER return LinkContestRoom1_EventScript_23BAEF:: @ 823BAEF - setvar VAR_TEMP_1, 32 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_PICNICKER return LinkContestRoom1_EventScript_23BAF5:: @ 823BAF5 - setvar VAR_TEMP_1, 33 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_MAN_3 return LinkContestRoom1_EventScript_23BAFB:: @ 823BAFB - setvar VAR_TEMP_1, 34 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_WOMAN_5 return LinkContestRoom1_EventScript_23BB01:: @ 823BB01 - setvar VAR_TEMP_1, 35 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_YOUNGSTER return LinkContestRoom1_EventScript_23BB07:: @ 823BB07 - setvar VAR_TEMP_1, 36 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_BUG_CATCHER return LinkContestRoom1_EventScript_23BB0D:: @ 823BB0D - setvar VAR_TEMP_1, 37 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_PSYCHIC_M return LinkContestRoom1_EventScript_23BB13:: @ 823BB13 - setvar VAR_TEMP_1, 38 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_SCHOOL_KID_M return LinkContestRoom1_EventScript_23BB19:: @ 823BB19 - setvar VAR_TEMP_1, 44 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_BLACK_BELT return LinkContestRoom1_EventScript_23BB1F:: @ 823BB1F - setvar VAR_TEMP_1, 45 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_BEAUTY return LinkContestRoom1_EventScript_23BB25:: @ 823BB25 - setvar VAR_TEMP_1, 46 + setvar VAR_TEMP_1, EVENT_OBJ_GFX_SCIENTIST_1 return LinkContestRoom1_EventScript_23BB2B:: @ 823BB2B -- cgit v1.2.3 From 18dee141704daa10313f27890d0f97a2a083a496 Mon Sep 17 00:00:00 2001 From: Tustin2121 Date: Sat, 17 Aug 2019 23:26:46 -0400 Subject: Review fixes --- asm/macros/event.inc | 2 -- data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc | 4 +++- data/maps/MauvilleCity_GameCorner/scripts.inc | 14 ++++++++++++-- data/maps/MtChimney/scripts.inc | 10 +++++++++- data/maps/Route109_SeashoreHouse/scripts.inc | 10 +++++++++- data/maps/Route121_SafariZoneEntrance/scripts.inc | 6 +++++- data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc | 10 +++++++++- 7 files changed, 47 insertions(+), 9 deletions(-) diff --git a/asm/macros/event.inc b/asm/macros/event.inc index 14051999f..bf1b8ce76 100644 --- a/asm/macros/event.inc +++ b/asm/macros/event.inc @@ -1083,8 +1083,6 @@ @ Hides the secondary box spawned by showmoney. .macro hidemoneybox .byte 0x94 - .byte 0 @ leftovers from ruby/sapphire. x, y params not used - .byte 0 .endm @ Updates the secondary box spawned by showmoney. Consumes but does not use arguments. diff --git a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc index 4bd4dc01c..b8d0a7c44 100644 --- a/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc +++ b/data/maps/LilycoveCity_DepartmentStoreRooftop/scripts.inc @@ -143,7 +143,7 @@ LilycoveCity_DepartmentStoreRooftop_EventScript_22032F:: @ 822032F call_if_eq LilycoveCity_DepartmentStoreRooftop_EventScript_220321 compare VAR_TEMP_1, 2 call_if_eq LilycoveCity_DepartmentStoreRooftop_EventScript_220328 - updatemoneybox 0,0 + updatemoneybox 0, 0 bufferitemname 0, VAR_TEMP_0 playse SE_JIHANKI msgbox LilycoveCity_DepartmentStoreRooftop_Text_2205A1, MSGBOX_DEFAULT @@ -196,6 +196,8 @@ LilycoveCity_DepartmentStoreRooftop_EventScript_220450:: @ 8220450 LilycoveCity_DepartmentStoreRooftop_EventScript_22045E:: @ 822045E hidemoneybox + nop + nop releaseall end diff --git a/data/maps/MauvilleCity_GameCorner/scripts.inc b/data/maps/MauvilleCity_GameCorner/scripts.inc index 257479372..0df7afe54 100644 --- a/data/maps/MauvilleCity_GameCorner/scripts.inc +++ b/data/maps/MauvilleCity_GameCorner/scripts.inc @@ -39,11 +39,13 @@ MauvilleCity_GameCorner_EventScript_20FC33:: @ 820FC33 goto_if_eq MauvilleCity_GameCorner_EventScript_20FCC1 givecoins 50 takemoney 0x3e8, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 updatecoinsbox 1, 6 playse SE_REGI msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT hidemoneybox + nop + nop hidecoinsbox 0, 5 release end @@ -57,11 +59,13 @@ MauvilleCity_GameCorner_EventScript_20FC75:: @ 820FC75 goto_if_eq MauvilleCity_GameCorner_EventScript_20FCC1 givecoins 500 takemoney 0x2710, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 updatecoinsbox 1, 6 playse SE_REGI msgbox MauvilleCity_GameCorner_Text_210529, MSGBOX_DEFAULT hidemoneybox + nop + nop hidecoinsbox 0, 5 release end @@ -74,6 +78,8 @@ MauvilleCity_GameCorner_EventScript_20FCB7:: @ 820FCB7 MauvilleCity_GameCorner_EventScript_20FCC1:: @ 820FCC1 msgbox MauvilleCity_GameCorner_Text_210553, MSGBOX_DEFAULT hidemoneybox + nop + nop hidecoinsbox 0, 5 release end @@ -81,6 +87,8 @@ MauvilleCity_GameCorner_EventScript_20FCC1:: @ 820FCC1 MauvilleCity_GameCorner_EventScript_20FCD1:: @ 820FCD1 msgbox MauvilleCity_GameCorner_Text_21059A, MSGBOX_DEFAULT hidemoneybox + nop + nop hidecoinsbox 0, 5 release end @@ -88,6 +96,8 @@ MauvilleCity_GameCorner_EventScript_20FCD1:: @ 820FCD1 MauvilleCity_GameCorner_EventScript_20FCE1:: @ 820FCE1 msgbox MauvilleCity_GameCorner_Text_21057E, MSGBOX_DEFAULT hidemoneybox + nop + nop hidecoinsbox 0, 5 release end diff --git a/data/maps/MtChimney/scripts.inc b/data/maps/MtChimney/scripts.inc index e89a8b437..717973eba 100644 --- a/data/maps/MtChimney/scripts.inc +++ b/data/maps/MtChimney/scripts.inc @@ -115,29 +115,37 @@ MtChimney_EventScript_22EEF3:: @ 822EEF3 compare VAR_RESULT, 0 goto_if_eq MtChimney_EventScript_22EF51 hidemoneybox + nop + nop release end MtChimney_EventScript_22EF51:: @ 822EF51 msgbox gText_TooBadBagIsFull, MSGBOX_DEFAULT hidemoneybox + nop + nop release end MtChimney_EventScript_22EF5E:: @ 822EF5E takemoney 0xc8, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 return MtChimney_EventScript_22EF69:: @ 822EF69 msgbox MtChimney_Text_22FE9B, MSGBOX_DEFAULT hidemoneybox + nop + nop release end MtChimney_EventScript_22EF76:: @ 822EF76 msgbox MtChimney_Text_22FE5E, MSGBOX_DEFAULT hidemoneybox + nop + nop release end diff --git a/data/maps/Route109_SeashoreHouse/scripts.inc b/data/maps/Route109_SeashoreHouse/scripts.inc index 594b17f84..79d021334 100644 --- a/data/maps/Route109_SeashoreHouse/scripts.inc +++ b/data/maps/Route109_SeashoreHouse/scripts.inc @@ -43,6 +43,8 @@ Route109_SeashoreHouse_EventScript_269460:: @ 8269460 goto_if_eq Route109_SeashoreHouse_EventScript_269484 msgbox Route109_SeashoreHouse_Text_2697EF, MSGBOX_DEFAULT hidemoneybox + nop + nop release end @@ -55,21 +57,27 @@ Route109_SeashoreHouse_EventScript_269484:: @ 8269484 goto_if_eq Route109_SeashoreHouse_EventScript_2694D5 msgbox Route109_SeashoreHouse_Text_2697C8, MSGBOX_DEFAULT takemoney 0x12c, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 giveitem_std ITEM_SODA_POP hidemoneybox + nop + nop release end Route109_SeashoreHouse_EventScript_2694C8:: @ 82694C8 msgbox Route109_SeashoreHouse_Text_2697D5, MSGBOX_DEFAULT hidemoneybox + nop + nop release end Route109_SeashoreHouse_EventScript_2694D5:: @ 82694D5 msgbox gText_TooBadBagIsFull, MSGBOX_DEFAULT hidemoneybox + nop + nop release end diff --git a/data/maps/Route121_SafariZoneEntrance/scripts.inc b/data/maps/Route121_SafariZoneEntrance/scripts.inc index 001f80b15..85b6c6c36 100644 --- a/data/maps/Route121_SafariZoneEntrance/scripts.inc +++ b/data/maps/Route121_SafariZoneEntrance/scripts.inc @@ -67,7 +67,7 @@ Route121_SafariZoneEntrance_EventScript_22BC48:: @ 822BC48 playse SE_REGI msgbox Route121_SafariZoneEntrance_Text_2A501B, MSGBOX_DEFAULT takemoney 0x1f4, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 msgbox Route121_SafariZoneEntrance_Text_2A5036, MSGBOX_DEFAULT playfanfare MUS_FANFA4 message Route121_SafariZoneEntrance_Text_2A5052 @@ -75,6 +75,8 @@ Route121_SafariZoneEntrance_EventScript_22BC48:: @ 822BC48 msgbox Route121_SafariZoneEntrance_Text_2A506F, MSGBOX_DEFAULT closemessage hidemoneybox + nop + nop applymovement EVENT_OBJ_ID_PLAYER, Route121_SafariZoneEntrance_Movement_22BD18 waitmovement 0 special EnterSafariMode @@ -111,6 +113,8 @@ Route121_SafariZoneEntrance_EventScript_22BCF8:: @ 822BCF8 Route121_SafariZoneEntrance_EventScript_22BD06:: @ 822BD06 closemessage hidemoneybox + nop + nop applymovement EVENT_OBJ_ID_PLAYER, Route121_SafariZoneEntrance_Movement_22BD16 waitmovement 0 releaseall diff --git a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc index 6dc4f2242..90d42ccae 100644 --- a/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc +++ b/data/maps/SlateportCity_OceanicMuseum_1F/scripts.inc @@ -26,6 +26,8 @@ SlateportCity_OceanicMuseum_1F_EventScript_20ADC1:: @ 820ADC1 goto_if_eq SlateportCity_OceanicMuseum_1F_EventScript_20ADE8 closemessage hidemoneybox + nop + nop applymovement EVENT_OBJ_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_20AE4B waitmovement 0 releaseall @@ -37,10 +39,12 @@ SlateportCity_OceanicMuseum_1F_EventScript_20ADE8:: @ 820ADE8 goto_if_eq SlateportCity_OceanicMuseum_1F_EventScript_20AE18 playse SE_REGI takemoney 0x32, 0 - updatemoneybox 0,0 + updatemoneybox 0, 0 msgbox SlateportCity_OceanicMuseum_1F_Text_20B026, MSGBOX_DEFAULT setvar VAR_SLATEPORT_MUSEUM_1F_STATE, 1 hidemoneybox + nop + nop releaseall end @@ -49,6 +53,8 @@ SlateportCity_OceanicMuseum_1F_EventScript_20AE18:: @ 820AE18 msgbox SlateportCity_OceanicMuseum_1F_Text_20B03D, MSGBOX_DEFAULT closemessage hidemoneybox + nop + nop applymovement EVENT_OBJ_ID_PLAYER, SlateportCity_OceanicMuseum_1F_Movement_20AE4B waitmovement 0 releaseall @@ -58,6 +64,8 @@ SlateportCity_OceanicMuseum_1F_EventScript_20AE39:: @ 820AE39 msgbox SlateportCity_OceanicMuseum_1F_Text_20B075, MSGBOX_DEFAULT setvar VAR_SLATEPORT_MUSEUM_1F_STATE, 1 hidemoneybox + nop + nop releaseall end -- cgit v1.2.3 From 82744ba63687bc23447ad414a27224c95d2acc43 Mon Sep 17 00:00:00 2001 From: tustin2121 Date: Wed, 21 Aug 2019 14:05:22 -0400 Subject: Replace {STRING 5} with {KUN} Since we already have the KUN placeholder, there's no need for this {STRING 5} stuff. Also, it makes it easier to delete all the {KUN}s in hacks later on if desired. --- data/event_scripts.s | 2 +- data/scripts/apprentice.inc | 152 ++++++++++---------- data/text/match_call.inc | 338 ++++++++++++++++++++++---------------------- 3 files changed, 246 insertions(+), 246 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 191fe5d60..ca8152e75 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -2556,7 +2556,7 @@ gUnknown_08272A3F:: @ 8272A3F .string "Please come again!$" gUnknown_08272A52:: @ 8272A52 - .string "{PLAYER}{STRING 5}, welcome!\pWhat can I do for you?$" + .string "{PLAYER}{KUN}, welcome!\pWhat can I do for you?$" gUnknown_08272A78:: @ 8272A78 .string "Obtained the {STR_VAR_2}!$" diff --git a/data/scripts/apprentice.inc b/data/scripts/apprentice.inc index d6713cde4..b75a3c579 100644 --- a/data/scripts/apprentice.inc +++ b/data/scripts/apprentice.inc @@ -553,7 +553,7 @@ gText_082B7D18:: @ 82B7D18 .string "time with someone like me.$" gText_082B7DD4:: @ 82B7DD4 - .string "Oh! You're {PLAYER}{STRING 5}, aren't you?\p" + .string "Oh! You're {PLAYER}{KUN}, aren't you?\p" .string "I've heard that you're tough at\n" .string "POKéMON!\p" .string "I'm {STR_VAR_1}!\n" @@ -576,19 +576,19 @@ gText_082B7F35:: @ 82B7F35 .string "You know that the BATTLE TOWER has\n" .string "Level 50 and Open Level Rooms?\p" .string "Which do you think would be good\n" - .string "for me, {PLAYER}{STRING 5}?$" + .string "for me, {PLAYER}{KUN}?$" gText_082B7FE8:: @ 82B7FE8 .string "Okay, {STR_VAR_1} is suitable for me?\n" .string "Thank you!\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" gText_082B8087:: @ 82B8087 - .string "Oh, hi, there! {PLAYER}{STRING 5}!\n" + .string "Oh, hi, there! {PLAYER}{KUN}!\n" .string "I know you because you're famous!\l" .string "Call me {STR_VAR_1}! Glad to meet you!\p" .string "I'm a TRIATHLETE, so I keep myself\n" @@ -599,13 +599,13 @@ gText_082B8087:: @ 82B8087 .string "me to become a decent TRAINER.\p" .string "So, I have a proposition!\p" .string "There must be a reason why we met.\n" - .string "So, {PLAYER}{STRING 5}, how about sharing your\l" + .string "So, {PLAYER}{KUN}, how about sharing your\l" .string "wisdom with me every so often?$" gText_082B822B:: @ 82B822B .string "Oh, but, please?\n" .string "A guy like me needs someone like\l" - .string "you, {PLAYER}{STRING 5}!\p" + .string "you, {PLAYER}{KUN}!\p" .string "Honestly, I need your advice!$" gText_082B8286:: @ 82B8286 @@ -741,15 +741,15 @@ gText_082B8C20:: @ 82B8C20 gText_082B8CAA:: @ 82B8CAA .string "Whoa! Could you be…\n" - .string "Might you be… {PLAYER}{STRING 5}?!\l" + .string "Might you be… {PLAYER}{KUN}?!\l" .string "That strong and famous TRAINER?\l" .string "Well, hello, aren't I just the luckiest!\p" .string "Hello, the name's {STR_VAR_1}!\p" .string "I've been on the lookout for\n" .string "a POKéMON teacher.\p" .string "And with impeccably good timing,\n" - .string "along came you, {PLAYER}{STRING 5}!\p" - .string "So, there you have it, {PLAYER}{STRING 5}!\n" + .string "along came you, {PLAYER}{KUN}!\p" + .string "So, there you have it, {PLAYER}{KUN}!\n" .string "Let me apprentice under you!$" gText_082B8DD3:: @ 82B8DD3 @@ -774,7 +774,7 @@ gText_082B8ED5:: @ 82B8ED5 .string "Adios!$" gText_082B8F45:: @ 82B8F45 - .string "Oh, hey, {PLAYER}{STRING 5}, right?\n" + .string "Oh, hey, {PLAYER}{KUN}, right?\n" .string "The police were looking for you!\p" .string "… … …\n" .string "Of course I'm lying!\p" @@ -822,7 +822,7 @@ gText_082B929C:: @ 82B929C .string "Your turn now, tell me a little about\n" .string "yourself, give it a try!\p" .string "Uh-huh, uh-huh!\n" - .string "{PLAYER}{STRING 5}'s your name,\l" + .string "{PLAYER}{KUN}'s your name,\l" .string "and POKéMON's your game!\p" .string "And you're at a delicate age\n" .string "when all the world's your stage!\p" @@ -901,7 +901,7 @@ gText_082B992D:: @ 82B992D .string "not built to take the abuse…\p" .string "I decided I'll battle POKéMON and\n" .string "toughen myself up.\p" - .string "You're {PLAYER}{STRING 5}, aren't you?\n" + .string "You're {PLAYER}{KUN}, aren't you?\n" .string "The POKéMON LEAGUE CHAMP?\p" .string "Listen, can I get you to give me\n" .string "advice?$" @@ -927,7 +927,7 @@ gText_082B9B76:: @ 82B9B76 gText_082B9BF2:: @ 82B9BF2 .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}…?\p" + .string "{PLAYER}{KUN}…?\p" .string "Please, don't look at me that way.\n" .string "You're making me all self-conscious.\p" .string "I… I'm {STR_VAR_1}.\p" @@ -935,7 +935,7 @@ gText_082B9BF2:: @ 82B9BF2 .string "but I explore ancient ruins and such.\p" .string "I'm even more embarrassed to admit\n" .string "I'm interested in the BATTLE FRONTIER.\p" - .string "{PLAYER}{STRING 5}, you have a reputation as\n" + .string "{PLAYER}{KUN}, you have a reputation as\n" .string "a tough TRAINER…\p" .string "It's hard for me to say this,\n" .string "but I want to ask something.\p" @@ -962,18 +962,18 @@ gText_082B9EAA:: @ 82B9EAA .string "I'll try my hand at that.\p" .string "I hope I can make a valiant challenge\n" .string "without getting all flustered…\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" gText_082B9F55:: @ 82B9F55 - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really real?\p" .string "You may call me {STR_VAR_1}.\p" .string "I have been toying with the idea of\n" .string "apprenticing under a strong TRAINER.\p" .string "So, I must say I'm lucky you came along!\n" - .string "…You really are {PLAYER}{STRING 5}, yes?\p" + .string "…You really are {PLAYER}{KUN}, yes?\p" .string "No, no, if you are real, it's fine.\n" .string "I merely want you to recognize me\l" .string "as your apprentice.$" @@ -1130,7 +1130,7 @@ gText_082BAA81:: @ 82BAA81 .string "my {STR_VAR_2} hold anything?$" gText_082BAB22:: @ 82BAB22 - .string "Oh, {PLAYER}{STRING 5}.\n" + .string "Oh, {PLAYER}{KUN}.\n" .string "There's something I wanted to ask you.\p" .string "You know how you decided which\n" .string "POKéMON I should have for me?\p" @@ -1148,7 +1148,7 @@ gText_082BAC43:: @ 82BAC43 gText_082BAC78:: @ 82BAC78 .string "If you think that's best, I'll do that.\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" @@ -1157,7 +1157,7 @@ gText_082BAD17:: @ 82BAD17 .string "The item {STR_VAR_1}, huh?\n" .string "Not bad. I'll use it!\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" @@ -1170,7 +1170,7 @@ gText_082BADB6:: @ 82BADB6 .string "do the best it can empty-handed?$" gText_082BAE36:: @ 82BAE36 - .string "Yo, {PLAYER}{STRING 5}!\p" + .string "Yo, {PLAYER}{KUN}!\p" .string "We're both busy, but we seem to run\n" .string "into each other often anyway!\p" .string "Today I have to do some walking,\n" @@ -1315,7 +1315,7 @@ gText_082BB84A:: @ 82BB84A gText_082BB8CD:: @ 82BB8CD .string "Hola!\n" - .string "My maestro, {PLAYER}{STRING 5}!\p" + .string "My maestro, {PLAYER}{KUN}!\p" .string "I want to hit you up for advice on\n" .string "POKéMON tools.\p" .string "What do you think would be good for\n" @@ -1348,7 +1348,7 @@ gText_082BBA6C:: @ 82BBA6C .string "can win without holding any item?$" gText_082BBB01:: @ 82BBB01 - .string "{PLAYER}{STRING 5}, something unbelievable\n" + .string "{PLAYER}{KUN}, something unbelievable\n" .string "has happened!\p" .string "I woke up this morning, and my POKéMON\n" .string "had 10 NUGGETS!\p" @@ -1465,14 +1465,14 @@ gText_082BC373:: @ 82BC373 .string "Doesn't need to hold anything?$" gText_082BC40E:: @ 82BC40E - .string "Gwah! Ouch! {PLAYER}{STRING 5}, my arm's broken!\n" + .string "Gwah! Ouch! {PLAYER}{KUN}, my arm's broken!\n" .string "Don't touch it, please!\p" .string "I must've broken it while I was trying\n" .string "out different hold items with my posse\l" .string "of POKéMON.\p" .string "So, things being this way,\n" .string "I need you to decide for me.\p" - .string "{PLAYER}{STRING 5}, what do you think would be\n" + .string "{PLAYER}{KUN}, what do you think would be\n" .string "good for my {STR_VAR_1} to hold?$" gText_082BC514:: @ 82BC514 @@ -1504,14 +1504,14 @@ gText_082BC666:: @ 82BC666 gText_082BC714:: @ 82BC714 .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}…\p" + .string "{PLAYER}{KUN}…\p" .string "Please, don't look at me that way.\n" .string "My POKéMON don't have anything.\p" .string "I… I'm really embarrassed about this,\n" .string "but I really need your advice.\p" .string "I can't decide what hold item would\n" .string "make my {STR_VAR_1} strong.\p" - .string "{PLAYER}{STRING 5}, what do you think would\n" + .string "{PLAYER}{KUN}, what do you think would\n" .string "be good?$" gText_082BC808:: @ 82BC808 @@ -1523,7 +1523,7 @@ gText_082BC84D:: @ 82BC84D .string "I'll go without an item.\p" .string "This is nerve-racking, though.\n" .string "Wouldn't it be too cool?\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" @@ -1532,7 +1532,7 @@ gText_082BC8EA:: @ 82BC8EA .string "I'll go with that {STR_VAR_1}.\p" .string "This is nerve-racking, though.\n" .string "Wouldn't it be too cool?\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" @@ -1545,7 +1545,7 @@ gText_082BC984:: @ 82BC984 .string "my {STR_VAR_2} didn't have an item?$" gText_082BCA4D:: @ 82BCA4D - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really?\l" .string "Perhaps you're a twin?\p" .string "Oh, no, no, no, don't worry!\n" @@ -1647,7 +1647,7 @@ gText_082BD18A:: @ 82BD18A .string "speak with me… Thank you!$" gText_082BD222:: @ 82BD222 - .string "Oh, {PLAYER}{STRING 5}! It's me!\n" + .string "Oh, {PLAYER}{KUN}! It's me!\n" .string "I'm so glad to see you because I have\l" .string "this little problem.\p" .string "I can't decide how my POKéMON should\n" @@ -1660,13 +1660,13 @@ gText_082BD222:: @ 82BD222 gText_082BD325:: @ 82BD325 .string "My {STR_VAR_1}? That's great!\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" gText_082BD3B1:: @ 82BD3B1 - .string "Hi, my teacher {PLAYER}{STRING 5}!\n" + .string "Hi, my teacher {PLAYER}{KUN}!\n" .string "I'm busy again today!\p" .string "I have to do some cycling, shopping,\n" .string "and humming.\p" @@ -1740,13 +1740,13 @@ gText_082BD8F5:: @ 82BD8F5 gText_082BD9BE:: @ 82BD9BE .string "Hello, hello!\n" - .string "My mentor, {PLAYER}{STRING 5}!\l" + .string "My mentor, {PLAYER}{KUN}!\l" .string "Hit me with your sage advice today!\p" .string "You see, I pulled together a team of\n" .string "three POKéMON. So far so good.\p" .string "But the team's battling order's not\n" .string "settled yet.\p" - .string "This is where you come in, {PLAYER}{STRING 5}!\n" + .string "This is where you come in, {PLAYER}{KUN}!\n" .string "You decide which POKéMON leads off!\p" .string "Don't be shy now.\n" .string "Let's blurt it out!$" @@ -1759,7 +1759,7 @@ gText_082BDAE1:: @ 82BDAE1 .string "Adios!$" gText_082BDB4E:: @ 82BDB4E - .string "{PLAYER}{STRING 5}, listen!\n" + .string "{PLAYER}{KUN}, listen!\n" .string "It's a crisis!\p" .string "My POKéMON, all three of them, go into\n" .string "battle at once!\p" @@ -1815,7 +1815,7 @@ gText_082BDF4D:: @ 82BDF4D .string "See you again, my smart friend!$" gText_082BDFD8:: @ 82BDFD8 - .string "…Oof…ooch… {PLAYER}{STRING 5}…\n" + .string "…Oof…ooch… {PLAYER}{KUN}…\n" .string "My stomach's hurting all of a sudden…\p" .string "…It's getting better now…\p" .string "I must've worried myself sick racking\n" @@ -1823,7 +1823,7 @@ gText_082BDFD8:: @ 82BDFD8 .string "my posse of POKéMON.\p" .string "So, things being this way,\n" .string "I need you to decide for me.\p" - .string "{PLAYER}{STRING 5}, which of my POKéMON should\n" + .string "{PLAYER}{KUN}, which of my POKéMON should\n" .string "go first? So I'd win, I mean.$" gText_082BE0FD:: @ 82BE0FD @@ -1836,7 +1836,7 @@ gText_082BE0FD:: @ 82BE0FD gText_082BE189:: @ 82BE189 .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}?\p" + .string "{PLAYER}{KUN}?\p" .string "Please, don't look at me that way.\n" .string "You're making me feel all flustered.\p" .string "Um…\n" @@ -1852,12 +1852,12 @@ gText_082BE2A5:: @ 82BE2A5 .string "I'll lead with my {STR_VAR_1}.\p" .string "I hope I can do my best without\n" .string "getting all flustered.\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" gText_082BE33E:: @ 82BE33E - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really?\l" .string "Perhaps you're a clever look-alike?\p" .string "Oh, no, no, no, don't worry!\n" @@ -1949,7 +1949,7 @@ gText_082BE99C:: @ 82BE99C .string "Thank you!$" gText_082BEA1B:: @ 82BEA1B - .string "Oh, {PLAYER}{STRING 5}! I'm so glad to see you!\n" + .string "Oh, {PLAYER}{KUN}! I'm so glad to see you!\n" .string "I was about to go looking for you!\p" .string "Can you decide what kind of POKéMON\n" .string "I should use?\p" @@ -1962,20 +1962,20 @@ gText_082BEA1B:: @ 82BEA1B gText_082BEAE9:: @ 82BEAE9 .string "{STR_VAR_1}? That's great!\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" gText_082BEB72:: @ 82BEB72 - .string "If it isn't {PLAYER}{STRING 5}! How's it going?\n" + .string "If it isn't {PLAYER}{KUN}! How's it going?\n" .string "I'm busy again as always!\p" .string "I want to do good with POKéMON, too,\n" .string "but I haven't been able to decide\l" .string "which POKéMON I should use.\p" .string "You know how {STR_VAR_1} look strong?\n" .string "But {STR_VAR_2} are tough to ignore.\p" - .string "{PLAYER}{STRING 5}, give me some of your good\n" + .string "{PLAYER}{KUN}, give me some of your good\n" .string "advice! Which one'd be good for me?$" gText_082BEC8E:: @ 82BEC8E @@ -2046,7 +2046,7 @@ gText_082BF11D:: @ 82BF11D gText_082BF1A8:: @ 82BF1A8 .string "Hey, hey!\n" - .string "My mentor, {PLAYER}{STRING 5}!\p" + .string "My mentor, {PLAYER}{KUN}!\p" .string "Hello, I've been looking for you\n" .string "for some more of your sage advice!\p" .string "Which kind of POKéMON would be right\n" @@ -2062,7 +2062,7 @@ gText_082BF268:: @ 82BF268 .string "Adios!$" gText_082BF2D1:: @ 82BF2D1 - .string "{PLAYER}{STRING 5}, listen! Big news!\n" + .string "{PLAYER}{KUN}, listen! Big news!\n" .string "I caught a mirage POKéMON!\p" .string "Of course I'm lying!\n" .string "Wahahaha!\p" @@ -2120,13 +2120,13 @@ gText_082BF6E5:: @ 82BF6E5 .string "See you again, my smart friend!$" gText_082BF773:: @ 82BF773 - .string "Oh, hi, {PLAYER}{STRING 5}…\n" + .string "Oh, hi, {PLAYER}{KUN}…\n" .string "I have this horrible headache…\p" .string "I must've worried too much about\n" .string "the kind of POKéMON I should raise.\p" .string "So, things being this way,\n" .string "I need you to decide for me.\p" - .string "{PLAYER}{STRING 5}, if I had to choose between\n" + .string "{PLAYER}{KUN}, if I had to choose between\n" .string "the POKéMON {STR_VAR_1} and\l" .string "{STR_VAR_2}, which should it be?$" @@ -2138,7 +2138,7 @@ gText_082BF869:: @ 82BF869 gText_082BF8DD:: @ 82BF8DD .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}…?\p" + .string "{PLAYER}{KUN}…?\p" .string "Please, don't look at me that way.\n" .string "I'm getting all flustered…\l" .string "I… I need your advice.\p" @@ -2152,12 +2152,12 @@ gText_082BF9BA:: @ 82BF9BA .string "I'll do my best with one {STR_VAR_1}.\p" .string "I hope I can do my best without\n" .string "getting all flustered.\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" gText_082BFA5A:: @ 82BFA5A - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really real?\p" .string "No, no, if you are real, it's fine.\n" .string "Incidentally, I would like to obtain\l" @@ -2250,7 +2250,7 @@ gText_082C0032:: @ 82C0032 .string "Thank you!$" gText_082C0090:: @ 82C0090 - .string "Oh, {PLAYER}{STRING 5}!\n" + .string "Oh, {PLAYER}{KUN}!\n" .string "I was just hoping to see you, too!\p" .string "I was wondering what move would\n" .string "be suitable for my {STR_VAR_1}.\p" @@ -2263,14 +2263,14 @@ gText_082C0090:: @ 82C0090 gText_082C016E:: @ 82C016E .string "{STR_VAR_1}? That's great!\p" .string "Knowing that you made the decision,\n" - .string "{PLAYER}{STRING 5}, I won't be so upset if\l" + .string "{PLAYER}{KUN}, I won't be so upset if\l" .string "I lose.\p" .string "Okay, I'll look to you for advice again.\n" .string "Bye!$" gText_082C01F7:: @ 82C01F7 .string "How could things be this busy?\n" - .string "Hey, if it isn't {PLAYER}{STRING 5}!\l" + .string "Hey, if it isn't {PLAYER}{KUN}!\l" .string "How's it going?\p" .string "Since I got up this morning, I've done\n" .string "my jogging, swimming, and cooking!\p" @@ -2279,7 +2279,7 @@ gText_082C01F7:: @ 82C01F7 .string "my {STR_VAR_1} should learn!\p" .string "{STR_VAR_2} looks good, huh?\n" .string "But {STR_VAR_3}'s also decent.\p" - .string "{PLAYER}{STRING 5}, give me some of your good\n" + .string "{PLAYER}{KUN}, give me some of your good\n" .string "advice! Which move'd be good for me?$" gText_082C034C:: @ 82C034C @@ -2344,7 +2344,7 @@ gText_082C06D8:: @ 82C06D8 .string "some more another time.$" gText_082C074A:: @ 82C074A - .string "Hola, {PLAYER}{STRING 5}, bueno!\n" + .string "Hola, {PLAYER}{KUN}, bueno!\n" .string "I'm hoping for some more of\l" .string "your sage advice today!\p" .string "What would be the best move for\n" @@ -2362,7 +2362,7 @@ gText_082C0809:: @ 82C0809 .string "Adios!$" gText_082C086E:: @ 82C086E - .string "{PLAYER}{STRING 5}, it's completely wild!\p" + .string "{PLAYER}{KUN}, it's completely wild!\p" .string "My POKéMON!\n" .string "It learned six moves!\p" .string "Of course I'm lying!\n" @@ -2420,13 +2420,13 @@ gText_082C0C7D:: @ 82C0C7D .string "See you again, my smart friend!$" gText_082C0D0B:: @ 82C0D0B - .string "Gahack! Gaah! Oh, {PLAYER}{STRING 5}…\n" + .string "Gahack! Gaah! Oh, {PLAYER}{KUN}…\n" .string "I have this lousy cold, I do…\p" .string "I want to pick a move for my POKéMON,\n" .string "but I'm not up to it…\p" .string "So, things being this way,\n" .string "I need you to decide for me.\p" - .string "{PLAYER}{STRING 5}, if I had to choose between\n" + .string "{PLAYER}{KUN}, if I had to choose between\n" .string "{STR_VAR_2} and {STR_VAR_3} for\l" .string "my {STR_VAR_1}, which would it be?$" @@ -2438,7 +2438,7 @@ gText_082C0DFE:: @ 82C0DFE gText_082C0E71:: @ 82C0E71 .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}…?\p" + .string "{PLAYER}{KUN}…?\p" .string "Please, don't look at me that way.\n" .string "I'm getting all flustered…\l" .string "I… I need your advice.\p" @@ -2454,12 +2454,12 @@ gText_082C0F6D:: @ 82C0F6D .string "I'll try that {STR_VAR_1}.\p" .string "I hope I can teach that move…\n" .string "This is so nerve-racking…\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "If we meet again, I hope you will be\l" .string "as helpful.$" gText_082C1003:: @ 82C1003 - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really real?\p" .string "Perhaps you're one of those popular\n" .string "mimics?\p" @@ -2569,7 +2569,7 @@ gText_082C174F:: @ 82C174F .string "somewhere again!$" gText_082C1862:: @ 82C1862 - .string "Oh, {PLAYER}{STRING 5}.\n" + .string "Oh, {PLAYER}{KUN}.\n" .string "There's something I want you to hear.\p" .string "I know that I don't always sound\n" .string "nice or polite…\p" @@ -2595,7 +2595,7 @@ gText_082C19A0:: @ 82C19A0 gText_082C1A76:: @ 82C1A76 .string "Oh, I can't get over how busy I am!\n" - .string "Oh, hey, I was looking for you, {PLAYER}{STRING 5}.\p" + .string "Oh, hey, I was looking for you, {PLAYER}{KUN}.\p" .string "Are you well as usual?\n" .string "Things haven't changed for me at all.\p" .string "I've got running, fighting, and mapping\n" @@ -2605,7 +2605,7 @@ gText_082C1A76:: @ 82C1A76 .string "from a win without saying a word.\p" .string "So, what would be a cool saying to\n" .string "underline my coolness when I'm done\l" - .string "and walking away? {PLAYER}{STRING 5}, help me!$" + .string "and walking away? {PLAYER}{KUN}, help me!$" gText_082C1C16:: @ 82C1C16 .string "{STR_VAR_1}\p" @@ -2615,7 +2615,7 @@ gText_082C1C16:: @ 82C1C16 .string "like you.\p" .string "I'm going to make time somehow so\n" .string "I can get into battling.\p" - .string "Thanks for everything, {PLAYER}{STRING 5}!\n" + .string "Thanks for everything, {PLAYER}{KUN}!\n" .string "We have to battle, you and me, one day!$" gText_082C1CF5:: @ 82C1CF5 @@ -2694,7 +2694,7 @@ gText_082C21FF:: @ 82C21FF gText_082C231C:: @ 82C231C .string "Hola, bueno!\n" - .string "{PLAYER}{STRING 5}!\p" + .string "{PLAYER}{KUN}!\p" .string "You know, I'm getting the itch to roam\n" .string "and battle where I may.\p" .string "But before I do, I want your advice\n" @@ -2714,7 +2714,7 @@ gText_082C2407:: @ 82C2407 .string "Adios!$" gText_082C24B5:: @ 82C24B5 - .string "{PLAYER}{STRING 5}, there's big trouble!\p" + .string "{PLAYER}{KUN}, there's big trouble!\p" .string "When I win a battle, I brag about it\n" .string "for an hour at least!\p" .string "Of course I'm lying!\n" @@ -2793,14 +2793,14 @@ gText_082C2A0B:: @ 82C2A0B .string "Love ya!$" gText_082C2B50:: @ 82C2B50 - .string "{PLAYER}{STRING 5}, I'm finished…\n" + .string "{PLAYER}{KUN}, I'm finished…\n" .string "My nose won't stop dripping…\p" .string "I was trying to think up something\n" .string "cool to say when I win a battle.\p" .string "It inspired me so much, it made me cry,\n" .string "and now my nose won't stop running…\p" .string "So, things being this way,\n" - .string "I need you to decide for me, {PLAYER}{STRING 5}.\p" + .string "I need you to decide for me, {PLAYER}{KUN}.\p" .string "When I win a battle,\n" .string "what should I say?$" @@ -2812,13 +2812,13 @@ gText_082C2C77:: @ 82C2C77 .string "But in spite of my tears and runny\n" .string "nose, I will use that saying!\p" .string "I'm plumb out of things to ask you,\n" - .string "{PLAYER}{STRING 5}.\p" + .string "{PLAYER}{KUN}.\p" .string "From now on, we're rivals!\n" .string "Thanks for everything!$" gText_082C2D67:: @ 82C2D67 .string "Er… Um…\n" - .string "{PLAYER}{STRING 5}…\p" + .string "{PLAYER}{KUN}…\p" .string "Please, don't look at me that way.\n" .string "You're making me all nervous.\p" .string "I… I need your advice again.\n" @@ -2832,13 +2832,13 @@ gText_082C2E41:: @ 82C2E41 .string "Oh… Okay!\n" .string "I'll try to say that!\l" .string "I might be too nervous to say it…\p" - .string "Thank you, {PLAYER}{STRING 5}.\n" + .string "Thank you, {PLAYER}{KUN}.\n" .string "I have to say good-bye now.\p" .string "I'll obey all that you've taught me,\n" - .string "{PLAYER}{STRING 5}, and do the best I can.$" + .string "{PLAYER}{KUN}, and do the best I can.$" gText_082C2EF5:: @ 82C2EF5 - .string "Hm? You appear to be {PLAYER}{STRING 5}…\n" + .string "Hm? You appear to be {PLAYER}{KUN}…\n" .string "But are you really?\l" .string "Perhaps a clever {PLAYER} DOLL?\p" .string "Oh, no, no, no, don't worry!\n" diff --git a/data/text/match_call.inc b/data/text/match_call.inc index b25b72ebf..376f36750 100644 --- a/data/text/match_call.inc +++ b/data/text/match_call.inc @@ -1,5 +1,5 @@ MatchCall_WildBattleText1:: @ 82A971C - .string "Hi! {PLAYER}{STRING 5}, hello!\n" + .string "Hi! {PLAYER}{KUN}, hello!\n" .string "This is {STR_VAR_1}.\p" .string "I saw this {STR_VAR_2} a while back\n" .string "but I couldn't catch it.\p" @@ -7,7 +7,7 @@ MatchCall_WildBattleText1:: @ 82A971C .string "Well, see you again!$" MatchCall_WildBattleText2:: @ 82A9798 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's {STR_VAR_1}.\p" .string "I tried to catch a nice {STR_VAR_2}\n" .string "a little while ago.\p" @@ -25,7 +25,7 @@ MatchCall_WildBattleText3:: @ 82A9813 .string "All right, see you!$" MatchCall_WildBattleText4:: @ 82A98A8 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "You know the POKéMON {STR_VAR_2}?\n" .string "I came close to getting one.\p" @@ -36,7 +36,7 @@ MatchCall_WildBattleText4:: @ 82A98A8 .string "Okay, catch you later.$" MatchCall_WildBattleText5:: @ 82A9977 - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\l" .string "Catching any POKéMON lately?\p" .string "A little while ago I came close to\n" @@ -44,7 +44,7 @@ MatchCall_WildBattleText5:: @ 82A9977 .string "Right, take care!$" MatchCall_WildBattleText6:: @ 82A99FD - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\l" .string "Caught any POKéMON lately?\p" .string "I nearly nabbed one the other day.\n" @@ -52,7 +52,7 @@ MatchCall_WildBattleText6:: @ 82A99FD .string "You take care.$" MatchCall_WildBattleText7:: @ 82A9A78 - .string "…Uh, {PLAYER}{STRING 5}?\n" + .string "…Uh, {PLAYER}{KUN}?\n" .string "It's me, {STR_VAR_1}.\p" .string "Oh, wait! Wait!\n" .string "I can catch this {STR_VAR_2}…\p" @@ -60,7 +60,7 @@ MatchCall_WildBattleText7:: @ 82A9A78 .string "That wasn't just close!$" MatchCall_WildBattleText8:: @ 82A9AE8 - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\p" .string "Have you had success catching\n" .string "POKéMON lately?\p" @@ -70,7 +70,7 @@ MatchCall_WildBattleText8:: @ 82A9AE8 .string "See you again!$" MatchCall_WildBattleText9:: @ 82A9BA7 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "So? Are you getting more POKéMON\n" .string "together?\p" @@ -79,7 +79,7 @@ MatchCall_WildBattleText9:: @ 82A9BA7 .string "See you!$" MatchCall_WildBattleText10:: @ 82A9C36 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "Listen, I came within a whisker of\n" .string "catching this {STR_VAR_2}…\p" @@ -88,7 +88,7 @@ MatchCall_WildBattleText10:: @ 82A9C36 .string "See you around.$" MatchCall_WildBattleText11:: @ 82A9CC8 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "How are things with you?\p" .string "I tried to catch a wild {STR_VAR_2}\n" @@ -96,7 +96,7 @@ MatchCall_WildBattleText11:: @ 82A9CC8 .string "I feel defeated…$" MatchCall_WildBattleText12:: @ 82A9D44 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you still catching POKéMON?\p" .string "I've been trying to catch them\n" @@ -104,7 +104,7 @@ MatchCall_WildBattleText12:: @ 82A9D44 .string "The way of POKéMON is deep!$" MatchCall_WildBattleText13:: @ 82A9DD7 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "Have you been catching POKéMON?\p" .string "I've been trying to catch them\n" @@ -112,7 +112,7 @@ MatchCall_WildBattleText13:: @ 82A9DD7 .string "The way of POKéMON is deep!$" MatchCall_WildBattleText14:: @ 82A9E70 - .string "Oh, hi, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, hi, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1}.\p" .string "Just now, I tried to catch a cute\n" .string "{STR_VAR_2}.\p" @@ -131,7 +131,7 @@ MatchCall_WildBattleText15:: @ 82A9EFD .string "See you around!$" MatchCall_NegativeBattleText1:: @ 82A9FAB - .string "Hi! {PLAYER}{STRING 5}, hello!\n" + .string "Hi! {PLAYER}{KUN}, hello!\n" .string "This is {STR_VAR_1}.\p" .string "I tried battling another TRAINER,\n" .string "but I lost.\p" @@ -139,7 +139,7 @@ MatchCall_NegativeBattleText1:: @ 82A9FAB .string "Well, see you again!$" MatchCall_NegativeBattleText2:: @ 82AA028 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's {STR_VAR_1}.\p" .string "I challenged someone else after\n" .string "we battled.\p" @@ -188,7 +188,7 @@ MatchCall_NegativeBattleText7:: @ 82AA2A1 .string "See you.$" MatchCall_NegativeBattleText8:: @ 82AA31B - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\p" .string "How are your POKéMON doing?\n" .string "I lost a match the other day.\p" @@ -196,7 +196,7 @@ MatchCall_NegativeBattleText8:: @ 82AA31B .string "See you again!$" MatchCall_NegativeBattleText9:: @ 82AA3A8 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "Listen, listen, you have to hear\n" .string "this!\p" @@ -205,7 +205,7 @@ MatchCall_NegativeBattleText9:: @ 82AA3A8 .string "Oh, it burns me up!$" MatchCall_NegativeBattleText10:: @ 82AA442 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "A little earlier, I was in a battle.\n" .string "I lost, though.\p" @@ -213,14 +213,14 @@ MatchCall_NegativeBattleText10:: @ 82AA442 .string "See you around.$" MatchCall_NegativeBattleText11:: @ 82AA4C5 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "How are your POKéMON?\p" .string "I just lost yet another battle.\p" .string "Well, see you!$" MatchCall_NegativeBattleText12:: @ 82AA520 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you still battling hard?\p" .string "As for me, I lost recently, so I've\n" @@ -228,16 +228,16 @@ MatchCall_NegativeBattleText12:: @ 82AA520 .string "Let's meet again.$" MatchCall_NegativeBattleText13:: @ 82AA5AD - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\p" .string "I hope you've been keeping well.\p" .string "I was in a battle just a little\n" .string "while before this.\p" - .string "{PLAYER}{STRING 5}, try to be active like me.\n" + .string "{PLAYER}{KUN}, try to be active like me.\n" .string "See you again!$" MatchCall_NegativeBattleText14:: @ 82AA64D - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "Are you doing good?\p" .string "You should go home every so often,\n" @@ -245,7 +245,7 @@ MatchCall_NegativeBattleText14:: @ 82AA64D .string "Bye-bye!$" MatchCall_PositiveBattleText1:: @ 82AA6AF - .string "Hi! {PLAYER}{STRING 5}, hello!\n" + .string "Hi! {PLAYER}{KUN}, hello!\n" .string "This is {STR_VAR_1}!\p" .string "I battled another TRAINER earlier.\n" .string "I won! I won!\p" @@ -253,7 +253,7 @@ MatchCall_PositiveBattleText1:: @ 82AA6AF .string "for me. This is so great!$" MatchCall_PositiveBattleText2:: @ 82AA730 - .string "Hello, {PLAYER}{STRING 5}!\n" + .string "Hello, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}!\p" .string "I had a battle yesterday and\n" .string "I won! It's fantastic!$" @@ -276,7 +276,7 @@ MatchCall_PositiveBattleText4:: @ 82AA81C .string "inspired showing.$" MatchCall_PositiveBattleText5:: @ 82AA88C - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "How are things with you?\n" .string "Battling much?\p" @@ -286,7 +286,7 @@ MatchCall_PositiveBattleText5:: @ 82AA88C .string "next time! Right, take care!$" MatchCall_PositiveBattleText6:: @ 82AA934 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "How's it going for you?\p" .string "I've been riding a hot streak.\n" @@ -295,7 +295,7 @@ MatchCall_PositiveBattleText6:: @ 82AA934 .string "I'm sure not going to lose!$" MatchCall_PositiveBattleText7:: @ 82AA9D3 - .string "{PLAYER}{STRING 5}?\n" + .string "{PLAYER}{KUN}?\n" .string "{STR_VAR_1} here.\p" .string "My {STR_VAR_2} is a force!\n" .string "It won me another battle just now!\p" @@ -303,7 +303,7 @@ MatchCall_PositiveBattleText7:: @ 82AA9D3 .string "with you.$" MatchCall_PositiveBattleText8:: @ 82AAA40 - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\p" .string "I hope you've been well.\n" .string "I wanted to tell you I just won.\p" @@ -312,7 +312,7 @@ MatchCall_PositiveBattleText8:: @ 82AAA40 .string "See you again!$" MatchCall_PositiveBattleText9:: @ 82AAAE4 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "How are your POKéMON holding up?\n" .string "Mine just won a battle!\p" @@ -322,7 +322,7 @@ MatchCall_PositiveBattleText9:: @ 82AAAE4 .string "See you again!$" MatchCall_PositiveBattleText10:: @ 82AAB8C - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "How has life been treating you?\p" .string "My POKéMON appear to be charged\n" @@ -331,7 +331,7 @@ MatchCall_PositiveBattleText10:: @ 82AAB8C .string "See you around.$" MatchCall_PositiveBattleText11:: @ 82AAC25 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "Been in any battles lately?\n" .string "I just won another one today!\p" @@ -339,7 +339,7 @@ MatchCall_PositiveBattleText11:: @ 82AAC25 .string "Well, see you!$" MatchCall_PositiveBattleText12:: @ 82AAC9D - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\p" .string "I trust you've been well?\n" .string "I'm still bursting with life!\p" @@ -348,7 +348,7 @@ MatchCall_PositiveBattleText12:: @ 82AAC9D .string "youngsters yet!$" MatchCall_PositiveBattleText13:: @ 82AAD41 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\p" .string "I hope you've been keeping well.\n" .string "I still have a bounce in my step!\p" @@ -358,12 +358,12 @@ MatchCall_PositiveBattleText13:: @ 82AAD41 .string "See you again!$" MatchCall_PositiveBattleText14:: @ 82AAE00 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I was in a battle recently, and my\n" .string "{STR_VAR_2} was exceptional!\p" .string "I wish you could have seen it,\n" - .string "{PLAYER}{STRING 5}. Bye-bye!$" + .string "{PLAYER}{KUN}. Bye-bye!$" MatchCall_SameRouteBattleRequestText1:: @ 82AAE7F .string "Hi! {PLAYER}, hello!\n" @@ -392,7 +392,7 @@ MatchCall_SameRouteBattleRequestText3:: @ 82AAF69 .string "I'll be waiting! Catch you soon!$" MatchCall_SameRouteBattleRequestText4:: @ 82AB010 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "Whereabouts are you now?\n" .string "Huh? {STR_VAR_2}?\p" @@ -400,7 +400,7 @@ MatchCall_SameRouteBattleRequestText4:: @ 82AB010 .string "I'll wait for you. See you!$" MatchCall_SameRouteBattleRequestText5:: @ 82AB076 - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\l" .string "How are things with you?\p" .string "You're where now?\n" @@ -411,7 +411,7 @@ MatchCall_SameRouteBattleRequestText5:: @ 82AB076 .string "See you soon!$" MatchCall_SameRouteBattleRequestText6:: @ 82AB11A - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\l" .string "How are your POKéMON keeping?\p" .string "Oh, is that right? You're around\n" @@ -422,7 +422,7 @@ MatchCall_SameRouteBattleRequestText6:: @ 82AB11A .string "See you!$" MatchCall_SameRouteBattleRequestText7:: @ 82AB1B4 - .string "…Er, {PLAYER}{STRING 5}?\n" + .string "…Er, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here…\p" .string "Oh, you happen to be around\n" .string "{STR_VAR_2}?\p" @@ -432,7 +432,7 @@ MatchCall_SameRouteBattleRequestText7:: @ 82AB1B4 .string "I'll wait for you.$" MatchCall_SameRouteBattleRequestText8:: @ 82AB23D - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\p" .string "I hope you're doing well.\n" .string "Oh, you're near {STR_VAR_2}.\p" @@ -442,7 +442,7 @@ MatchCall_SameRouteBattleRequestText8:: @ 82AB23D .string "See you soon!$" MatchCall_SameRouteBattleRequestText9:: @ 82AB2E9 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "Are you keeping up?\n" .string "Oh, you're near {STR_VAR_2}?\p" @@ -451,7 +451,7 @@ MatchCall_SameRouteBattleRequestText9:: @ 82AB2E9 .string "Don't keep me waiting too long!$" MatchCall_SameRouteBattleRequestText10:: @ 82AB382 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "How are things with you?\n" .string "Oh, you're near {STR_VAR_2}.\p" @@ -460,7 +460,7 @@ MatchCall_SameRouteBattleRequestText10:: @ 82AB382 .string "Be quick!$" MatchCall_SameRouteBattleRequestText11:: @ 82AB410 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "Ah, so where you are now is\n" .string "{STR_VAR_2}?\p" @@ -470,7 +470,7 @@ MatchCall_SameRouteBattleRequestText11:: @ 82AB410 .string "See you real quick!$" MatchCall_SameRouteBattleRequestText12:: @ 82AB4B0 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Where might you be now?\p" .string "{STR_VAR_2}?\n" @@ -481,7 +481,7 @@ MatchCall_SameRouteBattleRequestText12:: @ 82AB4B0 .string "See you!$" MatchCall_SameRouteBattleRequestText13:: @ 82AB538 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\p" .string "I hope you've been keeping well.\n" .string "Oh, you're near {STR_VAR_2}?\p" @@ -491,7 +491,7 @@ MatchCall_SameRouteBattleRequestText13:: @ 82AB538 .string "Bye for now.$" MatchCall_SameRouteBattleRequestText14:: @ 82AB5E4 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "You're what? …{STR_VAR_2}?\n" .string "That's very close.\p" @@ -527,7 +527,7 @@ MatchCall_DifferentRouteBattleRequestText3:: @ 82AB73C .string "{STR_VAR_2}.$" MatchCall_DifferentRouteBattleRequestText4:: @ 82AB808 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\l" .string "How are things with you?\p" .string "My POKéMON have grown pretty\n" @@ -538,7 +538,7 @@ MatchCall_DifferentRouteBattleRequestText4:: @ 82AB808 .string "{STR_VAR_2}, okay?$" MatchCall_DifferentRouteBattleRequestText5:: @ 82AB8B7 - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "My POKéMON are growing up in\n" .string "decent ways.\p" @@ -548,7 +548,7 @@ MatchCall_DifferentRouteBattleRequestText5:: @ 82AB8B7 .string "{STR_VAR_2}. See you soon!$" MatchCall_DifferentRouteBattleRequestText6:: @ 82AB95D - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\l" .string "I hope you're on top of things.\p" .string "I was thinking I'd like another\n" @@ -558,7 +558,7 @@ MatchCall_DifferentRouteBattleRequestText6:: @ 82AB95D .string "See you!$" MatchCall_DifferentRouteBattleRequestText7:: @ 82ABA03 - .string "…Er, {PLAYER}{STRING 5}?\n" + .string "…Er, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here…\l" .string "So? Are your POKéMON growing?\p" .string "Mine sure got stronger.\n" @@ -568,7 +568,7 @@ MatchCall_DifferentRouteBattleRequestText7:: @ 82ABA03 .string "See you around.$" MatchCall_DifferentRouteBattleRequestText8:: @ 82ABA9F - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\p" .string "I hope you're doing well.\n" .string "My POKéMON are very frisky.\p" @@ -578,48 +578,48 @@ MatchCall_DifferentRouteBattleRequestText8:: @ 82ABA9F .string "Until then, good-bye!$" MatchCall_DifferentRouteBattleRequestText9:: @ 82ABB62 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\l" .string "How are your POKéMON doing?\p" .string "My POKéMON keep getting better.\n" - .string "I'd like to show you, {PLAYER}{STRING 5}.\p" + .string "I'd like to show you, {PLAYER}{KUN}.\p" .string "I'm around {STR_VAR_2} now,\n" .string "so let's battle if you're close by.\p" .string "Hope I see you soon!$" MatchCall_DifferentRouteBattleRequestText10:: @ 82ABC26 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\l" .string "So, how are things with you?\p" .string "My POKéMON have grown much\n" .string "stronger than before.\p" .string "I'd love another battle with you,\n" - .string "{PLAYER}{STRING 5}.\p" + .string "{PLAYER}{KUN}.\p" .string "I'll be around {STR_VAR_2}.\n" .string "Come see me if you're close.$" MatchCall_DifferentRouteBattleRequestText11:: @ 82ABCE9 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "Where might you be now?\p" .string "My POKéMON are full of life.\n" .string "They appear to be looking forward\l" - .string "to seeing your POKéMON, {PLAYER}{STRING 5}.\p" + .string "to seeing your POKéMON, {PLAYER}{KUN}.\p" .string "I'm around {STR_VAR_2} now.\n" .string "I hope you'll seek us out.$" MatchCall_DifferentRouteBattleRequestText12:: @ 82ABDA2 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\p" .string "I should tell you, my POKéMON have\n" .string "grown to be quite robust lately.\p" .string "I would like to see them in a battle\n" - .string "with you, {PLAYER}{STRING 5}.\p" + .string "with you, {PLAYER}{KUN}.\p" .string "We'll be around {STR_VAR_2}.\n" .string "Come see us anytime!$" MatchCall_DifferentRouteBattleRequestText13:: @ 82ABE5E - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "Are your POKéMON keeping well?\p" .string "My POKéMON have been so healthy,\n" @@ -630,13 +630,13 @@ MatchCall_DifferentRouteBattleRequestText13:: @ 82ABE5E .string "do come see us.$" MatchCall_DifferentRouteBattleRequestText14:: @ 82ABF36 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "Keeping well, I hope.\p" .string "Oh, yes! My POKéMON are\n" .string "much stronger than before.\p" .string "Don't you think we ought to have\n" - .string "a battle, {PLAYER}{STRING 5}?\p" + .string "a battle, {PLAYER}{KUN}?\p" .string "We'll be waiting for you around\n" .string "{STR_VAR_2}.\p" .string "Come see us anytime, okay?$" @@ -884,14 +884,14 @@ MatchCall_PersonalizedText23:: @ 82AD2A8 .string "When there's a strong TRAINER\n" .string "nearby, I can sometimes sense that\l" .string "somehow.\p" - .string "Did you pass close by, {PLAYER}{STRING 5}?\n" + .string "Did you pass close by, {PLAYER}{KUN}?\n" .string "Maybe it was you.\p" .string "I'll be waiting for your visit.\n" .string "Bye!$" MatchCall_PersonalizedText24:: @ 82AD34F .string "Hello, this is {STR_VAR_1}.\n" - .string "You sound well, {PLAYER}{STRING 5}.\p" + .string "You sound well, {PLAYER}{KUN}.\p" .string "I've traveled around the world,\n" .string "but I must say I've taken a great\l" .string "shine to this region.\p" @@ -1007,7 +1007,7 @@ MatchCall_PersonalizedText32:: @ 82ADC92 .string "It's kind of hard to explain, but…\l" .string "How would I say this now…\l" .string "My shorts feel silkier!\p" - .string "And when I battled you, {PLAYER}{STRING 5},\n" + .string "And when I battled you, {PLAYER}{KUN},\n" .string "my shorts felt icky and coarse.\p" .string "… … … … … …\n" .string "You didn't really believe that?\l" @@ -1117,7 +1117,7 @@ MatchCall_PersonalizedText40:: @ 82AE5CD .string "test of human endurance! Bye!$" MatchCall_PersonalizedText41:: @ 82AE698 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "How are your POKéMON doing?\p" .string "My DRAGON POKéMON appear to be\n" @@ -1171,7 +1171,7 @@ MatchCall_PersonalizedText46:: @ 82AE998 .string "I'd better go!$" MatchCall_PersonalizedText47:: @ 82AEA8F - .string "Oh, {PLAYER}{STRING 5}, hello!\n" + .string "Oh, {PLAYER}{KUN}, hello!\n" .string "This is {STR_VAR_1}.\l" .string "I'm up in the mountains now.\p" .string "But the ground is too bumpy.\n" @@ -1241,7 +1241,7 @@ MatchCall_PersonalizedText53:: @ 82AEEF4 MatchCall_PersonalizedText54:: @ 82AEFDA .string "Hi, it's {STR_VAR_1}. You know,\n" .string "the TRAINER who's always prepared!\p" - .string "{PLAYER}{STRING 5}, do you have enough items?\n" + .string "{PLAYER}{KUN}, do you have enough items?\n" .string "Are your POKéMON fit for action?\p" .string "Keeping everything perfect around\n" .string "you all the time is the secret to\l" @@ -1326,7 +1326,7 @@ MatchCall_PersonalizedText60:: @ 82AF671 .string "enjoy POKéMON whatever your age.\p" .string "Wouldn't it be good if you had\n" .string "a partnership like ours?\p" - .string "Of course, {PLAYER}{STRING 5}, you already\n" + .string "Of course, {PLAYER}{KUN}, you already\n" .string "enjoy the trust and companionship\l" .string "of your POKéMON now.\p" .string "You have the makings of long and\n" @@ -1344,7 +1344,7 @@ MatchCall_PersonalizedText61:: @ 82AF7D8 .string "was weak to make an impression!\p" .string "She always chews me out whether\n" .string "we win or lose!\p" - .string "{PLAYER}{STRING 5}, can you say something\n" + .string "{PLAYER}{KUN}, can you say something\n" .string "to her next time?\p" .string "Okay, see you!$" @@ -1412,7 +1412,7 @@ MatchCall_BattleFrontierStreakText3:: @ 82AFCFF .string "Catch you soon!$" MatchCall_BattleFrontierStreakText4:: @ 82AFDA7 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here. What's up?\p" .string "There's a rumor going around that\n" .string "you strung together {STR_VAR_3} straight\l" @@ -1421,7 +1421,7 @@ MatchCall_BattleFrontierStreakText4:: @ 82AFDA7 .string "See you!$" MatchCall_BattleFrontierStreakText5:: @ 82AFE3D - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "You were at the {STR_VAR_2}\n" .string "and won {STR_VAR_3} battles in a row?\l" @@ -1430,7 +1430,7 @@ MatchCall_BattleFrontierStreakText5:: @ 82AFE3D .string "See you soon!$" MatchCall_BattleFrontierStreakText6:: @ 82AFECA - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here. How are you?\p" .string "By the way, I heard you pulled off\n" .string "the feat of {STR_VAR_3} straight wins at\l" @@ -1439,7 +1439,7 @@ MatchCall_BattleFrontierStreakText6:: @ 82AFECA .string "raising my team.$" MatchCall_BattleFrontierStreakText7:: @ 82AFF64 - .string "…Er, {PLAYER}{STRING 5}?\n" + .string "…Er, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here…\p" .string "Oh, yeah, you were over at\n" .string "the {STR_VAR_2}, right?\p" @@ -1448,7 +1448,7 @@ MatchCall_BattleFrontierStreakText7:: @ 82AFF64 .string "I have to go!$" MatchCall_BattleFrontierStreakText8:: @ 82AFFF0 - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\l" .string "I hope you're doing well.\p" .string "Oh, but, you are. I've heard that\n" @@ -1458,7 +1458,7 @@ MatchCall_BattleFrontierStreakText8:: @ 82AFFF0 .string "I hope you stay successful.$" MatchCall_BattleFrontierStreakText9:: @ 82B00B5 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "I heard! Your {STR_VAR_3}-win streak at\n" .string "the {STR_VAR_2}!\p" @@ -1466,7 +1466,7 @@ MatchCall_BattleFrontierStreakText9:: @ 82B00B5 .string "I'd better try harder, too!$" MatchCall_BattleFrontierStreakText10:: @ 82B0129 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "You won {STR_VAR_3} straight battles at\n" .string "the {STR_VAR_2}?\p" @@ -1474,7 +1474,7 @@ MatchCall_BattleFrontierStreakText10:: @ 82B0129 .string "I need to work harder.$" MatchCall_BattleFrontierStreakText11:: @ 82B01A5 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I hear you're the terror of\n" .string "the {STR_VAR_2}?\p" @@ -1484,7 +1484,7 @@ MatchCall_BattleFrontierStreakText11:: @ 82B01A5 .string "I wonder how many I can win?$" MatchCall_BattleFrontierStreakText12:: @ 82B0232 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you keeping well?\p" .string "Someone passed on word about you.\n" @@ -1494,7 +1494,7 @@ MatchCall_BattleFrontierStreakText12:: @ 82B0232 .string "See you!$" MatchCall_BattleFrontierStreakText13:: @ 82B02D9 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "I hope you've been keeping well.\p" .string "They say you won {STR_VAR_3} straight\n" @@ -1503,7 +1503,7 @@ MatchCall_BattleFrontierStreakText13:: @ 82B02D9 .string "Bye now.$" MatchCall_BattleFrontierStreakText14:: @ 82B0366 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I heard about you!\n" .string "Didn't you just win {STR_VAR_3} battles in\l" @@ -1538,7 +1538,7 @@ MatchCall_BattleFrontierRecordStreakText3:: @ 82B04DE .string "Catch you soon!$" MatchCall_BattleFrontierRecordStreakText4:: @ 82B0586 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here. What's up?\p" .string "There's a rumor going around that\n" .string "you strung together {STR_VAR_3} straight\l" @@ -1547,7 +1547,7 @@ MatchCall_BattleFrontierRecordStreakText4:: @ 82B0586 .string "See you!$" MatchCall_BattleFrontierRecordStreakText5:: @ 82B061C - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "You were at the {STR_VAR_2}\n" .string "and won {STR_VAR_3} battles in a row?\l" @@ -1556,7 +1556,7 @@ MatchCall_BattleFrontierRecordStreakText5:: @ 82B061C .string "See you soon!$" MatchCall_BattleFrontierRecordStreakText6:: @ 82B06A3 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here. How are you?\p" .string "By the way, I heard you pulled off\n" .string "the feat of {STR_VAR_3} straight wins at\l" @@ -1565,7 +1565,7 @@ MatchCall_BattleFrontierRecordStreakText6:: @ 82B06A3 .string "See you soon!$" MatchCall_BattleFrontierRecordStreakText7:: @ 82B073B - .string "…Er, {PLAYER}{STRING 5}?\n" + .string "…Er, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here…\p" .string "Oh, yeah, you were over at\n" .string "the {STR_VAR_2}, right?\p" @@ -1574,7 +1574,7 @@ MatchCall_BattleFrontierRecordStreakText7:: @ 82B073B .string "I have to go!$" MatchCall_BattleFrontierRecordStreakText8:: @ 82B07C7 - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\l" .string "I hope you're doing well.\p" .string "Oh, but, you are. I've heard that\n" @@ -1584,7 +1584,7 @@ MatchCall_BattleFrontierRecordStreakText8:: @ 82B07C7 .string "I'd better work on my POKéMON, too!$" MatchCall_BattleFrontierRecordStreakText9:: @ 82B0894 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "I heard! Your {STR_VAR_3}-win streak at\n" .string "the {STR_VAR_2}!\p" @@ -1592,7 +1592,7 @@ MatchCall_BattleFrontierRecordStreakText9:: @ 82B0894 .string "I'd better try harder, too!$" MatchCall_BattleFrontierRecordStreakText10:: @ 82B0908 - .string "Oh, {PLAYER}{STRING 5}, hello…\n" + .string "Oh, {PLAYER}{KUN}, hello…\n" .string "This is {STR_VAR_1}.\p" .string "You won {STR_VAR_3} straight battles at\n" .string "the {STR_VAR_2}?\p" @@ -1600,7 +1600,7 @@ MatchCall_BattleFrontierRecordStreakText10:: @ 82B0908 .string "I need to work harder.$" MatchCall_BattleFrontierRecordStreakText11:: @ 82B0984 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I hear you're the terror of\n" .string "the {STR_VAR_2}?\p" @@ -1610,7 +1610,7 @@ MatchCall_BattleFrontierRecordStreakText11:: @ 82B0984 .string "I wonder how many I can win?$" MatchCall_BattleFrontierRecordStreakText12:: @ 82B0A11 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you keeping well?\p" .string "Someone passed on word about you.\n" @@ -1620,7 +1620,7 @@ MatchCall_BattleFrontierRecordStreakText12:: @ 82B0A11 .string "See you!$" MatchCall_BattleFrontierRecordStreakText13:: @ 82B0AB8 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "I hope you've been keeping well.\p" .string "They say you won {STR_VAR_3} straight\n" @@ -1629,7 +1629,7 @@ MatchCall_BattleFrontierRecordStreakText13:: @ 82B0AB8 .string "Bye now.$" MatchCall_BattleFrontierRecordStreakText14:: @ 82B0B45 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "I heard about you!\p" .string "Didn't you just win {STR_VAR_3} battles in\n" @@ -1664,7 +1664,7 @@ MatchCall_BattleDomeText3:: @ 82B0CC7 .string "Catch you soon!$" MatchCall_BattleDomeText4:: @ 82B0D4A - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "I heard you became the champion\n" .string "at the {STR_VAR_2} {STR_VAR_3} times.\p" @@ -1672,7 +1672,7 @@ MatchCall_BattleDomeText4:: @ 82B0D4A .string "I'll try to keep up!$" MatchCall_BattleDomeText5:: @ 82B0DC8 - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "I heard you won {STR_VAR_3} times\n" .string "outright at the {STR_VAR_2}.\p" @@ -1680,7 +1680,7 @@ MatchCall_BattleDomeText5:: @ 82B0DC8 .string "See you soon!$" MatchCall_BattleDomeText6:: @ 82B0E35 - .string "Hey, {PLAYER}{STRING 5}?\n" + .string "Hey, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here. How are you?\p" .string "By the way, I heard you became\n" .string "the champion {STR_VAR_3} times at\l" @@ -1689,7 +1689,7 @@ MatchCall_BattleDomeText6:: @ 82B0E35 .string "you pull farther ahead.$" MatchCall_BattleDomeText7:: @ 82B0ED1 - .string "{PLAYER}{STRING 5}?\n" + .string "{PLAYER}{KUN}?\n" .string "{STR_VAR_1} here.\p" .string "You were at the {STR_VAR_2}\n" .string "and became the champ {STR_VAR_3} times?\p" @@ -1699,7 +1699,7 @@ MatchCall_BattleDomeText7:: @ 82B0ED1 .string "Okay, bye.$" MatchCall_BattleDomeText8:: @ 82B0F72 - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\l" .string "I hope you're doing well.\l" .string "Oh, but, you are.\p" @@ -1709,7 +1709,7 @@ MatchCall_BattleDomeText8:: @ 82B0F72 .string "See you again.$" MatchCall_BattleDomeText9:: @ 82B102A - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "I heard! You took the title\n" .string "{STR_VAR_3} times at the {STR_VAR_2}!\p" @@ -1717,7 +1717,7 @@ MatchCall_BattleDomeText9:: @ 82B102A .string "I'd better try harder, too!$" MatchCall_BattleDomeText10:: @ 82B10A7 - .string "Oh, {PLAYER}{STRING 5}, hello.\n" + .string "Oh, {PLAYER}{KUN}, hello.\n" .string "This is {STR_VAR_1}.\p" .string "You won {STR_VAR_3} straight times at\n" .string "the {STR_VAR_2}?\p" @@ -1725,7 +1725,7 @@ MatchCall_BattleDomeText10:: @ 82B10A7 .string "I need to work harder.$" MatchCall_BattleDomeText11:: @ 82B1121 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I hear you're the terror of\n" .string "the {STR_VAR_2}?\p" @@ -1737,7 +1737,7 @@ MatchCall_BattleDomeText11:: @ 82B1121 .string "Well, see you!$" MatchCall_BattleDomeText12:: @ 82B11D3 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you keeping well?\p" .string "You've won {STR_VAR_3} events at a place\n" @@ -1746,7 +1746,7 @@ MatchCall_BattleDomeText12:: @ 82B11D3 .string "See you!$" MatchCall_BattleDomeText13:: @ 82B124D - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "I hope you've been keeping well.\p" .string "They say you won {STR_VAR_3} events\n" @@ -1755,7 +1755,7 @@ MatchCall_BattleDomeText13:: @ 82B124D .string "Bye now.$" MatchCall_BattleDomeText14:: @ 82B12D0 - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "I heard about you!\p" .string "Didn't you win {STR_VAR_3} titles\n" @@ -1790,7 +1790,7 @@ MatchCall_BattlePikeText3:: @ 82B142B .string "Catch you soon!$" MatchCall_BattlePikeText4:: @ 82B14B4 - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "I heard you blew through {STR_VAR_3} rooms\n" .string "at the {STR_VAR_2}.\p" @@ -1798,7 +1798,7 @@ MatchCall_BattlePikeText4:: @ 82B14B4 .string "try to keep up!$" MatchCall_BattlePikeText5:: @ 82B1525 - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "I heard you got past {STR_VAR_3} rooms\n" .string "at the {STR_VAR_2}.\p" @@ -1806,7 +1806,7 @@ MatchCall_BattlePikeText5:: @ 82B1525 .string "See you soon!$" MatchCall_BattlePikeText6:: @ 82B158E - .string "Hey, {PLAYER}{STRING 5}?\n" + .string "Hey, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here. How are you?\p" .string "By the way, I heard you got through\n" .string "{STR_VAR_3} rooms at the {STR_VAR_2}.\p" @@ -1814,7 +1814,7 @@ MatchCall_BattlePikeText6:: @ 82B158E .string "you pull further ahead.$" MatchCall_BattlePikeText7:: @ 82B1622 - .string "{PLAYER}{STRING 5}?\n" + .string "{PLAYER}{KUN}?\n" .string "{STR_VAR_1} here.\p" .string "You were at the {STR_VAR_2}\n" .string "and won your way past {STR_VAR_3} rooms?\p" @@ -1823,7 +1823,7 @@ MatchCall_BattlePikeText7:: @ 82B1622 .string "Okay, bye.$" MatchCall_BattlePikeText8:: @ 82B169D - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\l" .string "I hope you're doing well.\l" .string "Oh, but, you are.\p" @@ -1834,7 +1834,7 @@ MatchCall_BattlePikeText8:: @ 82B169D .string "See you again.$" MatchCall_BattlePikeText9:: @ 82B1775 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "I heard! You won your way through\n" .string "{STR_VAR_3} rooms at the {STR_VAR_2}!\p" @@ -1842,7 +1842,7 @@ MatchCall_BattlePikeText9:: @ 82B1775 .string "I'd better try harder, too!$" MatchCall_BattlePikeText10:: @ 82B17F8 - .string "Oh, {PLAYER}{STRING 5}, hello.\n" + .string "Oh, {PLAYER}{KUN}, hello.\n" .string "This is {STR_VAR_1}.\p" .string "You won your way past {STR_VAR_3} rooms\n" .string "at the {STR_VAR_2}?\p" @@ -1850,7 +1850,7 @@ MatchCall_BattlePikeText10:: @ 82B17F8 .string "I need to work harder.$" MatchCall_BattlePikeText11:: @ 82B1877 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I hear you're the terror of\n" .string "the {STR_VAR_2}?\p" @@ -1862,7 +1862,7 @@ MatchCall_BattlePikeText11:: @ 82B1877 .string "Well, see you!$" MatchCall_BattlePikeText12:: @ 82B1946 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you keeping well?\p" .string "You've won through {STR_VAR_3} rooms at\n" @@ -1871,7 +1871,7 @@ MatchCall_BattlePikeText12:: @ 82B1946 .string "See you!$" MatchCall_BattlePikeText13:: @ 82B19C7 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "I hope you've been keeping well.\p" .string "They say you won in {STR_VAR_3} rooms\n" @@ -1880,7 +1880,7 @@ MatchCall_BattlePikeText13:: @ 82B19C7 .string "Bye now.$" MatchCall_BattlePikeText14:: @ 82B1A4C - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "I heard about you!\p" .string "Didn't you get through {STR_VAR_3} rooms\n" @@ -1915,7 +1915,7 @@ MatchCall_BattlePyramidText3:: @ 82B1BE4 .string "Catch you soon!$" MatchCall_BattlePyramidText4:: @ 82B1C6A - .string "Hey, {PLAYER}{STRING 5}.\n" + .string "Hey, {PLAYER}{KUN}.\n" .string "{STR_VAR_1} here.\p" .string "I heard you scaled {STR_VAR_3} floors\n" .string "in the {STR_VAR_2}.\p" @@ -1923,7 +1923,7 @@ MatchCall_BattlePyramidText4:: @ 82B1C6A .string "to keep up!$" MatchCall_BattlePyramidText5:: @ 82B1CCF - .string "Hiya, {PLAYER}{STRING 5}!\n" + .string "Hiya, {PLAYER}{KUN}!\n" .string "It's {STR_VAR_1}.\p" .string "I heard you climbed {STR_VAR_3} floors\n" .string "in the {STR_VAR_2}.\p" @@ -1931,7 +1931,7 @@ MatchCall_BattlePyramidText5:: @ 82B1CCF .string "See you soon!$" MatchCall_BattlePyramidText6:: @ 82B1D38 - .string "Hey, {PLAYER}{STRING 5}?\n" + .string "Hey, {PLAYER}{KUN}?\n" .string "{STR_VAR_1} here. How are you?\p" .string "By the way, I heard you got through\n" .string "{STR_VAR_3} floors in the {STR_VAR_2}.\p" @@ -1939,7 +1939,7 @@ MatchCall_BattlePyramidText6:: @ 82B1D38 .string "you pull further ahead.$" MatchCall_BattlePyramidText7:: @ 82B1DCD - .string "{PLAYER}{STRING 5}?\n" + .string "{PLAYER}{KUN}?\n" .string "{STR_VAR_1} here.\p" .string "You were at the {STR_VAR_2}\n" .string "and won your way up {STR_VAR_3} floors?\p" @@ -1949,7 +1949,7 @@ MatchCall_BattlePyramidText7:: @ 82B1DCD .string "Okay, bye.$" MatchCall_BattlePyramidText8:: @ 82B1E4B - .string "Oh, {PLAYER}{STRING 5}, how do you do?\n" + .string "Oh, {PLAYER}{KUN}, how do you do?\n" .string "This is {STR_VAR_1} speaking.\l" .string "I hope you're doing well.\l" .string "Oh, but, you are.\p" @@ -1960,7 +1960,7 @@ MatchCall_BattlePyramidText8:: @ 82B1E4B .string "See you again.$" MatchCall_BattlePyramidText9:: @ 82B1F24 - .string "Oh, {PLAYER}{STRING 5}, hi there!\n" + .string "Oh, {PLAYER}{KUN}, hi there!\n" .string "This is {STR_VAR_1}!\p" .string "I heard! You won your way through\n" .string "{STR_VAR_3} floors in the {STR_VAR_2}!\p" @@ -1968,7 +1968,7 @@ MatchCall_BattlePyramidText9:: @ 82B1F24 .string "I'd better try harder, too!$" MatchCall_BattlePyramidText10:: @ 82B1FA8 - .string "Oh, {PLAYER}{STRING 5}, hello.\n" + .string "Oh, {PLAYER}{KUN}, hello.\n" .string "This is {STR_VAR_1}.\p" .string "You climbed {STR_VAR_3} floors inside\n" .string "the {STR_VAR_2}?\p" @@ -1976,7 +1976,7 @@ MatchCall_BattlePyramidText10:: @ 82B1FA8 .string "I need to work harder.$" MatchCall_BattlePyramidText11:: @ 82B2022 - .string "Ah, {PLAYER}{STRING 5}.\n" + .string "Ah, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\p" .string "I hear you're the terror of\n" .string "the {STR_VAR_2}?\p" @@ -1988,7 +1988,7 @@ MatchCall_BattlePyramidText11:: @ 82B2022 .string "Well, see you!$" MatchCall_BattlePyramidText12:: @ 82B20F3 - .string "Hello, {PLAYER}{STRING 5}.\n" + .string "Hello, {PLAYER}{KUN}.\n" .string "It's me, {STR_VAR_1}.\l" .string "Are you keeping well?\p" .string "You've won through {STR_VAR_3} floors in\n" @@ -1997,7 +1997,7 @@ MatchCall_BattlePyramidText12:: @ 82B20F3 .string "See you!$" MatchCall_BattlePyramidText13:: @ 82B2175 - .string "Ah, hello, {PLAYER}{STRING 5}!\n" + .string "Ah, hello, {PLAYER}{KUN}!\n" .string "This is {STR_VAR_1}!\l" .string "I hope you've been keeping well.\p" .string "They say you climbed {STR_VAR_3} floors\n" @@ -2006,7 +2006,7 @@ MatchCall_BattlePyramidText13:: @ 82B2175 .string "Bye now.$" MatchCall_BattlePyramidText14:: @ 82B21FC - .string "Oh, hi, {PLAYER}{STRING 5}.\n" + .string "Oh, hi, {PLAYER}{KUN}.\n" .string "This is {STR_VAR_1}.\l" .string "I heard about you!\p" .string "Didn't you get through {STR_VAR_3} floors\n" @@ -2068,7 +2068,7 @@ gText_Roxanne_Pokenav_2B2607:: @ 82B2607 .string "is a matter of pride.$" gText_Brawly_Pokenav_2B2659:: @ 82B2659 - .string "BRAWLY: Hey, there, {PLAYER}{STRING 5}!\p" + .string "BRAWLY: Hey, there, {PLAYER}{KUN}!\p" .string "I learned a lot from the battle we\n" .string "had together.\p" .string "I intend to do my training over,\n" @@ -2079,7 +2079,7 @@ gText_Brawly_Pokenav_2B2659:: @ 82B2659 .string "I want you to challenge us again.$" gText_Brawly_Pokenav_2B275D:: @ 82B275D - .string "BRAWLY: Hey, {PLAYER}{STRING 5}!\n" + .string "BRAWLY: Hey, {PLAYER}{KUN}!\n" .string "Congratulations!\p" .string "Word about your exploits arrived\n" .string "on tidal winds!\p" @@ -2091,13 +2091,13 @@ gText_Brawly_Pokenav_2B275D:: @ 82B275D .string "I want you to challenge us again.$" gText_Brawly_Pokenav_2B286F:: @ 82B286F - .string "BRAWLY: Hey, {PLAYER}{STRING 5}!\n" + .string "BRAWLY: Hey, {PLAYER}{KUN}!\n" .string "My GYM's ready for action!\p" .string "Come back to DEWFORD anytime\n" .string "for another challenge!$" gText_Brawly_Pokenav_2B28D1:: @ 82B28D1 - .string "BRAWLY: {PLAYER}{STRING 5}, I don't think\n" + .string "BRAWLY: {PLAYER}{KUN}, I don't think\n" .string "I'll ever get bored of battling you!$" gText_Wattson_Pokenav_2B2912:: @ 82B2912 @@ -2225,7 +2225,7 @@ gText_TateLiza_Pokenav_2B31CD:: @ 82B31CD gText_Juan_Pokenav_2B3249:: @ 82B3249 .string "JUAN: Hmm…\n" - .string "{PLAYER}{STRING 5}… Was it?\p" + .string "{PLAYER}{KUN}… Was it?\p" .string "Our battle together--it brought\n" .string "to me memories of when I first\l" .string "encountered WALLACE.\p" @@ -2233,7 +2233,7 @@ gText_Juan_Pokenav_2B3249:: @ 82B3249 .string "yet surpass WALLACE!$" gText_Juan_Pokenav_2B32EC:: @ 82B32EC - .string "JUAN: Fufu… {PLAYER}{STRING 5}…\n" + .string "JUAN: Fufu… {PLAYER}{KUN}…\n" .string "You've finally achieved your goal.\p" .string "My eye for appraising talent wasn't\n" .string "mistaken…\p" @@ -2242,14 +2242,14 @@ gText_Juan_Pokenav_2B32EC:: @ 82B32EC .string "of power and prestige.$" gText_Juan_Pokenav_2B33AA:: @ 82B33AA - .string "JUAN: Hoho… {PLAYER}{STRING 5}…\p" + .string "JUAN: Hoho… {PLAYER}{KUN}…\p" .string "Our SOOTOPOLIS GYM has finally\n" .string "reopened.\p" .string "If you wish to see me, you are\n" .string "welcome to visit anytime.$" gText_Juan_Pokenav_2B341E:: @ 82B341E - .string "JUAN: {PLAYER}{STRING 5}…\p" + .string "JUAN: {PLAYER}{KUN}…\p" .string "Like the finest music, the battles\n" .string "we wage together strike chords\l" .string "of inspiration in my heart…\p" @@ -2293,7 +2293,7 @@ gText_Drake_Pokenav_2B368B:: @ 82B368B .string "Don't you agree, {PLAYER}?$" gText_Wallace_Pokenav_2B3790:: @ 82B3790 - .string "WALLACE: Hello, {PLAYER}{STRING 5}.\n" + .string "WALLACE: Hello, {PLAYER}{KUN}.\n" .string "Have you met STEVEN?\p" .string "He is…\n" .string "Actually incredibly skilled.\p" @@ -2336,14 +2336,14 @@ MossdeepCity_SpaceCenter_2F_Text_2B39C6: @ 82B39C6 .string "… … … … … Click!$" gText_May_Pokenav_2B3AB3:: @ 2B3AB3 - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "MR. BRINEY retired as a SAILOR,\n" .string "but I still see him out on the sea\l" .string "with his pet PEEKO sometimes.\p" .string "He must love the sea still.$" gText_May_Pokenav_2B3B3F:: @ 2B3B3F - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "You know how little towns like\n" .string "PETALBURG and DEWFORD have GYMS?\p" .string "For some reason, the big port of\n" @@ -2352,7 +2352,7 @@ gText_May_Pokenav_2B3B3F:: @ 2B3B3F .string "I should apply to be the LEADER.$" gText_May_Pokenav_2B3C13:: @ 2B3C13 - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "Do you remember a man named\n" .string "the CUTTER in RUSTBORO?\l" .string "He had a house there, remember?\p" @@ -2364,13 +2364,13 @@ gText_May_Pokenav_2B3C13:: @ 2B3C13 .string "The ROCK SMASH GUY!$" gText_May_Pokenav_2B3CF3:: @ 2B3CF3 - .string "MAY: {PLAYER}{STRING 5}?\p" + .string "MAY: {PLAYER}{KUN}?\p" .string "RUSTURF TUNNEL…\n" .string "They named it that because it\l" .string "joins RUSTBORO and VERDANTURF.$" gText_May_Pokenav_2B3D4B:: @ 2B3D4B - .string "MAY: {PLAYER}{STRING 5}, how are you?\p" + .string "MAY: {PLAYER}{KUN}, how are you?\p" .string "I'm out on ROUTE 111 now.\p" .string "I'm going to get a rest at an old\n" .string "lady's house.\p" @@ -2378,7 +2378,7 @@ gText_May_Pokenav_2B3D4B:: @ 2B3D4B .string "the desert.$" gText_May_Pokenav_2B3DD1:: @ 2B3DD1 - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "Did you know about the MIRAGE\n" .string "TOWER in the desert?\p" .string "They say, like a mirage, it seems\n" @@ -2386,21 +2386,21 @@ gText_May_Pokenav_2B3DD1:: @ 2B3DD1 .string "I wish I could see it.$" gText_May_Pokenav_2B3E69:: @ 2B3E69 - .string "MAY: {PLAYER}{STRING 5}, yahoo!\n" + .string "MAY: {PLAYER}{KUN}, yahoo!\n" .string "I'm on ROUTE 119 now.\p" .string "There's a big river here, and\n" .string "it often rains.\p" .string "I got soaked!$" gText_May_Pokenav_2B3ECD:: @ 2B3ECD - .string "MAY: {PLAYER}{STRING 5}, hi.\p" + .string "MAY: {PLAYER}{KUN}, hi.\p" .string "MT. PYRE is a memorial to POKéMON\n" .string "whose lives have ended.\p" .string "Maybe as a result, it's infested\n" .string "with many GHOST-type POKéMON!$" gText_May_Pokenav_2B3F2B:: @ 2B3F2B - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "I was thinking of going to the hot\n" .string "spring in LAVARIDGE.\p" .string "But on the way, around JAGGED\n" @@ -2408,14 +2408,14 @@ gText_May_Pokenav_2B3F2B:: @ 2B3F2B .string "characters. The mood was ugly!$" gText_May_Pokenav_2B3FFB:: @ 2B3FFB - .string "MAY: Hi, {PLAYER}{STRING 5}!\n" + .string "MAY: Hi, {PLAYER}{KUN}!\n" .string "Did you see the news?\p" .string "They say CAPT. STERN discovered\n" .string "the SEAFLOOR CAVERN while on his\l" .string "submarine expedition.$" gText_May_Pokenav_2B402B:: @ 2B402B - .string "MAY: Hi, {PLAYER}{STRING 5}!\n" + .string "MAY: Hi, {PLAYER}{KUN}!\n" .string "Don't you think it's neat?\p" .string "Even if you don't have a boat,\n" .string "you can cross the sea using\l" @@ -2425,7 +2425,7 @@ gText_May_Pokenav_2B402B:: @ 2B402B .string "you go to the bottom of the sea.$" gText_May_Pokenav_2B414B:: @ 2B414B - .string "MAY: Hi, {PLAYER}{STRING 5}!\n" + .string "MAY: Hi, {PLAYER}{KUN}!\n" .string "Hope things are okay!\p" .string "Have you been on the sea and\n" .string "found your way to the other side\l" @@ -2436,7 +2436,7 @@ gText_May_Pokenav_2B414B:: @ 2B414B .string "come up to the surface. Easy!$" gText_May_Pokenav_2B4228:: @ 2B4228 - .string "MAY: Hi, {PLAYER}{STRING 5}!\p" + .string "MAY: Hi, {PLAYER}{KUN}!\p" .string "How's it going?\n" .string "Are you filling your POKéDEX?\p" .string "I heard a rumor that there are\n" @@ -2445,7 +2445,7 @@ gText_May_Pokenav_2B4228:: @ 2B4228 .string "I would love to see even one…$" gText_May_Pokenav_2B42E0:: @ 2B42E0 - .string "MAY: {PLAYER}{STRING 5}!\n" + .string "MAY: {PLAYER}{KUN}!\n" .string "I heard the rumors!\p" .string "You beat the SOOTOPOLIS GYM\n" .string "LEADER?\p" @@ -2455,9 +2455,9 @@ gText_May_Pokenav_2B42E0:: @ 2B42E0 gText_May_Pokenav_2B4350:: @ 2B4350 .string "MAY: There isn't a single TRAINER\n" .string "left in HOENN who doesn't know who\l" - .string "you are, {PLAYER}{STRING 5}!\p" + .string "you are, {PLAYER}{KUN}!\p" .string "When I tell people that I'm friends\n" - .string "with you, {PLAYER}{STRING 5}, they're all\l" + .string "with you, {PLAYER}{KUN}, they're all\l" .string "surprised!$" gText_Brendan_Pokenav_2B43EF:: @ 2B43EF @@ -2641,7 +2641,7 @@ gText_Wally_Pokenav_2B5100:: @ 2B5100 .string "Thank you…$" gText_Scott_Pokenav_2B5184:: @ 2B5184 - .string "SCOTT: Howdy, {PLAYER}{STRING 5}!\p" + .string "SCOTT: Howdy, {PLAYER}{KUN}!\p" .string "You know how POKéMON can be found\n" .string "everywhere?\p" .string "Like in the mountains, in the sea,\n" @@ -2660,7 +2660,7 @@ gText_Scott_Pokenav_2B5275:: @ 2B5275 .string "makes me all ticklish!$" gText_Scott_Pokenav_2B5323:: @ 2B5323 - .string "SCOTT: Hi, hi, {PLAYER}{STRING 5}!\p" + .string "SCOTT: Hi, hi, {PLAYER}{KUN}!\p" .string "Have you had the chance to climb\n" .string "MT. PYRE?\p" .string "The place is a memorial to POKéMON\n" @@ -2669,7 +2669,7 @@ gText_Scott_Pokenav_2B5323:: @ 2B5323 .string "should climb to the top of once.$" gText_Scott_Pokenav_2B53DB:: @ 2B53DB - .string "SCOTT: Hi, {PLAYER}{STRING 5}!\p" + .string "SCOTT: Hi, {PLAYER}{KUN}!\p" .string "I've been hearing about these odd\n" .string "gangs being a nuisance.\p" .string "TEAM MAGMA and TEAM AQUA,\n" @@ -2679,7 +2679,7 @@ gText_Scott_Pokenav_2B53DB:: @ 2B53DB .string "…But if they're thugs…$" gText_Scott_Pokenav_2B54A5:: @ 2B54A5 - .string "SCOTT: Oh, hi, {PLAYER}{STRING 5}.\p" + .string "SCOTT: Oh, hi, {PLAYER}{KUN}.\p" .string "Might there be tough TRAINERS\n" .string "at the bottom of the sea?\p" .string "I can't go check for myself.\n" @@ -2687,7 +2687,7 @@ gText_Scott_Pokenav_2B54A5:: @ 2B54A5 .string "And I don't raise POKéMON…$" gText_Scott_Pokenav_2B5541:: @ 2B5541 - .string "SCOTT: Hi, hi, {PLAYER}{STRING 5}!\p" + .string "SCOTT: Hi, hi, {PLAYER}{KUN}!\p" .string "You know that you can challenge\n" .string "the POKéMON LEAGUE when you've\l" .string "collected all the GYM BADGES?\p" @@ -2774,7 +2774,7 @@ gText_Norman_Pokenav_2B5B5E:: @ 82B5B5E .string "How much higher will you soar?$" gText_Steven_Pokenav_2B5B95:: @ 82B5B95 - .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p" + .string "STEVEN: Hi, {PLAYER}{KUN}!\p" .string "Have you been to MAUVILLE\n" .string "already?\p" .string "You should visit the BIKE SHOP\n" @@ -2785,14 +2785,14 @@ gText_Steven_Pokenav_2B5B95:: @ 82B5B95 .string "there.$" gText_Steven_Pokenav_2B5C53:: @ 82B5C53 - .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p" + .string "STEVEN: Hi, {PLAYER}{KUN}!\p" .string "I've met a lot of different\n" .string "TRAINERS so far.\p" .string "But you're one of a kind.\n" .string "You're not like anyone else.$" gText_Steven_Pokenav_2B5CC9:: @ 82B5CC9 - .string "STEVEN: Hi, {PLAYER}{STRING 5}!\p" + .string "STEVEN: Hi, {PLAYER}{KUN}!\p" .string "When you're on an adventure with\n" .string "your POKéMON, what do you think?\p" .string "Do you consider them to be strong\n" @@ -2804,7 +2804,7 @@ gText_Steven_Pokenav_2B5CC9:: @ 82B5CC9 gText_Steven_Pokenav_2B5DB4:: @ 82B5DB4 .string "STEVEN: Hello?\n" - .string "{PLAYER}{STRING 5}?\p" + .string "{PLAYER}{KUN}?\p" .string "I'm involved in a spot of trouble\n" .string "at the SPACE CENTER.\p" .string "I'm sorry, but I can't talk now.\n" @@ -2812,7 +2812,7 @@ gText_Steven_Pokenav_2B5DB4:: @ 82B5DB4 gText_Steven_Pokenav_2B5E26:: @ 82B5E26 .string "STEVEN: Oh!\n" - .string "{PLAYER}{STRING 5}!\p" + .string "{PLAYER}{KUN}!\p" .string "There's no need to talk.\n" .string "It's past time for talking.\p" .string "You have to believe in yourself\n" @@ -2824,7 +2824,7 @@ gText_Steven_Pokenav_2B5EA2:: @ 82B5EA2 .string "the call…$" gText_Steven_Pokenav_2B5ED9:: @ 82B5ED9 - .string "STEVEN: {PLAYER}{STRING 5}… Congratulations\n" + .string "STEVEN: {PLAYER}{KUN}… Congratulations\n" .string "for entering the HALL OF FAME.\p" .string "… … … … … …\n" .string "… … … … … …\p" @@ -2851,7 +2851,7 @@ Route101_Text_2B603A: @ 82B603A .string "POKéMON becomes more fun, eh?$" gText_MrStone_Pokenav_2B60C0:: @ 82B60C0 - .string "MR. STONE: Oh? {PLAYER}{STRING 5}!\p" + .string "MR. STONE: Oh? {PLAYER}{KUN}!\p" .string "Since you called me, the POKéNAV\n" .string "must be working properly!\p" .string "Other people will be registered,\n" @@ -2866,7 +2866,7 @@ gText_MrStone_Pokenav_2B60C0:: @ 82B60C0 .string "See you again!$" gText_MrStone_Pokenav_2B61E6:: @ 82B61E6 - .string "MR. STONE: Oh? {PLAYER}{STRING 5}!\p" + .string "MR. STONE: Oh? {PLAYER}{KUN}!\p" .string "What's wrong? Have you forgotten\n" .string "about that little errand of mine?\p" .string "I need you to deliver my letter\n" @@ -2878,7 +2878,7 @@ gText_MrStone_Pokenav_2B61E6:: @ 82B61E6 .string "I have to go! Bye-bye!$" gText_MrStone_Pokenav_2B6302:: @ 82B6302 - .string "MR. STONE: Oh! {PLAYER}{STRING 5}!\p" + .string "MR. STONE: Oh! {PLAYER}{KUN}!\p" .string "Ah, so you've met STEVEN!\n" .string "I'd better reward you, then!\p" .string "When you visit RUSTBORO again,\n" @@ -2886,7 +2886,7 @@ gText_MrStone_Pokenav_2B6302:: @ 82B6302 .string "I'll be waiting for you!$" gText_MrStone_Pokenav_2B63A0:: @ 82B63A0 - .string "MR. STONE: Oh! {PLAYER}{STRING 5}!\p" + .string "MR. STONE: Oh! {PLAYER}{KUN}!\p" .string "Did you know that DEVON was\n" .string "digging the RUSTURF TUNNEL?\p" .string "But we shut down the operation to\n" @@ -2897,7 +2897,7 @@ gText_MrStone_Pokenav_2B63A0:: @ 82B63A0 .string "own convenience.$" gText_MrStone_Pokenav_2B64A2:: @ 82B64A2 - .string "MR. STONE: Hello, hello, {PLAYER}{STRING 5}!\p" + .string "MR. STONE: Hello, hello, {PLAYER}{KUN}!\p" .string "I heard from someone in PETALBURG\n" .string "that you're NORMAN's child!\p" .string "No wonder you're such a capable\n" @@ -2935,7 +2935,7 @@ gText_MrStone_Pokenav_2B66B1:: @ 82B66B1 .string "BZZZZ…$" gText_MrStone_Pokenav_2B6703:: @ 82B6703 - .string "MR. STONE: {PLAYER}{STRING 5}! It's me!\p" + .string "MR. STONE: {PLAYER}{KUN}! It's me!\p" .string "You were apparently involved in all\n" .string "sorts of things, but I, being busy,\l" .string "haven't a clue exactly what!\p" @@ -2946,7 +2946,7 @@ gText_MrStone_Pokenav_2B6703:: @ 82B6703 gText_MrStone_Pokenav_2B67ED:: @ 82B67ED .string "MR. STONE: … … … … … …\n" - .string "Is this maybe {PLAYER}{STRING 5}?\p" + .string "Is this maybe {PLAYER}{KUN}?\p" .string "Your voice is so full of confidence,\n" .string "I didn't recognize you right off!\p" .string "Hm! You must come visit us at DEVON\n" -- cgit v1.2.3 From 23979c4d7d6f7b10107f94781add4c9d3b0c7e52 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 04:22:19 -0400 Subject: initial documentation commit --- data/event_scripts.s | 28 +- .../maps/LilycoveCity_PokemonCenter_1F/scripts.inc | 2 +- data/specials.inc | 20 +- include/global.h | 16 +- include/lilycove_lady.h | 2 +- include/strings.h | 25 + src/contest_painting.c | 2 +- src/lilycove_lady.c | 1093 +++++++++++++------- src/scrcmd.c | 2 +- src/strings.c | 42 +- src/tv.c | 4 +- 11 files changed, 779 insertions(+), 457 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index ca8152e75..1952fae93 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -4281,7 +4281,7 @@ GraniteCave_B1F_Movement_2A8369: @ 82A8369 step_end LilycoveCity_PokemonCenter_1F_EventScript_2A836B:: @ 82A836B - special sub_818DAEC + special Script_GetLilycoveLadyId switch VAR_RESULT case 0, LilycoveCity_PokemonCenter_1F_EventScript_2A8554 case 1, LilycoveCity_PokemonCenter_1F_EventScript_2A8395 @@ -4307,7 +4307,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A83C6:: @ 82A83C6 end LilycoveCity_PokemonCenter_1F_EventScript_2A83D0:: @ 82A83D0 - special sub_818DC2C + special BufferFavorLadyDescription msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A7D, MSGBOX_DEFAULT specialvar VAR_RESULT, sub_818DC60 compare VAR_RESULT, 0 @@ -4357,7 +4357,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A845E:: @ 82A845E LilycoveCity_PokemonCenter_1F_EventScript_2A846C:: @ 82A846C fadescreen 1 setvar VAR_RESULT, 0 - special sub_818DD78 + special OpenBagMenuForFavorLady waitstate compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A848E @@ -4382,7 +4382,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD end LilycoveCity_PokemonCenter_1F_EventScript_2A84C9:: @ 82A84C9 - special sub_818DC2C + special BufferFavorLadyDescription msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C0F, MSGBOX_DEFAULT release end @@ -4396,13 +4396,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6 end LilycoveCity_PokemonCenter_1F_EventScript_2A84F2:: @ 82A84F2 - special sub_818DC2C + special BufferFavorLadyDescription msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C6F, MSGBOX_DEFAULT release end LilycoveCity_PokemonCenter_1F_EventScript_2A84FF:: @ 82A84FF - special sub_818DC2C + special BufferFavorLadyDescription msgbox LilycoveCity_PokemonCenter_1F_Text_2A8CC8, MSGBOX_DEFAULT goto LilycoveCity_PokemonCenter_1F_EventScript_2A8510 end @@ -4432,7 +4432,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8554:: @ 82A8554 lock faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A8E2B, MSGBOX_DEFAULT - specialvar VAR_RESULT, sub_818E038 + specialvar VAR_RESULT, GetQuizLadyPhase compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8585 compare VAR_RESULT, 1 @@ -4452,7 +4452,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8585:: @ 82A8585 end LilycoveCity_PokemonCenter_1F_EventScript_2A85AC:: @ 82A85AC - specialvar VAR_RESULT, sub_818E2D8 + specialvar VAR_RESULT, IsQuizLadyWaitingForChallenger compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8759 compare VAR_RESULT, 1 @@ -4489,7 +4489,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8612:: @ 82A8612 end LilycoveCity_PokemonCenter_1F_EventScript_2A861C:: @ 82A861C - special sub_818E3BC + special ClearQuizLadyResponse compare VAR_0x8004, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A864C compare VAR_0x8004, EASY_CHAT_TYPE_QUIZ_ANSWER @@ -4528,7 +4528,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A867F:: @ 82A867F end LilycoveCity_PokemonCenter_1F_EventScript_2A8689:: @ 82A8689 - special sub_818E37C + special SetQuizLadyPhase_MakeYourOwn msgbox LilycoveCity_PokemonCenter_1F_Text_2A8F4D, MSGBOX_DEFAULT specialvar VAR_RESULT, sub_818E308 compare VAR_RESULT, 0 @@ -4576,8 +4576,8 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8716:: @ 82A8716 LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724 setvar VAR_0x8005, 0 - special sub_818E358 - special sub_818E37C + special BufferQuizPrizeItem + special SetQuizLadyPhase_MakeYourOwn giveitem_std VAR_0x8005 compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A874C @@ -4586,7 +4586,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724 LilycoveCity_PokemonCenter_1F_EventScript_2A874C:: @ 82A874C msgbox LilycoveCity_PokemonCenter_1F_Text_2A906A, MSGBOX_DEFAULT - special sub_818E39C + special SetQuizLadyPhase_GivePrize release end @@ -4629,7 +4629,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A87AF:: @ 82A87AF LilycoveCity_PokemonCenter_1F_EventScript_2A87CE:: @ 82A87CE msgbox LilycoveCity_PokemonCenter_1F_Text_2A9270, MSGBOX_DEFAULT special sub_818E430 - special sub_818E3BC + special ClearQuizLadyResponse setvar VAR_0x8004, 16 LilycoveCity_PokemonCenter_1F_EventScript_2A87E1:: @ 82A87E1 diff --git a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc index 236eb3d23..c2e1deb5d 100644 --- a/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc +++ b/data/maps/LilycoveCity_PokemonCenter_1F/scripts.inc @@ -9,7 +9,7 @@ LilycoveCity_PokemonCenter_1F_OnTransition: @ 821C5BD end LilycoveCity_PokemonCenter_1F_EventScript_21C5C6:: @ 821C5C6 - special sub_818D9C0 + special SetLilycoveLadyGfx compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_21C5E0 compare VAR_RESULT, 1 diff --git a/data/specials.inc b/data/specials.inc index 78a949df5..bf2d6621e 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -372,30 +372,30 @@ gSpecials:: @ 81DBA64 def_special SetSecretBaseSecretsTvFlags_LargeDecorationSpot def_special SetSecretBaseSecretsTvFlags_SmallDecorationSpot def_special SetSecretBaseSecretsTvFlags_Poster - def_special sub_818D9C0 - def_special sub_818DAEC + def_special SetLilycoveLadyGfx + def_special Script_GetLilycoveLadyId def_special sub_818DBE8 - def_special sub_818DC2C + def_special BufferFavorLadyDescription def_special sub_818DC60 def_special sub_818DCC8 def_special sub_818DD14 def_special sub_818DD54 - def_special sub_818DD78 + def_special OpenBagMenuForFavorLady def_special sub_818DE44 def_special sub_818DE5C def_special sub_818DEA0 def_special sub_818DEDC - def_special sub_818E038 + def_special GetQuizLadyPhase def_special sub_818E06C - def_special sub_818E2D8 + def_special IsQuizLadyWaitingForChallenger def_special sub_811A858 def_special sub_818E2FC def_special sub_818E308 - def_special sub_818E358 - def_special sub_818E37C + def_special BufferQuizPrizeItem + def_special SetQuizLadyPhase_MakeYourOwn def_special sub_818E298 - def_special sub_818E39C - def_special sub_818E3BC + def_special SetQuizLadyPhase_GivePrize + def_special ClearQuizLadyResponse def_special sub_818E3E0 def_special sub_818E430 def_special sub_818E47C diff --git a/include/global.h b/include/global.h index 14377d8bb..db80d81a0 100644 --- a/include/global.h +++ b/include/global.h @@ -748,26 +748,26 @@ struct LilycoveLadyQuiz { /*0x000*/ u8 id; /*0x001*/ u8 phase; - /*0x002*/ u16 unk_002[9]; - /*0x014*/ u16 unk_014; - /*0x016*/ u16 unk_016; + /*0x002*/ u16 question[9]; + /*0x014*/ u16 answer; + /*0x016*/ u16 response; /*0x018*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x020*/ u16 playerTrainerId[4]; /*0x028*/ u16 itemId; - /*0x02a*/ u8 unk_02a; - /*0x02b*/ u8 unk_02b; - /*0x02c*/ u8 unk_02c; + /*0x02a*/ bool8 waitingForChallenger; + /*0x02b*/ u8 questionId; + /*0x02c*/ u8 prevQuestionId; /*0x02d*/ u8 language; }; -struct LilycoveLadyFavour +struct LilycoveLadyFavor { /*0x000*/ u8 id; /*0x001*/ u8 phase; /*0x002*/ u8 unk_002; /*0x003*/ u8 unk_003; /*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; - /*0x00c*/ u8 unk_00c; + /*0x00c*/ u8 favorId; /*0x00e*/ u16 itemId; /*0x010*/ u16 unk_010; /*0x012*/ u8 language; diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h index f26285d68..09a1b0c18 100644 --- a/include/lilycove_lady.h +++ b/include/lilycove_lady.h @@ -11,7 +11,7 @@ bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock); void sub_818E7E0(u8 *dest1, u8 *dest2); void sub_818E81C(u8 *dest); void sub_818E848(u8 *dest); -void sub_818E868(u8 *dest, u8 category); +void BufferContestName(u8 *dest, u8 category); u8 sub_818E880(void); #endif //GUARD_LILYCOVE_LADY_H diff --git a/include/strings.h b/include/strings.h index 7e7fcd322..d6a239559 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2744,6 +2744,31 @@ extern const u8 gText_JumpsInARow[]; extern const u8 gText_BestScore2[]; extern const u8 gText_ExcellentsInARow[]; +// Lilycove Lady +extern const u8 gText_Handsome[]; +extern const u8 gText_Vinny[]; +extern const u8 gText_Moreme[]; +extern const u8 gText_Ironhard[]; +extern const u8 gText_Muscle[]; +extern const u8 gText_Coolness[]; +extern const u8 gText_Beauty[]; +extern const u8 gText_Cuteness[]; +extern const u8 gText_Smartness[]; +extern const u8 gText_Toughness[]; +extern const u8 gText_Lady2[]; +extern const u8 gText_Slippery[]; +extern const u8 gText_Roundish[]; +extern const u8 gText_Whamish[]; +extern const u8 gText_Shiny[]; +extern const u8 gText_Sticky[]; +extern const u8 gText_Pointy[]; + +extern const u8 gText_CoolnessContest[]; +extern const u8 gText_BeautyContest[]; +extern const u8 gText_CutenessContest[]; +extern const u8 gText_SmartnessContest[]; +extern const u8 gText_ToughnessContest[]; + // Pokenav Match Call extern const u8 gText_CallCantBeMadeHere[]; extern const u8 gText_NumberRegistered[]; diff --git a/src/contest_painting.c b/src/contest_painting.c index 66127cbbc..1b95e1ed9 100644 --- a/src/contest_painting.c +++ b/src/contest_painting.c @@ -292,7 +292,7 @@ static void PrintContestPaintingCaption(u8 contestType, u8 arg1) category = gUnknown_030061C0->contestCategory; if (contestType < 8) { - sub_818E868(gStringVar1, category); + BufferContestName(gStringVar1, category); StringAppend(gStringVar1, gText_Space); StringAppend(gStringVar1, gContestRankTextPointers[gUnknown_030061C0->contestRank]); StringCopy(gStringVar2, gUnknown_030061C0->trainerName); diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index dc38d8848..b4557f1c0 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -1,7 +1,3 @@ -// -// Created by Scott Norton on 9/19/17. -// - #include "global.h" #include "main.h" #include "overworld.h" @@ -18,215 +14,511 @@ #include "text.h" #include "easy_chat.h" #include "lilycove_lady.h" +#include "contest.h" +#include "berry.h" +#include "strings.h" +#include "constants/easy_chat.h" +#include "constants/event_objects.h" +#include "constants/items.h" + +enum +{ + QUIZ_AUTHOR_LADY, + QUIZ_AUTHOR_PLAYER, + QUIZ_AUTHOR_OTHER_PLAYER +}; + +enum +{ + QUIZ_PHASE_ATTEMPT_QUIZ, + QUIZ_PHASE_MAKE_YOUR_OWN, + QUIZ_PHASE_GIVE_PRIZE +}; + + +//TODO name phases -static void SetLilycoveQuizLady(void); -static void SetLilycoveFavourLady(void); -static void SetLilycoveContestLady(void); +static void InitLilycoveQuizLady(void); +static void InitLilycoveFavourLady(void); +static void InitLilycoveContestLady(void); static void sub_818E004(void); static void sub_818DBC4(void); static void sub_818E674(void); -static u8 sub_818E13C(void); -static bool8 sub_818E1F4(void); -static u8 sub_818E258(const u8 *); +static u8 BufferAuthorName(void); +static bool8 IsQuizTrainerIdNotPlayer(void); +static u8 GetPlayerNameLength(const u8 *); -extern const u8 gText_Lady2[]; - -static const u16 sUnknown_0860B074[] = { - 0x62, 0xcb, 0xdc, 0xcc, 0xd1 +static const u16 sContestLadyMonGfxId[] = +{ + EVENT_OBJ_GFX_ZIGZAGOON_1, + EVENT_OBJ_GFX_SKITTY, + EVENT_OBJ_GFX_POOCHYENA, + EVENT_OBJ_GFX_KECLEON_1, + EVENT_OBJ_GFX_PIKACHU }; -static const u16 sUnknown_0860B07E[] = { - 0x1a, 0x14, 0x0a + +static const u16 sLilycoveLadyGfxId[] = +{ + EVENT_OBJ_GFX_WOMAN_4, + EVENT_OBJ_GFX_WOMAN_2, + EVENT_OBJ_GFX_GIRL_2 }; -static const u16 Unknown_0860B084[] = { - 0x101b, 0x1623, 0x1812, 0x102c, 0x020e, 0x0c03, 0x1a0b, 0x0210, 0x020d +// Quiz Lady data +static const u16 sQuizLadyQuestion1[] = +{ + EC_WORD_WHICH, + EC_WORD_STORES, + EC_WORD_INFORMATION, + EC_WORD_ON, + EC_WORD_POKEMON, + EC_WORD_QUES, + EC_WORD_CAMERA, + EC_WORD_POKEDEX, + EC_WORD_POKENAV }; -static const u16 Unknown_0860B096[] = { - 0x101b, 0x1013, 0x1020, 0x1a0f, 0x020c, 0x0c03, 0x0211, 0x0203, 0x0400 +static const u16 sQuizLadyQuestion2[] = +{ + EC_WORD_WHICH, + EC_WORD_ISN_T, + EC_WORD_A, + EC_WORD_GAME, + EC_WORD_VERSION, + EC_WORD_QUES, + EC_WORD_RUBY, + EC_WORD_SAPPHIRE, + EC_WORD_DARK }; -static const u16 Unknown_0860B0A8[] = { - 0x0e0f, 0x1018, 0x020e, 0x0204, 0x0c03, 0xffff, 0x0212, 0x0451, 0x0463 +static const u16 sQuizLadyQuestion3[] = +{ + EC_WORD_HOW, + EC_WORD_DO, + EC_WORD_POKEMON, + EC_WORD_EVOLVE, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_LEVEL, + EC_WORD_INSOMNIA, + EC_WORD_CUTE_CHARM }; -static const u16 Unknown_0860B0BA[] = { - 0x101b, 0x100b, 0x0e0d, 0x141a, 0x181d, 0x0c03, 0x141e, 0x1a26, 0x1823 +static const u16 sQuizLadyQuestion4[] = +{ + EC_WORD_WHICH, + EC_WORD_IS, + EC_WORD_THE, + EC_WORD_PRETTY, + EC_WORD_ITEM, + EC_WORD_QUES, + EC_WORD_COLD, + EC_WORD_FLOWERS, + EC_WORD_MACHINE }; -static const u16 Unknown_0860B0CC[] = { - 0x101b, 0x181d, 0x1018, 0x0a02, 0x2014, 0x0c03, 0x0208, 0x1824, 0x181c +static const u16 sQuizLadyQuestion5[] = +{ + EC_WORD_WHICH, + EC_WORD_ITEM, + EC_WORD_DO, + EC_WORD_YOU, + EC_WORD_BREAK, + EC_WORD_QUES, + EC_WORD_EGG, + EC_WORD_MAIL, + EC_WORD_PHONE }; -static const u16 Unknown_0860B0DE[] = { - 0x101b, 0x1000, 0x1c19, 0x265d, 0x0c03, 0xffff, 0x0447, 0x045d, 0x042c +static const u16 sQuizLadyQuestion6[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_WORD_STOP, + EC_MOVE2(CONFUSION), + EC_WORD_QUES, + 0xFFFF, + EC_WORD_ILLUMINATE, + EC_WORD_OWN_TEMPO, + EC_WORD_SWIFT_SWIM }; -static const u16 Unknown_0860B0F0[] = { - 0x101b, 0x1034, 0x1e11, 0x100b, 0x1a08, 0x0c03, 0x044b, 0x0446, 0x040a +static const u16 sQuizLadyQuestion7[] = +{ + EC_WORD_WHICH, + EC_WORD_OF, + EC_WORD_THESE, + EC_WORD_IS, + EC_WORD_MUSIC, + EC_WORD_QUES, + EC_WORD_FLYING, + EC_WORD_STEEL, + EC_WORD_ROCK }; -static const u16 Unknown_0860B102[] = { - 0x101b, 0x1000, 0x274f, 0x0626, 0x0c03, 0xffff, 0x0442, 0x0411, 0x0450 +static const u16 sQuizLadyQuestion8[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_MOVE2(BLOCK), + EC_WORD_ESCAPE, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_RUN_AWAY, + EC_WORD_SHADOW_TAG, + EC_WORD_WONDER_GUARD }; -static const u16 Unknown_0860B114[] = { - 0x101b, 0x1000, 0x1c19, 0x043c, 0x0c03, 0xffff, 0x0421, 0x0464, 0x0435 +static const u16 sQuizLadyQuestion9[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_WORD_STOP, + EC_WORD_POISON, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_GUTS, + EC_WORD_IMMUNITY, + EC_WORD_SHED_SKIN }; -static const u16 Unknown_0860B126[] = { - 0x101b, 0x1203, 0x1030, 0x0207, 0x0c03, 0xffff, 0x0210, 0x020e, 0x020d +static const u16 sQuizLadyQuestion10[] = +{ + EC_WORD_WHICH, + EC_WORD_GOES, + EC_WORD_WITH, + EC_WORD_CENTER, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_POKEDEX, + EC_WORD_POKEMON, + EC_WORD_POKENAV }; -static const u16 Unknown_0860B138[] = { - 0x101b, 0x1623, 0x0a05, 0x020e, 0x0c03, 0xffff, 0x1a25, 0x181a, 0x181b +static const u16 sQuizLadyQuestion11[] = +{ + EC_WORD_WHICH, + EC_WORD_STORES, + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_PC, + EC_WORD_DEPT_STORE, + EC_WORD_TELEVISION }; -static const u16 Unknown_0860B14A[] = { - 0x101b, 0x1823, 0x1603, 0x0a02, 0x1812, 0x0c03, 0x1a15, 0x1a23, 0x181b +static const u16 sQuizLadyQuestion12[] = +{ + EC_WORD_WHICH, + EC_WORD_MACHINE, + EC_WORD_GIVES, + EC_WORD_YOU, + EC_WORD_INFORMATION, + EC_WORD_QUES, + EC_WORD_BIKE, + EC_WORD_LOCOMOTIVE, + EC_WORD_TELEVISION }; -static const u16 Unknown_0860B15C[] = { - 0x1020, 0x020e, 0x1010, 0x1043, 0x1e0f, 0x0c03, 0x181c, 0x1a24, 0x1816 +static const u16 sQuizLadyQuestion13[] = +{ + EC_WORD_A, + EC_WORD_POKEMON, + EC_WORD_WAS, + EC_WORD_ONCE, + EC_WORD_THIS, + EC_WORD_QUES, + EC_WORD_PHONE, + EC_WORD_PLUSH_DOLL, + EC_WORD_LETTER }; -static const u16 Unknown_0860B16E[] = { - 0x0446, 0x100b, 0x0620, 0x061c, 0x101b, 0x0c03, 0x0420, 0x0426, 0xffff +static const u16 sQuizLadyQuestion14[] = +{ + EC_WORD_STEEL, + EC_WORD_IS, + EC_WORD_STRONG, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_ICE, + EC_WORD_GROUND, + 0xFFFF }; -static const u16 Unknown_0860B180[] = { - 0x0400, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x040e, 0x0410, 0xffff +static const u16 sQuizLadyQuestion15[] = +{ + EC_WORD_DARK, + EC_WORD_IS, + EC_WORD_WEAK, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_PSYCHIC, + EC_WORD_FIGHTING, + 0xFFFF }; -static const u16 Unknown_0860B192[] = { - 0x041f, 0x100b, 0x0639, 0x061c, 0x101b, 0x0c03, 0x0445, 0x0400, 0xffff +static const u16 sQuizLadyQuestion16[] = +{ + EC_WORD_GHOST, + EC_WORD_IS, + EC_WORD_WEAK, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_NORMAL, + EC_WORD_DARK, + 0xFFFF }; -static const u16 *const gUnknown_0860B1A4[] = { - Unknown_0860B084, - Unknown_0860B096, - Unknown_0860B0A8, - Unknown_0860B0BA, - Unknown_0860B0CC, - Unknown_0860B0DE, - Unknown_0860B0F0, - Unknown_0860B102, - Unknown_0860B114, - Unknown_0860B126, - Unknown_0860B138, - Unknown_0860B14A, - Unknown_0860B15C, - Unknown_0860B16E, - Unknown_0860B180, - Unknown_0860B192 +static const u16 *const sQuizLadyQuizQuestions[] = +{ + sQuizLadyQuestion1, + sQuizLadyQuestion2, + sQuizLadyQuestion3, + sQuizLadyQuestion4, + sQuizLadyQuestion5, + sQuizLadyQuestion6, + sQuizLadyQuestion7, + sQuizLadyQuestion8, + sQuizLadyQuestion9, + sQuizLadyQuestion10, + sQuizLadyQuestion11, + sQuizLadyQuestion12, + sQuizLadyQuestion13, + sQuizLadyQuestion14, + sQuizLadyQuestion15, + sQuizLadyQuestion16 }; -static const u16 sUnknown_0860B1E4[] = { - 0x0210, 0x0400, 0x0212, 0x1a26, 0x0208, 0x045d, 0x040a, 0x0411, 0x0464, 0x020e, 0x1a25, 0x181b, 0x1a24, 0x0420, 0x0410, 0x0400 +static const u16 sQuizLadyQuizAnswers[] = +{ + EC_WORD_POKEDEX, + EC_WORD_DARK, + EC_WORD_LEVEL, + EC_WORD_FLOWERS, + EC_WORD_EGG, + EC_WORD_OWN_TEMPO, + EC_WORD_ROCK, + EC_WORD_SHADOW_TAG, + EC_WORD_IMMUNITY, + EC_WORD_POKEMON, + EC_WORD_PC, + EC_WORD_TELEVISION, + EC_WORD_PLUSH_DOLL, + EC_WORD_ICE, + EC_WORD_FIGHTING, + EC_WORD_DARK // DARK is accepted as the correct answer despite the fact that it's wrong }; -static const u16 sUnknown_0860B204[] = { - 0x007b, 0x007f, 0x0081, 0x0023, 0x0023, 0x0023, 0x00a5, 0x00a7, 0x00a6, 0x000b, 0x012f, 0x006b, 0x006d, 0x0044, 0x0044, 0x000c +static const u16 sQuizLadyPrizes[] = +{ + ITEM_GLITTER_MAIL, + ITEM_BEAD_MAIL, + ITEM_TROPIC_MAIL, + ITEM_MAX_ETHER, + ITEM_MAX_ETHER, + ITEM_MAX_ETHER, + ITEM_WATMEL_BERRY, + ITEM_BELUE_BERRY, + ITEM_DURIN_BERRY, + ITEM_LUXURY_BALL, + ITEM_TM15_HYPER_BEAM, + ITEM_BIG_PEARL, + ITEM_STAR_PIECE, + ITEM_RARE_CANDY, + ITEM_RARE_CANDY, + ITEM_PREMIER_BALL }; -extern const u8 gUnknown_085EEB83[]; -extern const u8 gUnknown_085EEB8C[]; -extern const u8 gUnknown_085EEB95[]; -extern const u8 gUnknown_085EEB9E[]; -extern const u8 gUnknown_085EEBA4[]; -extern const u8 gUnknown_085EEBAB[]; - -static const u8 *const gUnknown_0860B224[] = { - gUnknown_085EEB83, - gUnknown_085EEB8C, - gUnknown_085EEB95, - gUnknown_085EEB9E, - gUnknown_085EEBA4, - gUnknown_085EEBAB +#define QUIZ_QUESTION_LEN ARRAY_COUNT(sQuizLadyQuestion1) // +#define QUIZ_QUESTION_NUM ARRAY_COUNT(sQuizLadyQuizQuestions) + +// Favor Lady data +static const u8 *const sFavorLadyDescriptions[] = +{ + gText_Slippery, + gText_Roundish, + gText_Whamish, + gText_Shiny, + gText_Sticky, + gText_Pointy }; -static const u16 Unknown_0860B23C[] = { - 0x0056, 0x0053, 0x0054, 0x000e, 0x0012, 0x000f, 0x00a7, 0x0011, 0x0010, 0x0018, 0x0019, 0x001e, 0x0000 +static const u16 sFavorLadyAcceptedItems_Slippery[] = +{ + ITEM_REPEL, + ITEM_SUPER_REPEL, + ITEM_MAX_REPEL, + ITEM_ANTIDOTE, + ITEM_PARALYZE_HEAL, + ITEM_BURN_HEAL, + ITEM_BELUE_BERRY, + ITEM_LUXURY_BALL, + ITEM_TIMER_BALL, + ITEM_REVIVE, + ITEM_MAX_REVIVE, + ITEM_ENERGY_POWDER, + ITEM_NONE }; -static const u16 Unknown_0860B256[] = { - 0x0051, 0x006a, 0x006b, 0x00cc, 0x00c2, 0x002f, 0x0067, 0x0068, 0x0087, 0x0089, 0x008b, 0x009d, 0x00a0, 0x00a5, 0x0004, 0x0002, 0x0000 +static const u16 sFavorLadyAcceptedItems_Roundish[] = +{ + ITEM_FLUFFY_TAIL, + ITEM_PEARL, + ITEM_BIG_PEARL, + ITEM_HARD_STONE, + ITEM_SMOKE_BALL, + ITEM_SHOAL_SHELL, + ITEM_TINY_MUSHROOM, + ITEM_BIG_MUSHROOM, + ITEM_PECHA_BERRY, + ITEM_ASPEAR_BERRY, + ITEM_ORAN_BERRY, + ITEM_GREPA_BERRY, + ITEM_MAGOST_BERRY, + ITEM_WATMEL_BERRY, + ITEM_POKE_BALL, + ITEM_ULTRA_BALL, + ITEM_NONE }; -static const u16 Unknown_0860B278[] = { - 0x0021, 0x000d, 0x001a, 0x001b, 0x001c, 0x00cc, 0x00ca, 0x0026, 0x0086, 0x0096, 0x0097, 0x009a, 0x00a2, 0x00a6, 0x0000 +static const u16 sFavorLadyAcceptedItems_Whamish[] = +{ + ITEM_REVIVAL_HERB, + ITEM_POTION, + ITEM_FRESH_WATER, + ITEM_SODA_POP, + ITEM_LEMONADE, + ITEM_HARD_STONE, + ITEM_LIGHT_BALL, + ITEM_LAVA_COOKIE, + ITEM_CHESTO_BERRY, + ITEM_NANAB_BERRY, + ITEM_WEPEAR_BERRY, + ITEM_KELPSY_BERRY, + ITEM_NOMEL_BERRY, + ITEM_DURIN_BERRY, + ITEM_NONE }; -static const u16 Unknown_0860B296[] = { - 0x0020, 0x004d, 0x004b, 0x004c, 0x0027, 0x0028, 0x0029, 0x002a, 0x002b, 0x006e, 0x005d, 0x006c, 0x006d, 0x006a, 0x006b, 0x00d6, 0x00bc, 0x00b3, 0x000b, 0x000c, 0x0000 +static const u16 sFavorLadyAcceptedItems_Shiny[] = +{ + ITEM_HEAL_POWDER, + ITEM_X_SPEED, + ITEM_X_ATTACK, + ITEM_X_DEFEND, + ITEM_BLUE_FLUTE, + ITEM_YELLOW_FLUTE, + ITEM_RED_FLUTE, + ITEM_BLACK_FLUTE, + ITEM_WHITE_FLUTE, + ITEM_NUGGET, + ITEM_SUN_STONE, + ITEM_STARDUST, + ITEM_STAR_PIECE, + ITEM_PEARL, + ITEM_BIG_PEARL, + ITEM_TWISTED_SPOON, + ITEM_SILVER_POWDER, + ITEM_BRIGHT_POWDER, + ITEM_LUXURY_BALL, + ITEM_PREMIER_BALL, + ITEM_NONE }; -static const u16 Unknown_0860B2C0[] = { - 0x001f, 0x0013, 0x0014, 0x004a, 0x004e, 0x0049, 0x00a5, 0x00c8, 0x0067, 0x006f, 0x0000 +static const u16 sFavorLadyAcceptedItems_Sticky[] = +{ + ITEM_ENERGY_ROOT, + ITEM_FULL_RESTORE, + ITEM_MAX_POTION, + ITEM_DIRE_HIT, + ITEM_X_ACCURACY, + ITEM_GUARD_SPEC, + ITEM_WATMEL_BERRY, + ITEM_LEFTOVERS, + ITEM_TINY_MUSHROOM, + ITEM_HEART_SCALE, + ITEM_NONE }; -static const u16 Unknown_0860B2D6[] = { - 0x00b7, 0x00d3, 0x00d2, 0x00d8, 0x009e, 0x00a6, 0x00ab, 0x00aa, 0x006c, 0x006d, 0x0000 +static const u16 sFavorLadyAcceptedItems_Pointy[] = +{ + ITEM_QUICK_CLAW, + ITEM_POISON_BARB, + ITEM_SHARP_BEAK, + ITEM_DRAGON_FANG, + ITEM_TAMATO_BERRY, + ITEM_DURIN_BERRY, + ITEM_PETAYA_BERRY, + ITEM_SALAC_BERRY, + ITEM_STARDUST, + ITEM_STAR_PIECE, + ITEM_NONE }; -static const u16 *const gUnknown_0860B2EC[] = { - Unknown_0860B23C, - Unknown_0860B256, - Unknown_0860B278, - Unknown_0860B296, - Unknown_0860B2C0, - Unknown_0860B2D6 +static const u16 *const sFavorLadyAcceptedItemLists[] = +{ + sFavorLadyAcceptedItems_Slippery, + sFavorLadyAcceptedItems_Roundish, + sFavorLadyAcceptedItems_Whamish, + sFavorLadyAcceptedItems_Shiny, + sFavorLadyAcceptedItems_Sticky, + sFavorLadyAcceptedItems_Pointy }; -static const u16 sUnknown_0860B304[] = { - 0x0b, 0x6e, 0x40, 0x6f, 0x44, 0x47 +static const u16 sFavorLadyPrizes[] = +{ + ITEM_LUXURY_BALL, + ITEM_NUGGET, + ITEM_PROTEIN, + ITEM_HEART_SCALE, + ITEM_RARE_CANDY, + ITEM_PP_MAX }; -extern const u8 gUnknown_085EEB2B[]; -extern const u8 gUnknown_085EEB34[]; -extern const u8 gUnknown_085EEB3A[]; -extern const u8 gUnknown_085EEB41[]; -extern const u8 gUnknown_085EEB4A[]; -extern const u8 gUnknown_085EEB51[]; -extern const u8 gUnknown_085EEB5A[]; -extern const u8 gUnknown_085EEB61[]; -extern const u8 gUnknown_085EEB6A[]; -extern const u8 gUnknown_085EEB74[]; -extern const u8 gUnknown_085EADA4[]; -extern const u8 gUnknown_085EADB5[]; -extern const u8 gUnknown_085EADC4[]; -extern const u8 gUnknown_085EADD5[]; -extern const u8 gUnknown_085EADE7[]; - -static const u8 *const gUnknown_0860B310[] = { - gUnknown_085EEB2B, - gUnknown_085EEB34, - gUnknown_085EEB3A, - gUnknown_085EEB41, - gUnknown_085EEB4A + +static const u8 *const sContestLadyMonNames[] = +{ + gText_Handsome, + gText_Vinny, + gText_Moreme, + gText_Ironhard, + gText_Muscle }; -static const u8 *const gUnknown_0860B324[] = { - gUnknown_085EEB51, - gUnknown_085EEB5A, - gUnknown_085EEB61, - gUnknown_085EEB6A, - gUnknown_085EEB74 + +static const u8 *const sContestLadyCategoryNames[] = +{ + gText_Coolness, + gText_Beauty, + gText_Cuteness, + gText_Smartness, + gText_Toughness }; -static const u8 *const gUnknown_0860B338[] = { - gUnknown_085EADA4, - gUnknown_085EADB5, - gUnknown_085EADC4, - gUnknown_085EADD5, - gUnknown_085EADE7 + +static const u8 *const sContestNames[] = +{ + gText_CoolnessContest, + gText_BeautyContest, + gText_CutenessContest, + gText_SmartnessContest, + gText_ToughnessContest }; -static const u16 sUnknown_0860B34C[] = { - 0x0120, 0x013b, 0x011e, 0x013d, 0x0019 +static const u16 sContestLadyMonSpecies[] = +{ + SPECIES_ZIGZAGOON, + SPECIES_SKITTY, + SPECIES_POOCHYENA, + SPECIES_KECLEON, + SPECIES_PIKACHU }; -static EWRAM_DATA struct LilycoveLadyFavour *gUnknown_0203CD64 = NULL; -static EWRAM_DATA struct LilycoveLadyQuiz *gUnknown_0203CD68 = NULL; -static EWRAM_DATA struct LilycoveLadyContest *gUnknown_0203CD6C = NULL; +static EWRAM_DATA struct LilycoveLadyFavor *sFavorLadyPtr = NULL; +static EWRAM_DATA struct LilycoveLadyQuiz *sQuizLadyPtr = NULL; +static EWRAM_DATA struct LilycoveLadyContest *sContestLadyPtr = NULL; extern EWRAM_DATA u16 gSpecialVar_ItemId; @@ -235,15 +527,15 @@ u8 GetLilycoveLadyId(void) return gSaveBlock1Ptr->lilycoveLady.id; } -void sub_818D9C0(void) +void SetLilycoveLadyGfx(void) { LilycoveLady *lilycoveLady; - VarSet(VAR_OBJ_GFX_ID_0, sUnknown_0860B07E[GetLilycoveLadyId()]); + VarSet(VAR_OBJ_GFX_ID_0, sLilycoveLadyGfxId[GetLilycoveLadyId()]); if (GetLilycoveLadyId() == LILYCOVE_LADY_CONTEST) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; - VarSet(VAR_OBJ_GFX_ID_1, sUnknown_0860B074[lilycoveLady->contest.category]); + VarSet(VAR_OBJ_GFX_ID_1, sContestLadyMonGfxId[lilycoveLady->contest.category]); gSpecialVar_Result = TRUE; } else @@ -262,13 +554,13 @@ void SetLilycoveLady(void) switch (id) { case LILYCOVE_LADY_QUIZ: - SetLilycoveQuizLady(); + InitLilycoveQuizLady(); break; case LILYCOVE_LADY_FAVOUR: - SetLilycoveFavourLady(); + InitLilycoveFavourLady(); break; case LILYCOVE_LADY_CONTEST: - SetLilycoveContestLady(); + InitLilycoveContestLady(); break; } } @@ -297,28 +589,28 @@ void SetLilycoveLadyRandomly(void) switch (id) { case LILYCOVE_LADY_QUIZ: - SetLilycoveQuizLady(); + InitLilycoveQuizLady(); break; case LILYCOVE_LADY_FAVOUR: - SetLilycoveFavourLady(); + InitLilycoveFavourLady(); break; case LILYCOVE_LADY_CONTEST: - SetLilycoveContestLady(); + InitLilycoveContestLady(); break; } } -void sub_818DAEC(void) +void Script_GetLilycoveLadyId(void) { gSpecialVar_Result = GetLilycoveLadyId(); } -static u8 sub_818DB04(const u16 *data) +static u8 GetNumAcceptedItems(const u16 *itemsArray) { - u8 len; + u8 items; - for (len = 0; *data != 0; len ++, data ++); - return len; + for (items = 0; *itemsArray != ITEM_NONE; items ++, itemsArray ++); + return items; } static void sub_818DB20(void) @@ -326,40 +618,40 @@ static void sub_818DB20(void) u8 size; u8 idx; - gUnknown_0203CD64->unk_00c = Random() % 6; - size = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]); + sFavorLadyPtr->favorId = Random() % 6; + size = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); idx = Random() % size; - gUnknown_0203CD64->unk_010 = gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][idx]; + sFavorLadyPtr->unk_010 = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][idx]; } -static void SetLilycoveFavourLady(void) +static void InitLilycoveFavourLady(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR; - gUnknown_0203CD64->phase = 0; - gUnknown_0203CD64->playerName[0] = EOS; - gUnknown_0203CD64->unk_002 = 0; - gUnknown_0203CD64->unk_003= 0; - gUnknown_0203CD64->itemId = ITEM_NONE; - gUnknown_0203CD64->language = gGameLanguage; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr->id = LILYCOVE_LADY_FAVOUR; + sFavorLadyPtr->phase = 0; + sFavorLadyPtr->playerName[0] = EOS; + sFavorLadyPtr->unk_002 = 0; + sFavorLadyPtr->unk_003= 0; + sFavorLadyPtr->itemId = ITEM_NONE; + sFavorLadyPtr->language = gGameLanguage; sub_818DB20(); } static void sub_818DBC4(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - gUnknown_0203CD64->id = LILYCOVE_LADY_FAVOUR; - gUnknown_0203CD64->phase = 0; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr->id = LILYCOVE_LADY_FAVOUR; + sFavorLadyPtr->phase = 0; } u8 sub_818DBE8(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - if (gUnknown_0203CD64->phase == 2) + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + if (sFavorLadyPtr->phase == 2) { return 2; } - else if (gUnknown_0203CD64->phase == 1) + else if (sFavorLadyPtr->phase == 1) { return 1; } @@ -369,38 +661,38 @@ u8 sub_818DBE8(void) } } -static const u8 *sub_818DC1C(u8 idx) +static const u8 *GetFavorLadyDescription(u8 idx) { - return gUnknown_0860B224[idx]; + return sFavorLadyDescriptions[idx]; } -void sub_818DC2C(void) +void BufferFavorLadyDescription(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - StringCopy(gStringVar1, sub_818DC1C(gUnknown_0203CD64->unk_00c)); + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + StringCopy(gStringVar1, GetFavorLadyDescription(sFavorLadyPtr->favorId)); } bool8 sub_818DC60(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - if (gUnknown_0203CD64->playerName[0] != EOS) + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + if (sFavorLadyPtr->playerName[0] != EOS) { - StringCopy7(gStringVar3, gUnknown_0203CD64->playerName); - ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language); + StringCopy7(gStringVar3, sFavorLadyPtr->playerName); + ConvertInternationalString(gStringVar3, sFavorLadyPtr->language); return TRUE; } return FALSE; } -static void sub_818DCAC(u8 *dest, u16 itemId) +static void BufferItemName(u8 *dest, u16 itemId) { StringCopy(dest, ItemId_GetName(itemId)); } void sub_818DCC8(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - sub_818DCAC(gStringVar2, gUnknown_0203CD64->itemId); + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + BufferItemName(gStringVar2, sFavorLadyPtr->itemId); } static void sub_818DCF4(const u8 *src, u8 *dest) @@ -411,50 +703,50 @@ static void sub_818DCF4(const u8 *src, u8 *dest) void sub_818DD14(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - sub_818DCF4(gUnknown_0203CD64->playerName, gStringVar3); - ConvertInternationalString(gStringVar3, gUnknown_0203CD64->language); + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sub_818DCF4(sFavorLadyPtr->playerName, gStringVar3); + ConvertInternationalString(gStringVar3, sFavorLadyPtr->language); } bool8 sub_818DD54(void) { - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - return gUnknown_0203CD64->unk_002 ? TRUE : FALSE; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + return sFavorLadyPtr->unk_002 ? TRUE : FALSE; } -void sub_818DD78(void) +void OpenBagMenuForFavorLady(void) { sub_81AAC50(); } static bool8 sub_818DD84(u16 itemId) { - u8 len; + u8 numItems; u8 i; bool8 response; - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - len = sub_818DB04(gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c]); - gUnknown_0203CD64->phase = 1; - sub_818DCAC(gStringVar2, itemId); - gUnknown_0203CD64->itemId = itemId; - sub_818DCF4(gSaveBlock2Ptr->playerName, gUnknown_0203CD64->playerName); - gUnknown_0203CD64->language = gGameLanguage; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); + sFavorLadyPtr->phase = 1; + BufferItemName(gStringVar2, itemId); + sFavorLadyPtr->itemId = itemId; + sub_818DCF4(gSaveBlock2Ptr->playerName, sFavorLadyPtr->playerName); + sFavorLadyPtr->language = gGameLanguage; response = FALSE; - for (i = 0; i < len; i ++) + for (i = 0; i < numItems; i ++) { - if (gUnknown_0860B2EC[gUnknown_0203CD64->unk_00c][i] == itemId) + if (sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][i] == itemId) { response = TRUE; - gUnknown_0203CD64->unk_003 ++; - gUnknown_0203CD64->unk_002 = 1; - if (gUnknown_0203CD64->unk_010 == itemId) + sFavorLadyPtr->unk_003 ++; + sFavorLadyPtr->unk_002 = 1; + if (sFavorLadyPtr->unk_010 == itemId) { - gUnknown_0203CD64->unk_003 = 5; + sFavorLadyPtr->unk_003 = 5; } break; } - gUnknown_0203CD64->unk_002 = 0; + sFavorLadyPtr->unk_002 = 0; } return response; } @@ -468,31 +760,31 @@ bool8 sub_818DE5C(void) { u8 checkval; - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - checkval = gUnknown_0203CD64->unk_003; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + checkval = sFavorLadyPtr->unk_003; return checkval < 5 ? FALSE : TRUE; } -static void sub_818DE88(u16 itemId) +static void BufferPrizeName(u16 itemId) { - sub_818DCAC(gStringVar2, itemId); + BufferItemName(gStringVar2, itemId); } u16 sub_818DEA0(void) { u16 itemId; - gUnknown_0203CD64 = &gSaveBlock1Ptr->lilycoveLady.favour; - itemId = sUnknown_0860B304[gUnknown_0203CD64->unk_00c]; - sub_818DE88(itemId); - gUnknown_0203CD64->phase = 2; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + itemId = sFavorLadyPrizes[sFavorLadyPtr->favorId]; + BufferPrizeName(itemId); + sFavorLadyPtr->phase = 2; return itemId; } void sub_818DEDC(void) { - SetLilycoveFavourLady(); - gUnknown_0203CD64->phase = 1; + InitLilycoveFavourLady(); + sFavorLadyPtr->phase = 1; } void sub_818DEF4(void) @@ -500,105 +792,108 @@ void sub_818DEF4(void) EnableBothScriptContexts(); } -static void sub_818DF00(void) +static void PickQuizQuestion(void) { - u8 v0; + u8 questionId; u8 i; - v0 = Random() % 16; - for (i = 0; i < 9; i ++) + questionId = Random() % QUIZ_QUESTION_NUM; + for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { - gUnknown_0203CD68->unk_002[i] = gUnknown_0860B1A4[v0][i]; + sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i]; } - gUnknown_0203CD68->unk_014 = sUnknown_0860B1E4[v0]; - gUnknown_0203CD68->itemId = sUnknown_0860B204[v0]; - gUnknown_0203CD68->unk_02b = v0; - gUnknown_0203CD68->playerName[0] = EOS; + sQuizLadyPtr->answer = sQuizLadyQuizAnswers[questionId]; + sQuizLadyPtr->itemId = sQuizLadyPrizes[questionId]; + sQuizLadyPtr->questionId = questionId; + sQuizLadyPtr->playerName[0] = EOS; } -static void SetLilycoveQuizLady(void) +static void InitLilycoveQuizLady(void) { u8 i; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ; - gUnknown_0203CD68->phase = 0; - for (i = 0; i < 9; i ++) + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ; + sQuizLadyPtr->phase = QUIZ_PHASE_ATTEMPT_QUIZ; + for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { - gUnknown_0203CD68->unk_002[i] = -1; + sQuizLadyPtr->question[i] = -1; } - gUnknown_0203CD68->unk_014 = -1; - gUnknown_0203CD68->unk_016 = -1; + sQuizLadyPtr->answer = -1; + sQuizLadyPtr->response = -1; for (i = 0; i < 4; i ++) { - gUnknown_0203CD68->playerTrainerId[i] = 0; + sQuizLadyPtr->playerTrainerId[i] = 0; } - gUnknown_0203CD68->itemId = ITEM_NONE; - gUnknown_0203CD68->unk_02a = 0; - gUnknown_0203CD68->unk_02c = 0x10; - gUnknown_0203CD68->language = gGameLanguage; - sub_818DF00(); + sQuizLadyPtr->itemId = ITEM_NONE; + sQuizLadyPtr->waitingForChallenger = FALSE; + sQuizLadyPtr->prevQuestionId = QUIZ_QUESTION_NUM; + sQuizLadyPtr->language = gGameLanguage; + PickQuizQuestion(); } static void sub_818E004(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->id = LILYCOVE_LADY_QUIZ; - gUnknown_0203CD68->phase = 0; - gUnknown_0203CD68->unk_02a = 0; - gUnknown_0203CD68->unk_016 = -1; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ; + sQuizLadyPtr->phase = QUIZ_PHASE_ATTEMPT_QUIZ; + sQuizLadyPtr->waitingForChallenger = FALSE; + sQuizLadyPtr->response = -1; } -u8 sub_818E038(void) +u8 GetQuizLadyPhase(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (gUnknown_0203CD68->phase == 2) + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + if (sQuizLadyPtr->phase == QUIZ_PHASE_GIVE_PRIZE) { - return 2; + return QUIZ_PHASE_GIVE_PRIZE; } - else if (gUnknown_0203CD68->phase == 1) + else if (sQuizLadyPtr->phase == QUIZ_PHASE_MAKE_YOUR_OWN) { - return 1; + return QUIZ_PHASE_MAKE_YOUR_OWN; } else { - return 0; + return QUIZ_PHASE_ATTEMPT_QUIZ; } } -u8 sub_818E06C(void) +// 0: waiting for someone to attempt player's quiz +// 1: ready to attempt other player's quiz +// 2: ready to attempt lady's quiz +u8 sub_818E06C(void) //sub_818E06C { int i; int j; - u8 rv; + u8 author; struct LilycoveLadyQuiz *quiz; quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (sub_811F8D8(quiz->unk_014) == 0) - { - i = quiz->unk_02b; + if (sub_811F8D8(quiz->answer) == 0) + { + i = quiz->questionId; do { - if (++ i >= 16) + if (++ i >= QUIZ_QUESTION_NUM) { i = 0; } - } while (sub_811F8D8(sUnknown_0860B1E4[i]) == 0); - for (j = 0; j < 9; j ++) + } while (sub_811F8D8(sQuizLadyQuizAnswers[i]) == 0); + for (j = 0; j < QUIZ_QUESTION_LEN; j ++) { - quiz->unk_002[j] = gUnknown_0860B1A4[i][j]; + quiz->question[j] = sQuizLadyQuizQuestions[i][j]; } - quiz->unk_014 = sUnknown_0860B1E4[i]; - quiz->itemId = sUnknown_0860B204[i]; - quiz->unk_02b = i; + quiz->answer = sQuizLadyQuizAnswers[i]; + quiz->itemId = sQuizLadyPrizes[i]; + quiz->questionId = i; quiz->playerName[0] = EOS; } - rv = sub_818E13C(); - if (rv == 0) + author = BufferAuthorName(); + if (author == QUIZ_AUTHOR_LADY) { return 2; } - else if (rv == 2 || sub_818E1F4()) + else if (author == QUIZ_AUTHOR_OTHER_PLAYER || IsQuizTrainerIdNotPlayer()) { return 1; } @@ -608,126 +903,126 @@ u8 sub_818E06C(void) } } -static u8 sub_818E13C(void) +static u8 BufferAuthorName(void) { - u8 retval; - u8 len; + u8 author; + u8 nameLen; u8 i; - retval = 1; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (gUnknown_0203CD68->playerName[0] == EOS) + author = QUIZ_AUTHOR_PLAYER; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + if (sQuizLadyPtr->playerName[0] == EOS) { StringCopy7(gStringVar1, gText_Lady2); - retval = 0; + author = QUIZ_AUTHOR_LADY; } else { - StringCopy7(gStringVar1, gUnknown_0203CD68->playerName); - ConvertInternationalString(gStringVar1, gUnknown_0203CD68->language); - len = sub_818E258(gUnknown_0203CD68->playerName); - if (len == sub_818E258(gSaveBlock2Ptr->playerName)) + StringCopy7(gStringVar1, sQuizLadyPtr->playerName); + ConvertInternationalString(gStringVar1, sQuizLadyPtr->language); + nameLen = GetPlayerNameLength(sQuizLadyPtr->playerName); + if (nameLen == GetPlayerNameLength(gSaveBlock2Ptr->playerName)) { - u8 *name = gUnknown_0203CD68->playerName; - for (i = 0; i < len; i ++) + u8 *name = sQuizLadyPtr->playerName; + for (i = 0; i < nameLen; i ++) { - name = gUnknown_0203CD68->playerName; + name = sQuizLadyPtr->playerName; if (name[i] != gSaveBlock2Ptr->playerName[i]) { - retval = 2; + author = QUIZ_AUTHOR_OTHER_PLAYER; break; } } } } - return retval; + return author; } -static u8 sub_818E1F4(void) +static bool8 IsQuizTrainerIdNotPlayer(void) { - bool8 response; + bool8 notPlayer; u8 i; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - response = FALSE; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + notPlayer = FALSE; for (i = 0; i < 4; i ++) { - if (gUnknown_0203CD68->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i]) + if (sQuizLadyPtr->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i]) { - response = TRUE; + notPlayer = TRUE; break; } } - return response; + return notPlayer; } -static u8 sub_818E258(const u8 *str) +static u8 GetPlayerNameLength(const u8 *playerName) { u8 len; const u8 *ptr; - for (len = 0, ptr = str; *ptr != EOS; len ++, ptr ++); + for (len = 0, ptr = playerName; *ptr != EOS; len ++, ptr ++); return len; } void sub_818E274(void) { - StringCopy(gStringVar1, ItemId_GetName(gUnknown_0203CD68->itemId)); + StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->itemId)); } bool8 sub_818E298(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (!sub_818E13C()) + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + if (BufferAuthorName() == QUIZ_AUTHOR_LADY) { - gUnknown_0203CD68->language = gGameLanguage; + sQuizLadyPtr->language = gGameLanguage; return TRUE; } return FALSE; } -u8 sub_818E2D8(void) +bool8 IsQuizLadyWaitingForChallenger(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - return gUnknown_0203CD68->unk_02a; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + return sQuizLadyPtr->waitingForChallenger; } -void sub_818E2FC(void) +void sub_818E2FC(void) //sub_818E2FC { ShowEasyChatScreen(); } bool8 sub_818E308(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - CopyEasyChatWord(gStringVar1, gUnknown_0203CD68->unk_014); - CopyEasyChatWord(gStringVar2, gUnknown_0203CD68->unk_016); + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + CopyEasyChatWord(gStringVar1, sQuizLadyPtr->answer); + CopyEasyChatWord(gStringVar2, sQuizLadyPtr->response); return StringCompare(gStringVar1, gStringVar2) ? FALSE : TRUE; } -void sub_818E358(void) +void BufferQuizPrizeItem(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gSpecialVar_0x8005 = gUnknown_0203CD68->itemId; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + gSpecialVar_0x8005 = sQuizLadyPtr->itemId; } -void sub_818E37C(void) +void SetQuizLadyPhase_MakeYourOwn(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->phase = 1; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->phase = QUIZ_PHASE_MAKE_YOUR_OWN; } -void sub_818E39C(void) +void SetQuizLadyPhase_GivePrize(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->phase = 2; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->phase = QUIZ_PHASE_GIVE_PRIZE; } -void sub_818E3BC(void) +void ClearQuizLadyResponse(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->unk_016 = -1; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->response = -1; } void sub_818E3E0(void) @@ -737,28 +1032,28 @@ void sub_818E3E0(void) void sub_818E3EC(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; if (sub_818E298()) { - gUnknown_0203CD68->unk_02c = gUnknown_0203CD68->unk_02b; + sQuizLadyPtr->prevQuestionId = sQuizLadyPtr->questionId; } else { - gUnknown_0203CD68->unk_02c = 0x10; + sQuizLadyPtr->prevQuestionId = QUIZ_QUESTION_NUM; } - sub_818DF00(); + PickQuizQuestion(); } void sub_818E430(void) { u8 i; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - for (i = 0; i < 9; i ++) + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { - gUnknown_0203CD68->unk_002[i] = -1; + sQuizLadyPtr->question[i] = -1; } - gUnknown_0203CD68->unk_014 = -1; + sQuizLadyPtr->answer = -1; } void sub_818E47C(void) @@ -776,26 +1071,26 @@ void sub_818E4A4(void) { u8 i; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->itemId = gSpecialVar_ItemId; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->itemId = gSpecialVar_ItemId; for (i = 0; i < 4; i ++) { - gUnknown_0203CD68->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; + sQuizLadyPtr->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; } - StringCopy7(gUnknown_0203CD68->playerName, gSaveBlock2Ptr->playerName); - gUnknown_0203CD68->language = gGameLanguage; + StringCopy7(sQuizLadyPtr->playerName, gSaveBlock2Ptr->playerName); + sQuizLadyPtr->language = gGameLanguage; } void sub_818E510(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - gUnknown_0203CD68->unk_02a = 1; + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + sQuizLadyPtr->waitingForChallenger = TRUE; } void sub_818E538(void) { - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - CopyEasyChatWord(gStringVar3, gUnknown_0203CD68->unk_014); + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + CopyEasyChatWord(gStringVar3, sQuizLadyPtr->answer); } void sub_818E564(void) @@ -807,63 +1102,64 @@ void sub_818E570(const LilycoveLady *lilycoveLady) { u8 i; - gUnknown_0203CD68 = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (lilycoveLady->quiz.unk_02c < 16 && gUnknown_0203CD68->id == LILYCOVE_LADY_QUIZ) + sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; + if (lilycoveLady->quiz.prevQuestionId < QUIZ_QUESTION_NUM && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ) { for (i = 0; i < 4; i ++) { - if (lilycoveLady->quiz.unk_02c != gUnknown_0203CD68->unk_02b) + if (lilycoveLady->quiz.prevQuestionId != sQuizLadyPtr->questionId) { break; } - gUnknown_0203CD68->unk_02b = Random() % 16; + sQuizLadyPtr->questionId = Random() % QUIZ_QUESTION_NUM; } - if (lilycoveLady->quiz.unk_02c == gUnknown_0203CD68->unk_02b) + if (lilycoveLady->quiz.prevQuestionId == sQuizLadyPtr->questionId) { - gUnknown_0203CD68->unk_02b = (gUnknown_0203CD68->unk_02b + 1) % 16; + sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % QUIZ_QUESTION_NUM; } - gUnknown_0203CD68->unk_02c = lilycoveLady->quiz.unk_02c; + sQuizLadyPtr->prevQuestionId = lilycoveLady->quiz.prevQuestionId; } } -static void sub_818E604(void) +static void ResetContestLadyContestData(void) { - gUnknown_0203CD6C->playerName[0] = EOS; - gUnknown_0203CD6C->fave_pkblk = 0; - gUnknown_0203CD6C->other_pkblk = 0; - gUnknown_0203CD6C->max_sheen = 0; - gUnknown_0203CD6C->category = Random() % 5; + sContestLadyPtr->playerName[0] = EOS; + sContestLadyPtr->fave_pkblk = 0; + sContestLadyPtr->other_pkblk = 0; + sContestLadyPtr->max_sheen = 0; + sContestLadyPtr->category = Random() % CONTEST_CATEGORIES_COUNT; } -static void SetLilycoveContestLady(void) +static void InitLilycoveContestLady(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST; - gUnknown_0203CD6C->phase = 0; - sub_818E604(); - gUnknown_0203CD6C->language = gGameLanguage; + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; + sContestLadyPtr->phase = 0; + ResetContestLadyContestData(); + sContestLadyPtr->language = gGameLanguage; } static void sub_818E674(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - gUnknown_0203CD6C->id = LILYCOVE_LADY_CONTEST; - gUnknown_0203CD6C->phase = 0; - if (gUnknown_0203CD6C->fave_pkblk == 5 || gUnknown_0203CD6C->other_pkblk == 5) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; + sContestLadyPtr->phase = 0; + if (sContestLadyPtr->fave_pkblk == FLAVOR_COUNT + || sContestLadyPtr->other_pkblk == FLAVOR_COUNT) { - sub_818E604(); + ResetContestLadyContestData(); } } static void sub_818E6B0(u8 sheen) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - if (gUnknown_0203CD6C->max_sheen <= sheen) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + if (sContestLadyPtr->max_sheen <= sheen) { - gUnknown_0203CD6C->max_sheen = sheen; - memset(gUnknown_0203CD6C->playerName, EOS, sizeof(gUnknown_0203CD6C->playerName)); - memcpy(gUnknown_0203CD6C->playerName, gSaveBlock2Ptr->playerName, sizeof(gUnknown_0203CD6C->playerName)); - gUnknown_0203CD6C->language = gGameLanguage; + sContestLadyPtr->max_sheen = sheen; + memset(sContestLadyPtr->playerName, EOS, sizeof(sContestLadyPtr->playerName)); + memcpy(sContestLadyPtr->playerName, gSaveBlock2Ptr->playerName, sizeof(sContestLadyPtr->playerName)); + sContestLadyPtr->language = gGameLanguage; } } @@ -874,38 +1170,38 @@ bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock) sheen = 0; response = FALSE; - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - switch (gUnknown_0203CD6C->category) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + switch (sContestLadyPtr->category) { - case 0: + case CONTEST_CATEGORY_COOL: if (pokeblock->spicy != 0) { sheen = pokeblock->spicy; response = TRUE; } break; - case 1: + case CONTEST_CATEGORY_BEAUTY: if (pokeblock->dry != 0) { sheen = pokeblock->dry; response = TRUE; } break; - case 2: + case CONTEST_CATEGORY_CUTE: if (pokeblock->sweet != 0) { sheen = pokeblock->sweet; response = TRUE; } break; - case 3: + case CONTEST_CATEGORY_SMART: if (pokeblock->bitter != 0) { sheen = pokeblock->bitter; response = TRUE; } break; - case 4: + case CONTEST_CATEGORY_TOUGH: if (pokeblock->sour != 0) { sheen = pokeblock->sour; @@ -916,54 +1212,54 @@ bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock) if (response == TRUE) { sub_818E6B0(sheen); - gUnknown_0203CD6C->fave_pkblk ++; + sContestLadyPtr->fave_pkblk ++; } else { - gUnknown_0203CD6C->other_pkblk ++; + sContestLadyPtr->other_pkblk ++; } return response; } -static void sub_818E794(u8 *dest1, u8 *dest2) +static void sub_818E794(u8 *dest1, u8 *dest2) //sub_818E794 { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - StringCopy(dest1, gUnknown_0860B324[gUnknown_0203CD6C->category]); - StringCopy10(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]); + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + StringCopy(dest1, sContestLadyCategoryNames[sContestLadyPtr->category]); + StringCopy10(dest2, sContestLadyMonNames[sContestLadyPtr->category]); } void sub_818E7E0(u8 *dest1, u8 *dest2) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - *dest1 = gUnknown_0203CD6C->category; - StringCopy(dest2, gUnknown_0860B310[gUnknown_0203CD6C->category]); + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + *dest1 = sContestLadyPtr->category; + StringCopy(dest2, sContestLadyMonNames[sContestLadyPtr->category]); } void sub_818E81C(u8 *dest) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - StringCopy(dest, gUnknown_0203CD6C->playerName); + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + StringCopy(dest, sContestLadyPtr->playerName); } void sub_818E848(u8 *dest) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - *dest = gUnknown_0203CD6C->language; + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + *dest = sContestLadyPtr->language; } -void sub_818E868(u8 *dest, u8 category) +void BufferContestName(u8 *dest, u8 category) { - StringCopy(dest, gUnknown_0860B338[category]); + StringCopy(dest, sContestNames[category]); } u8 sub_818E880(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - if (gUnknown_0203CD6C->fave_pkblk >= 5) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + if (sContestLadyPtr->fave_pkblk >= FLAVOR_COUNT) { return 1; } - else if (gUnknown_0203CD6C->fave_pkblk == 0) + else if (sContestLadyPtr->fave_pkblk == 0) { return 2; } @@ -975,8 +1271,8 @@ u8 sub_818E880(void) bool8 sub_818E8B4(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - if (gUnknown_0203CD6C->phase == 1) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + if (sContestLadyPtr->phase == 1) { return TRUE; } @@ -988,8 +1284,9 @@ bool8 sub_818E8E0(void) bool8 response; response = FALSE; - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - if (gUnknown_0203CD6C->fave_pkblk >= 5 || gUnknown_0203CD6C->other_pkblk >= 5) + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + if (sContestLadyPtr->fave_pkblk >= FLAVOR_COUNT + || sContestLadyPtr->other_pkblk >= FLAVOR_COUNT) { response = TRUE; } @@ -1008,18 +1305,18 @@ void sub_818E92C(void) void sub_818E940(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - gUnknown_0203CD6C->phase = 1; + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + sContestLadyPtr->phase = 1; } void sub_818E960(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - gSpecialVar_0x8005 = sUnknown_0860B34C[gUnknown_0203CD6C->category]; + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + gSpecialVar_0x8005 = sContestLadyMonSpecies[sContestLadyPtr->category]; } u8 sub_818E990(void) { - gUnknown_0203CD6C = &gSaveBlock1Ptr->lilycoveLady.contest; - return gUnknown_0203CD6C->category; + sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; + return sContestLadyPtr->category; } diff --git a/src/scrcmd.c b/src/scrcmd.c index e31be848a..0326a56a4 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -1633,7 +1633,7 @@ bool8 ScrCmd_buffercontesttype(struct ScriptContext *ctx) u8 stringVarIndex = ScriptReadByte(ctx); u16 index = VarGet(ScriptReadHalfword(ctx)); - sub_818E868(sScriptStringVars[stringVarIndex], index); + BufferContestName(sScriptStringVars[stringVarIndex], index); return FALSE; } diff --git a/src/strings.c b/src/strings.c index 8463cfacb..8134265f3 100644 --- a/src/strings.c +++ b/src/strings.c @@ -610,11 +610,11 @@ const u8 gUnknown_085EAD72[] = _("What's a CONTEST?"); const u8 gUnknown_085EAD84[] = _("Types of CONTESTS"); const u8 gUnknown_085EAD96[] = _("Ranks"); const u8 gUnknown_085EAD9C[] = _("Judging"); -const u8 gUnknown_085EADA4[] = _("COOLNESS CONTEST"); -const u8 gUnknown_085EADB5[] = _("BEAUTY CONTEST"); -const u8 gUnknown_085EADC4[] = _("CUTENESS CONTEST"); -const u8 gUnknown_085EADD5[] = _("SMARTNESS CONTEST"); -const u8 gUnknown_085EADE7[] = _("TOUGHNESS CONTEST"); +const u8 gText_CoolnessContest[] = _("COOLNESS CONTEST"); +const u8 gText_BeautyContest[] = _("BEAUTY CONTEST"); +const u8 gText_CutenessContest[] = _("CUTENESS CONTEST"); +const u8 gText_SmartnessContest[] = _("SMARTNESS CONTEST"); +const u8 gText_ToughnessContest[] = _("TOUGHNESS CONTEST"); const u8 gUnknown_085EADF9[] = _("DECORATION"); const u8 gUnknown_085EAE04[] = _("PACK UP"); const u8 gUnknown_085EAE0C[] = _("COUNT"); @@ -1591,23 +1591,23 @@ const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?"); const u8 gText_TellHimTheWords[] = _("Tell him the words."); const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK"); const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here."); -const u8 gUnknown_085EEB2B[] = _("HANDSOME"); -const u8 gUnknown_085EEB34[] = _("VINNY"); -const u8 gUnknown_085EEB3A[] = _("MOREME"); -const u8 gUnknown_085EEB41[] = _("IRONHARD"); -const u8 gUnknown_085EEB4A[] = _("MUSCLE"); -const u8 gUnknown_085EEB51[] = _("coolness"); -const u8 gUnknown_085EEB5A[] = _("beauty"); -const u8 gUnknown_085EEB61[] = _("cuteness"); -const u8 gUnknown_085EEB6A[] = _("smartness"); -const u8 gUnknown_085EEB74[] = _("toughness"); +const u8 gText_Handsome[] = _("HANDSOME"); +const u8 gText_Vinny[] = _("VINNY"); +const u8 gText_Moreme[] = _("MOREME"); +const u8 gText_Ironhard[] = _("IRONHARD"); +const u8 gText_Muscle[] = _("MUSCLE"); +const u8 gText_Coolness[] = _("coolness"); +const u8 gText_Beauty[] = _("beauty"); +const u8 gText_Cuteness[] = _("cuteness"); +const u8 gText_Smartness[] = _("smartness"); +const u8 gText_Toughness[] = _("toughness"); const u8 gText_Lady2[] = _("Lady"); -const u8 gUnknown_085EEB83[] = _("slippery"); -const u8 gUnknown_085EEB8C[] = _("roundish"); -const u8 gUnknown_085EEB95[] = _("wham-ish"); -const u8 gUnknown_085EEB9E[] = _("shiny"); -const u8 gUnknown_085EEBA4[] = _("sticky"); -const u8 gUnknown_085EEBAB[] = _("pointy"); +const u8 gText_Slippery[] = _("slippery"); +const u8 gText_Roundish[] = _("roundish"); +const u8 gText_Whamish[] = _("wham-ish"); +const u8 gText_Shiny[] = _("shiny"); +const u8 gText_Sticky[] = _("sticky"); +const u8 gText_Pointy[] = _("pointy"); const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON"); const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON."); const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON."); diff --git a/src/tv.c b/src/tv.c index b4c8463fd..ad3a4f315 100644 --- a/src/tv.c +++ b/src/tv.c @@ -5600,7 +5600,7 @@ static void DoTVShowPokemonContestLiveUpdates(void) switch (state) { case 0: - sub_818E868(gStringVar1, show->contestLiveUpdates.category); + BufferContestName(gStringVar1, show->contestLiveUpdates.category); StringCopy(gStringVar2, gSpeciesNames[show->contestLiveUpdates.species]); TVShowConvertInternationalString(gStringVar3, show->contestLiveUpdates.playerName, show->contestLiveUpdates.language); if (show->contestLiveUpdates.round1Rank == show->contestLiveUpdates.round2Rank) @@ -7720,7 +7720,7 @@ static void DoTVShowPokemonContestLiveUpdates2(void) switch (state) { case 0: - sub_818E868(gStringVar1, show->contestLiveUpdates2.contestCategory); + BufferContestName(gStringVar1, show->contestLiveUpdates2.contestCategory); if (show->contestLiveUpdates2.pokeblockState == 1) { sTVShowState = 1; -- cgit v1.2.3 From fc467a9d52e200a9ffae663161c8b2b2b7c79689 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 04:38:59 -0400 Subject: standardize favour/favor --- include/global.h | 4 ++-- src/lilycove_lady.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/global.h b/include/global.h index db80d81a0..f6a701ab8 100644 --- a/include/global.h +++ b/include/global.h @@ -740,7 +740,7 @@ struct RecordMixingDayCareMail enum { LILYCOVE_LADY_QUIZ, - LILYCOVE_LADY_FAVOUR, + LILYCOVE_LADY_FAVOR, LILYCOVE_LADY_CONTEST }; @@ -788,7 +788,7 @@ struct LilycoveLadyContest typedef union // 3b58 { struct LilycoveLadyQuiz quiz; - struct LilycoveLadyFavour favour; + struct LilycoveLadyFavor favor; struct LilycoveLadyContest contest; u8 id; u8 pad[0x40]; diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index b4557f1c0..a3ab2228d 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -39,7 +39,7 @@ enum //TODO name phases static void InitLilycoveQuizLady(void); -static void InitLilycoveFavourLady(void); +static void InitLilycoveFavorLady(void); static void InitLilycoveContestLady(void); static void sub_818E004(void); static void sub_818DBC4(void); @@ -556,8 +556,8 @@ void SetLilycoveLady(void) case LILYCOVE_LADY_QUIZ: InitLilycoveQuizLady(); break; - case LILYCOVE_LADY_FAVOUR: - InitLilycoveFavourLady(); + case LILYCOVE_LADY_FAVOR: + InitLilycoveFavorLady(); break; case LILYCOVE_LADY_CONTEST: InitLilycoveContestLady(); @@ -572,7 +572,7 @@ void sub_818DA78(void) case LILYCOVE_LADY_QUIZ: sub_818E004(); break; - case LILYCOVE_LADY_FAVOUR: + case LILYCOVE_LADY_FAVOR: sub_818DBC4(); break; case LILYCOVE_LADY_CONTEST: @@ -591,8 +591,8 @@ void SetLilycoveLadyRandomly(void) case LILYCOVE_LADY_QUIZ: InitLilycoveQuizLady(); break; - case LILYCOVE_LADY_FAVOUR: - InitLilycoveFavourLady(); + case LILYCOVE_LADY_FAVOR: + InitLilycoveFavorLady(); break; case LILYCOVE_LADY_CONTEST: InitLilycoveContestLady(); @@ -624,10 +624,10 @@ static void sub_818DB20(void) sFavorLadyPtr->unk_010 = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][idx]; } -static void InitLilycoveFavourLady(void) +static void InitLilycoveFavorLady(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; - sFavorLadyPtr->id = LILYCOVE_LADY_FAVOUR; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; + sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR; sFavorLadyPtr->phase = 0; sFavorLadyPtr->playerName[0] = EOS; sFavorLadyPtr->unk_002 = 0; @@ -639,14 +639,14 @@ static void InitLilycoveFavourLady(void) static void sub_818DBC4(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; - sFavorLadyPtr->id = LILYCOVE_LADY_FAVOUR; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; + sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR; sFavorLadyPtr->phase = 0; } u8 sub_818DBE8(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; if (sFavorLadyPtr->phase == 2) { return 2; @@ -668,13 +668,13 @@ static const u8 *GetFavorLadyDescription(u8 idx) void BufferFavorLadyDescription(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; StringCopy(gStringVar1, GetFavorLadyDescription(sFavorLadyPtr->favorId)); } bool8 sub_818DC60(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; if (sFavorLadyPtr->playerName[0] != EOS) { StringCopy7(gStringVar3, sFavorLadyPtr->playerName); @@ -691,7 +691,7 @@ static void BufferItemName(u8 *dest, u16 itemId) void sub_818DCC8(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; BufferItemName(gStringVar2, sFavorLadyPtr->itemId); } @@ -703,14 +703,14 @@ static void sub_818DCF4(const u8 *src, u8 *dest) void sub_818DD14(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; sub_818DCF4(sFavorLadyPtr->playerName, gStringVar3); ConvertInternationalString(gStringVar3, sFavorLadyPtr->language); } bool8 sub_818DD54(void) { - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; return sFavorLadyPtr->unk_002 ? TRUE : FALSE; } @@ -725,7 +725,7 @@ static bool8 sub_818DD84(u16 itemId) u8 i; bool8 response; - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); sFavorLadyPtr->phase = 1; BufferItemName(gStringVar2, itemId); @@ -760,7 +760,7 @@ bool8 sub_818DE5C(void) { u8 checkval; - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; checkval = sFavorLadyPtr->unk_003; return checkval < 5 ? FALSE : TRUE; } @@ -774,7 +774,7 @@ u16 sub_818DEA0(void) { u16 itemId; - sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favour; + sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; itemId = sFavorLadyPrizes[sFavorLadyPtr->favorId]; BufferPrizeName(itemId); sFavorLadyPtr->phase = 2; @@ -783,7 +783,7 @@ u16 sub_818DEA0(void) void sub_818DEDC(void) { - InitLilycoveFavourLady(); + InitLilycoveFavorLady(); sFavorLadyPtr->phase = 1; } -- cgit v1.2.3 From 5d96a0cc97431d4935042fa58e0ff06f4db8a43d Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 10:15:50 -0400 Subject: minor fixes --- include/strings.h | 34 +++++++++++++++++----------------- src/easy_chat.c | 20 ++++++++++---------- src/lilycove_lady.c | 40 +++++++++++++++++++++------------------- src/script_menu.c | 10 +++++----- src/strings.c | 34 +++++++++++++++++----------------- 5 files changed, 70 insertions(+), 68 deletions(-) diff --git a/include/strings.h b/include/strings.h index d6a239559..78ae2c140 100644 --- a/include/strings.h +++ b/include/strings.h @@ -2745,23 +2745,23 @@ extern const u8 gText_BestScore2[]; extern const u8 gText_ExcellentsInARow[]; // Lilycove Lady -extern const u8 gText_Handsome[]; -extern const u8 gText_Vinny[]; -extern const u8 gText_Moreme[]; -extern const u8 gText_Ironhard[]; -extern const u8 gText_Muscle[]; -extern const u8 gText_Coolness[]; -extern const u8 gText_Beauty[]; -extern const u8 gText_Cuteness[]; -extern const u8 gText_Smartness[]; -extern const u8 gText_Toughness[]; -extern const u8 gText_Lady2[]; -extern const u8 gText_Slippery[]; -extern const u8 gText_Roundish[]; -extern const u8 gText_Whamish[]; -extern const u8 gText_Shiny[]; -extern const u8 gText_Sticky[]; -extern const u8 gText_Pointy[]; +extern const u8 gText_ContestLady_Handsome[]; +extern const u8 gText_ContestLady_Vinny[]; +extern const u8 gText_ContestLady_Moreme[]; +extern const u8 gText_ContestLady_Ironhard[]; +extern const u8 gText_ContestLady_Muscle[]; +extern const u8 gText_ContestLady_Coolness[]; +extern const u8 gText_ContestLady_Beauty[]; +extern const u8 gText_ContestLady_Cuteness[]; +extern const u8 gText_ContestLady_Smartness[]; +extern const u8 gText_ContestLady_Toughness[]; +extern const u8 gText_QuizLady_Lady[]; +extern const u8 gText_FavorLady_Slippery[]; +extern const u8 gText_FavorLady_Roundish[]; +extern const u8 gText_FavorLady_Whamish[]; +extern const u8 gText_FavorLady_Shiny[]; +extern const u8 gText_FavorLady_Sticky[]; +extern const u8 gText_FavorLady_Pointy[]; extern const u8 gText_CoolnessContest[]; extern const u8 gText_BeautyContest[]; diff --git a/src/easy_chat.c b/src/easy_chat.c index 93456631a..9a529afe3 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -1305,15 +1305,15 @@ void ShowEasyChatScreen(void) displayedPersonType = EASY_CHAT_PERSON_BOY; break; case EASY_CHAT_TYPE_QUIZ_ANSWER: - words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016; + words = &gSaveBlock1Ptr->lilycoveLady.quiz.response; break; case EASY_CHAT_TYPE_QUIZ_QUESTION: return; case EASY_CHAT_TYPE_QUIZ_SET_QUESTION: - words = gSaveBlock1Ptr->lilycoveLady.quiz.unk_002; + words = gSaveBlock1Ptr->lilycoveLady.quiz.question; break; case EASY_CHAT_TYPE_QUIZ_SET_ANSWER: - words = &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014; + words = &gSaveBlock1Ptr->lilycoveLady.quiz.answer; break; case EASY_CHAT_TYPE_APPRENTICE: words = gSaveBlock2Ptr->apprentices[0].easyChatWords; @@ -1343,7 +1343,7 @@ static void sub_811A7E4(void) if (!gPaletteFade.active) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; - lilycoveLady->quiz.unk_016 = -1; + lilycoveLady->quiz.response = -1; CleanupOverworldWindowsAndTilemaps(); DoQuizQuestionEasyChatScreen(); } @@ -1387,7 +1387,7 @@ static void DoQuizAnswerEasyChatScreen(void) { DoEasyChatScreen( EASY_CHAT_TYPE_QUIZ_ANSWER, - &gSaveBlock1Ptr->lilycoveLady.quiz.unk_016, + &gSaveBlock1Ptr->lilycoveLady.quiz.response, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -1395,7 +1395,7 @@ static void DoQuizAnswerEasyChatScreen(void) static void DoQuizQuestionEasyChatScreen(void) { DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_QUESTION, - gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, + gSaveBlock1Ptr->lilycoveLady.quiz.question, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -1403,7 +1403,7 @@ static void DoQuizQuestionEasyChatScreen(void) static void DoQuizSetAnswerEasyChatScreen(void) { DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_ANSWER, - &gSaveBlock1Ptr->lilycoveLady.quiz.unk_014, + &gSaveBlock1Ptr->lilycoveLady.quiz.answer, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -1411,7 +1411,7 @@ static void DoQuizSetAnswerEasyChatScreen(void) static void DoQuizSetQuestionEasyChatScreen(void) { DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_QUESTION, - gSaveBlock1Ptr->lilycoveLady.quiz.unk_002, + gSaveBlock1Ptr->lilycoveLady.quiz.question, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -2662,7 +2662,7 @@ static int sub_811BD64(void) saveBlock1 = gSaveBlock1Ptr; for (i = 0; i < 9; i++) { - if (saveBlock1->lilycoveLady.quiz.unk_002[i] != 0xFFFF) + if (saveBlock1->lilycoveLady.quiz.question[i] != 0xFFFF) return 0; } @@ -2676,7 +2676,7 @@ static int sub_811BDB0(void) return sub_811BCF4(); quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - return quiz->unk_014 == 0xFFFF ? 1 : 0; + return quiz->answer == 0xFFFF ? 1 : 0; } static void sub_811BDF0(u8 *arg0) diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index a3ab2228d..fe1129dd1 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -20,6 +20,8 @@ #include "constants/easy_chat.h" #include "constants/event_objects.h" #include "constants/items.h" +#include "constants/species.h" +#include "constants/moves.h" enum { @@ -339,12 +341,12 @@ static const u16 sQuizLadyPrizes[] = // Favor Lady data static const u8 *const sFavorLadyDescriptions[] = { - gText_Slippery, - gText_Roundish, - gText_Whamish, - gText_Shiny, - gText_Sticky, - gText_Pointy + gText_FavorLady_Slippery, + gText_FavorLady_Roundish, + gText_FavorLady_Whamish, + gText_FavorLady_Shiny, + gText_FavorLady_Sticky, + gText_FavorLady_Pointy }; static const u16 sFavorLadyAcceptedItems_Slippery[] = @@ -356,8 +358,8 @@ static const u16 sFavorLadyAcceptedItems_Slippery[] = ITEM_PARALYZE_HEAL, ITEM_BURN_HEAL, ITEM_BELUE_BERRY, - ITEM_LUXURY_BALL, - ITEM_TIMER_BALL, + ITEM_AWAKENING, + ITEM_ICE_HEAL, ITEM_REVIVE, ITEM_MAX_REVIVE, ITEM_ENERGY_POWDER, @@ -482,20 +484,20 @@ static const u16 sFavorLadyPrizes[] = static const u8 *const sContestLadyMonNames[] = { - gText_Handsome, - gText_Vinny, - gText_Moreme, - gText_Ironhard, - gText_Muscle + gText_ContestLady_Handsome, + gText_ContestLady_Vinny, + gText_ContestLady_Moreme, + gText_ContestLady_Ironhard, + gText_ContestLady_Muscle }; static const u8 *const sContestLadyCategoryNames[] = { - gText_Coolness, - gText_Beauty, - gText_Cuteness, - gText_Smartness, - gText_Toughness + gText_ContestLady_Coolness, + gText_ContestLady_Beauty, + gText_ContestLady_Cuteness, + gText_ContestLady_Smartness, + gText_ContestLady_Toughness }; static const u8 *const sContestNames[] = @@ -913,7 +915,7 @@ static u8 BufferAuthorName(void) sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; if (sQuizLadyPtr->playerName[0] == EOS) { - StringCopy7(gStringVar1, gText_Lady2); + StringCopy7(gStringVar1, gText_QuizLady_Lady); author = QUIZ_AUTHOR_LADY; } else diff --git a/src/script_menu.c b/src/script_menu.c index b17d3df38..b0e0ec920 100644 --- a/src/script_menu.c +++ b/src/script_menu.c @@ -41,11 +41,11 @@ const struct MenuAction MultichoiceList_003[] = const struct MenuAction MultichoiceList_004[] = { - {gUnknown_085EADA4, NULL}, - {gUnknown_085EADB5, NULL}, - {gUnknown_085EADC4, NULL}, - {gUnknown_085EADD5, NULL}, - {gUnknown_085EADE7, NULL}, + {gText_CoolnessContest, NULL}, + {gText_BeautyContest, NULL}, + {gText_CutenessContest, NULL}, + {gText_SmartnessContest, NULL}, + {gText_ToughnessContest, NULL}, {gText_Exit, NULL}, }; diff --git a/src/strings.c b/src/strings.c index 8134265f3..ebc995f13 100644 --- a/src/strings.c +++ b/src/strings.c @@ -1591,23 +1591,23 @@ const u8 gText_PkmnsNickname[] = _("{STR_VAR_1}'s nickname?"); const u8 gText_TellHimTheWords[] = _("Tell him the words."); const u8 gText_MoveOkBack[] = _("{DPAD_NONE}MOVE {A_BUTTON}OK {B_BUTTON}BACK"); const u8 gText_CallCantBeMadeHere[] = _("A call can't be made from here."); -const u8 gText_Handsome[] = _("HANDSOME"); -const u8 gText_Vinny[] = _("VINNY"); -const u8 gText_Moreme[] = _("MOREME"); -const u8 gText_Ironhard[] = _("IRONHARD"); -const u8 gText_Muscle[] = _("MUSCLE"); -const u8 gText_Coolness[] = _("coolness"); -const u8 gText_Beauty[] = _("beauty"); -const u8 gText_Cuteness[] = _("cuteness"); -const u8 gText_Smartness[] = _("smartness"); -const u8 gText_Toughness[] = _("toughness"); -const u8 gText_Lady2[] = _("Lady"); -const u8 gText_Slippery[] = _("slippery"); -const u8 gText_Roundish[] = _("roundish"); -const u8 gText_Whamish[] = _("wham-ish"); -const u8 gText_Shiny[] = _("shiny"); -const u8 gText_Sticky[] = _("sticky"); -const u8 gText_Pointy[] = _("pointy"); +const u8 gText_ContestLady_Handsome[] = _("HANDSOME"); +const u8 gText_ContestLady_Vinny[] = _("VINNY"); +const u8 gText_ContestLady_Moreme[] = _("MOREME"); +const u8 gText_ContestLady_Ironhard[] = _("IRONHARD"); +const u8 gText_ContestLady_Muscle[] = _("MUSCLE"); +const u8 gText_ContestLady_Coolness[] = _("coolness"); +const u8 gText_ContestLady_Beauty[] = _("beauty"); +const u8 gText_ContestLady_Cuteness[] = _("cuteness"); +const u8 gText_ContestLady_Smartness[] = _("smartness"); +const u8 gText_ContestLady_Toughness[] = _("toughness"); +const u8 gText_QuizLady_Lady[] = _("Lady"); +const u8 gText_FavorLady_Slippery[] = _("slippery"); +const u8 gText_FavorLady_Roundish[] = _("roundish"); +const u8 gText_FavorLady_Whamish[] = _("wham-ish"); +const u8 gText_FavorLady_Shiny[] = _("shiny"); +const u8 gText_FavorLady_Sticky[] = _("sticky"); +const u8 gText_FavorLady_Pointy[] = _("pointy"); const u8 gText_RentalPkmn2[] = _("RENTAL POKéMON"); const u8 gText_SelectFirstPkmn[] = _("Select the first POKéMON."); const u8 gText_SelectSecondPkmn[] = _("Select the second POKéMON."); -- cgit v1.2.3 From 009caa21c860bcf704c1c156ba54dbeb99728f8b Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 12:00:42 -0400 Subject: some contest lady funcs --- data/event_scripts.s | 10 +++++----- data/specials.inc | 8 ++++---- include/global.h | 2 +- src/lilycove_lady.c | 21 +++++++++++---------- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 1952fae93..50eb0dac0 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -4701,7 +4701,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88B0:: @ 82A88B0 LilycoveCity_PokemonCenter_1F_EventScript_2A88BA:: @ 82A88BA fadescreen 1 - special sub_818E92C + special OpenPokeblockCaseForContestLady waitstate compare VAR_RESULT, 65535 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A88D7 @@ -4719,8 +4719,8 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88D7:: @ 82A88D7 LilycoveCity_PokemonCenter_1F_EventScript_2A88F6:: @ 82A88F6 msgbox LilycoveCity_PokemonCenter_1F_Text_2A9571, MSGBOX_DEFAULT - special sub_818E940 - special sub_818E960 + special ContestLadyGivenPokeblock + special GetContestLadyMonSpecies goto LilycoveCity_PokemonCenter_1F_EventScript_2A890A end @@ -4810,9 +4810,9 @@ LilycoveCity_PokemonCenter_1F_Movement_2A89C2: @ 82A89C2 step_end LilycoveCity_PokemonCenter_1F_EventScript_2A89C7:: @ 82A89C7 - specialvar VAR_RESULT, sub_818E990 + specialvar VAR_RESULT, GetContestLadyCategory special sub_818E914 - special sub_818E960 + special GetContestLadyMonSpecies compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A0A compare VAR_RESULT, 1 diff --git a/data/specials.inc b/data/specials.inc index bf2d6621e..5c2eaa760 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -409,10 +409,10 @@ gSpecials:: @ 81DBA64 def_special sub_818E8E0 def_special sub_818E8B4 def_special sub_818E914 - def_special sub_818E92C - def_special sub_818E940 - def_special sub_818E960 - def_special sub_818E990 + def_special OpenPokeblockCaseForContestLady + def_special ContestLadyGivenPokeblock + def_special GetContestLadyMonSpecies + def_special GetContestLadyCategory def_special PutLilycoveContestLadyShowOnTheAir def_special sub_813B880 def_special CallApprenticeFunction diff --git a/include/global.h b/include/global.h index f6a701ab8..a25100bd9 100644 --- a/include/global.h +++ b/include/global.h @@ -776,7 +776,7 @@ struct LilycoveLadyFavor struct LilycoveLadyContest { /*0x000*/ u8 id; - /*0x001*/ u8 phase; + /*0x001*/ bool8 givenPokeblock; /*0x002*/ u8 fave_pkblk; /*0x003*/ u8 other_pkblk; /*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index fe1129dd1..ef43841ef 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -335,8 +335,8 @@ static const u16 sQuizLadyPrizes[] = ITEM_PREMIER_BALL }; -#define QUIZ_QUESTION_LEN ARRAY_COUNT(sQuizLadyQuestion1) // -#define QUIZ_QUESTION_NUM ARRAY_COUNT(sQuizLadyQuizQuestions) +#define QUIZ_QUESTION_LEN 9 +#define QUIZ_QUESTION_NUM 16 // Favor Lady data static const u8 *const sFavorLadyDescriptions[] = @@ -1136,7 +1136,7 @@ static void InitLilycoveContestLady(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; - sContestLadyPtr->phase = 0; + sContestLadyPtr->givenPokeblock = FALSE; ResetContestLadyContestData(); sContestLadyPtr->language = gGameLanguage; } @@ -1145,7 +1145,7 @@ static void sub_818E674(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; - sContestLadyPtr->phase = 0; + sContestLadyPtr->givenPokeblock = FALSE; if (sContestLadyPtr->fave_pkblk == FLAVOR_COUNT || sContestLadyPtr->other_pkblk == FLAVOR_COUNT) { @@ -1274,7 +1274,7 @@ u8 sub_818E880(void) bool8 sub_818E8B4(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; - if (sContestLadyPtr->phase == 1) + if (sContestLadyPtr->givenPokeblock == TRUE) { return TRUE; } @@ -1295,29 +1295,30 @@ bool8 sub_818E8E0(void) return response; } +// called when mon enjoys pokeblock void sub_818E914(void) { sub_818E794(gStringVar2, gStringVar1); } -void sub_818E92C(void) +void OpenPokeblockCaseForContestLady(void) { OpenPokeblockCase(3, CB2_ReturnToField); } -void sub_818E940(void) +void ContestLadyGivenPokeblock(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; - sContestLadyPtr->phase = 1; + sContestLadyPtr->givenPokeblock = TRUE; } -void sub_818E960(void) +void GetContestLadyMonSpecies(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; gSpecialVar_0x8005 = sContestLadyMonSpecies[sContestLadyPtr->category]; } -u8 sub_818E990(void) +u8 GetContestLadyCategory(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; return sContestLadyPtr->category; -- cgit v1.2.3 From 771a7b25faf62748ef82534a6838dbf32377ebef Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 14:23:54 -0400 Subject: move data, more contest lady funcs --- include/lilycove_lady.h | 6 +- src/data/lilycove_lady.h | 470 +++++++++++++++++++++++++++++++++++++++++++++ src/lilycove_lady.c | 487 +---------------------------------------------- src/tv.c | 6 +- 4 files changed, 486 insertions(+), 483 deletions(-) create mode 100644 src/data/lilycove_lady.h diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h index 09a1b0c18..dde78b8d8 100644 --- a/include/lilycove_lady.h +++ b/include/lilycove_lady.h @@ -8,9 +8,9 @@ void sub_818DEF4(void); void sub_818E564(void); void sub_818E570(const LilycoveLady *lilycoveLady); bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock); -void sub_818E7E0(u8 *dest1, u8 *dest2); -void sub_818E81C(u8 *dest); -void sub_818E848(u8 *dest); +void BufferContestLadyMonName(u8 *dest1, u8 *dest2); +void BufferContestLadyPlayerName(u8 *dest); +void BufferContestLadyLanguage(u8 *dest); void BufferContestName(u8 *dest, u8 category); u8 sub_818E880(void); diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h new file mode 100644 index 000000000..36bd94e55 --- /dev/null +++ b/src/data/lilycove_lady.h @@ -0,0 +1,470 @@ +#include "constants/easy_chat.h" +#include "constants/event_objects.h" +#include "constants/items.h" +#include "constants/species.h" +#include "constants/moves.h" + +static const u16 sContestLadyMonGfxId[] = +{ + EVENT_OBJ_GFX_ZIGZAGOON_1, + EVENT_OBJ_GFX_SKITTY, + EVENT_OBJ_GFX_POOCHYENA, + EVENT_OBJ_GFX_KECLEON_1, + EVENT_OBJ_GFX_PIKACHU +}; + +static const u16 sLilycoveLadyGfxId[] = +{ + EVENT_OBJ_GFX_WOMAN_4, + EVENT_OBJ_GFX_WOMAN_2, + EVENT_OBJ_GFX_GIRL_2 +}; + +// Quiz Lady data +static const u16 sQuizLadyQuestion1[] = +{ + EC_WORD_WHICH, + EC_WORD_STORES, + EC_WORD_INFORMATION, + EC_WORD_ON, + EC_WORD_POKEMON, + EC_WORD_QUES, + EC_WORD_CAMERA, + EC_WORD_POKEDEX, + EC_WORD_POKENAV +}; + +static const u16 sQuizLadyQuestion2[] = +{ + EC_WORD_WHICH, + EC_WORD_ISN_T, + EC_WORD_A, + EC_WORD_GAME, + EC_WORD_VERSION, + EC_WORD_QUES, + EC_WORD_RUBY, + EC_WORD_SAPPHIRE, + EC_WORD_DARK +}; + +static const u16 sQuizLadyQuestion3[] = +{ + EC_WORD_HOW, + EC_WORD_DO, + EC_WORD_POKEMON, + EC_WORD_EVOLVE, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_LEVEL, + EC_WORD_INSOMNIA, + EC_WORD_CUTE_CHARM +}; + +static const u16 sQuizLadyQuestion4[] = +{ + EC_WORD_WHICH, + EC_WORD_IS, + EC_WORD_THE, + EC_WORD_PRETTY, + EC_WORD_ITEM, + EC_WORD_QUES, + EC_WORD_COLD, + EC_WORD_FLOWERS, + EC_WORD_MACHINE +}; + +static const u16 sQuizLadyQuestion5[] = +{ + EC_WORD_WHICH, + EC_WORD_ITEM, + EC_WORD_DO, + EC_WORD_YOU, + EC_WORD_BREAK, + EC_WORD_QUES, + EC_WORD_EGG, + EC_WORD_MAIL, + EC_WORD_PHONE +}; + +static const u16 sQuizLadyQuestion6[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_WORD_STOP, + EC_MOVE2(CONFUSION), + EC_WORD_QUES, + 0xFFFF, + EC_WORD_ILLUMINATE, + EC_WORD_OWN_TEMPO, + EC_WORD_SWIFT_SWIM +}; + +static const u16 sQuizLadyQuestion7[] = +{ + EC_WORD_WHICH, + EC_WORD_OF, + EC_WORD_THESE, + EC_WORD_IS, + EC_WORD_MUSIC, + EC_WORD_QUES, + EC_WORD_FLYING, + EC_WORD_STEEL, + EC_WORD_ROCK +}; + +static const u16 sQuizLadyQuestion8[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_MOVE2(BLOCK), + EC_WORD_ESCAPE, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_RUN_AWAY, + EC_WORD_SHADOW_TAG, + EC_WORD_WONDER_GUARD +}; + +static const u16 sQuizLadyQuestion9[] = +{ + EC_WORD_WHICH, + EC_WORD_WILL, + EC_WORD_STOP, + EC_WORD_POISON, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_GUTS, + EC_WORD_IMMUNITY, + EC_WORD_SHED_SKIN +}; + +static const u16 sQuizLadyQuestion10[] = +{ + EC_WORD_WHICH, + EC_WORD_GOES, + EC_WORD_WITH, + EC_WORD_CENTER, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_POKEDEX, + EC_WORD_POKEMON, + EC_WORD_POKENAV +}; + +static const u16 sQuizLadyQuestion11[] = +{ + EC_WORD_WHICH, + EC_WORD_STORES, + EC_WORD_YOUR, + EC_WORD_POKEMON, + EC_WORD_QUES, + 0xFFFF, + EC_WORD_PC, + EC_WORD_DEPT_STORE, + EC_WORD_TELEVISION +}; + +static const u16 sQuizLadyQuestion12[] = +{ + EC_WORD_WHICH, + EC_WORD_MACHINE, + EC_WORD_GIVES, + EC_WORD_YOU, + EC_WORD_INFORMATION, + EC_WORD_QUES, + EC_WORD_BIKE, + EC_WORD_LOCOMOTIVE, + EC_WORD_TELEVISION +}; + +static const u16 sQuizLadyQuestion13[] = +{ + EC_WORD_A, + EC_WORD_POKEMON, + EC_WORD_WAS, + EC_WORD_ONCE, + EC_WORD_THIS, + EC_WORD_QUES, + EC_WORD_PHONE, + EC_WORD_PLUSH_DOLL, + EC_WORD_LETTER +}; + +static const u16 sQuizLadyQuestion14[] = +{ + EC_WORD_STEEL, + EC_WORD_IS, + EC_WORD_STRONG, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_ICE, + EC_WORD_GROUND, + 0xFFFF +}; + +static const u16 sQuizLadyQuestion15[] = +{ + EC_WORD_DARK, + EC_WORD_IS, + EC_WORD_WEAK, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_PSYCHIC, + EC_WORD_FIGHTING, + 0xFFFF +}; + +static const u16 sQuizLadyQuestion16[] = +{ + EC_WORD_GHOST, + EC_WORD_IS, + EC_WORD_WEAK, + EC_WORD_VERSUS, + EC_WORD_WHICH, + EC_WORD_QUES, + EC_WORD_NORMAL, + EC_WORD_DARK, + 0xFFFF +}; + +static const u16 *const sQuizLadyQuizQuestions[] = +{ + sQuizLadyQuestion1, + sQuizLadyQuestion2, + sQuizLadyQuestion3, + sQuizLadyQuestion4, + sQuizLadyQuestion5, + sQuizLadyQuestion6, + sQuizLadyQuestion7, + sQuizLadyQuestion8, + sQuizLadyQuestion9, + sQuizLadyQuestion10, + sQuizLadyQuestion11, + sQuizLadyQuestion12, + sQuizLadyQuestion13, + sQuizLadyQuestion14, + sQuizLadyQuestion15, + sQuizLadyQuestion16 +}; + +static const u16 sQuizLadyQuizAnswers[] = +{ + EC_WORD_POKEDEX, + EC_WORD_DARK, + EC_WORD_LEVEL, + EC_WORD_FLOWERS, + EC_WORD_EGG, + EC_WORD_OWN_TEMPO, + EC_WORD_ROCK, + EC_WORD_SHADOW_TAG, + EC_WORD_IMMUNITY, + EC_WORD_POKEMON, + EC_WORD_PC, + EC_WORD_TELEVISION, + EC_WORD_PLUSH_DOLL, + EC_WORD_ICE, + EC_WORD_FIGHTING, + EC_WORD_DARK // DARK is accepted as the correct answer despite the fact that it's wrong +}; + +static const u16 sQuizLadyPrizes[] = +{ + ITEM_GLITTER_MAIL, + ITEM_BEAD_MAIL, + ITEM_TROPIC_MAIL, + ITEM_MAX_ETHER, + ITEM_MAX_ETHER, + ITEM_MAX_ETHER, + ITEM_WATMEL_BERRY, + ITEM_BELUE_BERRY, + ITEM_DURIN_BERRY, + ITEM_LUXURY_BALL, + ITEM_TM15_HYPER_BEAM, + ITEM_BIG_PEARL, + ITEM_STAR_PIECE, + ITEM_RARE_CANDY, + ITEM_RARE_CANDY, + ITEM_PREMIER_BALL +}; + +// Favor Lady data +static const u8 *const sFavorLadyDescriptions[] = +{ + gText_FavorLady_Slippery, + gText_FavorLady_Roundish, + gText_FavorLady_Whamish, + gText_FavorLady_Shiny, + gText_FavorLady_Sticky, + gText_FavorLady_Pointy +}; + +static const u16 sFavorLadyAcceptedItems_Slippery[] = +{ + ITEM_REPEL, + ITEM_SUPER_REPEL, + ITEM_MAX_REPEL, + ITEM_ANTIDOTE, + ITEM_PARALYZE_HEAL, + ITEM_BURN_HEAL, + ITEM_BELUE_BERRY, + ITEM_AWAKENING, + ITEM_ICE_HEAL, + ITEM_REVIVE, + ITEM_MAX_REVIVE, + ITEM_ENERGY_POWDER, + ITEM_NONE +}; + +static const u16 sFavorLadyAcceptedItems_Roundish[] = +{ + ITEM_FLUFFY_TAIL, + ITEM_PEARL, + ITEM_BIG_PEARL, + ITEM_HARD_STONE, + ITEM_SMOKE_BALL, + ITEM_SHOAL_SHELL, + ITEM_TINY_MUSHROOM, + ITEM_BIG_MUSHROOM, + ITEM_PECHA_BERRY, + ITEM_ASPEAR_BERRY, + ITEM_ORAN_BERRY, + ITEM_GREPA_BERRY, + ITEM_MAGOST_BERRY, + ITEM_WATMEL_BERRY, + ITEM_POKE_BALL, + ITEM_ULTRA_BALL, + ITEM_NONE +}; + +static const u16 sFavorLadyAcceptedItems_Whamish[] = +{ + ITEM_REVIVAL_HERB, + ITEM_POTION, + ITEM_FRESH_WATER, + ITEM_SODA_POP, + ITEM_LEMONADE, + ITEM_HARD_STONE, + ITEM_LIGHT_BALL, + ITEM_LAVA_COOKIE, + ITEM_CHESTO_BERRY, + ITEM_NANAB_BERRY, + ITEM_WEPEAR_BERRY, + ITEM_KELPSY_BERRY, + ITEM_NOMEL_BERRY, + ITEM_DURIN_BERRY, + ITEM_NONE +}; + +static const u16 sFavorLadyAcceptedItems_Shiny[] = +{ + ITEM_HEAL_POWDER, + ITEM_X_SPEED, + ITEM_X_ATTACK, + ITEM_X_DEFEND, + ITEM_BLUE_FLUTE, + ITEM_YELLOW_FLUTE, + ITEM_RED_FLUTE, + ITEM_BLACK_FLUTE, + ITEM_WHITE_FLUTE, + ITEM_NUGGET, + ITEM_SUN_STONE, + ITEM_STARDUST, + ITEM_STAR_PIECE, + ITEM_PEARL, + ITEM_BIG_PEARL, + ITEM_TWISTED_SPOON, + ITEM_SILVER_POWDER, + ITEM_BRIGHT_POWDER, + ITEM_LUXURY_BALL, + ITEM_PREMIER_BALL, + ITEM_NONE +}; + +static const u16 sFavorLadyAcceptedItems_Sticky[] = +{ + ITEM_ENERGY_ROOT, + ITEM_FULL_RESTORE, + ITEM_MAX_POTION, + ITEM_DIRE_HIT, + ITEM_X_ACCURACY, + ITEM_GUARD_SPEC, + ITEM_WATMEL_BERRY, + ITEM_LEFTOVERS, + ITEM_TINY_MUSHROOM, + ITEM_HEART_SCALE, + ITEM_NONE +}; + +static const u16 sFavorLadyAcceptedItems_Pointy[] = +{ + ITEM_QUICK_CLAW, + ITEM_POISON_BARB, + ITEM_SHARP_BEAK, + ITEM_DRAGON_FANG, + ITEM_TAMATO_BERRY, + ITEM_DURIN_BERRY, + ITEM_PETAYA_BERRY, + ITEM_SALAC_BERRY, + ITEM_STARDUST, + ITEM_STAR_PIECE, + ITEM_NONE +}; + +static const u16 *const sFavorLadyAcceptedItemLists[] = +{ + sFavorLadyAcceptedItems_Slippery, + sFavorLadyAcceptedItems_Roundish, + sFavorLadyAcceptedItems_Whamish, + sFavorLadyAcceptedItems_Shiny, + sFavorLadyAcceptedItems_Sticky, + sFavorLadyAcceptedItems_Pointy +}; + +static const u16 sFavorLadyPrizes[] = +{ + ITEM_LUXURY_BALL, + ITEM_NUGGET, + ITEM_PROTEIN, + ITEM_HEART_SCALE, + ITEM_RARE_CANDY, + ITEM_PP_MAX +}; + + +static const u8 *const sContestLadyMonNames[] = +{ + gText_ContestLady_Handsome, + gText_ContestLady_Vinny, + gText_ContestLady_Moreme, + gText_ContestLady_Ironhard, + gText_ContestLady_Muscle +}; + +static const u8 *const sContestLadyCategoryNames[] = +{ + gText_ContestLady_Coolness, + gText_ContestLady_Beauty, + gText_ContestLady_Cuteness, + gText_ContestLady_Smartness, + gText_ContestLady_Toughness +}; + +static const u8 *const sContestNames[] = +{ + gText_CoolnessContest, + gText_BeautyContest, + gText_CutenessContest, + gText_SmartnessContest, + gText_ToughnessContest +}; + +static const u16 sContestLadyMonSpecies[] = +{ + SPECIES_ZIGZAGOON, + SPECIES_SKITTY, + SPECIES_POOCHYENA, + SPECIES_KECLEON, + SPECIES_PIKACHU +}; diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index ef43841ef..b4a056eb3 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -17,11 +17,10 @@ #include "contest.h" #include "berry.h" #include "strings.h" -#include "constants/easy_chat.h" -#include "constants/event_objects.h" -#include "constants/items.h" -#include "constants/species.h" -#include "constants/moves.h" + +// TODO use array count macro? +#define QUIZ_QUESTION_LEN 9 +#define QUIZ_QUESTION_NUM 16 enum { @@ -37,8 +36,8 @@ enum QUIZ_PHASE_GIVE_PRIZE }; +#include "data/lilycove_lady.h" -//TODO name phases static void InitLilycoveQuizLady(void); static void InitLilycoveFavorLady(void); @@ -50,473 +49,7 @@ static u8 BufferAuthorName(void); static bool8 IsQuizTrainerIdNotPlayer(void); static u8 GetPlayerNameLength(const u8 *); -static const u16 sContestLadyMonGfxId[] = -{ - EVENT_OBJ_GFX_ZIGZAGOON_1, - EVENT_OBJ_GFX_SKITTY, - EVENT_OBJ_GFX_POOCHYENA, - EVENT_OBJ_GFX_KECLEON_1, - EVENT_OBJ_GFX_PIKACHU -}; - -static const u16 sLilycoveLadyGfxId[] = -{ - EVENT_OBJ_GFX_WOMAN_4, - EVENT_OBJ_GFX_WOMAN_2, - EVENT_OBJ_GFX_GIRL_2 -}; - -// Quiz Lady data -static const u16 sQuizLadyQuestion1[] = -{ - EC_WORD_WHICH, - EC_WORD_STORES, - EC_WORD_INFORMATION, - EC_WORD_ON, - EC_WORD_POKEMON, - EC_WORD_QUES, - EC_WORD_CAMERA, - EC_WORD_POKEDEX, - EC_WORD_POKENAV -}; - -static const u16 sQuizLadyQuestion2[] = -{ - EC_WORD_WHICH, - EC_WORD_ISN_T, - EC_WORD_A, - EC_WORD_GAME, - EC_WORD_VERSION, - EC_WORD_QUES, - EC_WORD_RUBY, - EC_WORD_SAPPHIRE, - EC_WORD_DARK -}; - -static const u16 sQuizLadyQuestion3[] = -{ - EC_WORD_HOW, - EC_WORD_DO, - EC_WORD_POKEMON, - EC_WORD_EVOLVE, - EC_WORD_QUES, - 0xFFFF, - EC_WORD_LEVEL, - EC_WORD_INSOMNIA, - EC_WORD_CUTE_CHARM -}; - -static const u16 sQuizLadyQuestion4[] = -{ - EC_WORD_WHICH, - EC_WORD_IS, - EC_WORD_THE, - EC_WORD_PRETTY, - EC_WORD_ITEM, - EC_WORD_QUES, - EC_WORD_COLD, - EC_WORD_FLOWERS, - EC_WORD_MACHINE -}; - -static const u16 sQuizLadyQuestion5[] = -{ - EC_WORD_WHICH, - EC_WORD_ITEM, - EC_WORD_DO, - EC_WORD_YOU, - EC_WORD_BREAK, - EC_WORD_QUES, - EC_WORD_EGG, - EC_WORD_MAIL, - EC_WORD_PHONE -}; - -static const u16 sQuizLadyQuestion6[] = -{ - EC_WORD_WHICH, - EC_WORD_WILL, - EC_WORD_STOP, - EC_MOVE2(CONFUSION), - EC_WORD_QUES, - 0xFFFF, - EC_WORD_ILLUMINATE, - EC_WORD_OWN_TEMPO, - EC_WORD_SWIFT_SWIM -}; - -static const u16 sQuizLadyQuestion7[] = -{ - EC_WORD_WHICH, - EC_WORD_OF, - EC_WORD_THESE, - EC_WORD_IS, - EC_WORD_MUSIC, - EC_WORD_QUES, - EC_WORD_FLYING, - EC_WORD_STEEL, - EC_WORD_ROCK -}; - -static const u16 sQuizLadyQuestion8[] = -{ - EC_WORD_WHICH, - EC_WORD_WILL, - EC_MOVE2(BLOCK), - EC_WORD_ESCAPE, - EC_WORD_QUES, - 0xFFFF, - EC_WORD_RUN_AWAY, - EC_WORD_SHADOW_TAG, - EC_WORD_WONDER_GUARD -}; - -static const u16 sQuizLadyQuestion9[] = -{ - EC_WORD_WHICH, - EC_WORD_WILL, - EC_WORD_STOP, - EC_WORD_POISON, - EC_WORD_QUES, - 0xFFFF, - EC_WORD_GUTS, - EC_WORD_IMMUNITY, - EC_WORD_SHED_SKIN -}; -static const u16 sQuizLadyQuestion10[] = -{ - EC_WORD_WHICH, - EC_WORD_GOES, - EC_WORD_WITH, - EC_WORD_CENTER, - EC_WORD_QUES, - 0xFFFF, - EC_WORD_POKEDEX, - EC_WORD_POKEMON, - EC_WORD_POKENAV -}; - -static const u16 sQuizLadyQuestion11[] = -{ - EC_WORD_WHICH, - EC_WORD_STORES, - EC_WORD_YOUR, - EC_WORD_POKEMON, - EC_WORD_QUES, - 0xFFFF, - EC_WORD_PC, - EC_WORD_DEPT_STORE, - EC_WORD_TELEVISION -}; - -static const u16 sQuizLadyQuestion12[] = -{ - EC_WORD_WHICH, - EC_WORD_MACHINE, - EC_WORD_GIVES, - EC_WORD_YOU, - EC_WORD_INFORMATION, - EC_WORD_QUES, - EC_WORD_BIKE, - EC_WORD_LOCOMOTIVE, - EC_WORD_TELEVISION -}; - -static const u16 sQuizLadyQuestion13[] = -{ - EC_WORD_A, - EC_WORD_POKEMON, - EC_WORD_WAS, - EC_WORD_ONCE, - EC_WORD_THIS, - EC_WORD_QUES, - EC_WORD_PHONE, - EC_WORD_PLUSH_DOLL, - EC_WORD_LETTER -}; - -static const u16 sQuizLadyQuestion14[] = -{ - EC_WORD_STEEL, - EC_WORD_IS, - EC_WORD_STRONG, - EC_WORD_VERSUS, - EC_WORD_WHICH, - EC_WORD_QUES, - EC_WORD_ICE, - EC_WORD_GROUND, - 0xFFFF -}; - -static const u16 sQuizLadyQuestion15[] = -{ - EC_WORD_DARK, - EC_WORD_IS, - EC_WORD_WEAK, - EC_WORD_VERSUS, - EC_WORD_WHICH, - EC_WORD_QUES, - EC_WORD_PSYCHIC, - EC_WORD_FIGHTING, - 0xFFFF -}; - -static const u16 sQuizLadyQuestion16[] = -{ - EC_WORD_GHOST, - EC_WORD_IS, - EC_WORD_WEAK, - EC_WORD_VERSUS, - EC_WORD_WHICH, - EC_WORD_QUES, - EC_WORD_NORMAL, - EC_WORD_DARK, - 0xFFFF -}; - -static const u16 *const sQuizLadyQuizQuestions[] = -{ - sQuizLadyQuestion1, - sQuizLadyQuestion2, - sQuizLadyQuestion3, - sQuizLadyQuestion4, - sQuizLadyQuestion5, - sQuizLadyQuestion6, - sQuizLadyQuestion7, - sQuizLadyQuestion8, - sQuizLadyQuestion9, - sQuizLadyQuestion10, - sQuizLadyQuestion11, - sQuizLadyQuestion12, - sQuizLadyQuestion13, - sQuizLadyQuestion14, - sQuizLadyQuestion15, - sQuizLadyQuestion16 -}; - -static const u16 sQuizLadyQuizAnswers[] = -{ - EC_WORD_POKEDEX, - EC_WORD_DARK, - EC_WORD_LEVEL, - EC_WORD_FLOWERS, - EC_WORD_EGG, - EC_WORD_OWN_TEMPO, - EC_WORD_ROCK, - EC_WORD_SHADOW_TAG, - EC_WORD_IMMUNITY, - EC_WORD_POKEMON, - EC_WORD_PC, - EC_WORD_TELEVISION, - EC_WORD_PLUSH_DOLL, - EC_WORD_ICE, - EC_WORD_FIGHTING, - EC_WORD_DARK // DARK is accepted as the correct answer despite the fact that it's wrong -}; - -static const u16 sQuizLadyPrizes[] = -{ - ITEM_GLITTER_MAIL, - ITEM_BEAD_MAIL, - ITEM_TROPIC_MAIL, - ITEM_MAX_ETHER, - ITEM_MAX_ETHER, - ITEM_MAX_ETHER, - ITEM_WATMEL_BERRY, - ITEM_BELUE_BERRY, - ITEM_DURIN_BERRY, - ITEM_LUXURY_BALL, - ITEM_TM15_HYPER_BEAM, - ITEM_BIG_PEARL, - ITEM_STAR_PIECE, - ITEM_RARE_CANDY, - ITEM_RARE_CANDY, - ITEM_PREMIER_BALL -}; - -#define QUIZ_QUESTION_LEN 9 -#define QUIZ_QUESTION_NUM 16 - -// Favor Lady data -static const u8 *const sFavorLadyDescriptions[] = -{ - gText_FavorLady_Slippery, - gText_FavorLady_Roundish, - gText_FavorLady_Whamish, - gText_FavorLady_Shiny, - gText_FavorLady_Sticky, - gText_FavorLady_Pointy -}; - -static const u16 sFavorLadyAcceptedItems_Slippery[] = -{ - ITEM_REPEL, - ITEM_SUPER_REPEL, - ITEM_MAX_REPEL, - ITEM_ANTIDOTE, - ITEM_PARALYZE_HEAL, - ITEM_BURN_HEAL, - ITEM_BELUE_BERRY, - ITEM_AWAKENING, - ITEM_ICE_HEAL, - ITEM_REVIVE, - ITEM_MAX_REVIVE, - ITEM_ENERGY_POWDER, - ITEM_NONE -}; - -static const u16 sFavorLadyAcceptedItems_Roundish[] = -{ - ITEM_FLUFFY_TAIL, - ITEM_PEARL, - ITEM_BIG_PEARL, - ITEM_HARD_STONE, - ITEM_SMOKE_BALL, - ITEM_SHOAL_SHELL, - ITEM_TINY_MUSHROOM, - ITEM_BIG_MUSHROOM, - ITEM_PECHA_BERRY, - ITEM_ASPEAR_BERRY, - ITEM_ORAN_BERRY, - ITEM_GREPA_BERRY, - ITEM_MAGOST_BERRY, - ITEM_WATMEL_BERRY, - ITEM_POKE_BALL, - ITEM_ULTRA_BALL, - ITEM_NONE -}; - -static const u16 sFavorLadyAcceptedItems_Whamish[] = -{ - ITEM_REVIVAL_HERB, - ITEM_POTION, - ITEM_FRESH_WATER, - ITEM_SODA_POP, - ITEM_LEMONADE, - ITEM_HARD_STONE, - ITEM_LIGHT_BALL, - ITEM_LAVA_COOKIE, - ITEM_CHESTO_BERRY, - ITEM_NANAB_BERRY, - ITEM_WEPEAR_BERRY, - ITEM_KELPSY_BERRY, - ITEM_NOMEL_BERRY, - ITEM_DURIN_BERRY, - ITEM_NONE -}; - -static const u16 sFavorLadyAcceptedItems_Shiny[] = -{ - ITEM_HEAL_POWDER, - ITEM_X_SPEED, - ITEM_X_ATTACK, - ITEM_X_DEFEND, - ITEM_BLUE_FLUTE, - ITEM_YELLOW_FLUTE, - ITEM_RED_FLUTE, - ITEM_BLACK_FLUTE, - ITEM_WHITE_FLUTE, - ITEM_NUGGET, - ITEM_SUN_STONE, - ITEM_STARDUST, - ITEM_STAR_PIECE, - ITEM_PEARL, - ITEM_BIG_PEARL, - ITEM_TWISTED_SPOON, - ITEM_SILVER_POWDER, - ITEM_BRIGHT_POWDER, - ITEM_LUXURY_BALL, - ITEM_PREMIER_BALL, - ITEM_NONE -}; - -static const u16 sFavorLadyAcceptedItems_Sticky[] = -{ - ITEM_ENERGY_ROOT, - ITEM_FULL_RESTORE, - ITEM_MAX_POTION, - ITEM_DIRE_HIT, - ITEM_X_ACCURACY, - ITEM_GUARD_SPEC, - ITEM_WATMEL_BERRY, - ITEM_LEFTOVERS, - ITEM_TINY_MUSHROOM, - ITEM_HEART_SCALE, - ITEM_NONE -}; - -static const u16 sFavorLadyAcceptedItems_Pointy[] = -{ - ITEM_QUICK_CLAW, - ITEM_POISON_BARB, - ITEM_SHARP_BEAK, - ITEM_DRAGON_FANG, - ITEM_TAMATO_BERRY, - ITEM_DURIN_BERRY, - ITEM_PETAYA_BERRY, - ITEM_SALAC_BERRY, - ITEM_STARDUST, - ITEM_STAR_PIECE, - ITEM_NONE -}; - -static const u16 *const sFavorLadyAcceptedItemLists[] = -{ - sFavorLadyAcceptedItems_Slippery, - sFavorLadyAcceptedItems_Roundish, - sFavorLadyAcceptedItems_Whamish, - sFavorLadyAcceptedItems_Shiny, - sFavorLadyAcceptedItems_Sticky, - sFavorLadyAcceptedItems_Pointy -}; - -static const u16 sFavorLadyPrizes[] = -{ - ITEM_LUXURY_BALL, - ITEM_NUGGET, - ITEM_PROTEIN, - ITEM_HEART_SCALE, - ITEM_RARE_CANDY, - ITEM_PP_MAX -}; - - -static const u8 *const sContestLadyMonNames[] = -{ - gText_ContestLady_Handsome, - gText_ContestLady_Vinny, - gText_ContestLady_Moreme, - gText_ContestLady_Ironhard, - gText_ContestLady_Muscle -}; - -static const u8 *const sContestLadyCategoryNames[] = -{ - gText_ContestLady_Coolness, - gText_ContestLady_Beauty, - gText_ContestLady_Cuteness, - gText_ContestLady_Smartness, - gText_ContestLady_Toughness -}; - -static const u8 *const sContestNames[] = -{ - gText_CoolnessContest, - gText_BeautyContest, - gText_CutenessContest, - gText_SmartnessContest, - gText_ToughnessContest -}; - -static const u16 sContestLadyMonSpecies[] = -{ - SPECIES_ZIGZAGOON, - SPECIES_SKITTY, - SPECIES_POOCHYENA, - SPECIES_KECLEON, - SPECIES_PIKACHU -}; static EWRAM_DATA struct LilycoveLadyFavor *sFavorLadyPtr = NULL; static EWRAM_DATA struct LilycoveLadyQuiz *sQuizLadyPtr = NULL; @@ -1223,27 +756,27 @@ bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock) return response; } -static void sub_818E794(u8 *dest1, u8 *dest2) //sub_818E794 +static void BufferContestLadyCategoryAndMonName(u8 *dest1, u8 *dest2) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; StringCopy(dest1, sContestLadyCategoryNames[sContestLadyPtr->category]); StringCopy10(dest2, sContestLadyMonNames[sContestLadyPtr->category]); } -void sub_818E7E0(u8 *dest1, u8 *dest2) +void BufferContestLadyMonName(u8 *dest1, u8 *dest2) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; *dest1 = sContestLadyPtr->category; StringCopy(dest2, sContestLadyMonNames[sContestLadyPtr->category]); } -void sub_818E81C(u8 *dest) +void BufferContestLadyPlayerName(u8 *dest) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; StringCopy(dest, sContestLadyPtr->playerName); } -void sub_818E848(u8 *dest) +void BufferContestLadyLanguage(u8 *dest) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; *dest = sContestLadyPtr->language; @@ -1298,7 +831,7 @@ bool8 sub_818E8E0(void) // called when mon enjoys pokeblock void sub_818E914(void) { - sub_818E794(gStringVar2, gStringVar1); + BufferContestLadyCategoryAndMonName(gStringVar2, gStringVar1); } void OpenPokeblockCaseForContestLady(void) diff --git a/src/tv.c b/src/tv.c index ad3a4f315..ef826a4af 100644 --- a/src/tv.c +++ b/src/tv.c @@ -1657,12 +1657,12 @@ void PutLilycoveContestLadyShowOnTheAir(void) if (gSpecialVar_Result != TRUE) { show = &gSaveBlock1Ptr->tvShows[sCurTVShowSlot]; - sub_818E848(&show->contestLiveUpdates2.language); + BufferContestLadyLanguage(&show->contestLiveUpdates2.language); show->contestLiveUpdates2.pokemonNameLanguage = LANGUAGE_ENGLISH; show->contestLiveUpdates2.kind = TVSHOW_CONTEST_LIVE_UPDATES_2; show->contestLiveUpdates2.active = TRUE; - sub_818E81C(show->contestLiveUpdates2.playerName); - sub_818E7E0(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname); + BufferContestLadyPlayerName(show->contestLiveUpdates2.playerName); + BufferContestLadyMonName(&show->contestLiveUpdates2.contestCategory, show->contestLiveUpdates2.nickname); show->contestLiveUpdates2.pokeblockState = sub_818E880(); tv_store_id_2x(show); } -- cgit v1.2.3 From 7fc99f39525a89aa0f3158b98bc61e709bebdfa2 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Sun, 4 Aug 2019 23:12:49 -0400 Subject: favor lady funcs --- data/event_scripts.s | 30 ++++---- data/specials.inc | 28 ++++---- include/global.h | 13 ++-- include/lilycove_lady.h | 4 +- src/lilycove_lady.c | 186 +++++++++++++++++++++++++----------------------- src/new_game.c | 2 +- src/record_mixing.c | 2 +- 7 files changed, 138 insertions(+), 127 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 50eb0dac0..397cbd503 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -4292,7 +4292,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8395:: @ 82A8395 lock faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A69, MSGBOX_DEFAULT - specialvar VAR_RESULT, sub_818DBE8 + specialvar VAR_RESULT, GetFavorLadyState compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A83D0 compare VAR_RESULT, 1 @@ -4317,9 +4317,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A83D0:: @ 82A83D0 end LilycoveCity_PokemonCenter_1F_EventScript_2A83F7:: @ 82A83F7 - special sub_818DCC8 - special sub_818DD14 - specialvar VAR_RESULT, sub_818DD54 + special BufferFavorLadyItemName + special BufferFavorLadyPlayerName + specialvar VAR_RESULT, DidFavorLadyLikeItem compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8419 compare VAR_RESULT, 1 @@ -4357,7 +4357,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A845E:: @ 82A845E LilycoveCity_PokemonCenter_1F_EventScript_2A846C:: @ 82A846C fadescreen 1 setvar VAR_RESULT, 0 - special OpenBagMenuForFavorLady + special FavorLadyOpenBagMenu waitstate compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A848E @@ -4374,7 +4374,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A848E:: @ 82A848E end LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD - specialvar VAR_RESULT, sub_818DE44 + specialvar VAR_RESULT, Script_ShowFavorLadyItem compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84C9 compare VAR_RESULT, 1 @@ -4388,7 +4388,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84C9:: @ 82A84C9 end LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6 - specialvar VAR_RESULT, sub_818DE5C + specialvar VAR_RESULT, DidFavorLadyLoveItem compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84F2 compare VAR_RESULT, 1 @@ -4409,7 +4409,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84FF:: @ 82A84FF LilycoveCity_PokemonCenter_1F_EventScript_2A8510:: @ 82A8510 setvar VAR_0x8004, 0 - specialvar VAR_0x8004, sub_818DEA0 + specialvar VAR_0x8004, FavorLadyGetPrize msgbox LilycoveCity_PokemonCenter_1F_Text_2A8D5D, MSGBOX_DEFAULT giveitem_std VAR_0x8004 compare VAR_RESULT, 0 @@ -4424,7 +4424,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8545:: @ 82A8545 end LilycoveCity_PokemonCenter_1F_EventScript_2A854F:: @ 82A854F - special sub_818DEDC + special SetFavorLadyState_Complete release end @@ -4432,7 +4432,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8554:: @ 82A8554 lock faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A8E2B, MSGBOX_DEFAULT - specialvar VAR_RESULT, GetQuizLadyPhase + specialvar VAR_RESULT, GetQuizLadyState compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8585 compare VAR_RESULT, 1 @@ -4442,7 +4442,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8554:: @ 82A8554 end LilycoveCity_PokemonCenter_1F_EventScript_2A8585:: @ 82A8585 - specialvar VAR_RESULT, sub_818E06C + specialvar VAR_RESULT, GetQuizAuthor compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85C8 compare VAR_RESULT, 1 @@ -4509,7 +4509,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A864C:: @ 82A864C end LilycoveCity_PokemonCenter_1F_EventScript_2A8656:: @ 82A8656 - special sub_818E2FC + special QuizLadyShowEasyChatScreen waitstate goto LilycoveCity_PokemonCenter_1F_EventScript_2A8635 end @@ -4528,7 +4528,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A867F:: @ 82A867F end LilycoveCity_PokemonCenter_1F_EventScript_2A8689:: @ 82A8689 - special SetQuizLadyPhase_MakeYourOwn + special SetQuizLadyState_Complete msgbox LilycoveCity_PokemonCenter_1F_Text_2A8F4D, MSGBOX_DEFAULT specialvar VAR_RESULT, sub_818E308 compare VAR_RESULT, 0 @@ -4577,7 +4577,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8716:: @ 82A8716 LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724 setvar VAR_0x8005, 0 special BufferQuizPrizeItem - special SetQuizLadyPhase_MakeYourOwn + special SetQuizLadyState_Complete giveitem_std VAR_0x8005 compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A874C @@ -4586,7 +4586,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8724:: @ 82A8724 LilycoveCity_PokemonCenter_1F_EventScript_2A874C:: @ 82A874C msgbox LilycoveCity_PokemonCenter_1F_Text_2A906A, MSGBOX_DEFAULT - special SetQuizLadyPhase_GivePrize + special SetQuizLadyState_GivePrize release end diff --git a/data/specials.inc b/data/specials.inc index 5c2eaa760..ac25698e4 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -374,27 +374,27 @@ gSpecials:: @ 81DBA64 def_special SetSecretBaseSecretsTvFlags_Poster def_special SetLilycoveLadyGfx def_special Script_GetLilycoveLadyId - def_special sub_818DBE8 + def_special GetFavorLadyState def_special BufferFavorLadyDescription def_special sub_818DC60 - def_special sub_818DCC8 - def_special sub_818DD14 - def_special sub_818DD54 - def_special OpenBagMenuForFavorLady - def_special sub_818DE44 - def_special sub_818DE5C - def_special sub_818DEA0 - def_special sub_818DEDC - def_special GetQuizLadyPhase - def_special sub_818E06C + def_special BufferFavorLadyItemName + def_special BufferFavorLadyPlayerName + def_special DidFavorLadyLikeItem + def_special FavorLadyOpenBagMenu + def_special Script_ShowFavorLadyItem + def_special DidFavorLadyLoveItem + def_special FavorLadyGetPrize + def_special SetFavorLadyState_Complete + def_special GetQuizLadyState + def_special GetQuizAuthor def_special IsQuizLadyWaitingForChallenger def_special sub_811A858 - def_special sub_818E2FC + def_special QuizLadyShowEasyChatScreen def_special sub_818E308 def_special BufferQuizPrizeItem - def_special SetQuizLadyPhase_MakeYourOwn + def_special SetQuizLadyState_Complete def_special sub_818E298 - def_special SetQuizLadyPhase_GivePrize + def_special SetQuizLadyState_GivePrize def_special ClearQuizLadyResponse def_special sub_818E3E0 def_special sub_818E430 diff --git a/include/global.h b/include/global.h index a25100bd9..a055cb2c0 100644 --- a/include/global.h +++ b/include/global.h @@ -741,13 +741,14 @@ enum { LILYCOVE_LADY_QUIZ, LILYCOVE_LADY_FAVOR, - LILYCOVE_LADY_CONTEST + LILYCOVE_LADY_CONTEST, + LILYCOVE_LADY_COUNT }; struct LilycoveLadyQuiz { /*0x000*/ u8 id; - /*0x001*/ u8 phase; + /*0x001*/ u8 state; /*0x002*/ u16 question[9]; /*0x014*/ u16 answer; /*0x016*/ u16 response; @@ -763,13 +764,13 @@ struct LilycoveLadyQuiz struct LilycoveLadyFavor { /*0x000*/ u8 id; - /*0x001*/ u8 phase; - /*0x002*/ u8 unk_002; - /*0x003*/ u8 unk_003; + /*0x001*/ u8 state; + /*0x002*/ bool8 likedItem; + /*0x003*/ u8 numItemsGiven; /*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x00c*/ u8 favorId; /*0x00e*/ u16 itemId; - /*0x010*/ u16 unk_010; + /*0x010*/ u16 bestItem; /*0x012*/ u8 language; }; diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h index dde78b8d8..959878ac9 100644 --- a/include/lilycove_lady.h +++ b/include/lilycove_lady.h @@ -2,8 +2,8 @@ #define GUARD_LILYCOVE_LADY_H u8 GetLilycoveLadyId(void); -void SetLilycoveLady(void); -void sub_818DA78(void); +void InitLilycoveLady(void); +void ReadyLilycoveLady(void); void sub_818DEF4(void); void sub_818E564(void); void sub_818E570(const LilycoveLady *lilycoveLady); diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index b4a056eb3..77641b98f 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -18,9 +18,16 @@ #include "berry.h" #include "strings.h" -// TODO use array count macro? -#define QUIZ_QUESTION_LEN 9 -#define QUIZ_QUESTION_NUM 16 +// TODO use array count macro? +#define QUIZ_QUESTION_LEN 9 //len of sQuizLadyQuestion# +#define NUM_QUIZ_QUESTIONS 16 //len of sQuizLadyQuizQuestions +#define FAVOR_DESCRIPTION_NUM 6 //len of sFavorLadyDescriptions + +// TODO not a great name? The number of successes required to receive +// an item from the favor lady. Reached automatically if the randomly +// selected 'best' item is given to her +#define FAVOR_GIFT_MAX 5 + enum { @@ -31,26 +38,24 @@ enum enum { - QUIZ_PHASE_ATTEMPT_QUIZ, - QUIZ_PHASE_MAKE_YOUR_OWN, - QUIZ_PHASE_GIVE_PRIZE + LILYCOVE_LADY_STATE_READY, + LILYCOVE_LADY_STATE_COMPLETED, + LILYCOVE_LADY_STATE_PRIZE }; -#include "data/lilycove_lady.h" +#include "data/lilycove_lady.h" static void InitLilycoveQuizLady(void); static void InitLilycoveFavorLady(void); static void InitLilycoveContestLady(void); -static void sub_818E004(void); -static void sub_818DBC4(void); -static void sub_818E674(void); +static void ReadyQuizLady(void); +static void ReadyFavorLady(void); +static void ReadyContestLady(void); static u8 BufferAuthorName(void); static bool8 IsQuizTrainerIdNotPlayer(void); static u8 GetPlayerNameLength(const u8 *); - - static EWRAM_DATA struct LilycoveLadyFavor *sFavorLadyPtr = NULL; static EWRAM_DATA struct LilycoveLadyQuiz *sQuizLadyPtr = NULL; static EWRAM_DATA struct LilycoveLadyContest *sContestLadyPtr = NULL; @@ -79,12 +84,12 @@ void SetLilycoveLadyGfx(void) } } -void SetLilycoveLady(void) +void InitLilycoveLady(void) { u16 id; id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]); - id %= 6; + id %= 6; //TODO num lilycove ladies * 2. constant? id >>= 1; switch (id) { @@ -100,28 +105,30 @@ void SetLilycoveLady(void) } } -void sub_818DA78(void) +// Used after mixing records +void ReadyLilycoveLady(void) { switch (GetLilycoveLadyId()) { case LILYCOVE_LADY_QUIZ: - sub_818E004(); + ReadyQuizLady(); break; case LILYCOVE_LADY_FAVOR: - sub_818DBC4(); + ReadyFavorLady(); break; case LILYCOVE_LADY_CONTEST: - sub_818E674(); + ReadyContestLady(); break; } } -void SetLilycoveLadyRandomly(void) +// Unused? +void InitLilycoveLadyRandomly(void) { - u8 id; + u8 lady; - id = Random() % 3; - switch (id) + lady = Random() % LILYCOVE_LADY_COUNT; + switch (lady) { case LILYCOVE_LADY_QUIZ: InitLilycoveQuizLady(); @@ -148,51 +155,51 @@ static u8 GetNumAcceptedItems(const u16 *itemsArray) return items; } -static void sub_818DB20(void) +static void FavorLadyPickFavorAndBestItem(void) { u8 size; u8 idx; - sFavorLadyPtr->favorId = Random() % 6; + sFavorLadyPtr->favorId = Random() % FAVOR_DESCRIPTION_NUM; size = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); idx = Random() % size; - sFavorLadyPtr->unk_010 = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][idx]; + sFavorLadyPtr->bestItem = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][idx]; } static void InitLilycoveFavorLady(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR; - sFavorLadyPtr->phase = 0; + sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY; sFavorLadyPtr->playerName[0] = EOS; - sFavorLadyPtr->unk_002 = 0; - sFavorLadyPtr->unk_003= 0; + sFavorLadyPtr->likedItem = FALSE; + sFavorLadyPtr->numItemsGiven = 0; sFavorLadyPtr->itemId = ITEM_NONE; sFavorLadyPtr->language = gGameLanguage; - sub_818DB20(); + FavorLadyPickFavorAndBestItem(); } -static void sub_818DBC4(void) +static void ReadyFavorLady(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR; - sFavorLadyPtr->phase = 0; + sFavorLadyPtr->state = LILYCOVE_LADY_STATE_READY; } -u8 sub_818DBE8(void) +u8 GetFavorLadyState(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - if (sFavorLadyPtr->phase == 2) + if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE) { - return 2; + return LILYCOVE_LADY_STATE_PRIZE; } - else if (sFavorLadyPtr->phase == 1) + else if (sFavorLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED) { - return 1; + return LILYCOVE_LADY_STATE_COMPLETED; } else { - return 0; + return LILYCOVE_LADY_STATE_READY; } } @@ -224,80 +231,82 @@ static void BufferItemName(u8 *dest, u16 itemId) StringCopy(dest, ItemId_GetName(itemId)); } -void sub_818DCC8(void) +void BufferFavorLadyItemName(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; BufferItemName(gStringVar2, sFavorLadyPtr->itemId); } -static void sub_818DCF4(const u8 *src, u8 *dest) +static void SetFavorLadyPlayerName(const u8 *src, u8 *dest) { memset(dest, 0xFF, 8); StringCopy7(dest, src); } -void sub_818DD14(void) +void BufferFavorLadyPlayerName(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - sub_818DCF4(sFavorLadyPtr->playerName, gStringVar3); + SetFavorLadyPlayerName(sFavorLadyPtr->playerName, gStringVar3); ConvertInternationalString(gStringVar3, sFavorLadyPtr->language); } -bool8 sub_818DD54(void) +bool8 DidFavorLadyLikeItem(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - return sFavorLadyPtr->unk_002 ? TRUE : FALSE; + return sFavorLadyPtr->likedItem ? TRUE : FALSE; } -void OpenBagMenuForFavorLady(void) +void FavorLadyOpenBagMenu(void) { sub_81AAC50(); } -static bool8 sub_818DD84(u16 itemId) +//TODO rename? +static bool8 ShowFavorLadyItem(u16 itemId) { u8 numItems; u8 i; - bool8 response; + bool8 likedItem; sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); - sFavorLadyPtr->phase = 1; + sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED; BufferItemName(gStringVar2, itemId); sFavorLadyPtr->itemId = itemId; - sub_818DCF4(gSaveBlock2Ptr->playerName, sFavorLadyPtr->playerName); + SetFavorLadyPlayerName(gSaveBlock2Ptr->playerName, sFavorLadyPtr->playerName); sFavorLadyPtr->language = gGameLanguage; - response = FALSE; + likedItem = FALSE; for (i = 0; i < numItems; i ++) { if (sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][i] == itemId) { - response = TRUE; - sFavorLadyPtr->unk_003 ++; - sFavorLadyPtr->unk_002 = 1; - if (sFavorLadyPtr->unk_010 == itemId) + likedItem = TRUE; + sFavorLadyPtr->numItemsGiven++; + sFavorLadyPtr->likedItem = TRUE; + if (sFavorLadyPtr->bestItem == itemId) { - sFavorLadyPtr->unk_003 = 5; + sFavorLadyPtr->numItemsGiven = FAVOR_GIFT_MAX; } break; } - sFavorLadyPtr->unk_002 = 0; + sFavorLadyPtr->likedItem = FALSE; } - return response; + return likedItem; } -bool8 sub_818DE44(void) +bool8 Script_ShowFavorLadyItem(void) { - return sub_818DD84(gSpecialVar_ItemId); + return ShowFavorLadyItem(gSpecialVar_ItemId); } -bool8 sub_818DE5C(void) +//was item given the best item / have they given her 5 items +bool8 DidFavorLadyLoveItem(void) { u8 checkval; sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - checkval = sFavorLadyPtr->unk_003; - return checkval < 5 ? FALSE : TRUE; + checkval = sFavorLadyPtr->numItemsGiven; + return checkval < FAVOR_GIFT_MAX ? FALSE : TRUE; } static void BufferPrizeName(u16 itemId) @@ -305,21 +314,21 @@ static void BufferPrizeName(u16 itemId) BufferItemName(gStringVar2, itemId); } -u16 sub_818DEA0(void) +u16 FavorLadyGetPrize(void) { u16 itemId; sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; itemId = sFavorLadyPrizes[sFavorLadyPtr->favorId]; BufferPrizeName(itemId); - sFavorLadyPtr->phase = 2; + sFavorLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE; return itemId; } -void sub_818DEDC(void) +void SetFavorLadyState_Complete(void) { InitLilycoveFavorLady(); - sFavorLadyPtr->phase = 1; + sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED; } void sub_818DEF4(void) @@ -332,7 +341,7 @@ static void PickQuizQuestion(void) u8 questionId; u8 i; - questionId = Random() % QUIZ_QUESTION_NUM; + questionId = Random() % NUM_QUIZ_QUESTIONS; for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i]; @@ -349,7 +358,7 @@ static void InitLilycoveQuizLady(void) sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ; - sQuizLadyPtr->phase = QUIZ_PHASE_ATTEMPT_QUIZ; + sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY; for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { sQuizLadyPtr->question[i] = -1; @@ -362,41 +371,42 @@ static void InitLilycoveQuizLady(void) } sQuizLadyPtr->itemId = ITEM_NONE; sQuizLadyPtr->waitingForChallenger = FALSE; - sQuizLadyPtr->prevQuestionId = QUIZ_QUESTION_NUM; + sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; sQuizLadyPtr->language = gGameLanguage; PickQuizQuestion(); } -static void sub_818E004(void) +static void ReadyQuizLady(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ; - sQuizLadyPtr->phase = QUIZ_PHASE_ATTEMPT_QUIZ; + sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY; sQuizLadyPtr->waitingForChallenger = FALSE; sQuizLadyPtr->response = -1; } -u8 GetQuizLadyPhase(void) +u8 GetQuizLadyState(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (sQuizLadyPtr->phase == QUIZ_PHASE_GIVE_PRIZE) + if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_PRIZE) { - return QUIZ_PHASE_GIVE_PRIZE; + return LILYCOVE_LADY_STATE_PRIZE; } - else if (sQuizLadyPtr->phase == QUIZ_PHASE_MAKE_YOUR_OWN) + else if (sQuizLadyPtr->state == LILYCOVE_LADY_STATE_COMPLETED) { - return QUIZ_PHASE_MAKE_YOUR_OWN; + return LILYCOVE_LADY_STATE_COMPLETED; } else { - return QUIZ_PHASE_ATTEMPT_QUIZ; + return LILYCOVE_LADY_STATE_READY; } } +// TODO enum? another enum might be excessive. why did GF swap the order from AUTHOR // 0: waiting for someone to attempt player's quiz // 1: ready to attempt other player's quiz // 2: ready to attempt lady's quiz -u8 sub_818E06C(void) //sub_818E06C +u8 GetQuizAuthor(void) { int i; int j; @@ -409,7 +419,7 @@ u8 sub_818E06C(void) //sub_818E06C i = quiz->questionId; do { - if (++ i >= QUIZ_QUESTION_NUM) + if (++ i >= NUM_QUIZ_QUESTIONS) { i = 0; } @@ -523,7 +533,7 @@ bool8 IsQuizLadyWaitingForChallenger(void) return sQuizLadyPtr->waitingForChallenger; } -void sub_818E2FC(void) //sub_818E2FC +void QuizLadyShowEasyChatScreen(void) { ShowEasyChatScreen(); } @@ -542,16 +552,16 @@ void BufferQuizPrizeItem(void) gSpecialVar_0x8005 = sQuizLadyPtr->itemId; } -void SetQuizLadyPhase_MakeYourOwn(void) +void SetQuizLadyState_Complete(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - sQuizLadyPtr->phase = QUIZ_PHASE_MAKE_YOUR_OWN; + sQuizLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED; } -void SetQuizLadyPhase_GivePrize(void) +void SetQuizLadyState_GivePrize(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - sQuizLadyPtr->phase = QUIZ_PHASE_GIVE_PRIZE; + sQuizLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE; } void ClearQuizLadyResponse(void) @@ -574,7 +584,7 @@ void sub_818E3EC(void) } else { - sQuizLadyPtr->prevQuestionId = QUIZ_QUESTION_NUM; + sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; } PickQuizQuestion(); } @@ -638,7 +648,7 @@ void sub_818E570(const LilycoveLady *lilycoveLady) u8 i; sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (lilycoveLady->quiz.prevQuestionId < QUIZ_QUESTION_NUM && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ) + if (lilycoveLady->quiz.prevQuestionId < NUM_QUIZ_QUESTIONS && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ) { for (i = 0; i < 4; i ++) { @@ -646,11 +656,11 @@ void sub_818E570(const LilycoveLady *lilycoveLady) { break; } - sQuizLadyPtr->questionId = Random() % QUIZ_QUESTION_NUM; + sQuizLadyPtr->questionId = Random() % NUM_QUIZ_QUESTIONS; } if (lilycoveLady->quiz.prevQuestionId == sQuizLadyPtr->questionId) { - sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % QUIZ_QUESTION_NUM; + sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % NUM_QUIZ_QUESTIONS; } sQuizLadyPtr->prevQuestionId = lilycoveLady->quiz.prevQuestionId; } @@ -674,7 +684,7 @@ static void InitLilycoveContestLady(void) sContestLadyPtr->language = gGameLanguage; } -static void sub_818E674(void) +static void ReadyContestLady(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; diff --git a/src/new_game.c b/src/new_game.c index ee67da9be..b4d9ba9b3 100644 --- a/src/new_game.c +++ b/src/new_game.c @@ -198,7 +198,7 @@ void NewGameInitData(void) ScriptContext2_RunNewScript(EventScript_ResetAllMapFlags); ResetMiniGamesResults(); copy_strings_to_sav1(); - SetLilycoveLady(); + InitLilycoveLady(); ResetAllApprenticeData(); ClearRankingHallRecords(); InitMatchCallCounters(); diff --git a/src/record_mixing.c b/src/record_mixing.c index 6cb145c80..44cf8044c 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -701,7 +701,7 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz } memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady)); - sub_818DA78(); + ReadyLilycoveLady(); if (dest != NULL) { sub_818E570(dest); -- cgit v1.2.3 From d931ba96020397ec9a9740a9d67aac8a99bf11f6 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Mon, 5 Aug 2019 20:37:09 -0400 Subject: document remaining funcs --- data/event_scripts.s | 90 ++++++------ data/specials.inc | 44 +++--- include/constants/lilycove_lady.h | 30 ++++ include/global.h | 20 +-- include/item_menu.h | 4 +- include/lilycove_lady.h | 8 +- src/data/lilycove_lady.h | 4 +- src/easy_chat.c | 15 +- src/item_menu.c | 24 ++-- src/lilycove_lady.c | 288 +++++++++++++++++--------------------- src/record_mixing.c | 4 +- 11 files changed, 263 insertions(+), 268 deletions(-) create mode 100644 include/constants/lilycove_lady.h diff --git a/data/event_scripts.s b/data/event_scripts.s index 397cbd503..5ad4fa778 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -19,6 +19,7 @@ #include "constants/vars.h" #include "constants/weather.h" #include "constants/trainer_hill.h" +#include "constants/lilycove_lady.h" #include "constants/battle.h" #include "constants/metatile_labels.h" .include "asm/macros.inc" @@ -4283,9 +4284,9 @@ GraniteCave_B1F_Movement_2A8369: @ 82A8369 LilycoveCity_PokemonCenter_1F_EventScript_2A836B:: @ 82A836B special Script_GetLilycoveLadyId switch VAR_RESULT - case 0, LilycoveCity_PokemonCenter_1F_EventScript_2A8554 - case 1, LilycoveCity_PokemonCenter_1F_EventScript_2A8395 - case 2, LilycoveCity_PokemonCenter_1F_EventScript_2A882A + case LILYCOVE_LADY_QUIZ, LilycoveCity_PokemonCenter_1F_EventScript_2A8554 + case LILYCOVE_LADY_FAVOR, LilycoveCity_PokemonCenter_1F_EventScript_2A8395 + case LILYCOVE_LADY_CONTEST, LilycoveCity_PokemonCenter_1F_EventScript_2A882A end LilycoveCity_PokemonCenter_1F_EventScript_2A8395:: @ 82A8395 @@ -4293,11 +4294,11 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8395:: @ 82A8395 faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A69, MSGBOX_DEFAULT specialvar VAR_RESULT, GetFavorLadyState - compare VAR_RESULT, 0 + compare VAR_RESULT, LILYCOVE_LADY_STATE_READY goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A83D0 - compare VAR_RESULT, 1 + compare VAR_RESULT, LILYCOVE_LADY_STATE_COMPLETED goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A83C6 - compare VAR_RESULT, 2 + compare VAR_RESULT, LILYCOVE_LADY_STATE_PRIZE goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8510 end @@ -4307,9 +4308,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A83C6:: @ 82A83C6 end LilycoveCity_PokemonCenter_1F_EventScript_2A83D0:: @ 82A83D0 - special BufferFavorLadyDescription + special BufferFavorLadyRequest msgbox LilycoveCity_PokemonCenter_1F_Text_2A8A7D, MSGBOX_DEFAULT - specialvar VAR_RESULT, sub_818DC60 + specialvar VAR_RESULT, HasAnotherPlayerGivenFavorLadyItem compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8435 compare VAR_RESULT, 1 @@ -4357,7 +4358,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A845E:: @ 82A845E LilycoveCity_PokemonCenter_1F_EventScript_2A846C:: @ 82A846C fadescreen 1 setvar VAR_RESULT, 0 - special FavorLadyOpenBagMenu + special Script_FavorLadyOpenBagMenu waitstate compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A848E @@ -4374,7 +4375,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A848E:: @ 82A848E end LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD - specialvar VAR_RESULT, Script_ShowFavorLadyItem + specialvar VAR_RESULT, Script_DoesFavorLadyLikeItem compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84C9 compare VAR_RESULT, 1 @@ -4382,13 +4383,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84AD:: @ 82A84AD end LilycoveCity_PokemonCenter_1F_EventScript_2A84C9:: @ 82A84C9 - special BufferFavorLadyDescription + special BufferFavorLadyRequest msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C0F, MSGBOX_DEFAULT release end LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6 - specialvar VAR_RESULT, DidFavorLadyLoveItem + specialvar VAR_RESULT, IsFavorLadyThresholdMet compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A84F2 compare VAR_RESULT, 1 @@ -4396,13 +4397,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A84D6:: @ 82A84D6 end LilycoveCity_PokemonCenter_1F_EventScript_2A84F2:: @ 82A84F2 - special BufferFavorLadyDescription + special BufferFavorLadyRequest msgbox LilycoveCity_PokemonCenter_1F_Text_2A8C6F, MSGBOX_DEFAULT release end LilycoveCity_PokemonCenter_1F_EventScript_2A84FF:: @ 82A84FF - special BufferFavorLadyDescription + special BufferFavorLadyRequest msgbox LilycoveCity_PokemonCenter_1F_Text_2A8CC8, MSGBOX_DEFAULT goto LilycoveCity_PokemonCenter_1F_EventScript_2A8510 end @@ -4433,21 +4434,21 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8554:: @ 82A8554 faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A8E2B, MSGBOX_DEFAULT specialvar VAR_RESULT, GetQuizLadyState - compare VAR_RESULT, 0 + compare VAR_RESULT, LILYCOVE_LADY_STATE_READY goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8585 - compare VAR_RESULT, 1 + compare VAR_RESULT, LILYCOVE_LADY_STATE_COMPLETED goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85AC - compare VAR_RESULT, 2 + compare VAR_RESULT, LILYCOVE_LADY_STATE_PRIZE goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A86EC end LilycoveCity_PokemonCenter_1F_EventScript_2A8585:: @ 82A8585 specialvar VAR_RESULT, GetQuizAuthor - compare VAR_RESULT, 0 + compare VAR_RESULT, QUIZ_AUTHOR_PLAYER goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85C8 - compare VAR_RESULT, 1 + compare VAR_RESULT, QUIZ_AUTHOR_OTHER_PLAYER goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85D2 - compare VAR_RESULT, 2 + compare VAR_RESULT, QUIZ_AUTHOR_LADY goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A85E0 end @@ -4489,7 +4490,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8612:: @ 82A8612 end LilycoveCity_PokemonCenter_1F_EventScript_2A861C:: @ 82A861C - special ClearQuizLadyResponse + special ClearQuizLadyPlayerAnswer compare VAR_0x8004, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A864C compare VAR_0x8004, EASY_CHAT_TYPE_QUIZ_ANSWER @@ -4509,7 +4510,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A864C:: @ 82A864C end LilycoveCity_PokemonCenter_1F_EventScript_2A8656:: @ 82A8656 - special QuizLadyShowEasyChatScreen + special QuizLadyGetPlayerAnswer waitstate goto LilycoveCity_PokemonCenter_1F_EventScript_2A8635 end @@ -4530,7 +4531,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A867F:: @ 82A867F LilycoveCity_PokemonCenter_1F_EventScript_2A8689:: @ 82A8689 special SetQuizLadyState_Complete msgbox LilycoveCity_PokemonCenter_1F_Text_2A8F4D, MSGBOX_DEFAULT - specialvar VAR_RESULT, sub_818E308 + specialvar VAR_RESULT, IsQuizAnswerCorrect compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A86C7 compare VAR_RESULT, 1 @@ -4546,8 +4547,8 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A86B0:: @ 82A86B0 end LilycoveCity_PokemonCenter_1F_EventScript_2A86C7:: @ 82A86C7 - special sub_818E538 - special sub_818E274 + special BufferQuizCorrectAnswer + special BufferQuizPrizeName playse SE_HAZURE delay 10 playse SE_HAZURE @@ -4556,8 +4557,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A86C7:: @ 82A86C7 goto LilycoveCity_PokemonCenter_1F_EventScript_2A8759 end +@VAR_RESULT is essentially ignored, both scripts are identical LilycoveCity_PokemonCenter_1F_EventScript_2A86EC:: @ 82A86EC - specialvar VAR_RESULT, sub_818E298 + specialvar VAR_RESULT, BufferQuizAuthorNameAndCheckIfLady compare VAR_RESULT, 1 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8708 compare VAR_RESULT, 0 @@ -4599,7 +4601,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8759:: @ 82A8759 end LilycoveCity_PokemonCenter_1F_EventScript_2A8778:: @ 82A8778 - special sub_818E3EC + special QuizLadyPickNewQuestion msgbox LilycoveCity_PokemonCenter_1F_Text_2A9131, MSGBOX_DEFAULT release end @@ -4610,7 +4612,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8785:: @ 82A8785 LilycoveCity_PokemonCenter_1F_EventScript_2A878D:: @ 82A878D fadescreen 1 setvar VAR_RESULT, 0 - special sub_818E3E0 + special Script_QuizLadyOpenBagMenu waitstate compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A87AF @@ -4628,13 +4630,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A87AF:: @ 82A87AF LilycoveCity_PokemonCenter_1F_EventScript_2A87CE:: @ 82A87CE msgbox LilycoveCity_PokemonCenter_1F_Text_2A9270, MSGBOX_DEFAULT - special sub_818E430 - special ClearQuizLadyResponse - setvar VAR_0x8004, 16 + special ClearQuizLadyQuestionAndAnswer + special ClearQuizLadyPlayerAnswer + setvar VAR_0x8004, EASY_CHAT_TYPE_QUIZ_QUESTION LilycoveCity_PokemonCenter_1F_EventScript_2A87E1:: @ 82A87E1 fadescreen 1 - special sub_818E47C + special QuizLadySetCustomQuestion waitstate compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A87F8 @@ -4650,9 +4652,9 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A87F8:: @ 82A87F8 end LilycoveCity_PokemonCenter_1F_EventScript_2A8817:: @ 82A8817 - special sub_818E490 - special sub_818E4A4 - special sub_818E510 + special QuizLadyTakePrizeForCustomQuiz + special QuizLadyRecordCustomQuizData + special QuizLadySetWaitingForChallenger msgbox LilycoveCity_PokemonCenter_1F_Text_2A9336, MSGBOX_DEFAULT release end @@ -4661,15 +4663,16 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A882A:: @ 82A882A lock faceplayer msgbox LilycoveCity_PokemonCenter_1F_Text_2A93A7, MSGBOX_DEFAULT - specialvar VAR_RESULT, sub_818E8B4 + specialvar VAR_RESULT, HasPlayerGivenContestLadyPokeblock compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8850 compare VAR_RESULT, 1 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A886C end +@ Redundant with above script, VAR_RESULT will always be 0 here LilycoveCity_PokemonCenter_1F_EventScript_2A8850:: @ 82A8850 - specialvar VAR_RESULT, sub_818E8E0 + specialvar VAR_RESULT, ShouldContestLadyShowGoOnAir compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8876 compare VAR_RESULT, 1 @@ -4682,7 +4685,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A886C:: @ 82A886C end LilycoveCity_PokemonCenter_1F_EventScript_2A8876:: @ 82A8876 - special sub_818E914 + special Script_BufferContestLadyCategoryAndMonName msgbox LilycoveCity_PokemonCenter_1F_Text_2A93F4, MSGBOX_DEFAULT checkitem ITEM_POKEBLOCK_CASE, 1 compare VAR_RESULT, 0 @@ -4719,11 +4722,12 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88D7:: @ 82A88D7 LilycoveCity_PokemonCenter_1F_EventScript_2A88F6:: @ 82A88F6 msgbox LilycoveCity_PokemonCenter_1F_Text_2A9571, MSGBOX_DEFAULT - special ContestLadyGivenPokeblock + special SetContestLadyGivenPokeblock special GetContestLadyMonSpecies goto LilycoveCity_PokemonCenter_1F_EventScript_2A890A end +@VAR_0x8004 here is the return value from GivePokeblockToContestLady LilycoveCity_PokemonCenter_1F_EventScript_2A890A:: @ 82A890A applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89B8 waitmovement 0 @@ -4745,6 +4749,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A893F:: @ 82A893F waitmovement 0 delay 60 +@VAR_0x8004 here is the return value from GivePokeblockToContestLady LilycoveCity_PokemonCenter_1F_EventScript_2A894C:: @ 82A894C applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89C0 waitmovement 0 @@ -4761,13 +4766,13 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8970:: @ 82A8970 end LilycoveCity_PokemonCenter_1F_EventScript_2A897E:: @ 82A897E - special sub_818E914 + special Script_BufferContestLadyCategoryAndMonName msgbox LilycoveCity_PokemonCenter_1F_Text_2A9605, MSGBOX_DEFAULT goto LilycoveCity_PokemonCenter_1F_EventScript_2A898F end LilycoveCity_PokemonCenter_1F_EventScript_2A898F:: @ 82A898F - specialvar VAR_RESULT, sub_818E8E0 + specialvar VAR_RESULT, ShouldContestLadyShowGoOnAir compare VAR_RESULT, 1 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A89A1 release @@ -4809,9 +4814,10 @@ LilycoveCity_PokemonCenter_1F_Movement_2A89C2: @ 82A89C2 jump_in_place_left step_end +@TODO, these are CONTEST_CATEGORY_ constants, move into a new constants/contest.h? LilycoveCity_PokemonCenter_1F_EventScript_2A89C7:: @ 82A89C7 specialvar VAR_RESULT, GetContestLadyCategory - special sub_818E914 + special Script_BufferContestLadyCategoryAndMonName special GetContestLadyMonSpecies compare VAR_RESULT, 0 goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A0A diff --git a/data/specials.inc b/data/specials.inc index ac25698e4..eaf661194 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -375,42 +375,42 @@ gSpecials:: @ 81DBA64 def_special SetLilycoveLadyGfx def_special Script_GetLilycoveLadyId def_special GetFavorLadyState - def_special BufferFavorLadyDescription - def_special sub_818DC60 + def_special BufferFavorLadyRequest + def_special HasAnotherPlayerGivenFavorLadyItem def_special BufferFavorLadyItemName def_special BufferFavorLadyPlayerName def_special DidFavorLadyLikeItem - def_special FavorLadyOpenBagMenu - def_special Script_ShowFavorLadyItem - def_special DidFavorLadyLoveItem + def_special Script_FavorLadyOpenBagMenu + def_special Script_DoesFavorLadyLikeItem + def_special IsFavorLadyThresholdMet def_special FavorLadyGetPrize def_special SetFavorLadyState_Complete def_special GetQuizLadyState def_special GetQuizAuthor def_special IsQuizLadyWaitingForChallenger def_special sub_811A858 - def_special QuizLadyShowEasyChatScreen - def_special sub_818E308 + def_special QuizLadyGetPlayerAnswer + def_special IsQuizAnswerCorrect def_special BufferQuizPrizeItem def_special SetQuizLadyState_Complete - def_special sub_818E298 + def_special BufferQuizAuthorNameAndCheckIfLady def_special SetQuizLadyState_GivePrize - def_special ClearQuizLadyResponse - def_special sub_818E3E0 - def_special sub_818E430 - def_special sub_818E47C - def_special sub_818E490 + def_special ClearQuizLadyPlayerAnswer + def_special Script_QuizLadyOpenBagMenu + def_special ClearQuizLadyQuestionAndAnswer + def_special QuizLadySetCustomQuestion + def_special QuizLadyTakePrizeForCustomQuiz def_special sub_813986C - def_special sub_818E4A4 - def_special sub_818E510 - def_special sub_818E538 - def_special sub_818E274 - def_special sub_818E3EC - def_special sub_818E8E0 - def_special sub_818E8B4 - def_special sub_818E914 + def_special QuizLadyRecordCustomQuizData + def_special QuizLadySetWaitingForChallenger + def_special BufferQuizCorrectAnswer + def_special BufferQuizPrizeName + def_special QuizLadyPickNewQuestion + def_special ShouldContestLadyShowGoOnAir + def_special HasPlayerGivenContestLadyPokeblock + def_special Script_BufferContestLadyCategoryAndMonName def_special OpenPokeblockCaseForContestLady - def_special ContestLadyGivenPokeblock + def_special SetContestLadyGivenPokeblock def_special GetContestLadyMonSpecies def_special GetContestLadyCategory def_special PutLilycoveContestLadyShowOnTheAir diff --git a/include/constants/lilycove_lady.h b/include/constants/lilycove_lady.h new file mode 100644 index 000000000..6ef70d8a7 --- /dev/null +++ b/include/constants/lilycove_lady.h @@ -0,0 +1,30 @@ +#ifndef GUARD_LILYCOVE_LADY_CONSTANTS_H +#define GUARD_LILYCOVE_LADY_CONSTANTS_H + +#define LILYCOVE_LADY_QUIZ 0 +#define LILYCOVE_LADY_FAVOR 1 +#define LILYCOVE_LADY_CONTEST 2 +#define LILYCOVE_LADY_COUNT 3 + +#define LILYCOVE_LADY_STATE_READY 0 +#define LILYCOVE_LADY_STATE_COMPLETED 1 +#define LILYCOVE_LADY_STATE_PRIZE 2 + +#define QUIZ_AUTHOR_PLAYER 0 +#define QUIZ_AUTHOR_OTHER_PLAYER 1 +#define QUIZ_AUTHOR_LADY 2 + +// Would be redundant with the above set if GF hadn't mixed the order +#define QUIZ_AUTHOR_NAME_LADY 0 +#define QUIZ_AUTHOR_NAME_PLAYER 1 +#define QUIZ_AUTHOR_NAME_OTHER_PLAYER 2 + +// TODO use array count macro? +#define QUIZ_QUESTION_LEN 9 //ARRAY_COUNT(sQuizLadyQuestion#) +#define NUM_QUIZ_QUESTIONS 16 //ARRAY_COUNT(sQuizLadyQuizQuestions) +#define FAVOR_DESCRIPTION_NUM 6 //ARRAY_COUNT(sFavorLadyDescriptions) + +#define LILYCOVE_LADY_GIFT_THRESHOLD 5 + + +#endif diff --git a/include/global.h b/include/global.h index a055cb2c0..df0d0c1ea 100644 --- a/include/global.h +++ b/include/global.h @@ -737,24 +737,16 @@ struct RecordMixingDayCareMail bool16 holdsItem[DAYCARE_MON_COUNT]; }; -enum -{ - LILYCOVE_LADY_QUIZ, - LILYCOVE_LADY_FAVOR, - LILYCOVE_LADY_CONTEST, - LILYCOVE_LADY_COUNT -}; - struct LilycoveLadyQuiz { /*0x000*/ u8 id; /*0x001*/ u8 state; /*0x002*/ u16 question[9]; - /*0x014*/ u16 answer; - /*0x016*/ u16 response; + /*0x014*/ u16 correctAnswer; + /*0x016*/ u16 playerAnswer; /*0x018*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x020*/ u16 playerTrainerId[4]; - /*0x028*/ u16 itemId; + /*0x028*/ u16 prize; /*0x02a*/ bool8 waitingForChallenger; /*0x02b*/ u8 questionId; /*0x02c*/ u8 prevQuestionId; @@ -778,10 +770,10 @@ struct LilycoveLadyContest { /*0x000*/ u8 id; /*0x001*/ bool8 givenPokeblock; - /*0x002*/ u8 fave_pkblk; - /*0x003*/ u8 other_pkblk; + /*0x002*/ u8 numGoodPokeblocksGiven; + /*0x003*/ u8 numOtherPokeblocksGiven; /*0x004*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; - /*0x00c*/ u8 max_sheen; + /*0x00c*/ u8 maxSheen; /*0x00d*/ u8 category; /*0x00e*/ u8 language; }; diff --git a/include/item_menu.h b/include/item_menu.h index 5580fa4b4..b1275549d 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -69,8 +69,8 @@ extern u16 gSpecialVar_ItemId; // Exported ROM declarations void sub_81AAC14(void); -void sub_81AAC50(void); -void sub_81AAC70(void); +void FavorLadyOpenBagMenu(void); +void QuizLadyOpenBagMenu(void); void sub_81AAC28(void); void sub_81AABB0(void); void SetInitialScrollAndCursorPositions(u8 pocketId); diff --git a/include/lilycove_lady.h b/include/lilycove_lady.h index 959878ac9..1ec327be9 100644 --- a/include/lilycove_lady.h +++ b/include/lilycove_lady.h @@ -3,10 +3,10 @@ u8 GetLilycoveLadyId(void); void InitLilycoveLady(void); -void ReadyLilycoveLady(void); -void sub_818DEF4(void); -void sub_818E564(void); -void sub_818E570(const LilycoveLady *lilycoveLady); +void ResetLilycoveLadyForRecordMix(void); +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 BufferContestLadyPlayerName(u8 *dest); diff --git a/src/data/lilycove_lady.h b/src/data/lilycove_lady.h index 36bd94e55..f60e527a5 100644 --- a/src/data/lilycove_lady.h +++ b/src/data/lilycove_lady.h @@ -266,7 +266,7 @@ static const u16 sQuizLadyQuizAnswers[] = EC_WORD_PLUSH_DOLL, EC_WORD_ICE, EC_WORD_FIGHTING, - EC_WORD_DARK // DARK is accepted as the correct answer despite the fact that it's wrong + EC_WORD_DARK }; static const u16 sQuizLadyPrizes[] = @@ -290,7 +290,7 @@ static const u16 sQuizLadyPrizes[] = }; // Favor Lady data -static const u8 *const sFavorLadyDescriptions[] = +static const u8 *const sFavorLadyRequests[] = { gText_FavorLady_Slippery, gText_FavorLady_Roundish, diff --git a/src/easy_chat.c b/src/easy_chat.c index 9a529afe3..b95b43aea 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -30,6 +30,7 @@ #include "constants/easy_chat.h" #include "constants/event_objects.h" #include "constants/flags.h" +#include "constants/lilycove_lady.h" #include "constants/songs.h" #include "constants/species.h" #include "constants/rgb.h" @@ -1305,7 +1306,7 @@ void ShowEasyChatScreen(void) displayedPersonType = EASY_CHAT_PERSON_BOY; break; case EASY_CHAT_TYPE_QUIZ_ANSWER: - words = &gSaveBlock1Ptr->lilycoveLady.quiz.response; + words = &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer; break; case EASY_CHAT_TYPE_QUIZ_QUESTION: return; @@ -1313,7 +1314,7 @@ void ShowEasyChatScreen(void) words = gSaveBlock1Ptr->lilycoveLady.quiz.question; break; case EASY_CHAT_TYPE_QUIZ_SET_ANSWER: - words = &gSaveBlock1Ptr->lilycoveLady.quiz.answer; + words = &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer; break; case EASY_CHAT_TYPE_APPRENTICE: words = gSaveBlock2Ptr->apprentices[0].easyChatWords; @@ -1343,7 +1344,7 @@ static void sub_811A7E4(void) if (!gPaletteFade.active) { lilycoveLady = &gSaveBlock1Ptr->lilycoveLady; - lilycoveLady->quiz.response = -1; + lilycoveLady->quiz.playerAnswer = -1; CleanupOverworldWindowsAndTilemaps(); DoQuizQuestionEasyChatScreen(); } @@ -1387,7 +1388,7 @@ static void DoQuizAnswerEasyChatScreen(void) { DoEasyChatScreen( EASY_CHAT_TYPE_QUIZ_ANSWER, - &gSaveBlock1Ptr->lilycoveLady.quiz.response, + &gSaveBlock1Ptr->lilycoveLady.quiz.playerAnswer, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -1403,7 +1404,7 @@ static void DoQuizQuestionEasyChatScreen(void) static void DoQuizSetAnswerEasyChatScreen(void) { DoEasyChatScreen(EASY_CHAT_TYPE_QUIZ_SET_ANSWER, - &gSaveBlock1Ptr->lilycoveLady.quiz.answer, + &gSaveBlock1Ptr->lilycoveLady.quiz.correctAnswer, CB2_ReturnToFieldContinueScript, EASY_CHAT_PERSON_DISPLAY_NONE); } @@ -2660,7 +2661,7 @@ static int sub_811BD64(void) return sub_811BCF4(); saveBlock1 = gSaveBlock1Ptr; - for (i = 0; i < 9; i++) + for (i = 0; i < QUIZ_QUESTION_LEN; i++) { if (saveBlock1->lilycoveLady.quiz.question[i] != 0xFFFF) return 0; @@ -2676,7 +2677,7 @@ static int sub_811BDB0(void) return sub_811BCF4(); quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - return quiz->answer == 0xFFFF ? 1 : 0; + return quiz->correctAnswer == 0xFFFF ? 1 : 0; } static void sub_811BDF0(u8 *arg0) diff --git a/src/item_menu.c b/src/item_menu.c index 5b47a567b..12f03b328 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -118,9 +118,9 @@ void sub_81AD9C0(u8); void sub_81ADB14(u8); void sub_81ADA7C(u8); void sub_81ADC0C(u8); -void bag_menu_leave_maybe_3(void); -void bag_menu_leave_maybe_2(void); void bag_menu_leave_maybe(void); +void CB2_FavorLadyExitBagMenu(void); +void CB2_QuizLadyExitBagMenu(void); void sub_81ABA6C(void); static void SetPocketListPositions(void); void sub_81ABAE0(void); @@ -493,20 +493,20 @@ void sub_81AAC14(void) void sub_81AAC28(void) { - GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe_3); + GoToBagMenu(RETURN_LOCATION_FIELD_6, POCKETS_COUNT, bag_menu_leave_maybe); gSpecialVar_0x8005 = 0; gSpecialVar_Result = 0; } -void sub_81AAC50(void) +void FavorLadyOpenBagMenu(void) { - GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, bag_menu_leave_maybe_2); + GoToBagMenu(RETURN_LOCATION_FIELD_4, POCKETS_COUNT, CB2_FavorLadyExitBagMenu); gSpecialVar_Result = 0; } -void sub_81AAC70(void) +void QuizLadyOpenBagMenu(void) { - GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, bag_menu_leave_maybe); + GoToBagMenu(RETURN_LOCATION_FIELD_5, POCKETS_COUNT, CB2_QuizLadyExitBagMenu); gSpecialVar_Result = 0; } @@ -2202,7 +2202,7 @@ void unknown_ItemMenu_Show(u8 taskId) unknown_ItemMenu_Confirm(taskId); } -void bag_menu_leave_maybe_3(void) +void bag_menu_leave_maybe(void) { gFieldCallback = Apprentice_EnableBothScriptContexts; SetMainCallback2(CB2_ReturnToField); @@ -2216,9 +2216,9 @@ void unknown_ItemMenu_Give2(u8 taskId) unknown_ItemMenu_Confirm(taskId); } -void bag_menu_leave_maybe_2(void) +void CB2_FavorLadyExitBagMenu(void) { - gFieldCallback = sub_818DEF4; + gFieldCallback = FieldCallback_FavorLadyEnableScriptContexts; SetMainCallback2(CB2_ReturnToField); } @@ -2229,9 +2229,9 @@ void unknown_ItemMenu_Confirm2(u8 taskId) unknown_ItemMenu_Confirm(taskId); } -void bag_menu_leave_maybe(void) +void CB2_QuizLadyExitBagMenu(void) { - gFieldCallback = sub_818E564; + gFieldCallback = FieldCallback_QuizLadyEnableScriptContexts; SetMainCallback2(CB2_ReturnToField); } diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 77641b98f..339e91847 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -15,44 +15,17 @@ #include "easy_chat.h" #include "lilycove_lady.h" #include "contest.h" -#include "berry.h" #include "strings.h" - -// TODO use array count macro? -#define QUIZ_QUESTION_LEN 9 //len of sQuizLadyQuestion# -#define NUM_QUIZ_QUESTIONS 16 //len of sQuizLadyQuizQuestions -#define FAVOR_DESCRIPTION_NUM 6 //len of sFavorLadyDescriptions - -// TODO not a great name? The number of successes required to receive -// an item from the favor lady. Reached automatically if the randomly -// selected 'best' item is given to her -#define FAVOR_GIFT_MAX 5 - - -enum -{ - QUIZ_AUTHOR_LADY, - QUIZ_AUTHOR_PLAYER, - QUIZ_AUTHOR_OTHER_PLAYER -}; - -enum -{ - LILYCOVE_LADY_STATE_READY, - LILYCOVE_LADY_STATE_COMPLETED, - LILYCOVE_LADY_STATE_PRIZE -}; - - +#include "constants/lilycove_lady.h" #include "data/lilycove_lady.h" static void InitLilycoveQuizLady(void); static void InitLilycoveFavorLady(void); static void InitLilycoveContestLady(void); -static void ReadyQuizLady(void); -static void ReadyFavorLady(void); -static void ReadyContestLady(void); -static u8 BufferAuthorName(void); +static void ResetQuizLadyForRecordMix(void); +static void ResetFavorLadyForRecordMix(void); +static void ResetContestLadyForRecordMix(void); +static u8 BufferQuizAuthorName(void); static bool8 IsQuizTrainerIdNotPlayer(void); static u8 GetPlayerNameLength(const u8 *); @@ -86,10 +59,8 @@ void SetLilycoveLadyGfx(void) void InitLilycoveLady(void) { - u16 id; - - id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]); - id %= 6; //TODO num lilycove ladies * 2. constant? + u16 id = ((gSaveBlock2Ptr->playerTrainerId[1] << 8) | gSaveBlock2Ptr->playerTrainerId[0]); + id %= 6; id >>= 1; switch (id) { @@ -105,29 +76,27 @@ void InitLilycoveLady(void) } } -// Used after mixing records -void ReadyLilycoveLady(void) +void ResetLilycoveLadyForRecordMix(void) { switch (GetLilycoveLadyId()) { case LILYCOVE_LADY_QUIZ: - ReadyQuizLady(); + ResetQuizLadyForRecordMix(); break; case LILYCOVE_LADY_FAVOR: - ReadyFavorLady(); + ResetFavorLadyForRecordMix(); break; case LILYCOVE_LADY_CONTEST: - ReadyContestLady(); + ResetContestLadyForRecordMix(); break; } } -// Unused? +// Unused void InitLilycoveLadyRandomly(void) { - u8 lady; + u8 lady = Random() % LILYCOVE_LADY_COUNT; - lady = Random() % LILYCOVE_LADY_COUNT; switch (lady) { case LILYCOVE_LADY_QUIZ: @@ -179,7 +148,7 @@ static void InitLilycoveFavorLady(void) FavorLadyPickFavorAndBestItem(); } -static void ReadyFavorLady(void) +static void ResetFavorLadyForRecordMix(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; sFavorLadyPtr->id = LILYCOVE_LADY_FAVOR; @@ -203,18 +172,18 @@ u8 GetFavorLadyState(void) } } -static const u8 *GetFavorLadyDescription(u8 idx) +static const u8 *GetFavorLadyRequest(u8 idx) { - return sFavorLadyDescriptions[idx]; + return sFavorLadyRequests[idx]; } -void BufferFavorLadyDescription(void) +void BufferFavorLadyRequest(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - StringCopy(gStringVar1, GetFavorLadyDescription(sFavorLadyPtr->favorId)); + StringCopy(gStringVar1, GetFavorLadyRequest(sFavorLadyPtr->favorId)); } -bool8 sub_818DC60(void) +bool8 HasAnotherPlayerGivenFavorLadyItem(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; if (sFavorLadyPtr->playerName[0] != EOS) @@ -250,19 +219,19 @@ void BufferFavorLadyPlayerName(void) ConvertInternationalString(gStringVar3, sFavorLadyPtr->language); } +// Only used to determine if a record-mixed player had given her an item she liked bool8 DidFavorLadyLikeItem(void) { sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; return sFavorLadyPtr->likedItem ? TRUE : FALSE; } -void FavorLadyOpenBagMenu(void) +void Script_FavorLadyOpenBagMenu(void) { - sub_81AAC50(); + FavorLadyOpenBagMenu(); } -//TODO rename? -static bool8 ShowFavorLadyItem(u16 itemId) +static bool8 DoesFavorLadyLikeItem(u16 itemId) { u8 numItems; u8 i; @@ -285,7 +254,7 @@ static bool8 ShowFavorLadyItem(u16 itemId) sFavorLadyPtr->likedItem = TRUE; if (sFavorLadyPtr->bestItem == itemId) { - sFavorLadyPtr->numItemsGiven = FAVOR_GIFT_MAX; + sFavorLadyPtr->numItemsGiven = LILYCOVE_LADY_GIFT_THRESHOLD; } break; } @@ -294,35 +263,34 @@ static bool8 ShowFavorLadyItem(u16 itemId) return likedItem; } -bool8 Script_ShowFavorLadyItem(void) +bool8 Script_DoesFavorLadyLikeItem(void) { - return ShowFavorLadyItem(gSpecialVar_ItemId); + return DoesFavorLadyLikeItem(gSpecialVar_ItemId); } -//was item given the best item / have they given her 5 items -bool8 DidFavorLadyLoveItem(void) +bool8 IsFavorLadyThresholdMet(void) { - u8 checkval; + u8 numItemsGiven; sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - checkval = sFavorLadyPtr->numItemsGiven; - return checkval < FAVOR_GIFT_MAX ? FALSE : TRUE; + numItemsGiven = sFavorLadyPtr->numItemsGiven; + return numItemsGiven < LILYCOVE_LADY_GIFT_THRESHOLD ? FALSE : TRUE; } -static void BufferPrizeName(u16 itemId) +static void FavorLadyBufferPrizeName(u16 prize) { - BufferItemName(gStringVar2, itemId); + BufferItemName(gStringVar2, prize); } u16 FavorLadyGetPrize(void) { - u16 itemId; + u16 prize; sFavorLadyPtr = &gSaveBlock1Ptr->lilycoveLady.favor; - itemId = sFavorLadyPrizes[sFavorLadyPtr->favorId]; - BufferPrizeName(itemId); + prize = sFavorLadyPrizes[sFavorLadyPtr->favorId]; + FavorLadyBufferPrizeName(prize); sFavorLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE; - return itemId; + return prize; } void SetFavorLadyState_Complete(void) @@ -331,12 +299,12 @@ void SetFavorLadyState_Complete(void) sFavorLadyPtr->state = LILYCOVE_LADY_STATE_COMPLETED; } -void sub_818DEF4(void) +void FieldCallback_FavorLadyEnableScriptContexts(void) { EnableBothScriptContexts(); } -static void PickQuizQuestion(void) +static void QuizLadyPickQuestion(void) { u8 questionId; u8 i; @@ -346,8 +314,8 @@ static void PickQuizQuestion(void) { sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i]; } - sQuizLadyPtr->answer = sQuizLadyQuizAnswers[questionId]; - sQuizLadyPtr->itemId = sQuizLadyPrizes[questionId]; + sQuizLadyPtr->correctAnswer = sQuizLadyQuizAnswers[questionId]; + sQuizLadyPtr->prize = sQuizLadyPrizes[questionId]; sQuizLadyPtr->questionId = questionId; sQuizLadyPtr->playerName[0] = EOS; } @@ -363,26 +331,26 @@ static void InitLilycoveQuizLady(void) { sQuizLadyPtr->question[i] = -1; } - sQuizLadyPtr->answer = -1; - sQuizLadyPtr->response = -1; + sQuizLadyPtr->correctAnswer = -1; + sQuizLadyPtr->playerAnswer = -1; for (i = 0; i < 4; i ++) { sQuizLadyPtr->playerTrainerId[i] = 0; } - sQuizLadyPtr->itemId = ITEM_NONE; + sQuizLadyPtr->prize = ITEM_NONE; sQuizLadyPtr->waitingForChallenger = FALSE; sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; sQuizLadyPtr->language = gGameLanguage; - PickQuizQuestion(); + QuizLadyPickQuestion(); } -static void ReadyQuizLady(void) +static void ResetQuizLadyForRecordMix(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; sQuizLadyPtr->id = LILYCOVE_LADY_QUIZ; sQuizLadyPtr->state = LILYCOVE_LADY_STATE_READY; sQuizLadyPtr->waitingForChallenger = FALSE; - sQuizLadyPtr->response = -1; + sQuizLadyPtr->playerAnswer = -1; } u8 GetQuizLadyState(void) @@ -402,19 +370,15 @@ u8 GetQuizLadyState(void) } } -// TODO enum? another enum might be excessive. why did GF swap the order from AUTHOR -// 0: waiting for someone to attempt player's quiz -// 1: ready to attempt other player's quiz -// 2: ready to attempt lady's quiz u8 GetQuizAuthor(void) { int i; int j; - u8 author; + u8 authorNameId; struct LilycoveLadyQuiz *quiz; quiz = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (sub_811F8D8(quiz->answer) == 0) + if (sub_811F8D8(quiz->correctAnswer) == 0) { i = quiz->questionId; do @@ -428,38 +392,38 @@ u8 GetQuizAuthor(void) { quiz->question[j] = sQuizLadyQuizQuestions[i][j]; } - quiz->answer = sQuizLadyQuizAnswers[i]; - quiz->itemId = sQuizLadyPrizes[i]; + quiz->correctAnswer = sQuizLadyQuizAnswers[i]; + quiz->prize = sQuizLadyPrizes[i]; quiz->questionId = i; quiz->playerName[0] = EOS; } - author = BufferAuthorName(); - if (author == QUIZ_AUTHOR_LADY) + authorNameId = BufferQuizAuthorName(); + if (authorNameId == QUIZ_AUTHOR_NAME_LADY) { - return 2; + return QUIZ_AUTHOR_LADY; } - else if (author == QUIZ_AUTHOR_OTHER_PLAYER || IsQuizTrainerIdNotPlayer()) + else if (authorNameId == QUIZ_AUTHOR_NAME_OTHER_PLAYER || IsQuizTrainerIdNotPlayer()) { - return 1; + return QUIZ_AUTHOR_OTHER_PLAYER; } else { - return 0; + return QUIZ_AUTHOR_PLAYER; } } -static u8 BufferAuthorName(void) +static u8 BufferQuizAuthorName(void) { - u8 author; + u8 authorNameId; u8 nameLen; u8 i; - author = QUIZ_AUTHOR_PLAYER; + authorNameId = QUIZ_AUTHOR_NAME_PLAYER; sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; if (sQuizLadyPtr->playerName[0] == EOS) { StringCopy7(gStringVar1, gText_QuizLady_Lady); - author = QUIZ_AUTHOR_LADY; + authorNameId = QUIZ_AUTHOR_NAME_LADY; } else { @@ -474,14 +438,14 @@ static u8 BufferAuthorName(void) name = sQuizLadyPtr->playerName; if (name[i] != gSaveBlock2Ptr->playerName[i]) { - author = QUIZ_AUTHOR_OTHER_PLAYER; + authorNameId = QUIZ_AUTHOR_NAME_OTHER_PLAYER; break; } } } } - return author; + return authorNameId; } static bool8 IsQuizTrainerIdNotPlayer(void) @@ -511,15 +475,15 @@ static u8 GetPlayerNameLength(const u8 *playerName) return len; } -void sub_818E274(void) +void BufferQuizPrizeName(void) { - StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->itemId)); + StringCopy(gStringVar1, ItemId_GetName(sQuizLadyPtr->prize)); } -bool8 sub_818E298(void) +bool8 BufferQuizAuthorNameAndCheckIfLady(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (BufferAuthorName() == QUIZ_AUTHOR_LADY) + if (BufferQuizAuthorName() == QUIZ_AUTHOR_NAME_LADY) { sQuizLadyPtr->language = gGameLanguage; return TRUE; @@ -533,23 +497,23 @@ bool8 IsQuizLadyWaitingForChallenger(void) return sQuizLadyPtr->waitingForChallenger; } -void QuizLadyShowEasyChatScreen(void) +void QuizLadyGetPlayerAnswer(void) { ShowEasyChatScreen(); } -bool8 sub_818E308(void) +bool8 IsQuizAnswerCorrect(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - CopyEasyChatWord(gStringVar1, sQuizLadyPtr->answer); - CopyEasyChatWord(gStringVar2, sQuizLadyPtr->response); + CopyEasyChatWord(gStringVar1, sQuizLadyPtr->correctAnswer); + CopyEasyChatWord(gStringVar2, sQuizLadyPtr->playerAnswer); return StringCompare(gStringVar1, gStringVar2) ? FALSE : TRUE; } void BufferQuizPrizeItem(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - gSpecialVar_0x8005 = sQuizLadyPtr->itemId; + gSpecialVar_0x8005 = sQuizLadyPtr->prize; } void SetQuizLadyState_Complete(void) @@ -564,21 +528,21 @@ void SetQuizLadyState_GivePrize(void) sQuizLadyPtr->state = LILYCOVE_LADY_STATE_PRIZE; } -void ClearQuizLadyResponse(void) +void ClearQuizLadyPlayerAnswer(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - sQuizLadyPtr->response = -1; + sQuizLadyPtr->playerAnswer = -1; } -void sub_818E3E0(void) +void Script_QuizLadyOpenBagMenu(void) { - sub_81AAC70(); + QuizLadyOpenBagMenu(); } -void sub_818E3EC(void) +void QuizLadyPickNewQuestion(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (sub_818E298()) + if (BufferQuizAuthorNameAndCheckIfLady()) { sQuizLadyPtr->prevQuestionId = sQuizLadyPtr->questionId; } @@ -586,10 +550,10 @@ void sub_818E3EC(void) { sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; } - PickQuizQuestion(); + QuizLadyPickQuestion(); } -void sub_818E430(void) +void ClearQuizLadyQuestionAndAnswer(void) { u8 i; @@ -598,26 +562,26 @@ void sub_818E430(void) { sQuizLadyPtr->question[i] = -1; } - sQuizLadyPtr->answer = -1; + sQuizLadyPtr->correctAnswer = -1; } -void sub_818E47C(void) +void QuizLadySetCustomQuestion(void) { gSpecialVar_0x8004 = EASY_CHAT_TYPE_QUIZ_SET_QUESTION; ShowEasyChatScreen(); } -void sub_818E490(void) +void QuizLadyTakePrizeForCustomQuiz(void) { RemoveBagItem(gSpecialVar_ItemId, 1); } -void sub_818E4A4(void) +void QuizLadyRecordCustomQuizData(void) { u8 i; sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - sQuizLadyPtr->itemId = gSpecialVar_ItemId; + sQuizLadyPtr->prize = gSpecialVar_ItemId; for (i = 0; i < 4; i ++) { sQuizLadyPtr->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; @@ -626,24 +590,25 @@ void sub_818E4A4(void) sQuizLadyPtr->language = gGameLanguage; } -void sub_818E510(void) +void QuizLadySetWaitingForChallenger(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; sQuizLadyPtr->waitingForChallenger = TRUE; } -void sub_818E538(void) +void BufferQuizCorrectAnswer(void) { sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - CopyEasyChatWord(gStringVar3, sQuizLadyPtr->answer); + CopyEasyChatWord(gStringVar3, sQuizLadyPtr->correctAnswer); } -void sub_818E564(void) + +void FieldCallback_QuizLadyEnableScriptContexts(void) { EnableBothScriptContexts(); } -void sub_818E570(const LilycoveLady *lilycoveLady) +void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady) { u8 i; @@ -669,9 +634,9 @@ void sub_818E570(const LilycoveLady *lilycoveLady) static void ResetContestLadyContestData(void) { sContestLadyPtr->playerName[0] = EOS; - sContestLadyPtr->fave_pkblk = 0; - sContestLadyPtr->other_pkblk = 0; - sContestLadyPtr->max_sheen = 0; + sContestLadyPtr->numGoodPokeblocksGiven = 0; + sContestLadyPtr->numOtherPokeblocksGiven = 0; + sContestLadyPtr->maxSheen = 0; sContestLadyPtr->category = Random() % CONTEST_CATEGORIES_COUNT; } @@ -684,24 +649,24 @@ static void InitLilycoveContestLady(void) sContestLadyPtr->language = gGameLanguage; } -static void ReadyContestLady(void) +static void ResetContestLadyForRecordMix(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; sContestLadyPtr->id = LILYCOVE_LADY_CONTEST; sContestLadyPtr->givenPokeblock = FALSE; - if (sContestLadyPtr->fave_pkblk == FLAVOR_COUNT - || sContestLadyPtr->other_pkblk == FLAVOR_COUNT) + if (sContestLadyPtr->numGoodPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD + || sContestLadyPtr->numOtherPokeblocksGiven == LILYCOVE_LADY_GIFT_THRESHOLD) { ResetContestLadyContestData(); } } -static void sub_818E6B0(u8 sheen) +static void ContestLadySavePlayerNameIfHighSheen(u8 sheen) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; - if (sContestLadyPtr->max_sheen <= sheen) + if (sContestLadyPtr->maxSheen <= sheen) { - sContestLadyPtr->max_sheen = sheen; + sContestLadyPtr->maxSheen = sheen; memset(sContestLadyPtr->playerName, EOS, sizeof(sContestLadyPtr->playerName)); memcpy(sContestLadyPtr->playerName, gSaveBlock2Ptr->playerName, sizeof(sContestLadyPtr->playerName)); sContestLadyPtr->language = gGameLanguage; @@ -710,11 +675,9 @@ static void sub_818E6B0(u8 sheen) bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock) { - u8 sheen; - bool8 response; + u8 sheen = 0; + bool8 correctFlavor = FALSE; - sheen = 0; - response = FALSE; sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; switch (sContestLadyPtr->category) { @@ -722,48 +685,48 @@ bool8 GivePokeblockToContestLady(struct Pokeblock *pokeblock) if (pokeblock->spicy != 0) { sheen = pokeblock->spicy; - response = TRUE; + correctFlavor = TRUE; } break; case CONTEST_CATEGORY_BEAUTY: if (pokeblock->dry != 0) { sheen = pokeblock->dry; - response = TRUE; + correctFlavor = TRUE; } break; case CONTEST_CATEGORY_CUTE: if (pokeblock->sweet != 0) { sheen = pokeblock->sweet; - response = TRUE; + correctFlavor = TRUE; } break; case CONTEST_CATEGORY_SMART: if (pokeblock->bitter != 0) { sheen = pokeblock->bitter; - response = TRUE; + correctFlavor = TRUE; } break; case CONTEST_CATEGORY_TOUGH: if (pokeblock->sour != 0) { sheen = pokeblock->sour; - response = TRUE; + correctFlavor = TRUE; } break; } - if (response == TRUE) + if (correctFlavor == TRUE) { - sub_818E6B0(sheen); - sContestLadyPtr->fave_pkblk ++; + ContestLadySavePlayerNameIfHighSheen(sheen); + sContestLadyPtr->numGoodPokeblocksGiven++; } else { - sContestLadyPtr->other_pkblk ++; + sContestLadyPtr->numOtherPokeblocksGiven++; } - return response; + return correctFlavor; } static void BufferContestLadyCategoryAndMonName(u8 *dest1, u8 *dest2) @@ -797,14 +760,18 @@ void BufferContestName(u8 *dest, u8 category) StringCopy(dest, sContestNames[category]); } +// used in tv.c to determine sTVShowState for Contest Lady show +// if return val is 1, sTVShowState is 1 +// if return val is 2, sTVShowState is 3 +// if return val is 0, sTVShowState is 2 u8 sub_818E880(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; - if (sContestLadyPtr->fave_pkblk >= FLAVOR_COUNT) + if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD) { return 1; } - else if (sContestLadyPtr->fave_pkblk == 0) + else if (sContestLadyPtr->numGoodPokeblocksGiven == 0) { return 2; } @@ -814,7 +781,8 @@ u8 sub_818E880(void) } } -bool8 sub_818E8B4(void) + +bool8 HasPlayerGivenContestLadyPokeblock(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; if (sContestLadyPtr->givenPokeblock == TRUE) @@ -824,22 +792,20 @@ bool8 sub_818E8B4(void) return FALSE; } -bool8 sub_818E8E0(void) +bool8 ShouldContestLadyShowGoOnAir(void) { - bool8 response; + bool8 putOnAir = FALSE; - response = FALSE; sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; - if (sContestLadyPtr->fave_pkblk >= FLAVOR_COUNT - || sContestLadyPtr->other_pkblk >= FLAVOR_COUNT) + if (sContestLadyPtr->numGoodPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD + || sContestLadyPtr->numOtherPokeblocksGiven >= LILYCOVE_LADY_GIFT_THRESHOLD) { - response = TRUE; + putOnAir = TRUE; } - return response; + return putOnAir; } -// called when mon enjoys pokeblock -void sub_818E914(void) +void Script_BufferContestLadyCategoryAndMonName(void) { BufferContestLadyCategoryAndMonName(gStringVar2, gStringVar1); } @@ -849,7 +815,7 @@ void OpenPokeblockCaseForContestLady(void) OpenPokeblockCase(3, CB2_ReturnToField); } -void ContestLadyGivenPokeblock(void) +void SetContestLadyGivenPokeblock(void) { sContestLadyPtr = &gSaveBlock1Ptr->lilycoveLady.contest; sContestLadyPtr->givenPokeblock = TRUE; diff --git a/src/record_mixing.c b/src/record_mixing.c index 44cf8044c..32e0404b9 100644 --- a/src/record_mixing.c +++ b/src/record_mixing.c @@ -701,10 +701,10 @@ static void ReceiveLilycoveLadyData(LilycoveLady *lilycoveLady, size_t recordSiz } memcpy(sLilycoveLadySave, (void *)lilycoveLady + recordSize * mixIndices[which], sizeof(LilycoveLady)); - ReadyLilycoveLady(); + ResetLilycoveLadyForRecordMix(); if (dest != NULL) { - sub_818E570(dest); + QuizLadyClearQuestionForRecordMix(dest); free(dest); } } -- cgit v1.2.3 From 5fb7ab05dd1e0897687ef9eb79bd9769c42c679c Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Tue, 6 Aug 2019 13:52:10 -0400 Subject: clean up --- data/event_scripts.s | 19 +++++++++---------- data/specials.inc | 2 +- include/constants/global.h | 2 ++ include/constants/lilycove_lady.h | 12 ++++-------- include/global.h | 22 +++++++++++----------- src/easy_chat.c | 7 ++++--- src/lilycove_lady.c | 33 +++++++++++++++++---------------- 7 files changed, 48 insertions(+), 49 deletions(-) diff --git a/data/event_scripts.s b/data/event_scripts.s index 5ad4fa778..563f7fb7b 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -4504,7 +4504,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A8635:: @ 82A8635 end LilycoveCity_PokemonCenter_1F_EventScript_2A864C:: @ 82A864C - special sub_811A858 + special QuizLadyShowQuizQuestion waitstate goto LilycoveCity_PokemonCenter_1F_EventScript_2A8635 end @@ -4557,7 +4557,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A86C7:: @ 82A86C7 goto LilycoveCity_PokemonCenter_1F_EventScript_2A8759 end -@VAR_RESULT is essentially ignored, both scripts are identical +@ VAR_RESULT is essentially ignored, both jumps are identical LilycoveCity_PokemonCenter_1F_EventScript_2A86EC:: @ 82A86EC specialvar VAR_RESULT, BufferQuizAuthorNameAndCheckIfLady compare VAR_RESULT, 1 @@ -4727,7 +4727,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A88F6:: @ 82A88F6 goto LilycoveCity_PokemonCenter_1F_EventScript_2A890A end -@VAR_0x8004 here is the return value from GivePokeblockToContestLady +@ VAR_0x8004 here is the return value from GivePokeblockToContestLady LilycoveCity_PokemonCenter_1F_EventScript_2A890A:: @ 82A890A applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89B8 waitmovement 0 @@ -4749,7 +4749,7 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A893F:: @ 82A893F waitmovement 0 delay 60 -@VAR_0x8004 here is the return value from GivePokeblockToContestLady +@ VAR_0x8004 here is the return value from GivePokeblockToContestLady LilycoveCity_PokemonCenter_1F_EventScript_2A894C:: @ 82A894C applymovement 4, LilycoveCity_PokemonCenter_1F_Movement_2A89C0 waitmovement 0 @@ -4814,20 +4814,19 @@ LilycoveCity_PokemonCenter_1F_Movement_2A89C2: @ 82A89C2 jump_in_place_left step_end -@TODO, these are CONTEST_CATEGORY_ constants, move into a new constants/contest.h? LilycoveCity_PokemonCenter_1F_EventScript_2A89C7:: @ 82A89C7 specialvar VAR_RESULT, GetContestLadyCategory special Script_BufferContestLadyCategoryAndMonName special GetContestLadyMonSpecies - compare VAR_RESULT, 0 + compare VAR_RESULT, 0 @CONTEST_CATEGORY_COOL goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A0A - compare VAR_RESULT, 1 + compare VAR_RESULT, 1 @CONTEST_CATEGORY_BEAUTY goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A1D - compare VAR_RESULT, 2 + compare VAR_RESULT, 2 @CONTEST_CATEGORY_CUTE goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A30 - compare VAR_RESULT, 3 + compare VAR_RESULT, 3 @CONTEST_CATEGORY_SMART goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A43 - compare VAR_RESULT, 4 + compare VAR_RESULT, 4 @CONTEST_CATEGORY_TOUGH goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A56 end diff --git a/data/specials.inc b/data/specials.inc index eaf661194..ba93b098d 100644 --- a/data/specials.inc +++ b/data/specials.inc @@ -388,7 +388,7 @@ gSpecials:: @ 81DBA64 def_special GetQuizLadyState def_special GetQuizAuthor def_special IsQuizLadyWaitingForChallenger - def_special sub_811A858 + def_special QuizLadyShowQuizQuestion def_special QuizLadyGetPlayerAnswer def_special IsQuizAnswerCorrect def_special BufferQuizPrizeItem diff --git a/include/constants/global.h b/include/constants/global.h index ff28d6a4b..1177f0444 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -50,6 +50,8 @@ #define PYRAMID_BAG_ITEMS_COUNT 10 #define HALL_FACILITIES_COUNT 9 // 7 facilities for single mode + tower double mode + tower multi mode. +#define TRAINER_ID_LENGTH 4 + // string lengths #define ITEM_NAME_LENGTH 14 #define POKEMON_NAME_LENGTH 10 diff --git a/include/constants/lilycove_lady.h b/include/constants/lilycove_lady.h index 6ef70d8a7..01f60ccf4 100644 --- a/include/constants/lilycove_lady.h +++ b/include/constants/lilycove_lady.h @@ -10,6 +10,8 @@ #define LILYCOVE_LADY_STATE_COMPLETED 1 #define LILYCOVE_LADY_STATE_PRIZE 2 +#define LILYCOVE_LADY_GIFT_THRESHOLD 5 + #define QUIZ_AUTHOR_PLAYER 0 #define QUIZ_AUTHOR_OTHER_PLAYER 1 #define QUIZ_AUTHOR_LADY 2 @@ -18,13 +20,7 @@ #define QUIZ_AUTHOR_NAME_LADY 0 #define QUIZ_AUTHOR_NAME_PLAYER 1 #define QUIZ_AUTHOR_NAME_OTHER_PLAYER 2 - -// TODO use array count macro? -#define QUIZ_QUESTION_LEN 9 //ARRAY_COUNT(sQuizLadyQuestion#) -#define NUM_QUIZ_QUESTIONS 16 //ARRAY_COUNT(sQuizLadyQuizQuestions) -#define FAVOR_DESCRIPTION_NUM 6 //ARRAY_COUNT(sFavorLadyDescriptions) - -#define LILYCOVE_LADY_GIFT_THRESHOLD 5 - + +#define QUIZ_QUESTION_LEN 9 #endif diff --git a/include/global.h b/include/global.h index df0d0c1ea..a82fe5861 100644 --- a/include/global.h +++ b/include/global.h @@ -224,7 +224,7 @@ struct Apprentice u8 number; struct ApprenticeMon party[3]; u16 easyChatWords[6]; - u8 playerId[4]; + u8 playerId[TRAINER_ID_LENGTH]; u8 playerName[PLAYER_NAME_LENGTH]; u8 language; u32 checksum; @@ -263,7 +263,7 @@ struct EmeraldBattleTowerRecord /*0x01*/ u8 facilityClass; /*0x02*/ u16 winStreak; /*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1]; - /*0x0C*/ u8 trainerId[4]; + /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH]; /*0x10*/ u16 greeting[6]; /*0x1C*/ u16 speechWon[6]; /*0x28*/ u16 speechLost[6]; @@ -278,7 +278,7 @@ struct BattleTowerEReaderTrainer /*0x01*/ u8 facilityClass; /*0x02*/ u16 winStreak; /*0x04*/ u8 name[PLAYER_NAME_LENGTH + 1]; - /*0x0C*/ u8 trainerId[4]; + /*0x0C*/ u8 trainerId[TRAINER_ID_LENGTH]; /*0x10*/ u16 greeting[6]; /*0x1C*/ u16 farewellPlayerLost[6]; /*0x28*/ u16 farewellPlayerWon[6]; @@ -425,7 +425,7 @@ struct PlayersApprentice struct RankingHall1P { - u8 id[4]; + u8 id[TRAINER_ID_LENGTH]; u16 winStreak; u8 name[PLAYER_NAME_LENGTH + 1]; u8 language; @@ -433,8 +433,8 @@ struct RankingHall1P struct RankingHall2P { - u8 id1[4]; - u8 id2[4]; + u8 id1[TRAINER_ID_LENGTH]; + u8 id2[TRAINER_ID_LENGTH]; u16 winStreak; u8 name1[PLAYER_NAME_LENGTH + 1]; u8 name2[PLAYER_NAME_LENGTH + 1]; @@ -446,7 +446,7 @@ struct SaveBlock2 /*0x00*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; /*0x08*/ u8 playerGender; // MALE, FEMALE /*0x09*/ u8 specialSaveWarpFlags; - /*0x0A*/ u8 playerTrainerId[4]; + /*0x0A*/ u8 playerTrainerId[TRAINER_ID_LENGTH]; /*0x0E*/ u16 playTimeHours; /*0x10*/ u8 playTimeMinutes; /*0x11*/ u8 playTimeSeconds; @@ -495,7 +495,7 @@ struct SecretBase /*0x1A9D*/ u8 battledOwnerToday:1; /*0x1A9D*/ u8 registryStatus:2; /*0x1A9E*/ u8 trainerName[PLAYER_NAME_LENGTH]; - /*0x1AA5*/ u8 trainerId[4]; // byte 0 is used for determining trainer class + /*0x1AA5*/ u8 trainerId[TRAINER_ID_LENGTH]; // byte 0 is used for determining trainer class /*0x1AA9*/ u8 language; /*0x1AAA*/ u16 numSecretBasesReceived; /*0x1AAC*/ u8 numTimesEntered; @@ -581,7 +581,7 @@ struct MailStruct { /*0x00*/ u16 words[MAIL_WORDS_COUNT]; /*0x12*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; - /*0x1A*/ u8 trainerId[4]; + /*0x1A*/ u8 trainerId[TRAINER_ID_LENGTH]; /*0x1E*/ u16 species; /*0x20*/ u16 itemId; }; @@ -598,7 +598,7 @@ struct MauvilleManBard /*0x0E*/ u16 temporaryLyrics[6]; /*0x1A*/ u8 playerName[8]; /*0x22*/ u8 filler_2DB6[0x3]; - /*0x25*/ u8 playerTrainerId[4]; + /*0x25*/ u8 playerTrainerId[TRAINER_ID_LENGTH]; /*0x29*/ bool8 hasChangedSong; /*0x2A*/ u8 language; }; /*size = 0x2C*/ @@ -745,7 +745,7 @@ struct LilycoveLadyQuiz /*0x014*/ u16 correctAnswer; /*0x016*/ u16 playerAnswer; /*0x018*/ u8 playerName[PLAYER_NAME_LENGTH + 1]; - /*0x020*/ u16 playerTrainerId[4]; + /*0x020*/ u16 playerTrainerId[TRAINER_ID_LENGTH]; /*0x028*/ u16 prize; /*0x02a*/ bool8 waitingForChallenger; /*0x02b*/ u8 questionId; diff --git a/src/easy_chat.c b/src/easy_chat.c index b95b43aea..ba54de783 100644 --- a/src/easy_chat.c +++ b/src/easy_chat.c @@ -241,6 +241,7 @@ struct Unk8597530 MainCallback callback; }; +// Lilycove Quiz Lady static const struct Unk8597530 sUnknown_08597530[] = { { .word = 26, @@ -1330,7 +1331,7 @@ void ShowEasyChatScreen(void) DoEasyChatScreen(gSpecialVar_0x8004, words, CB2_ReturnToFieldContinueScript, displayedPersonType); } -static void sub_811A7E4(void) +static void CB2_QuizLadyQuestion(void) { LilycoveLady *lilycoveLady; @@ -1353,9 +1354,9 @@ static void sub_811A7E4(void) gMain.state ++; } -void sub_811A858(void) +void QuizLadyShowQuizQuestion(void) { - SetMainCallback2(sub_811A7E4); + SetMainCallback2(CB2_QuizLadyQuestion); } static int sub_811A868(u16 word) diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 339e91847..60ad9de46 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -126,13 +126,13 @@ static u8 GetNumAcceptedItems(const u16 *itemsArray) static void FavorLadyPickFavorAndBestItem(void) { - u8 size; - u8 idx; + u8 numItems; + u8 bestItem; - sFavorLadyPtr->favorId = Random() % FAVOR_DESCRIPTION_NUM; - size = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); - idx = Random() % size; - sFavorLadyPtr->bestItem = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][idx]; + sFavorLadyPtr->favorId = Random() % ARRAY_COUNT(sFavorLadyRequests); + numItems = GetNumAcceptedItems(sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId]); + bestItem = Random() % numItems; + sFavorLadyPtr->bestItem = sFavorLadyAcceptedItemLists[sFavorLadyPtr->favorId][bestItem]; } static void InitLilycoveFavorLady(void) @@ -309,7 +309,7 @@ static void QuizLadyPickQuestion(void) u8 questionId; u8 i; - questionId = Random() % NUM_QUIZ_QUESTIONS; + questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions); for (i = 0; i < QUIZ_QUESTION_LEN; i ++) { sQuizLadyPtr->question[i] = sQuizLadyQuizQuestions[questionId][i]; @@ -333,13 +333,13 @@ static void InitLilycoveQuizLady(void) } sQuizLadyPtr->correctAnswer = -1; sQuizLadyPtr->playerAnswer = -1; - for (i = 0; i < 4; i ++) + for (i = 0; i < TRAINER_ID_LENGTH; i ++) { sQuizLadyPtr->playerTrainerId[i] = 0; } sQuizLadyPtr->prize = ITEM_NONE; sQuizLadyPtr->waitingForChallenger = FALSE; - sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; + sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions); sQuizLadyPtr->language = gGameLanguage; QuizLadyPickQuestion(); } @@ -383,7 +383,7 @@ u8 GetQuizAuthor(void) i = quiz->questionId; do { - if (++ i >= NUM_QUIZ_QUESTIONS) + if (++ i >= (int)(ARRAY_COUNT(sQuizLadyQuizQuestions))) { i = 0; } @@ -455,7 +455,7 @@ static bool8 IsQuizTrainerIdNotPlayer(void) sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; notPlayer = FALSE; - for (i = 0; i < 4; i ++) + for (i = 0; i < TRAINER_ID_LENGTH; i ++) { if (sQuizLadyPtr->playerTrainerId[i] != gSaveBlock2Ptr->playerTrainerId[i]) { @@ -548,7 +548,7 @@ void QuizLadyPickNewQuestion(void) } else { - sQuizLadyPtr->prevQuestionId = NUM_QUIZ_QUESTIONS; + sQuizLadyPtr->prevQuestionId = ARRAY_COUNT(sQuizLadyQuizQuestions); } QuizLadyPickQuestion(); } @@ -582,7 +582,7 @@ void QuizLadyRecordCustomQuizData(void) sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; sQuizLadyPtr->prize = gSpecialVar_ItemId; - for (i = 0; i < 4; i ++) + for (i = 0; i < TRAINER_ID_LENGTH; i ++) { sQuizLadyPtr->playerTrainerId[i] = gSaveBlock2Ptr->playerTrainerId[i]; } @@ -613,7 +613,8 @@ void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady) u8 i; sQuizLadyPtr = &gSaveBlock1Ptr->lilycoveLady.quiz; - if (lilycoveLady->quiz.prevQuestionId < NUM_QUIZ_QUESTIONS && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ) + if (lilycoveLady->quiz.prevQuestionId < ARRAY_COUNT(sQuizLadyQuizQuestions) + && sQuizLadyPtr->id == LILYCOVE_LADY_QUIZ) { for (i = 0; i < 4; i ++) { @@ -621,11 +622,11 @@ void QuizLadyClearQuestionForRecordMix(const LilycoveLady *lilycoveLady) { break; } - sQuizLadyPtr->questionId = Random() % NUM_QUIZ_QUESTIONS; + sQuizLadyPtr->questionId = Random() % ARRAY_COUNT(sQuizLadyQuizQuestions); } if (lilycoveLady->quiz.prevQuestionId == sQuizLadyPtr->questionId) { - sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % NUM_QUIZ_QUESTIONS; + sQuizLadyPtr->questionId = (sQuizLadyPtr->questionId + 1) % (int)(ARRAY_COUNT(sQuizLadyQuizQuestions)); } sQuizLadyPtr->prevQuestionId = lilycoveLady->quiz.prevQuestionId; } -- cgit v1.2.3 From f08615881ea84bc441ea1aba4682adc2a6315a29 Mon Sep 17 00:00:00 2001 From: GriffinR Date: Sun, 18 Aug 2019 01:35:30 -0400 Subject: Changes from review --- data/event_scripts.s | 11 ++++++----- include/constants/contest.h | 19 +++++++++++++++++++ include/contest.h | 19 +------------------ src/lilycove_lady.c | 1 + 4 files changed, 27 insertions(+), 23 deletions(-) create mode 100644 include/constants/contest.h diff --git a/data/event_scripts.s b/data/event_scripts.s index 563f7fb7b..a7c2dc93f 100644 --- a/data/event_scripts.s +++ b/data/event_scripts.s @@ -1,6 +1,7 @@ #include "constants/global.h" #include "constants/battle_frontier.h" #include "constants/battle_setup.h" +#include "constants/contest.h" #include "constants/easy_chat.h" #include "constants/event_objects.h" #include "constants/event_object_movement_constants.h" @@ -4818,15 +4819,15 @@ LilycoveCity_PokemonCenter_1F_EventScript_2A89C7:: @ 82A89C7 specialvar VAR_RESULT, GetContestLadyCategory special Script_BufferContestLadyCategoryAndMonName special GetContestLadyMonSpecies - compare VAR_RESULT, 0 @CONTEST_CATEGORY_COOL + compare VAR_RESULT, CONTEST_CATEGORY_COOL goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A0A - compare VAR_RESULT, 1 @CONTEST_CATEGORY_BEAUTY + compare VAR_RESULT, CONTEST_CATEGORY_BEAUTY goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A1D - compare VAR_RESULT, 2 @CONTEST_CATEGORY_CUTE + compare VAR_RESULT, CONTEST_CATEGORY_CUTE goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A30 - compare VAR_RESULT, 3 @CONTEST_CATEGORY_SMART + compare VAR_RESULT, CONTEST_CATEGORY_SMART goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A43 - compare VAR_RESULT, 4 @CONTEST_CATEGORY_TOUGH + compare VAR_RESULT, CONTEST_CATEGORY_TOUGH goto_if_eq LilycoveCity_PokemonCenter_1F_EventScript_2A8A56 end diff --git a/include/constants/contest.h b/include/constants/contest.h new file mode 100644 index 000000000..d3296222b --- /dev/null +++ b/include/constants/contest.h @@ -0,0 +1,19 @@ +#ifndef GUARD_CONSTANTS_CONTEST_H +#define GUARD_CONSTANTS_CONTEST_H + +#define CONTESTANT_COUNT 4 +#define APPLAUSE_METER_SIZE 5 +#define CONTEST_TURN_COUNT 5 + +#define LINK_CONTEST_FLAG_IS_LINK (1 << 0) +#define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1) +#define LINK_CONTEST_FLAG_HAS_RS_PLAYER (1 << 2) + +#define CONTEST_CATEGORY_COOL 0 +#define CONTEST_CATEGORY_BEAUTY 1 +#define CONTEST_CATEGORY_CUTE 2 +#define CONTEST_CATEGORY_SMART 3 +#define CONTEST_CATEGORY_TOUGH 4 +#define CONTEST_CATEGORIES_COUNT 5 + +#endif // GUARD_CONSTANTS_CONTEST_H diff --git a/include/contest.h b/include/contest.h index a4e209bcb..8ef208aea 100644 --- a/include/contest.h +++ b/include/contest.h @@ -2,10 +2,7 @@ #define GUARD_CONTEST_H #include "palette.h" - -#define CONTESTANT_COUNT 4 -#define APPLAUSE_METER_SIZE 5 -#define CONTEST_TURN_COUNT 5 +#include "constants/contest.h" enum { @@ -18,20 +15,6 @@ enum CONTEST_DEBUG_MODE_PRINT_UNK_D }; -#define LINK_CONTEST_FLAG_IS_LINK (1 << 0) -#define LINK_CONTEST_FLAG_IS_WIRELESS (1 << 1) -#define LINK_CONTEST_FLAG_HAS_RS_PLAYER (1 << 2) - -enum -{ - CONTEST_CATEGORY_COOL, - CONTEST_CATEGORY_BEAUTY, - CONTEST_CATEGORY_CUTE, - CONTEST_CATEGORY_SMART, - CONTEST_CATEGORY_TOUGH, - CONTEST_CATEGORIES_COUNT, -}; - enum { CONTEST_EFFECT_HIGHLY_APPEALING, diff --git a/src/lilycove_lady.c b/src/lilycove_lady.c index 60ad9de46..011d9fdfd 100644 --- a/src/lilycove_lady.c +++ b/src/lilycove_lady.c @@ -17,6 +17,7 @@ #include "contest.h" #include "strings.h" #include "constants/lilycove_lady.h" + #include "data/lilycove_lady.h" static void InitLilycoveQuizLady(void); -- cgit v1.2.3 From a4d5624ad6ab4535c448df9302517a9c983418e3 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 6 Aug 2019 14:08:13 -0400 Subject: Move asm srcs to src --- Makefile | 14 +- asm/crt0.s | 199 ----- asm/libagbsyscall.s | 116 --- asm/libgcnmultiboot.s | 550 -------------- asm/m4a_1.s | 1934 ------------------------------------------------- ld_script.txt | 8 +- ld_script_modern.txt | 9 +- src/crt0.s | 199 +++++ src/libagbsyscall.s | 116 +++ src/libgcnmultiboot.s | 550 ++++++++++++++ src/m4a_1.s | 1934 +++++++++++++++++++++++++++++++++++++++++++++++++ sym_bss.txt | 2 +- 12 files changed, 2821 insertions(+), 2810 deletions(-) delete mode 100644 asm/crt0.s delete mode 100644 asm/libagbsyscall.s delete mode 100644 asm/libgcnmultiboot.s delete mode 100644 asm/m4a_1.s create mode 100644 src/crt0.s create mode 100644 src/libagbsyscall.s create mode 100644 src/libgcnmultiboot.s create mode 100644 src/m4a_1.s diff --git a/Makefile b/Makefile index 5a8af32a9..c79647fd6 100644 --- a/Makefile +++ b/Makefile @@ -123,6 +123,9 @@ endif C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) +C_ASM_SRCS += $(wildcard $(C_SUBDIR)/*.s $(C_SUBDIR)/*/*.s $(C_SUBDIR)/*/*/*.s) +C_ASM_OBJS := $(patsubst $(C_SUBDIR)/%.s,$(C_BUILDDIR)/%.o,$(C_ASM_SRCS)) + ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s) ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS)) @@ -135,7 +138,7 @@ SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS)) MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid) MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS)) -OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) +OBJS := $(C_OBJS) $(C_ASM_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS)) SUBDIRS := $(sort $(dir $(OBJS))) @@ -235,6 +238,15 @@ $(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep) @echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s +ifeq ($(NODEP),1) +$(C_BUILDDIR)/%.o: c_asm_dep := +else +$(C_BUILDDIR)/%.o: c_asm_dep = $(shell $(SCANINC) -I "" $(C_SUBDIR)/$*.s) +endif + +$(C_BUILDDIR)/%.o: $(C_SUBDIR)/%.s $$(c_asm_dep) + $(AS) $(ASFLAGS) -o $@ $< + ifeq ($(NODEP),1) $(ASM_BUILDDIR)/%.o: asm_dep := else diff --git a/asm/crt0.s b/asm/crt0.s deleted file mode 100644 index 9ed678968..000000000 --- a/asm/crt0.s +++ /dev/null @@ -1,199 +0,0 @@ - .include "constants/gba_constants.inc" - - .syntax unified - - .global Start - - .text - - .arm - -Start: @ 8000000 - b Init - - .include "asm/rom_header.inc" - -@ 80000C0 - .word 0 - - .global GPIOPortData -GPIOPortData: @ 80000C4 - .2byte 0 - - .global GPIOPortDirection -GPIOPortDirection: @ 80000C6 - .2byte 0 - - .global GPIOPortReadEnable -GPIOPortReadEnable: @ 80000C8 - .2byte 0 - -@ 80000CA - .2byte 0 - -@ 80000CC - .space 0x34 - - .4byte 3 - .4byte 2 - - .ascii "pokemon emerald version" - .space 9 - - .4byte gMonFrontPicTable - .4byte gMonBackPicTable - .4byte gMonPaletteTable - .4byte gMonShinyPaletteTable - .4byte gMonIconTable - .4byte gMonIconPaletteIndices - .4byte gMonIconPaletteTable - .4byte gSpeciesNames - .4byte gMoveNames - .4byte gDecorations - - .4byte 0x00001270, 0x0000139c, 0x00000018, 0x00000988 - .4byte 0x00003b24, 0x00000046, 0x000008e4, 0x000008ac - .4byte 0x00000182 - - .byte 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x06, 0x0c - .byte 0x06, 0x10, 0x12, 0x0c, 0x0f, 0x0b, 0x01, 0x08 - - .4byte 0x0000000c, 0x00000f2c, 0x00003d88, 0x00000234 - .4byte 0x00000238, 0x00000009, 0x0000000a, 0x00000000 - .4byte 0x00000008, 0x00000ca8, 0x00000ca8, 0x000031c7 - .4byte 0x000031b3, 0x00000000 - - .4byte gBaseStats - .4byte gAbilityNames - .4byte gAbilityDescriptionPointers - .4byte gItems - .4byte gBattleMoves - .4byte gBallSpriteSheets - .4byte gBallSpritePalettes - - .4byte 0x000000a8, 0x00000864, 0x0000089b - - .byte 0x1e, 0x1e, 0x10, 0x40 - - .4byte 0x0000322e, 0x00000498, 0x000031a8, 0x000031f8 - .4byte 0x00000034, 0x00000000, 0x00000000 - - .arm - .align 2, 0 - .global Init -Init: @ 8000204 - mov r0, PSR_IRQ_MODE - msr cpsr_cf, r0 - ldr sp, sp_irq - mov r0, PSR_SYS_MODE - msr cpsr_cf, r0 - ldr sp, sp_sys - ldr r1, =INTR_VECTOR - adr r0, IntrMain - str r0, [r1] - ldr r1, =AgbMain + 1 - mov lr, pc - bx r1 - b Init - - .align 2, 0 -sp_sys: .word IWRAM_END - 0x1c0 -sp_irq: .word IWRAM_END - 0x60 - - .pool - - .arm - .align 2, 0 - .global IntrMain -IntrMain: @ 8000248 - mov r3, REG_BASE - add r3, r3, 0x200 - ldr r2, [r3, OFFSET_REG_IE - 0x200] - ldrh r1, [r3, OFFSET_REG_IME - 0x200] - mrs r0, spsr - stmdb sp!, {r0-r3,lr} - mov r0, 0 - strh r0, [r3, OFFSET_REG_IME - 0x200] - and r1, r2, r2, lsr 16 - mov r12, 0 - ands r0, r1, INTR_FLAG_VCOUNT - bne IntrMain_FoundIntr - add r12, r12, 0x4 - mov r0, 0x1 - strh r0, [r3, OFFSET_REG_IME - 0x200] - ands r0, r1, INTR_FLAG_SERIAL - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_TIMER3 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_HBLANK - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_VBLANK - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_TIMER0 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_TIMER1 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_TIMER2 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_DMA0 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_DMA1 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_DMA2 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_DMA3 - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_KEYPAD - bne IntrMain_FoundIntr - add r12, r12, 0x4 - ands r0, r1, INTR_FLAG_GAMEPAK - strbne r0, [r3, OFFSET_REG_SOUNDCNT_X - 0x200] - bne . @ spin -IntrMain_FoundIntr: - strh r0, [r3, OFFSET_REG_IF - 0x200] - bic r2, r2, r0 - ldr r0, =gRfuState - ldr r0, [r0] - ldrb r0, [r0, 0xA] - mov r1, 0x8 - mov r0, r1, lsl r0 - orr r0, r0, INTR_FLAG_GAMEPAK - orr r1, r0, INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK - and r1, r1, r2 - strh r1, [r3, OFFSET_REG_IE - 0x200] - mrs r3, cpsr - bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK - orr r3, r3, PSR_SYS_MODE - msr cpsr_cf, r3 - ldr r1, =gIntrTable - add r1, r1, r12 - ldr r0, [r1] - stmdb sp!, {lr} - adr lr, IntrMain_RetAddr - bx r0 -IntrMain_RetAddr: - ldmia sp!, {lr} - mrs r3, cpsr - bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK - orr r3, r3, PSR_I_BIT | PSR_IRQ_MODE - msr cpsr_cf, r3 - ldmia sp!, {r0-r3,lr} - strh r2, [r3, OFFSET_REG_IE - 0x200] - strh r1, [r3, OFFSET_REG_IME - 0x200] - msr spsr_cf, r0 - bx lr - - .pool - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/libagbsyscall.s b/asm/libagbsyscall.s deleted file mode 100644 index d5639f689..000000000 --- a/asm/libagbsyscall.s +++ /dev/null @@ -1,116 +0,0 @@ - .include "constants/gba_constants.inc" - .include "asm/macros.inc" - - .syntax unified - - .text - - thumb_func_start ArcTan2 -ArcTan2: @ 82E7078 - swi 0xA - bx lr - thumb_func_end ArcTan2 - - thumb_func_start BgAffineSet -@ void BgAffineSet(BgAffineSet_src_data *src, BgAffineSet_dest_data *dest, int entry_count) -BgAffineSet: @ 82E707C - swi 0xE - bx lr - thumb_func_end BgAffineSet - - thumb_func_start CpuFastSet -@ void CpuFastSet(void *src, void *dest, unsigned int mode) -CpuFastSet: @ 82E7080 - swi 0xC - bx lr - thumb_func_end CpuFastSet - - thumb_func_start CpuSet -@ void CpuSet(void *src, void *dest, unsigned int mode) -CpuSet: @ 82E7084 - swi 0xB - bx lr - thumb_func_end CpuSet - - thumb_func_start Div -Div: @ 82E7088 - swi 0x6 - bx lr - thumb_func_end Div - - thumb_func_start LZ77UnCompVram -@ void LZ77UnCompVram(void *src, void *dest) -LZ77UnCompVram: @ 82E708C - swi 0x12 - bx lr - thumb_func_end LZ77UnCompVram - - thumb_func_start LZ77UnCompWram -@ void LZ77UnCompWram(void *src, void *dest) -LZ77UnCompWram: @ 82E7090 - swi 0x11 - bx lr - thumb_func_end LZ77UnCompWram - - thumb_func_start MultiBoot -@ s32 MultiBoot(struct MultiBootParam *mp) -MultiBoot: @ 82E7094 - movs r1, 0x1 - swi 0x25 - bx lr - thumb_func_end MultiBoot - - thumb_func_start ObjAffineSet -ObjAffineSet: @ 82E709C - swi 0xF - bx lr - thumb_func_end ObjAffineSet - - thumb_func_start RLUnCompVram -RLUnCompVram: @ 82E70A0 - swi 0x15 - bx lr - thumb_func_end RLUnCompVram - - thumb_func_start RLUnCompWram -RLUnCompWram: @ 82E70A4 - swi 0x14 - bx lr - thumb_func_end RLUnCompWram - - thumb_func_start RegisterRamReset -@ void RegisterRamReset(int ResetFlags) -RegisterRamReset: @ 82E70A8 - swi 0x1 - bx lr - thumb_func_end RegisterRamReset - - thumb_func_start SoftReset -@ void SoftReset() -SoftReset: @ 82E70AC - ldr r3, =REG_IME - movs r2, 0 - strb r2, [r3] - ldr r1, =0x3007F00 - mov sp, r1 - swi 0x1 - swi 0 - .pool - thumb_func_end SoftReset - - thumb_func_start Sqrt -@ s16 Sqrt(int) -Sqrt: @ 82E70C4 - swi 0x8 - bx lr - thumb_func_end Sqrt - - thumb_func_start VBlankIntrWait -@ void VBlankIntrWait() -VBlankIntrWait: @ 82E70C8 - movs r2, 0 - swi 0x5 - bx lr - thumb_func_end VBlankIntrWait - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/libgcnmultiboot.s b/asm/libgcnmultiboot.s deleted file mode 100644 index 0e418e51f..000000000 --- a/asm/libgcnmultiboot.s +++ /dev/null @@ -1,550 +0,0 @@ -@ This library can be used to download and execute a multi-boot image from -@ a GameCube using the JOY Bus protocol over the link cable. - - .include "asm/macros.inc" - .include "constants/constants.inc" - - .equiv GCMB_STRUCT_BASE_DEST_PTR, 0x20 - .equiv GCMB_STRUCT_CUR_DEST_PTR, 0x24 - .equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28 - - .equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x4 - - .syntax unified - - .text - - thumb_func_start GameCubeMultiBoot_Hash -GameCubeMultiBoot_Hash: @ 82DED70 - push {r4,lr} - ldr r4, pool_HashVal - eors r3, r1 - movs r2, 0x20 - -GameCubeMultiBoot_Hash_Loop: - lsrs r3, 1 - bcc GameCubeMultiBoot_Hash_SkipEor - - eors r3, r4 - -GameCubeMultiBoot_Hash_SkipEor: - subs r2, 0x1 - bne GameCubeMultiBoot_Hash_Loop - - pop {r4,pc} - thumb_func_end GameCubeMultiBoot_Hash - - thumb_func_start GameCubeMultiBoot_Main -@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb); -GameCubeMultiBoot_Main: @ 82DED84 - ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - cmp r1, 0 - beq _082DEDAA - ldrb r1, [r0, 0x1] - adds r1, 0x1 - strb r1, [r0, 0x1] - ldrb r1, [r0, 0x2] - cmp r1, 0x2 - beq _082DEDF4 - ldr r3, pool_InterruptRegs - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - ldrb r1, [r0] - cmp r1, 0xA - bgt _082DEDA8 - adds r1, 0x1 - strb r1, [r0] -_082DEDA8: - strh r2, [r3, OFFSET_REG_IME - 0x200] -_082DEDAA: - bcs GameCubeMultiBoot_Init - ldrb r1, [r0, 0x2] - cmp r1, 0 - bne _082DEDF6 - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] - subs r1, r2 - beq _082DEE76 - cmp r1, 0xA0 - bcc _082DEE76 - push {r4-r6} - movs r1, 0x98 - adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET - ldr r4, pool_NintendoLogo -_082DEDC6: - ldm r2!, {r5} - ldm r4!, {r6} - cmp r5, r6 - bne _082DEDDC - subs r1, 0x4 - bne _082DEDC6 - ldm r2!, {r5} - ldm r4!, {r6} - eors r5, r6 - lsrs r5, 8 - str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] -_082DEDDC: - pop {r4-r6} - bne GameCubeMultiBoot_Init - movs r1, 0x1 - strb r1, [r0, 0x2] - ldr r1, [r0, 0x4] - ldr r2, [r0, 0x8] - eors r1, r2 - str r1, [r0, 0x18] - ldr r2, pool_Kawa - muls r1, r2 - adds r1, 0x1 - str r1, [r0, 0x14] -_082DEDF4: - bx lr -_082DEDF6: - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - mov r12, r1 - ldr r3, [r0, 0x18] - push {r4-r7} - ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] - ldr r5, pool_Kawa - ldr r6, [r0, 0x14] - ldr r7, pool_HashVal -_082DEE06: - cmp r4, r12 - bcs _082DEE26 - ldr r1, [r4] - eors r1, r6 - adds r1, r3 - stm r4!, {r1} - eors r3, r1 - movs r2, 0x20 -_082DEE16: - lsrs r3, 1 - bcc _082DEE1C - eors r3, r7 -_082DEE1C: - subs r2, 0x1 - bne _082DEE16 - muls r6, r5 - adds r6, 0x1 - b _082DEE06 -_082DEE26: - str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r6, [r0, 0x14] - pop {r4-r7} - str r3, [r0, 0x18] - ldrh r1, [r0, 0x12] - cmp r1, 0 - bne _082DEE76 - ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] - cmp r1, r2 - bne _082DEE76 - ldr r1, [r0, 0xC] - cmp r1, 0 - beq _082DEE60 - ldrh r1, [r0, 0x10] - cmp r1, 0 - beq _082DEDF4 - mov r12, lr - movs r1, 0xBB - ldr r3, [r0, 0xC] - bl GameCubeMultiBoot_Hash - ldrh r1, [r0, 0x10] - mov lr, r12 - subs r1, r3 - bne GameCubeMultiBoot_Init - movs r1, 0x2 - strb r1, [r0, 0x2] - bx lr -_082DEE60: - mov r12, lr - ldrb r1, [r0, 0x3] - lsls r1, 24 - subs r1, 0x1 - str r1, [r0, 0xC] - bl GameCubeMultiBoot_Hash - lsls r3, 8 - adds r3, 0xFF - str r3, [r0, 0x1C] - bx r12 -_082DEE76: - bx lr - thumb_func_end GameCubeMultiBoot_Main - - .align 2, 0 - -pool_HashVal: .4byte 0xa1c1 - -pool_Kawa: .ascii "Kawa" @ name of BIOS developer - -pool_NintendoLogo: .4byte RomHeaderNintendoLogo - - thumb_func_start GameCubeMultiBoot_ExecuteProgram -@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb); -GameCubeMultiBoot_ExecuteProgram: @ 82DEE84 - ldrb r1, [r0, 0x2] - cmp r1, 0x2 - bne GameCubeMultiBoot_ExecuteProgram_Fail - ldr r3, pool_InterruptRegs - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - ldr r1, pool_MultiBootLoadAddr - adds r1, 0xC0 - bx r1 -GameCubeMultiBoot_ExecuteProgram_Fail: - bx lr - thumb_func_end GameCubeMultiBoot_ExecuteProgram - - thumb_func_start GameCubeMultiBoot_Init -@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb); -GameCubeMultiBoot_Init: @ 82DEE98 - ldr r3, pool_InterruptRegs - -@ Save IME register. - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - -@ Disable interrupts. - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - -@ Set the handler to the "Stop" routine. -@ Unless the first command that is received is a device reset command, the -@ "Stop" routine will be executed and no further commands will be processed. - adr r3, GcMbIntrHandler_Stop - str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - - ldrb r3, [r0, 0x3] - push {r3} - ldrb r3, [r0, 0x1] - push {r0,r3} - - adds r3, r0, 0 - adds r3, GCMB_STRUCT_BASE_DEST_PTR - -@ clear all but the last 3 fields of the struct -GameCubeMultiBoot_Init_ClearStructLoop: - stm r0!, {r1} - cmp r0, r3 - blo GameCubeMultiBoot_Init_ClearStructLoop - - pop {r0,r3} - lsrs r3, 1 - strb r3, [r0, 0x3] - pop {r3} - strb r3, [r0, 0x1] - - ldr r3, pool_SerialRegs - -@ Turn off JOY Bus mode. - lsls r0, r3, 10 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] - -@ Turn on JOY Bus mode. - movs r0, 0xC0 - lsls r0, 8 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] - -@ Init JOY Bus registers. - movs r0, 0x47 - strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - - ldr r3, pool_InterruptRegs - -@ Acknowledge serial interrupt. - movs r0, INTR_FLAG_SERIAL - strh r0, [r3, OFFSET_REG_IF - 0x200] - -@ Enable serial interrupt. - ldrh r1, [r3, OFFSET_REG_IE - 0x200] - orrs r1, r0 - strh r1, [r3, OFFSET_REG_IE - 0x200] - -@ Restore IME register. - strh r2, [r3, OFFSET_REG_IME - 0x200] - - bx lr - thumb_func_end GameCubeMultiBoot_Init - - non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt -@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb); -GameCubeMultiBoot_HandleSerialInterrupt: @ 82DEEE2 - ldr r3, pool_SerialRegs - -@ Acknowledge reset/receive/send flags. - ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120] - strh r1, [r3, OFFSET_REG_JOYCNT - 0x120] - - movs r2, 0 - strb r2, [r0] - - ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - cmp r2, 0 - beq GameCubeMultiBoot_HandleSerialInterruptDone - - lsrs r1, 1 @ was a device reset command received? - bcs GameCubeMultiBoot_BeginHandshake @ branch if so - - mov pc, r2 - - .align 2, 0 - -@ Zero the status and the interrupt handler pointer. -@ Commands from the GameCube will not be processed after this is executed -@ unless GameCubeMultiBoot_Init() is called again. -GcMbIntrHandler_Stop: - movs r2, 0 - strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120] - -GameCubeMultiBoot_SetInterruptHandler: - str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] - -GameCubeMultiBoot_ReadVCount: - ldr r3, pool_RegDispstat - ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT] - strb r1, [r0, 0x3] - -GameCubeMultiBoot_HandleSerialInterruptDone: - bx lr - -GameCubeMultiBoot_BeginHandshake: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - ldr r1, pool_RubyUSAGameCode - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - movs r1, 0x10 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - ldrb r1, [r0, 0x3] - strb r1, [r0, 0x9] - ldrb r1, [r0, 0x2] - cmp r1, 0 - bne GcMbIntrHandler_Stop - ldr r1, pool_MultiBootLoadAddr - str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - adr r2, GcMbIntrHandler_CheckGameCodeSent - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckGameCodeSent: @ 82DEF24 - lsls r1, 31 - bcc GcMbIntrHandler_Stop @ stop if send failed - bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete - -@ If the response hasn't been fully received yet, -@ check again upon the next interrupt. - adr r2, GcMbIntrHandler_CheckHandshakeResponse - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_CheckHandshakeResponse: @ 82DEF30 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ stop if not - -GameCubeMultiBoot_CheckHandshakeResponse: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - ldr r2, pool_RubyUSAGameCode - cmp r1, r2 - bne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code - ldrb r1, [r0, 0x3] - strb r1, [r0, 0xB] - adr r2, GcMbIntrHandler_82DEF44 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEF44: @ 82DEF44 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - lsrs r2, r1, 24 - cmp r2, 0xDD - bne GcMbIntrHandler_Stop - str r1, [r0, 0x4] - ldrb r1, [r0, 0x1] - strb r1, [r0, 0xA] - movs r2, 0 - movs r3, 0 - ldr r1, [r0, 0x8] - lsrs r1, 8 -_082DEF5E: - lsrs r1, 1 - adcs r2, r3 - cmp r1, 0 - bne _082DEF5E - cmp r2, 0xE - bgt _082DEF70 - cmp r2, 0x7 - bge _082DEF72 - movs r1, 0xFF -_082DEF70: - strb r1, [r0, 0xA] -_082DEF72: - ldr r1, [r0, 0x8] - adds r1, 0xEE - ldr r3, pool_SerialRegs - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - movs r1, 0x30 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - adr r2, GcMbIntrHandler_82DEF84 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEF84: @ 82DEF84 - lsls r1, 31 - bcc GcMbIntrHandler_Stop @ stop if send failed - bmi _082DEF94 @ branch if receive is complete - adr r2, GcMbIntrHandler_82DEF90 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEF90: @ 82DEF90 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not -_082DEF94: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - ldr r2, _082DF034 - cmp r1, r2 - bhs GcMbIntrHandler_Stop - adds r1, 0x1 - adds r1, r1 - strh r1, [r0, 0x12] - ldrb r1, [r0, 0x2] - cmp r1, 0 -_082DEFA6: - bne GcMbIntrHandler_Stop - ldr r1, pool_MultiBootLoadAddr - str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] - str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] - adr r2, GcMbIntrHandler_82DEFB4 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEFB4: @ 82DEFB4 - lsrs r1, 1 @ is receive complete? - bcc GcMbIntrHandler_Stop @ branch if not - ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] - movs r1, 0x4 - ands r1, r2 - adds r1, 0x8 - lsls r1, 2 - strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - stm r2!, {r1} - str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] - ldrh r1, [r0, 0x12] - subs r1, 0x1 - strh r1, [r0, 0x12] - bne GameCubeMultiBoot_ReadVCount - -_082DEFD2: - ldrb r1, [r0, 0x1] - lsls r1, 8 - adds r1, 0xCC - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - adr r2, _082DEFE0 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -_082DEFE0: - lsls r1, 31 - -_082DEFE2: - bcc GcMbIntrHandler_Stop - ldr r1, [r0, 0x1C] - cmp r1, 0 - beq _082DEFD2 - str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] - adr r2, GcMbIntrHandler_82DEFF0 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEFF0: @ 82DEFF0 - lsls r1, 31 - bcc _082DEFE2 @ branch if send failed - bmi _082DF000 @ branch if receive is complete - adr r2, GcMbIntrHandler_82DEFFC - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DEFFC: @ 82DEFFC - lsrs r1, 1 @ is receive complete? - bcc _082DEFE2 @ branch if not - -_082DF000: - ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] - lsrs r2, r1, 24 - cmp r2, 0xBB - bne _082DEFA6 - strh r1, [r0, 0x10] - adr r2, GcMbIntrHandler_82DF010 - b GameCubeMultiBoot_SetInterruptHandler - - .align 2, 0 - -GcMbIntrHandler_82DF010: @ 82DF010 - b GcMbIntrHandler_Stop - - thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt - - non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit -@ void GameCubeMultiBoot_Quit(); -GameCubeMultiBoot_Quit: @ 82DF012 - ldr r3, pool_InterruptRegs - -@ Save IME register. - ldrh r2, [r3, OFFSET_REG_IME - 0x200] - -@ Disable interrupts. - movs r1, 0 - strh r1, [r3, OFFSET_REG_IME - 0x200] - - ldr r3, pool_SerialRegs - -@ Acknowledge all JOYCNT flags. - movs r0, 0x7 - strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] - -@ Turn off JOY Bus mode. - lsls r0, r3, 10 - strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000 - - ldr r3, pool_InterruptRegs - -@ Acknowledge serial interrupt. - movs r0, INTR_FLAG_SERIAL - strh r0, [r3, OFFSET_REG_IF - 0x200] - -@ Disable serial interrupt. - ldrh r1, [r3, OFFSET_REG_IE - 0x200] - bics r1, r0 - strh r1, [r3, OFFSET_REG_IE - 0x200] - -@ Restore IME register. - strh r2, [r3, OFFSET_REG_IME - 0x200] - - bx lr - thumb_func_end GameCubeMultiBoot_Quit - - .align 2, 0 - -_082DF034: .4byte 0x4000 - -pool_InterruptRegs: .4byte REG_BASE + 0x200 - -pool_SerialRegs: .4byte REG_BASE + 0x120 - -pool_RegDispstat: .4byte REG_DISPSTAT - -pool_RubyUSAGameCode: .ascii "AXVE" - -pool_MultiBootLoadAddr: .4byte EWRAM_START - - .align 2, 0 @ Don't pad with nop. diff --git a/asm/m4a_1.s b/asm/m4a_1.s deleted file mode 100644 index cab4ed174..000000000 --- a/asm/m4a_1.s +++ /dev/null @@ -1,1934 +0,0 @@ - .include "asm/macros.inc" - .include "constants/gba_constants.inc" - .include "constants/m4a_constants.inc" - - .syntax unified - - .text - - thumb_func_start umul3232H32 -umul3232H32: - adr r2, __umul3232H32 - bx r2 - .arm -__umul3232H32: - umull r2, r3, r0, r1 - add r0, r3, 0 - bx lr - thumb_func_end umul3232H32 - - thumb_func_start SoundMain -SoundMain: - ldr r0, lt_SOUND_INFO_PTR - ldr r0, [r0] - ldr r2, lt_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] - cmp r2, r3 - beq SoundMain_1 - bx lr @ Exit the function if ident doesn't match ID_NUMBER. -SoundMain_1: - adds r3, 1 - str r3, [r0, o_SoundInfo_ident] - push {r4-r7,lr} - mov r1, r8 - mov r2, r9 - mov r3, r10 - mov r4, r11 - push {r0-r4} - sub sp, 0x18 - ldrb r1, [r0, o_SoundInfo_maxLines] - cmp r1, 0 @ if maxLines is 0, there is no maximum - beq SoundMain_3 - ldr r2, lt_REG_VCOUNT - ldrb r2, [r2] - cmp r2, VCOUNT_VBLANK - bhs SoundMain_2 - adds r2, TOTAL_SCANLINES -SoundMain_2: - adds r1, r2 -SoundMain_3: - str r1, [sp, 0x14] - ldr r3, [r0, o_SoundInfo_func] - cmp r3, 0 - beq SoundMain_4 - ldr r0, [r0, o_SoundInfo_intp] - bl _081DD25E - ldr r0, [sp, 0x18] -SoundMain_4: - ldr r3, [r0, o_SoundInfo_CgbSound] - bl _081DD25E - ldr r0, [sp, 0x18] - ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] - mov r8, r3 - ldr r5, lt_o_SoundInfo_pcmBuffer - adds r5, r0 - ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] - subs r7, r4, 1 - bls SoundMain_5 - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] - subs r1, r7 - mov r2, r8 - muls r2, r1 - adds r5, r2 -SoundMain_5: - str r5, [sp, 0x8] - ldr r6, lt_PCM_DMA_BUF_SIZE - ldr r3, lt_SoundMainRAM_Buffer - bx r3 - - .align 2, 0 -lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR -lt_ID_NUMBER: .word ID_NUMBER -lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 -lt_REG_VCOUNT: .word REG_VCOUNT -lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer -lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE - thumb_func_end SoundMain - - thumb_func_start SoundMainRAM -SoundMainRAM: - ldrb r3, [r0, o_SoundInfo_reverb] - cmp r3, 0 - beq SoundMainRAM_NoReverb - adr r1, SoundMainRAM_Reverb - bx r1 - .arm -SoundMainRAM_Reverb: - cmp r4, 0x2 - addeq r7, r0, o_SoundInfo_pcmBuffer - addne r7, r5, r8 - mov r4, r8 -_081DCEC4: - ldrsb r0, [r5, r6] - ldrsb r1, [r5] - add r0, r0, r1 - ldrsb r1, [r7, r6] - add r0, r0, r1 - ldrsb r1, [r7], 0x1 - add r0, r0, r1 - mul r1, r0, r3 - mov r0, r1, asr 9 - tst r0, 0x80 - addne r0, r0, 0x1 - strb r0, [r5, r6] - strb r0, [r5], 0x1 - subs r4, r4, 0x1 - bgt _081DCEC4 - adr r0, _081DCF36 + 1 @ plus 1 because THUMB - bx r0 - .thumb -SoundMainRAM_NoReverb: - movs r0, 0 - mov r1, r8 - adds r6, r5 - lsrs r1, 3 - bcc SoundMainRAM_NoReverb_Ok - stm r5!, {r0} - stm r6!, {r0} -SoundMainRAM_NoReverb_Ok: - lsrs r1, 1 - bcc SoundMainRAM_NoReverb_Loop - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} -SoundMainRAM_NoReverb_Loop: - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - stm r5!, {r0} - stm r6!, {r0} - subs r1, 1 - bgt SoundMainRAM_NoReverb_Loop -_081DCF36: - ldr r4, [sp, 0x18] - ldr r0, [r4, o_SoundInfo_divFreq] - mov r12, r0 - ldrb r0, [r4, o_SoundInfo_maxChans] - adds r4, o_SoundInfo_chans - -SoundMainRAM_ChanLoop: - str r0, [sp, 0x4] - ldr r3, [r4, o_SoundChannel_wav] - ldr r0, [sp, 0x14] - cmp r0, 0 - beq _081DCF60 - ldr r1, =REG_VCOUNT - ldrb r1, [r1] - cmp r1, VCOUNT_VBLANK - bhs _081DCF54 - adds r1, TOTAL_SCANLINES -_081DCF54: - cmp r1, r0 - blo _081DCF60 - b _081DD24A - - .pool - -_081DCF60: - ldrb r6, [r4, o_SoundChannel_status] - movs r0, 0xC7 - tst r0, r6 - bne _081DCF6A - b _081DD240 -_081DCF6A: - movs r0, 0x80 - tst r0, r6 - beq _081DCFA0 - movs r0, 0x40 - tst r0, r6 - bne _081DCFB0 - movs r6, 0x3 - strb r6, [r4, o_SoundChannel_status] - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r4, o_SoundChannel_ct] - adds r0, r1 - str r0, [r4, o_SoundChannel_cp] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [r4, o_SoundChannel_ct] - movs r5, 0 - strb r5, [r4, o_SoundChannel_ev] - str r5, [r4, o_SoundChannel_fw] - ldrb r2, [r3, 0x3] - movs r0, 0xC0 - tst r0, r2 - beq _081DCFF8 - movs r0, 0x10 - orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] - b _081DCFF8 -_081DCFA0: - ldrb r5, [r4, o_SoundChannel_ev] - movs r0, 0x4 - tst r0, r6 - beq _081DCFB6 - ldrb r0, [r4, o_SoundChannel_iel] - subs r0, 1 - strb r0, [r4, o_SoundChannel_iel] - bhi _081DD006 -_081DCFB0: - movs r0, 0 - strb r0, [r4, o_SoundChannel_status] - b _081DD240 -_081DCFB6: - movs r0, 0x40 - tst r0, r6 - beq _081DCFD6 - ldrb r0, [r4, o_SoundChannel_release] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_iev] - cmp r5, r0 - bhi _081DD006 -_081DCFC8: - ldrb r5, [r4, o_SoundChannel_iev] - cmp r5, 0 - beq _081DCFB0 - movs r0, 0x4 - orrs r6, r0 - strb r6, [r4, o_SoundChannel_status] - b _081DD006 -_081DCFD6: - movs r2, 0x3 - ands r2, r6 - cmp r2, 0x2 - bne _081DCFF4 - ldrb r0, [r4, o_SoundChannel_decay] - muls r5, r0 - lsrs r5, 8 - ldrb r0, [r4, o_SoundChannel_sustain] - cmp r5, r0 - bhi _081DD006 - adds r5, r0, 0 - beq _081DCFC8 - subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] - b _081DD006 -_081DCFF4: - cmp r2, 0x3 - bne _081DD006 -_081DCFF8: - ldrb r0, [r4, o_SoundChannel_attack] - adds r5, r0 - cmp r5, 0xFF - bcc _081DD006 - movs r5, 0xFF - subs r6, 0x1 - strb r6, [r4, o_SoundChannel_status] -_081DD006: - strb r5, [r4, o_SoundChannel_ev] - ldr r0, [sp, 0x18] - ldrb r0, [r0, o_SoundChannel_release] - adds r0, 0x1 - muls r0, r5 - lsrs r5, r0, 4 - ldrb r0, [r4, o_SoundChannel_rightVolume] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, o_SoundChannel_er] - ldrb r0, [r4, o_SoundChannel_leftVolume] - muls r0, r5 - lsrs r0, 8 - strb r0, [r4, o_SoundChannel_el] - movs r0, 0x10 - ands r0, r6 - str r0, [sp, 0x10] - beq _081DD03A - adds r0, r3, 0 - adds r0, 0x10 - ldr r1, [r3, 0x8] - adds r0, r1 - str r0, [sp, 0xC] - ldr r0, [r3, 0xC] - subs r0, r1 - str r0, [sp, 0x10] -_081DD03A: - ldr r5, [sp, 0x8] - ldr r2, [r4, o_SoundChannel_ct] - ldr r3, [r4, o_SoundChannel_cp] - adr r0, _081DD044 - bx r0 - .arm -_081DD044: - str r8, [sp] - ldr r9, [r4, o_SoundChannel_fw] - ldrb r10, [r4, o_SoundChannel_er] - ldrb r11, [r4, o_SoundChannel_el] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x30 - beq _081DD068 - bl sub_82DF49C - b _081DD228 -_081DD068: - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 - beq _081DD19C -_081DD07C: - cmp r2, 0x4 - ble _081DD0EC - subs r2, r2, r8 - movgt r9, 0 - bgt _081DD0A8 - mov r9, r8 - add r2, r2, r8 - sub r8, r2, 0x4 - sub r9, r9, r8 - ands r2, r2, 0x3 - moveq r2, 0x4 -_081DD0A8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0B0: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - adds r5, r5, 0x40000000 - bcc _081DD0B0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD0A8 - adds r8, r8, r9 - beq _081DD22C -_081DD0EC: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD0F4: - ldrsb r0, [r3], 0x1 - mul r1, r10, r0 - bic r1, r1, 0xFF0000 - add r6, r1, r6, ror 8 - mul r1, r11, r0 - bic r1, r1, 0xFF0000 - add r7, r1, r7, ror 8 - subs r2, r2, 0x1 - beq _081DD164 -_081DD118: - adds r5, r5, 0x40000000 - bcc _081DD0F4 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD07C - b _081DD22C -_081DD134: - ldr r0, [sp, 0x18] - cmp r0, 0 - beq _081DD158 - ldr r3, [sp, 0x14] - rsb lr, r2, 0 -_081DD148: - adds r2, r0, r2 - bgt _081DD1FC - sub lr, lr, r0 - b _081DD148 -_081DD158: - pop {r4,r12} - mov r2, 0 - b _081DD174 -_081DD164: - ldr r2, [sp, 0x10] - cmp r2, 0 - ldrne r3, [sp, 0xC] - bne _081DD118 -_081DD174: - strb r2, [r4, o_SoundChannel_status] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - b _081DD234 -_081DD19C: - push {r4,r12} - ldr r1, [r4, o_SoundChannel_freq] - mul r4, r12, r1 - ldrsb r0, [r3] - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD1B4: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD1BC: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r4 - movs lr, r9, lsr 23 - beq _081DD208 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD134 - subs lr, lr, 0x1 - addeq r0, r0, r1 -_081DD1FC: - ldrsbne r0, [r3, lr]! - ldrsb r1, [r3, 0x1]! - sub r1, r1, r0 -_081DD208: - adds r5, r5, 0x40000000 - bcc _081DD1BC - str r7, [r5, 0x630] - str r6, [r5], 0x4 - subs r8, r8, 0x4 - bgt _081DD1B4 - sub r3, r3, 0x1 - pop {r4,r12} -_081DD228: - str r9, [r4, o_SoundChannel_fw] -_081DD22C: - str r2, [r4, o_SoundChannel_ct] - str r3, [r4, o_SoundChannel_cp] -_081DD234: - ldr r8, [sp] - add r0, pc, 0x1 - bx r0 - .thumb -_081DD240: - ldr r0, [sp, 0x4] - subs r0, 1 - ble _081DD24A - adds r4, SoundChannel_size - b SoundMainRAM_ChanLoop -_081DD24A: - ldr r0, [sp, 0x18] - ldr r3, =ID_NUMBER - str r3, [r0] - add sp, 0x1C - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} -_081DD25E: - bx r3 - .pool - thumb_func_end SoundMainRAM - - arm_func_start sub_82DF49C -sub_82DF49C: - ldr r6, [r4, o_SoundChannel_wav] - ldrb r0, [r4, o_SoundChannel_status] - tst r0, 0x20 - bne _081DD2B4 - orr r0, r0, 0x20 - strb r0, [r4, o_SoundChannel_status] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - beq _081DD29C - ldr r1, [r6, 0xC] - add r1, r1, r6, lsl 1 - add r1, r1, 0x20 - sub r3, r1, r3 - str r3, [r4, o_SoundChannel_cp] -_081DD29C: - ldrh r0, [r6] - cmp r0, 0 - beq _081DD2B4 - sub r3, r3, r6 - sub r3, r3, 0x10 - str r3, [r4, o_SoundChannel_cp] -_081DD2B4: - push {r8,r12,lr} - mov r10, r10, lsl 16 - mov r11, r11, lsl 16 - ldr r1, [r4, o_SoundChannel_freq] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x8 - movne r8, 0x800000 - muleq r8, r12, r1 - ldrh r0, [r6] - cmp r0, 0 - beq _081DD468 - mov r0, 0xFF000000 - str r0, [r4, o_SoundChannel_xpi] - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - bne _081DD3C0 - bl sub_82DF758 - mov r0, r1 - add r3, r3, 0x1 - bl sub_82DF758 - sub r1, r1, r0 -_081DD308: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD310: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD370 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD398 - subs lr, lr, 0x1 - bne _081DD358 - add r0, r0, r1 - b _081DD364 -_081DD358: - add r3, r3, lr - bl sub_82DF758 - mov r0, r1 -_081DD364: - add r3, r3, 0x1 - bl sub_82DF758 - sub r1, r1, r0 -_081DD370: - adds r5, r5, 0x40000000 - bcc _081DD310 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD308 - sub r3, r3, 0x1 - b _081DD4F0 -_081DD398: - ldr r0, [sp, 0x1C] - cmp r0, 0 - beq _081DD4F4 - ldr r3, [r4, o_SoundChannel_wav] - ldr r3, [r3, 0x8] - rsb lr, r2, 0 -_081DD3B0: - adds r2, r2, r0 - bgt _081DD358 - sub lr, lr, r0 - b _081DD3B0 -_081DD3C0: - sub r3, r3, 0x1 - bl sub_82DF758 - mov r0, r1 - sub r3, r3, 0x1 - bl sub_82DF758 - sub r1, r1, r0 -_081DD3D8: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD3E0: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD440 - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - subs lr, lr, 0x1 - bne _081DD428 - add r0, r0, r1 - b _081DD434 -_081DD428: - sub r3, r3, lr - bl sub_82DF758 - mov r0, r1 -_081DD434: - sub r3, r3, 0x1 - bl sub_82DF758 - sub r1, r1, r0 -_081DD440: - adds r5, r5, 0x40000000 - bcc _081DD3E0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD3D8 - add r3, r3, 0x2 - b _081DD4F0 -_081DD468: - ldrb r0, [r4, o_SoundChannel_type] - tst r0, 0x10 - beq _081DD4F0 - ldrsb r0, [r3, -0x1]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD480: - ldr r6, [r5] - ldr r7, [r5, 0x630] -_081DD488: - mul lr, r9, r1 - add lr, r0, lr, asr 23 - mul r12, r10, lr - bic r12, r12, 0xFF0000 - add r6, r12, r6, ror 8 - mul r12, r11, lr - bic r12, r12, 0xFF0000 - add r7, r12, r7, ror 8 - add r9, r9, r8 - movs lr, r9, lsr 23 - beq _081DD4CC - bic r9, r9, 0x3F800000 - subs r2, r2, lr - ble _081DD4F4 - ldrsb r0, [r3, -lr]! - ldrsb r1, [r3, -0x1] - sub r1, r1, r0 -_081DD4CC: - adds r5, r5, 0x40000000 - bcc _081DD488 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - ldr r6, [sp] - subs r6, r6, 0x4 - str r6, [sp] - bgt _081DD480 - add r3, r3, 0x1 -_081DD4F0: - pop {r8,r12,pc} -_081DD4F4: - mov r2, 0 - strb r2, [r4, o_SoundChannel_status] - mov r0, r5, lsr 30 - bic r5, r5, 0xC0000000 - rsb r0, r0, 0x3 - mov r0, r0, lsl 3 - mov r6, r6, ror r0 - mov r7, r7, ror r0 - str r7, [r5, 0x630] - str r6, [r5], 0x4 - pop {r8,r12,pc} - arm_func_end sub_82DF49C - - arm_func_start sub_82DF758 -sub_82DF758: - push {r0,r2,r5-r7,lr} - mov r0, r3, lsr 6 - ldr r1, [r4, o_SoundChannel_xpi] - cmp r0, r1 - beq _081DD594 - str r0, [r4, o_SoundChannel_xpi] - mov r1, 0x21 - mul r2, r1, r0 - ldr r1, [r4, o_SoundChannel_wav] - add r2, r2, r1 - add r2, r2, 0x10 - ldr r5, =gUnknown_03001300 - ldr r6, =gDeltaEncodingTable - mov r7, 0x40 - ldrb lr, [r2], 1 - strb lr, [r5], 1 - ldrb r1, [r2], 1 - b _081DD57C -_081DD568: - ldrb r1, [r2], 1 - mov r0, r1, lsr 4 - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 1 -_081DD57C: - and r0, r1, 0xF - ldrsb r0, [r6, r0] - add lr, lr, r0 - strb lr, [r5], 1 - subs r7, r7, 2 - bgt _081DD568 -_081DD594: - ldr r5, =gUnknown_03001300 - and r0, r3, 0x3F - ldrsb r1, [r5, r0] - pop {r0,r2,r5-r7,pc} - .pool - arm_func_end sub_82DF758 - - thumb_func_start SoundMainBTM -SoundMainBTM: - mov r12, r4 - movs r1, 0 - movs r2, 0 - movs r3, 0 - movs r4, 0 - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - stm r0!, {r1-r4} - mov r4, r12 - bx lr - thumb_func_end SoundMainBTM - - thumb_func_start RealClearChain -RealClearChain: - ldr r3, [r0, 0x2C] - cmp r3, 0 - beq _081DD5E2 - ldr r1, [r0, 0x34] - ldr r2, [r0, 0x30] - cmp r2, 0 - beq _081DD5D6 - str r1, [r2, 0x34] - b _081DD5D8 -_081DD5D6: - str r1, [r3, 0x20] -_081DD5D8: - cmp r1, 0 - beq _081DD5DE - str r2, [r1, 0x30] -_081DD5DE: - movs r1, 0 - str r1, [r0, 0x2C] -_081DD5E2: - bx lr - thumb_func_end RealClearChain - - thumb_func_start ply_fine -ply_fine: - push {r4,r5,lr} - adds r5, r1, 0 - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq ply_fine_done -ply_fine_loop: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq ply_fine_ok - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] -ply_fine_ok: - adds r0, r4, 0 - bl RealClearChain - ldr r4, [r4, 0x34] - cmp r4, 0 - bne ply_fine_loop -ply_fine_done: - movs r0, 0 - strb r0, [r5] - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end ply_fine - - thumb_func_start MPlayJumpTableCopy -MPlayJumpTableCopy: - mov r12, lr - movs r1, 0x24 - ldr r2, lt_MPlayJumpTableTemplate -MPlayJumpTableCopy_Loop: - ldr r3, [r2] - bl chk_adr_r2 - stm r0!, {r3} - adds r2, 0x4 - subs r1, 0x1 - bgt MPlayJumpTableCopy_Loop - bx r12 - thumb_func_end MPlayJumpTableCopy - - .align 2, 0 - .thumb_func -ldrb_r3_r2: - ldrb r3, [r2] - -@ This attempts to protect against reading anything from the BIOS ROM -@ besides the jump table template. -@ It assumes that the jump table template is located at the end of the ROM. - .thumb_func -chk_adr_r2: - push {r0} - lsrs r0, r2, 25 - bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it - ldr r0, lt_MPlayJumpTableTemplate - cmp r2, r0 - blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it - lsrs r0, r2, 14 - beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it -chk_adr_r2_reject: - movs r3, 0 -chk_adr_r2_done: - pop {r0} - bx lr - - .align 2, 0 -lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate - - thumb_func_start ld_r3_tp_adr_i -ld_r3_tp_adr_i: - ldr r2, [r1, 0x40] -_081DD64A: - adds r3, r2, 0x1 - str r3, [r1, 0x40] - ldrb r3, [r2] - b chk_adr_r2 - thumb_func_end ld_r3_tp_adr_i - - thumb_func_start ply_goto -ply_goto: - push {lr} -ply_goto_1: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r0, [r2, 0x3] - lsls r0, 8 - ldrb r3, [r2, 0x2] - orrs r0, r3 - lsls r0, 8 - ldrb r3, [r2, 0x1] - orrs r0, r3 - lsls r0, 8 - bl ldrb_r3_r2 - orrs r0, r3 - str r0, [r1, o_MusicPlayerTrack_cmdPtr] - pop {r0} - bx r0 - thumb_func_end ply_goto - - thumb_func_start ply_patt -ply_patt: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - cmp r2, 3 - bhs ply_patt_done - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - adds r2, 0x4 - str r2, [r3, o_MusicPlayerTrack_patternStack] - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - adds r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] - b ply_goto -ply_patt_done: - b ply_fine - thumb_func_end ply_patt - - thumb_func_start ply_pend -ply_pend: - ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] - cmp r2, 0 - beq ply_pend_done - subs r2, 1 - strb r2, [r1, o_MusicPlayerTrack_patternLevel] - lsls r2, 2 - adds r3, r1, r2 - ldr r2, [r3, o_MusicPlayerTrack_patternStack] - str r2, [r1, o_MusicPlayerTrack_cmdPtr] -ply_pend_done: - bx lr - thumb_func_end ply_pend - - thumb_func_start ply_rept -ply_rept: - push {lr} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - cmp r3, 0 - bne ply_rept_1 - adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - b ply_goto_1 -ply_rept_1: - ldrb r3, [r1, o_MusicPlayerTrack_repN] - adds r3, 1 - strb r3, [r1, o_MusicPlayerTrack_repN] - mov r12, r3 - bl ld_r3_tp_adr_i - cmp r12, r3 - bhs ply_rept_2 - b ply_goto_1 -ply_rept_2: - movs r3, 0 - strb r3, [r1, o_MusicPlayerTrack_repN] - adds r2, 5 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - pop {r0} - bx r0 - thumb_func_end ply_rept - - thumb_func_start ply_prio -ply_prio: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_priority] - bx r12 - thumb_func_end ply_prio - - thumb_func_start ply_tempo -ply_tempo: - mov r12, lr - bl ld_r3_tp_adr_i - lsls r3, 1 - strh r3, [r0, o_MusicPlayerInfo_tempoD] - ldrh r2, [r0, o_MusicPlayerInfo_tempoU] - muls r3, r2 - lsrs r3, 8 - strh r3, [r0, o_MusicPlayerInfo_tempoI] - bx r12 - thumb_func_end ply_tempo - - thumb_func_start ply_keysh -ply_keysh: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_keyShift] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_keysh - - thumb_func_start ply_voice -ply_voice: - mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - adds r2, 1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - lsls r2, r3, 1 - adds r2, r3 - lsls r2, 2 - ldr r3, [r0, o_MusicPlayerInfo_tone] - adds r2, r3 - ldr r3, [r2] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_type] - ldr r3, [r2, 0x4] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_wav] - ldr r3, [r2, 0x8] - bl chk_adr_r2 - str r3, [r1, o_MusicPlayerTrack_ToneData_attack] - bx r12 - thumb_func_end ply_voice - - thumb_func_start ply_vol -ply_vol: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_vol] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_vol - - thumb_func_start ply_pan -ply_pan: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_pan] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0x3 - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_pan - - thumb_func_start ply_bend -ply_bend: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_bend] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_bend - - thumb_func_start ply_bendr -ply_bendr: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_bendRange] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_bendr - - thumb_func_start ply_lfodl -ply_lfodl: - mov r12, lr - bl ld_r3_tp_adr_i - strb r3, [r1, o_MusicPlayerTrack_lfoDelay] - bx r12 - thumb_func_end ply_lfodl - - thumb_func_start ply_modt -ply_modt: - mov r12, lr - bl ld_r3_tp_adr_i - ldrb r0, [r1, o_MusicPlayerTrack_modT] - cmp r0, r3 - beq _081DD7AA - strb r3, [r1, o_MusicPlayerTrack_modT] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xF - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] -_081DD7AA: - bx r12 - thumb_func_end ply_modt - - thumb_func_start ply_tune -ply_tune: - mov r12, lr - bl ld_r3_tp_adr_i - subs r3, 0x40 - strb r3, [r1, o_MusicPlayerTrack_tune] - ldrb r3, [r1, o_MusicPlayerTrack_flags] - movs r2, 0xC - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx r12 - thumb_func_end ply_tune - - thumb_func_start ply_port -ply_port: - mov r12, lr - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - adds r2, 1 - ldr r0, =REG_SOUND1CNT_L @ sound register base address - adds r0, r3 - bl _081DD64A - strb r3, [r0] - bx r12 - .pool - thumb_func_end ply_port - - thumb_func_start m4aSoundVSync -m4aSoundVSync: - ldr r0, lt2_SOUND_INFO_PTR - ldr r0, [r0] - - @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. - ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_SoundInfo_ident] - subs r3, r2 - cmp r3, 1 - bhi m4aSoundVSync_Done - - @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. - ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] - subs r1, 1 - strb r1, [r0, o_SoundInfo_pcmDmaCounter] - bgt m4aSoundVSync_Done - - @ Reload the PCM DMA counter. - ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] - strb r1, [r0, o_SoundInfo_pcmDmaCounter] - - ldr r2, =REG_DMA1 - - ldr r1, [r2, 0x8] @ DMA1CNT - lsls r1, 7 - bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set - - ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 - str r1, [r2, 0x8] @ DMA1CNT - -m4aSoundVSync_SkipDMA1: - ldr r1, [r2, 0xC + 0x8] @ DMA2CNT - lsls r1, 7 - bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set - - ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 - str r1, [r2, 0xC + 0x8] @ DMA2CNT - -m4aSoundVSync_SkipDMA2: - - @ turn off DMA1/DMA2 - movs r1, DMA_32BIT >> 8 - lsls r1, 8 - strh r1, [r2, 0xA] @ DMA1CNT_H - strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H - - @ turn on DMA1/DMA2 direct-sound FIFO mode - movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8 - lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode) - strh r1, [r2, 0xA] @ DMA1CNT_H - strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H - -m4aSoundVSync_Done: - bx lr - - .pool - thumb_func_end m4aSoundVSync - - thumb_func_start MPlayMain -MPlayMain: - ldr r2, lt2_ID_NUMBER - ldr r3, [r0, o_MusicPlayerInfo_ident] - cmp r2, r3 - beq _081DD82E - bx lr -_081DD82E: - adds r3, 0x1 - str r3, [r0, o_MusicPlayerInfo_ident] - push {r0,lr} - ldr r3, [r0, o_MusicPlayerInfo_func] - cmp r3, 0 - beq _081DD840 - ldr r0, [r0, o_MusicPlayerInfo_intp] - bl call_r3 -_081DD840: - pop {r0} - push {r4-r7} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - adds r7, r0, 0 - ldr r0, [r7, o_MusicPlayerInfo_status] - cmp r0, 0 - bge _081DD858 - b _081DDA6C -_081DD858: - ldr r0, lt2_SOUND_INFO_PTR - ldr r0, [r0] - mov r8, r0 - adds r0, r7, 0 - bl FadeOutBody - ldr r0, [r7, o_MusicPlayerInfo_status] - cmp r0, 0 - bge _081DD86C - b _081DDA6C -_081DD86C: - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - ldrh r1, [r7, o_MusicPlayerInfo_tempoI] - adds r0, r1 - b _081DD9BC -_081DD874: - ldrb r6, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] - movs r3, 0x1 - movs r4, 0 -_081DD87C: - ldrb r0, [r5] - movs r1, 0x80 - tst r1, r0 - bne _081DD886 - b _081DD998 -_081DD886: - mov r10, r3 - orrs r4, r3 - mov r11, r4 - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq _081DD8BA -_081DD892: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DD8AE - ldrb r0, [r4, 0x10] - cmp r0, 0 - beq _081DD8B4 - subs r0, 0x1 - strb r0, [r4, 0x10] - bne _081DD8B4 - movs r0, 0x40 - orrs r1, r0 - strb r1, [r4] - b _081DD8B4 -_081DD8AE: - adds r0, r4, 0 - bl ClearChain -_081DD8B4: - ldr r4, [r4, 0x34] - cmp r4, 0 - bne _081DD892 -_081DD8BA: - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x40 - tst r0, r3 - beq _081DD938 - adds r0, r5, 0 - bl Clear64byte - movs r0, 0x80 - strb r0, [r5] - movs r0, 0x2 - strb r0, [r5, o_MusicPlayerTrack_bendRange] - movs r0, 0x40 - strb r0, [r5, o_MusicPlayerTrack_volX] - movs r0, 0x16 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeed] - movs r0, 0x1 - adds r1, r5, 0x6 - strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6] - b _081DD938 -_081DD8E0: - ldr r2, [r5, o_MusicPlayerTrack_cmdPtr] - ldrb r1, [r2] - cmp r1, 0x80 - bhs _081DD8EC - ldrb r1, [r5, o_MusicPlayerTrack_runningStatus] - b _081DD8F6 -_081DD8EC: - adds r2, 0x1 - str r2, [r5, o_MusicPlayerTrack_cmdPtr] - cmp r1, 0xBD - bcc _081DD8F6 - strb r1, [r5, o_MusicPlayerTrack_runningStatus] -_081DD8F6: - cmp r1, 0xCF - bcc _081DD90C - mov r0, r8 - ldr r3, [r0, o_SoundInfo_plynote] - adds r0, r1, 0 - subs r0, 0xCF - adds r1, r7, 0 - adds r2, r5, 0 - bl call_r3 - b _081DD938 -_081DD90C: - cmp r1, 0xB0 - bls _081DD92E - adds r0, r1, 0 - subs r0, 0xB1 - strb r0, [r7, o_MusicPlayerInfo_cmd] - mov r3, r8 - ldr r3, [r3, o_SoundInfo_MPlayJumpTable] - lsls r0, 2 - ldr r3, [r3, r0] - adds r0, r7, 0 - adds r1, r5, 0 - bl call_r3 - ldrb r0, [r5, o_MusicPlayerTrack_flags] - cmp r0, 0 - beq _081DD994 - b _081DD938 -_081DD92E: - ldr r0, lt_gClockTable - subs r1, 0x80 - adds r1, r0 - ldrb r0, [r1] - strb r0, [r5, o_MusicPlayerTrack_wait] -_081DD938: - ldrb r0, [r5, o_MusicPlayerTrack_wait] - cmp r0, 0 - beq _081DD8E0 - subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_wait] - ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed] - cmp r1, 0 - beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_mod] - cmp r0, 0 - beq _081DD994 - ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC] - cmp r0, 0 - beq _081DD95A - subs r0, 0x1 - strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] - b _081DD994 -_081DD95A: - ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] - adds r0, r1 - strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] - adds r1, r0, 0 - subs r0, 0x40 - lsls r0, 24 - bpl _081DD96E - lsls r2, r1, 24 - asrs r2, 24 - b _081DD972 -_081DD96E: - movs r0, 0x80 - subs r2, r0, r1 -_081DD972: - ldrb r0, [r5, o_MusicPlayerTrack_mod] - muls r0, r2 - asrs r2, r0, 6 - ldrb r0, [r5, o_MusicPlayerTrack_modM] - eors r0, r2 - lsls r0, 24 - beq _081DD994 - strb r2, [r5, o_MusicPlayerTrack_modM] - ldrb r0, [r5] - ldrb r1, [r5, o_MusicPlayerTrack_modT] - cmp r1, 0 - bne _081DD98E - movs r1, 0xC - b _081DD990 -_081DD98E: - movs r1, 0x3 -_081DD990: - orrs r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] -_081DD994: - mov r3, r10 - mov r4, r11 -_081DD998: - subs r6, 0x1 - ble _081DD9A4 - movs r0, 0x50 - adds r5, r0 - lsls r3, 1 - b _081DD87C -_081DD9A4: - ldr r0, [r7, o_MusicPlayerInfo_clock] - adds r0, 0x1 - str r0, [r7, o_MusicPlayerInfo_clock] - cmp r4, 0 - bne _081DD9B6 - movs r0, 0x80 - lsls r0, 24 - str r0, [r7, o_MusicPlayerInfo_status] - b _081DDA6C -_081DD9B6: - str r4, [r7, o_MusicPlayerInfo_status] - ldrh r0, [r7, o_MusicPlayerInfo_tempoC] - subs r0, 0x96 -_081DD9BC: - strh r0, [r7, o_MusicPlayerInfo_tempoC] - cmp r0, 0x96 - bcc _081DD9C4 - b _081DD874 -_081DD9C4: - ldrb r2, [r7, o_MusicPlayerInfo_trackCount] - ldr r5, [r7, o_MusicPlayerInfo_tracks] -_081DD9C8: - ldrb r0, [r5, o_MusicPlayerTrack_flags] - movs r1, 0x80 - tst r1, r0 - beq _081DDA62 - movs r1, 0xF - tst r1, r0 - beq _081DDA62 - mov r9, r2 - adds r0, r7, 0 - adds r1, r5, 0 - bl TrkVolPitSet - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq _081DDA58 -_081DD9E6: - ldrb r1, [r4, o_SoundChannel_status] - movs r0, 0xC7 - tst r0, r1 - bne _081DD9F6 - adds r0, r4, 0 - bl ClearChain - b _081DDA52 -_081DD9F6: - ldrb r0, [r4, o_SoundChannel_type] - movs r6, 0x7 - ands r6, r0 - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x3 - tst r0, r3 - beq _081DDA14 - bl ChnVolSetAsm - cmp r6, 0 - beq _081DDA14 - ldrb r0, [r4, o_CgbChannel_mo] - movs r1, 0x1 - orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] -_081DDA14: - ldrb r3, [r5, o_MusicPlayerTrack_flags] - movs r0, 0xC - tst r0, r3 - beq _081DDA52 - ldrb r1, [r4, o_SoundChannel_ky] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r2, r1, r0 - bpl _081DDA28 - movs r2, 0 -_081DDA28: - cmp r6, 0 - beq _081DDA46 - mov r0, r8 - ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq] - adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] - adds r0, r6, 0 - bl call_r3 - str r0, [r4, o_CgbChannel_fr] - ldrb r0, [r4, o_CgbChannel_mo] - movs r1, 0x2 - orrs r0, r1 - strb r0, [r4, o_CgbChannel_mo] - b _081DDA52 -_081DDA46: - adds r1, r2, 0 - ldrb r2, [r5, o_MusicPlayerTrack_pitM] - ldr r0, [r4, o_SoundChannel_wav] - bl MidiKeyToFreq - str r0, [r4, o_SoundChannel_freq] -_081DDA52: - ldr r4, [r4, o_SoundChannel_np] - cmp r4, 0 - bne _081DD9E6 -_081DDA58: - ldrb r0, [r5, o_MusicPlayerTrack_flags] - movs r1, 0xF0 - ands r0, r1 - strb r0, [r5, o_MusicPlayerTrack_flags] - mov r2, r9 -_081DDA62: - subs r2, 0x1 - ble _081DDA6C - movs r0, 0x50 - adds r5, r0 - bgt _081DD9C8 -_081DDA6C: - ldr r0, lt2_ID_NUMBER - str r0, [r7, o_MusicPlayerInfo_ident] - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r3} - -call_r3: - bx r3 - - .align 2, 0 -lt_gClockTable: .word gClockTable -lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR -lt2_ID_NUMBER: .word ID_NUMBER - thumb_func_end MPlayMain - - thumb_func_start TrackStop -TrackStop: - push {r4-r6,lr} - adds r5, r1, 0 - ldrb r1, [r5, o_MusicPlayerTrack_flags] - movs r0, 0x80 - tst r0, r1 - beq TrackStop_Done - ldr r4, [r5, o_MusicPlayerTrack_chan] - cmp r4, 0 - beq TrackStop_3 - movs r6, 0 -TrackStop_Loop: - ldrb r0, [r4, o_SoundChannel_status] - cmp r0, 0 - beq TrackStop_2 - ldrb r0, [r4, o_SoundChannel_type] - movs r3, 0x7 - ands r0, r3 - beq TrackStop_1 - ldr r3, =SOUND_INFO_PTR - ldr r3, [r3] - ldr r3, [r3, o_SoundInfo_CgbOscOff] - bl call_r3 -TrackStop_1: - strb r6, [r4, o_SoundChannel_status] -TrackStop_2: - str r6, [r4, o_SoundChannel_track] - ldr r4, [r4, o_SoundChannel_np] - cmp r4, 0 - bne TrackStop_Loop -TrackStop_3: - str r4, [r5, o_MusicPlayerTrack_chan] -TrackStop_Done: - pop {r4-r6} - pop {r0} - bx r0 - .pool - thumb_func_end TrackStop - - thumb_func_start ChnVolSetAsm -ChnVolSetAsm: - ldrb r1, [r4, 0x12] - movs r0, 0x14 - ldrsb r2, [r4, r0] - movs r3, 0x80 - adds r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x10] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAE8 - movs r0, 0xFF -_081DDAE8: - strb r0, [r4, 0x2] - movs r3, 0x7F - subs r3, r2 - muls r3, r1 - ldrb r0, [r5, 0x11] - muls r0, r3 - asrs r0, 14 - cmp r0, 0xFF - bls _081DDAFC - movs r0, 0xFF -_081DDAFC: - strb r0, [r4, 0x3] - bx lr - thumb_func_end ChnVolSetAsm - - thumb_func_start ply_note -ply_note: - push {r4-r7,lr} - mov r4, r8 - mov r5, r9 - mov r6, r10 - mov r7, r11 - push {r4-r7} - sub sp, 0x18 - str r1, [sp] - adds r5, r2, 0 - ldr r1, =SOUND_INFO_PTR - ldr r1, [r1] - str r1, [sp, 0x4] - ldr r1, =gClockTable - adds r0, r1 - ldrb r0, [r0] - strb r0, [r5, o_MusicPlayerTrack_gateTime] - ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB46 - strb r0, [r5, o_MusicPlayerTrack_key] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB44 - strb r0, [r5, o_MusicPlayerTrack_velocity] - adds r3, 0x1 - ldrb r0, [r3] - cmp r0, 0x80 - bhs _081DDB44 - ldrb r1, [r5, o_MusicPlayerTrack_gateTime] - adds r1, r0 - strb r1, [r5, o_MusicPlayerTrack_gateTime] - adds r3, 0x1 -_081DDB44: - str r3, [r5, o_MusicPlayerTrack_cmdPtr] -_081DDB46: - movs r0, 0 - str r0, [sp, 0x14] - adds r4, r5, 0 - adds r4, o_MusicPlayerTrack_ToneData_type - ldrb r2, [r4] - movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL - tst r0, r2 - beq _081DDB98 - ldrb r3, [r5, o_MusicPlayerTrack_key] - movs r0, TONEDATA_TYPE_SPL - tst r0, r2 - beq _081DDB66 - ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable] - adds r1, r3 - ldrb r0, [r1] - b _081DDB68 -_081DDB66: - adds r0, r3, 0 -_081DDB68: - lsls r1, r0, 1 - adds r1, r0 - lsls r1, 2 - ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav] - adds r1, r0 - mov r9, r1 - mov r6, r9 - ldrb r1, [r6] - movs r0, 0xC0 - tst r0, r1 - beq _081DDB80 - b _081DDCEA -_081DDB80: - movs r0, 0x80 - tst r0, r2 - beq _081DDB9C - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - beq _081DDB94 - subs r1, 0xC0 - lsls r1, 1 - str r1, [sp, 0x14] -_081DDB94: - ldrb r3, [r6, 0x1] - b _081DDB9C -_081DDB98: - mov r9, r4 - ldrb r3, [r5, 0x5] -_081DDB9C: - str r3, [sp, 0x8] - ldr r6, [sp] - ldrb r1, [r6, 0x9] - ldrb r0, [r5, 0x1D] - adds r0, r1 - cmp r0, 0xFF - bls _081DDBAC - movs r0, 0xFF -_081DDBAC: - str r0, [sp, 0x10] - mov r6, r9 - ldrb r0, [r6] - movs r6, 0x7 - ands r6, r0 - str r6, [sp, 0xC] - beq _081DDBEC - ldr r0, [sp, 0x4] - ldr r4, [r0, 0x1C] - cmp r4, 0 - bne _081DDBC4 - b _081DDCEA -_081DDBC4: - subs r6, 0x1 - lsls r0, r6, 6 - adds r4, r0 - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - bne _081DDC40 - ldrb r1, [r4, 0x13] - ldr r0, [sp, 0x10] - cmp r1, r0 - bcc _081DDC40 - beq _081DDBE4 - b _081DDCEA -_081DDBE4: - ldr r0, [r4, 0x2C] - cmp r0, r5 - bcs _081DDC40 - b _081DDCEA -_081DDBEC: - ldr r6, [sp, 0x10] - adds r7, r5, 0 - movs r2, 0 - mov r8, r2 - ldr r4, [sp, 0x4] - ldrb r3, [r4, 0x6] - adds r4, 0x50 -_081DDBFA: - ldrb r1, [r4] - movs r0, 0xC7 - tst r0, r1 - beq _081DDC40 - movs r0, 0x40 - tst r0, r1 - beq _081DDC14 - cmp r2, 0 - bne _081DDC18 - adds r2, 0x1 - ldrb r6, [r4, 0x13] - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC14: - cmp r2, 0 - bne _081DDC34 -_081DDC18: - ldrb r0, [r4, 0x13] - cmp r0, r6 - bcs _081DDC24 - adds r6, r0, 0 - ldr r7, [r4, 0x2C] - b _081DDC32 -_081DDC24: - bhi _081DDC34 - ldr r0, [r4, 0x2C] - cmp r0, r7 - bls _081DDC30 - adds r7, r0, 0 - b _081DDC32 -_081DDC30: - bcc _081DDC34 -_081DDC32: - mov r8, r4 -_081DDC34: - adds r4, 0x40 - subs r3, 0x1 - bgt _081DDBFA - mov r4, r8 - cmp r4, 0 - beq _081DDCEA -_081DDC40: - adds r0, r4, 0 - bl ClearChain - movs r1, 0 - str r1, [r4, 0x30] - ldr r3, [r5, 0x20] - str r3, [r4, 0x34] - cmp r3, 0 - beq _081DDC54 - str r4, [r3, 0x30] -_081DDC54: - str r4, [r5, 0x20] - str r5, [r4, 0x2C] - ldrb r0, [r5, 0x1B] - strb r0, [r5, 0x1C] - cmp r0, r1 - beq _081DDC66 - adds r1, r5, 0 - bl clear_modM -_081DDC66: - ldr r0, [sp] - adds r1, r5, 0 - bl TrkVolPitSet - ldr r0, [r5, 0x4] - str r0, [r4, 0x10] - ldr r0, [sp, 0x10] - strb r0, [r4, 0x13] - ldr r0, [sp, 0x8] - strb r0, [r4, 0x8] - ldr r0, [sp, 0x14] - strb r0, [r4, 0x14] - mov r6, r9 - ldrb r0, [r6] - strb r0, [r4, 0x1] - ldr r7, [r6, 0x4] - str r7, [r4, 0x24] - ldr r0, [r6, 0x8] - str r0, [r4, 0x4] - ldrh r0, [r5, 0x1E] - strh r0, [r4, 0xC] - bl ChnVolSetAsm - ldrb r1, [r4, 0x8] - movs r0, 0x8 - ldrsb r0, [r5, r0] - adds r3, r1, r0 - bpl _081DDCA0 - movs r3, 0 -_081DDCA0: - ldr r6, [sp, 0xC] - cmp r6, 0 - beq _081DDCCE - mov r6, r9 - ldrb r0, [r6, 0x2] - strb r0, [r4, 0x1E] - ldrb r1, [r6, 0x3] - movs r0, 0x80 - tst r0, r1 - bne _081DDCBA - movs r0, 0x70 - tst r0, r1 - bne _081DDCBC -_081DDCBA: - movs r1, 0x8 -_081DDCBC: - strb r1, [r4, 0x1F] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - ldr r0, [sp, 0xC] - ldr r3, [sp, 0x4] - ldr r3, [r3, 0x30] - bl call_r3 - b _081DDCDC -_081DDCCE: - ldr r0, [r5, o_MusicPlayerTrack_unk_3C] - str r0, [r4, 0x18] - ldrb r2, [r5, 0x9] - adds r1, r3, 0 - adds r0, r7, 0 - bl MidiKeyToFreq -_081DDCDC: - str r0, [r4, 0x20] - movs r0, 0x80 - strb r0, [r4] - ldrb r1, [r5] - movs r0, 0xF0 - ands r0, r1 - strb r0, [r5] -_081DDCEA: - add sp, 0x18 - pop {r0-r7} - mov r8, r0 - mov r9, r1 - mov r10, r2 - mov r11, r3 - pop {r0} - bx r0 - .pool - thumb_func_end ply_note - - thumb_func_start ply_endtie -ply_endtie: - push {r4,r5} - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - cmp r3, 0x80 - bhs _081DDD16 - strb r3, [r1, o_MusicPlayerTrack_key] - adds r2, 0x1 - str r2, [r1, o_MusicPlayerTrack_cmdPtr] - b _081DDD18 -_081DDD16: - ldrb r3, [r1, o_MusicPlayerTrack_key] -_081DDD18: - ldr r1, [r1, o_MusicPlayerTrack_chan] - cmp r1, 0 - beq _081DDD40 - movs r4, 0x83 - movs r5, 0x40 -_081DDD22: - ldrb r2, [r1, o_SoundChannel_status] - tst r2, r4 - beq _081DDD3A - tst r2, r5 - bne _081DDD3A - ldrb r0, [r1, o_SoundChannel_mk] - cmp r0, r3 - bne _081DDD3A - movs r0, 0x40 - orrs r2, r0 - strb r2, [r1, o_SoundChannel_status] - b _081DDD40 -_081DDD3A: - ldr r1, [r1, o_SoundChannel_np] - cmp r1, 0 - bne _081DDD22 -_081DDD40: - pop {r4,r5} - bx lr - thumb_func_end ply_endtie - - thumb_func_start clear_modM -clear_modM: - movs r2, 0 - strb r2, [r1, o_MusicPlayerTrack_modM] - strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC] - ldrb r2, [r1, o_MusicPlayerTrack_modT] - cmp r2, 0 - bne _081DDD54 - movs r2, 0xC - b _081DDD56 -_081DDD54: - movs r2, 0x3 -_081DDD56: - ldrb r3, [r1, o_MusicPlayerTrack_flags] - orrs r3, r2 - strb r3, [r1, o_MusicPlayerTrack_flags] - bx lr - thumb_func_end clear_modM - - thumb_func_start ld_r3_tp_adr_i -ld_r3_tp_adr_i_unchecked: - ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] - adds r3, r2, 1 - str r3, [r1, o_MusicPlayerTrack_cmdPtr] - ldrb r3, [r2] - bx lr - thumb_func_end ld_r3_tp_adr_i - - thumb_func_start ply_lfos -ply_lfos: - mov r12, lr - bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_lfoSpeed] - cmp r3, 0 - bne _081DDD7C - bl clear_modM -_081DDD7C: - bx r12 - thumb_func_end ply_lfos - - thumb_func_start ply_mod -ply_mod: - mov r12, lr - bl ld_r3_tp_adr_i_unchecked - strb r3, [r1, o_MusicPlayerTrack_mod] - cmp r3, 0 - bne _081DDD90 - bl clear_modM -_081DDD90: - bx r12 - thumb_func_end ply_mod - - .align 2, 0 @ Don't pad with nop. - - .bss -gUnknown_03001300: - .space 0x40 - .size gUnknown_03001300, .-gUnknown_03001300 - - .global gMPlayTrack_BGM -gMPlayTrack_BGM: - .space 0x320 - .size gMPlayTrack_BGM, .-gMPlayTrack_BGM - - .global gMPlayTrack_SE1 -gMPlayTrack_SE1: - .space 0xF0 - .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 - - .global gMPlayTrack_SE2 -gMPlayTrack_SE2: - .space 0x2D0 - .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 - - .global gMPlayTrack_SE3 -gMPlayTrack_SE3: - .space 0x50 - .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 diff --git a/ld_script.txt b/ld_script.txt index 8d451338c..a044ecdab 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -47,7 +47,7 @@ SECTIONS { .text : ALIGN(4) { - asm/crt0.o(.text); + src/crt0.o(.text); src/main.o(.text); src/alloc.o(.text); src/dma3_manager.o(.text); @@ -348,8 +348,8 @@ SECTIONS { lib_text : ALIGN(4) { - asm/libgcnmultiboot.o(.text); - asm/m4a_1.o(.text); + src/libgcnmultiboot.o(.text); + src/m4a_1.o(.text); src/m4a.o(.text); src/agb_flash.o(.text); src/agb_flash_1m.o(.text); @@ -360,7 +360,7 @@ SECTIONS { asm/librfu_intr.o(.text); src/librfu_rfu.o(.text); asm/librfu.o(.text); - asm/libagbsyscall.o(.text); + src/libagbsyscall.o(.text); *libgcc.a:_call_via_rX.o(.text); *libgcc.a:_divdi3.o(.text); *libgcc.a:_divsi3.o(.text); diff --git a/ld_script_modern.txt b/ld_script_modern.txt index 98ef16b17..5157e81dc 100644 --- a/ld_script_modern.txt +++ b/ld_script_modern.txt @@ -25,7 +25,6 @@ SECTIONS { { /* .bss starts at 0x3000000 */ src/*.o(.bss); - asm/m4a_1.o(.bss); /* .bss.code starts at 0x3001AA8 */ src/m4a.o(.bss.code); @@ -42,7 +41,7 @@ SECTIONS { .text : ALIGN(4) { - asm/crt0.o(.text); + src/crt0.o(.text); src/*.o(.text); asm/*.o(.text); } =0 @@ -56,8 +55,8 @@ SECTIONS { lib_text : ALIGN(4) { - asm/libgcnmultiboot.o(.text); - asm/m4a_1.o(.text); + src/libgcnmultiboot.o(.text); + src/m4a_1.o(.text); src/m4a.o(.text); src/agb_flash.o(.text); src/agb_flash_1m.o(.text); @@ -68,7 +67,7 @@ SECTIONS { asm/librfu_intr.o(.text); src/librfu_rfu.o(.text); asm/librfu.o(.text); - asm/libagbsyscall.o(.text); + src/libagbsyscall.o(.text); *libgcc.a:*.o(.text*); *libc.a:*.o(.text*); src/libisagbprn.o(.text); diff --git a/src/crt0.s b/src/crt0.s new file mode 100644 index 000000000..9ed678968 --- /dev/null +++ b/src/crt0.s @@ -0,0 +1,199 @@ + .include "constants/gba_constants.inc" + + .syntax unified + + .global Start + + .text + + .arm + +Start: @ 8000000 + b Init + + .include "asm/rom_header.inc" + +@ 80000C0 + .word 0 + + .global GPIOPortData +GPIOPortData: @ 80000C4 + .2byte 0 + + .global GPIOPortDirection +GPIOPortDirection: @ 80000C6 + .2byte 0 + + .global GPIOPortReadEnable +GPIOPortReadEnable: @ 80000C8 + .2byte 0 + +@ 80000CA + .2byte 0 + +@ 80000CC + .space 0x34 + + .4byte 3 + .4byte 2 + + .ascii "pokemon emerald version" + .space 9 + + .4byte gMonFrontPicTable + .4byte gMonBackPicTable + .4byte gMonPaletteTable + .4byte gMonShinyPaletteTable + .4byte gMonIconTable + .4byte gMonIconPaletteIndices + .4byte gMonIconPaletteTable + .4byte gSpeciesNames + .4byte gMoveNames + .4byte gDecorations + + .4byte 0x00001270, 0x0000139c, 0x00000018, 0x00000988 + .4byte 0x00003b24, 0x00000046, 0x000008e4, 0x000008ac + .4byte 0x00000182 + + .byte 0x07, 0x0a, 0x0a, 0x0a, 0x0c, 0x0c, 0x06, 0x0c + .byte 0x06, 0x10, 0x12, 0x0c, 0x0f, 0x0b, 0x01, 0x08 + + .4byte 0x0000000c, 0x00000f2c, 0x00003d88, 0x00000234 + .4byte 0x00000238, 0x00000009, 0x0000000a, 0x00000000 + .4byte 0x00000008, 0x00000ca8, 0x00000ca8, 0x000031c7 + .4byte 0x000031b3, 0x00000000 + + .4byte gBaseStats + .4byte gAbilityNames + .4byte gAbilityDescriptionPointers + .4byte gItems + .4byte gBattleMoves + .4byte gBallSpriteSheets + .4byte gBallSpritePalettes + + .4byte 0x000000a8, 0x00000864, 0x0000089b + + .byte 0x1e, 0x1e, 0x10, 0x40 + + .4byte 0x0000322e, 0x00000498, 0x000031a8, 0x000031f8 + .4byte 0x00000034, 0x00000000, 0x00000000 + + .arm + .align 2, 0 + .global Init +Init: @ 8000204 + mov r0, PSR_IRQ_MODE + msr cpsr_cf, r0 + ldr sp, sp_irq + mov r0, PSR_SYS_MODE + msr cpsr_cf, r0 + ldr sp, sp_sys + ldr r1, =INTR_VECTOR + adr r0, IntrMain + str r0, [r1] + ldr r1, =AgbMain + 1 + mov lr, pc + bx r1 + b Init + + .align 2, 0 +sp_sys: .word IWRAM_END - 0x1c0 +sp_irq: .word IWRAM_END - 0x60 + + .pool + + .arm + .align 2, 0 + .global IntrMain +IntrMain: @ 8000248 + mov r3, REG_BASE + add r3, r3, 0x200 + ldr r2, [r3, OFFSET_REG_IE - 0x200] + ldrh r1, [r3, OFFSET_REG_IME - 0x200] + mrs r0, spsr + stmdb sp!, {r0-r3,lr} + mov r0, 0 + strh r0, [r3, OFFSET_REG_IME - 0x200] + and r1, r2, r2, lsr 16 + mov r12, 0 + ands r0, r1, INTR_FLAG_VCOUNT + bne IntrMain_FoundIntr + add r12, r12, 0x4 + mov r0, 0x1 + strh r0, [r3, OFFSET_REG_IME - 0x200] + ands r0, r1, INTR_FLAG_SERIAL + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_TIMER3 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_HBLANK + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_VBLANK + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_TIMER0 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_TIMER1 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_TIMER2 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_DMA0 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_DMA1 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_DMA2 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_DMA3 + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_KEYPAD + bne IntrMain_FoundIntr + add r12, r12, 0x4 + ands r0, r1, INTR_FLAG_GAMEPAK + strbne r0, [r3, OFFSET_REG_SOUNDCNT_X - 0x200] + bne . @ spin +IntrMain_FoundIntr: + strh r0, [r3, OFFSET_REG_IF - 0x200] + bic r2, r2, r0 + ldr r0, =gRfuState + ldr r0, [r0] + ldrb r0, [r0, 0xA] + mov r1, 0x8 + mov r0, r1, lsl r0 + orr r0, r0, INTR_FLAG_GAMEPAK + orr r1, r0, INTR_FLAG_SERIAL | INTR_FLAG_TIMER3 | INTR_FLAG_VCOUNT | INTR_FLAG_HBLANK + and r1, r1, r2 + strh r1, [r3, OFFSET_REG_IE - 0x200] + mrs r3, cpsr + bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK + orr r3, r3, PSR_SYS_MODE + msr cpsr_cf, r3 + ldr r1, =gIntrTable + add r1, r1, r12 + ldr r0, [r1] + stmdb sp!, {lr} + adr lr, IntrMain_RetAddr + bx r0 +IntrMain_RetAddr: + ldmia sp!, {lr} + mrs r3, cpsr + bic r3, r3, PSR_I_BIT | PSR_F_BIT | PSR_MODE_MASK + orr r3, r3, PSR_I_BIT | PSR_IRQ_MODE + msr cpsr_cf, r3 + ldmia sp!, {r0-r3,lr} + strh r2, [r3, OFFSET_REG_IE - 0x200] + strh r1, [r3, OFFSET_REG_IME - 0x200] + msr spsr_cf, r0 + bx lr + + .pool + + .align 2, 0 @ Don't pad with nop. diff --git a/src/libagbsyscall.s b/src/libagbsyscall.s new file mode 100644 index 000000000..d5639f689 --- /dev/null +++ b/src/libagbsyscall.s @@ -0,0 +1,116 @@ + .include "constants/gba_constants.inc" + .include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start ArcTan2 +ArcTan2: @ 82E7078 + swi 0xA + bx lr + thumb_func_end ArcTan2 + + thumb_func_start BgAffineSet +@ void BgAffineSet(BgAffineSet_src_data *src, BgAffineSet_dest_data *dest, int entry_count) +BgAffineSet: @ 82E707C + swi 0xE + bx lr + thumb_func_end BgAffineSet + + thumb_func_start CpuFastSet +@ void CpuFastSet(void *src, void *dest, unsigned int mode) +CpuFastSet: @ 82E7080 + swi 0xC + bx lr + thumb_func_end CpuFastSet + + thumb_func_start CpuSet +@ void CpuSet(void *src, void *dest, unsigned int mode) +CpuSet: @ 82E7084 + swi 0xB + bx lr + thumb_func_end CpuSet + + thumb_func_start Div +Div: @ 82E7088 + swi 0x6 + bx lr + thumb_func_end Div + + thumb_func_start LZ77UnCompVram +@ void LZ77UnCompVram(void *src, void *dest) +LZ77UnCompVram: @ 82E708C + swi 0x12 + bx lr + thumb_func_end LZ77UnCompVram + + thumb_func_start LZ77UnCompWram +@ void LZ77UnCompWram(void *src, void *dest) +LZ77UnCompWram: @ 82E7090 + swi 0x11 + bx lr + thumb_func_end LZ77UnCompWram + + thumb_func_start MultiBoot +@ s32 MultiBoot(struct MultiBootParam *mp) +MultiBoot: @ 82E7094 + movs r1, 0x1 + swi 0x25 + bx lr + thumb_func_end MultiBoot + + thumb_func_start ObjAffineSet +ObjAffineSet: @ 82E709C + swi 0xF + bx lr + thumb_func_end ObjAffineSet + + thumb_func_start RLUnCompVram +RLUnCompVram: @ 82E70A0 + swi 0x15 + bx lr + thumb_func_end RLUnCompVram + + thumb_func_start RLUnCompWram +RLUnCompWram: @ 82E70A4 + swi 0x14 + bx lr + thumb_func_end RLUnCompWram + + thumb_func_start RegisterRamReset +@ void RegisterRamReset(int ResetFlags) +RegisterRamReset: @ 82E70A8 + swi 0x1 + bx lr + thumb_func_end RegisterRamReset + + thumb_func_start SoftReset +@ void SoftReset() +SoftReset: @ 82E70AC + ldr r3, =REG_IME + movs r2, 0 + strb r2, [r3] + ldr r1, =0x3007F00 + mov sp, r1 + swi 0x1 + swi 0 + .pool + thumb_func_end SoftReset + + thumb_func_start Sqrt +@ s16 Sqrt(int) +Sqrt: @ 82E70C4 + swi 0x8 + bx lr + thumb_func_end Sqrt + + thumb_func_start VBlankIntrWait +@ void VBlankIntrWait() +VBlankIntrWait: @ 82E70C8 + movs r2, 0 + swi 0x5 + bx lr + thumb_func_end VBlankIntrWait + + .align 2, 0 @ Don't pad with nop. diff --git a/src/libgcnmultiboot.s b/src/libgcnmultiboot.s new file mode 100644 index 000000000..0e418e51f --- /dev/null +++ b/src/libgcnmultiboot.s @@ -0,0 +1,550 @@ +@ This library can be used to download and execute a multi-boot image from +@ a GameCube using the JOY Bus protocol over the link cable. + + .include "asm/macros.inc" + .include "constants/constants.inc" + + .equiv GCMB_STRUCT_BASE_DEST_PTR, 0x20 + .equiv GCMB_STRUCT_CUR_DEST_PTR, 0x24 + .equiv GCMB_STRUCT_SERIAL_INTR_HANDLER, 0x28 + + .equiv ROM_HEADER_NINTENDO_LOGO_OFFSET, 0x4 + + .syntax unified + + .text + + thumb_func_start GameCubeMultiBoot_Hash +GameCubeMultiBoot_Hash: @ 82DED70 + push {r4,lr} + ldr r4, pool_HashVal + eors r3, r1 + movs r2, 0x20 + +GameCubeMultiBoot_Hash_Loop: + lsrs r3, 1 + bcc GameCubeMultiBoot_Hash_SkipEor + + eors r3, r4 + +GameCubeMultiBoot_Hash_SkipEor: + subs r2, 0x1 + bne GameCubeMultiBoot_Hash_Loop + + pop {r4,pc} + thumb_func_end GameCubeMultiBoot_Hash + + thumb_func_start GameCubeMultiBoot_Main +@ void GameCubeMultiBoot_Main(struct GameCubeMultiBoot *mb); +GameCubeMultiBoot_Main: @ 82DED84 + ldr r1, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] + cmp r1, 0 + beq _082DEDAA + ldrb r1, [r0, 0x1] + adds r1, 0x1 + strb r1, [r0, 0x1] + ldrb r1, [r0, 0x2] + cmp r1, 0x2 + beq _082DEDF4 + ldr r3, pool_InterruptRegs + ldrh r2, [r3, OFFSET_REG_IME - 0x200] + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + ldrb r1, [r0] + cmp r1, 0xA + bgt _082DEDA8 + adds r1, 0x1 + strb r1, [r0] +_082DEDA8: + strh r2, [r3, OFFSET_REG_IME - 0x200] +_082DEDAA: + bcs GameCubeMultiBoot_Init + ldrb r1, [r0, 0x2] + cmp r1, 0 + bne _082DEDF6 + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] + subs r1, r2 + beq _082DEE76 + cmp r1, 0xA0 + bcc _082DEE76 + push {r4-r6} + movs r1, 0x98 + adds r2, ROM_HEADER_NINTENDO_LOGO_OFFSET + ldr r4, pool_NintendoLogo +_082DEDC6: + ldm r2!, {r5} + ldm r4!, {r6} + cmp r5, r6 + bne _082DEDDC + subs r1, 0x4 + bne _082DEDC6 + ldm r2!, {r5} + ldm r4!, {r6} + eors r5, r6 + lsrs r5, 8 + str r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] +_082DEDDC: + pop {r4-r6} + bne GameCubeMultiBoot_Init + movs r1, 0x1 + strb r1, [r0, 0x2] + ldr r1, [r0, 0x4] + ldr r2, [r0, 0x8] + eors r1, r2 + str r1, [r0, 0x18] + ldr r2, pool_Kawa + muls r1, r2 + adds r1, 0x1 + str r1, [r0, 0x14] +_082DEDF4: + bx lr +_082DEDF6: + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + mov r12, r1 + ldr r3, [r0, 0x18] + push {r4-r7} + ldr r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] + ldr r5, pool_Kawa + ldr r6, [r0, 0x14] + ldr r7, pool_HashVal +_082DEE06: + cmp r4, r12 + bcs _082DEE26 + ldr r1, [r4] + eors r1, r6 + adds r1, r3 + stm r4!, {r1} + eors r3, r1 + movs r2, 0x20 +_082DEE16: + lsrs r3, 1 + bcc _082DEE1C + eors r3, r7 +_082DEE1C: + subs r2, 0x1 + bne _082DEE16 + muls r6, r5 + adds r6, 0x1 + b _082DEE06 +_082DEE26: + str r4, [r0, GCMB_STRUCT_BASE_DEST_PTR] + str r6, [r0, 0x14] + pop {r4-r7} + str r3, [r0, 0x18] + ldrh r1, [r0, 0x12] + cmp r1, 0 + bne _082DEE76 + ldr r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + ldr r2, [r0, GCMB_STRUCT_BASE_DEST_PTR] + cmp r1, r2 + bne _082DEE76 + ldr r1, [r0, 0xC] + cmp r1, 0 + beq _082DEE60 + ldrh r1, [r0, 0x10] + cmp r1, 0 + beq _082DEDF4 + mov r12, lr + movs r1, 0xBB + ldr r3, [r0, 0xC] + bl GameCubeMultiBoot_Hash + ldrh r1, [r0, 0x10] + mov lr, r12 + subs r1, r3 + bne GameCubeMultiBoot_Init + movs r1, 0x2 + strb r1, [r0, 0x2] + bx lr +_082DEE60: + mov r12, lr + ldrb r1, [r0, 0x3] + lsls r1, 24 + subs r1, 0x1 + str r1, [r0, 0xC] + bl GameCubeMultiBoot_Hash + lsls r3, 8 + adds r3, 0xFF + str r3, [r0, 0x1C] + bx r12 +_082DEE76: + bx lr + thumb_func_end GameCubeMultiBoot_Main + + .align 2, 0 + +pool_HashVal: .4byte 0xa1c1 + +pool_Kawa: .ascii "Kawa" @ name of BIOS developer + +pool_NintendoLogo: .4byte RomHeaderNintendoLogo + + thumb_func_start GameCubeMultiBoot_ExecuteProgram +@ void GameCubeMultiBoot_ExecuteProgram(struct GameCubeMultiBoot *mb); +GameCubeMultiBoot_ExecuteProgram: @ 82DEE84 + ldrb r1, [r0, 0x2] + cmp r1, 0x2 + bne GameCubeMultiBoot_ExecuteProgram_Fail + ldr r3, pool_InterruptRegs + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + ldr r1, pool_MultiBootLoadAddr + adds r1, 0xC0 + bx r1 +GameCubeMultiBoot_ExecuteProgram_Fail: + bx lr + thumb_func_end GameCubeMultiBoot_ExecuteProgram + + thumb_func_start GameCubeMultiBoot_Init +@ void GameCubeMultiBoot_Init(struct GameCubeMultiBoot *mb); +GameCubeMultiBoot_Init: @ 82DEE98 + ldr r3, pool_InterruptRegs + +@ Save IME register. + ldrh r2, [r3, OFFSET_REG_IME - 0x200] + +@ Disable interrupts. + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + +@ Set the handler to the "Stop" routine. +@ Unless the first command that is received is a device reset command, the +@ "Stop" routine will be executed and no further commands will be processed. + adr r3, GcMbIntrHandler_Stop + str r3, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] + + ldrb r3, [r0, 0x3] + push {r3} + ldrb r3, [r0, 0x1] + push {r0,r3} + + adds r3, r0, 0 + adds r3, GCMB_STRUCT_BASE_DEST_PTR + +@ clear all but the last 3 fields of the struct +GameCubeMultiBoot_Init_ClearStructLoop: + stm r0!, {r1} + cmp r0, r3 + blo GameCubeMultiBoot_Init_ClearStructLoop + + pop {r0,r3} + lsrs r3, 1 + strb r3, [r0, 0x3] + pop {r3} + strb r3, [r0, 0x1] + + ldr r3, pool_SerialRegs + +@ Turn off JOY Bus mode. + lsls r0, r3, 10 + strh r0, [r3, OFFSET_REG_RCNT - 0x120] + +@ Turn on JOY Bus mode. + movs r0, 0xC0 + lsls r0, 8 + strh r0, [r3, OFFSET_REG_RCNT - 0x120] + +@ Init JOY Bus registers. + movs r0, 0x47 + strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + + ldr r3, pool_InterruptRegs + +@ Acknowledge serial interrupt. + movs r0, INTR_FLAG_SERIAL + strh r0, [r3, OFFSET_REG_IF - 0x200] + +@ Enable serial interrupt. + ldrh r1, [r3, OFFSET_REG_IE - 0x200] + orrs r1, r0 + strh r1, [r3, OFFSET_REG_IE - 0x200] + +@ Restore IME register. + strh r2, [r3, OFFSET_REG_IME - 0x200] + + bx lr + thumb_func_end GameCubeMultiBoot_Init + + non_word_aligned_thumb_func_start GameCubeMultiBoot_HandleSerialInterrupt +@ void GameCubeMultiBoot_HandleSerialInterrupt(struct GameCubeMultiBoot *mb); +GameCubeMultiBoot_HandleSerialInterrupt: @ 82DEEE2 + ldr r3, pool_SerialRegs + +@ Acknowledge reset/receive/send flags. + ldrh r1, [r3, OFFSET_REG_JOYCNT - 0x120] + strh r1, [r3, OFFSET_REG_JOYCNT - 0x120] + + movs r2, 0 + strb r2, [r0] + + ldr r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] + cmp r2, 0 + beq GameCubeMultiBoot_HandleSerialInterruptDone + + lsrs r1, 1 @ was a device reset command received? + bcs GameCubeMultiBoot_BeginHandshake @ branch if so + + mov pc, r2 + + .align 2, 0 + +@ Zero the status and the interrupt handler pointer. +@ Commands from the GameCube will not be processed after this is executed +@ unless GameCubeMultiBoot_Init() is called again. +GcMbIntrHandler_Stop: + movs r2, 0 + strh r2, [r3, OFFSET_REG_JOYSTAT - 0x120] + +GameCubeMultiBoot_SetInterruptHandler: + str r2, [r0, GCMB_STRUCT_SERIAL_INTR_HANDLER] + +GameCubeMultiBoot_ReadVCount: + ldr r3, pool_RegDispstat + ldrh r1, [r3, OFFSET_REG_VCOUNT - OFFSET_REG_DISPSTAT] + strb r1, [r0, 0x3] + +GameCubeMultiBoot_HandleSerialInterruptDone: + bx lr + +GameCubeMultiBoot_BeginHandshake: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + ldr r1, pool_RubyUSAGameCode + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + movs r1, 0x10 + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + ldrb r1, [r0, 0x3] + strb r1, [r0, 0x9] + ldrb r1, [r0, 0x2] + cmp r1, 0 + bne GcMbIntrHandler_Stop + ldr r1, pool_MultiBootLoadAddr + str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] + str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + adr r2, GcMbIntrHandler_CheckGameCodeSent + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckGameCodeSent: @ 82DEF24 + lsls r1, 31 + bcc GcMbIntrHandler_Stop @ stop if send failed + bmi GameCubeMultiBoot_CheckHandshakeResponse @ branch if receive is complete + +@ If the response hasn't been fully received yet, +@ check again upon the next interrupt. + adr r2, GcMbIntrHandler_CheckHandshakeResponse + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_CheckHandshakeResponse: @ 82DEF30 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ stop if not + +GameCubeMultiBoot_CheckHandshakeResponse: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + ldr r2, pool_RubyUSAGameCode + cmp r1, r2 + bne GcMbIntrHandler_Stop @ stop if the GameCube didn't reply with the same game code + ldrb r1, [r0, 0x3] + strb r1, [r0, 0xB] + adr r2, GcMbIntrHandler_82DEF44 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEF44: @ 82DEF44 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ branch if not + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + lsrs r2, r1, 24 + cmp r2, 0xDD + bne GcMbIntrHandler_Stop + str r1, [r0, 0x4] + ldrb r1, [r0, 0x1] + strb r1, [r0, 0xA] + movs r2, 0 + movs r3, 0 + ldr r1, [r0, 0x8] + lsrs r1, 8 +_082DEF5E: + lsrs r1, 1 + adcs r2, r3 + cmp r1, 0 + bne _082DEF5E + cmp r2, 0xE + bgt _082DEF70 + cmp r2, 0x7 + bge _082DEF72 + movs r1, 0xFF +_082DEF70: + strb r1, [r0, 0xA] +_082DEF72: + ldr r1, [r0, 0x8] + adds r1, 0xEE + ldr r3, pool_SerialRegs + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + movs r1, 0x30 + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + adr r2, GcMbIntrHandler_82DEF84 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEF84: @ 82DEF84 + lsls r1, 31 + bcc GcMbIntrHandler_Stop @ stop if send failed + bmi _082DEF94 @ branch if receive is complete + adr r2, GcMbIntrHandler_82DEF90 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEF90: @ 82DEF90 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ branch if not +_082DEF94: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + ldr r2, _082DF034 + cmp r1, r2 + bhs GcMbIntrHandler_Stop + adds r1, 0x1 + adds r1, r1 + strh r1, [r0, 0x12] + ldrb r1, [r0, 0x2] + cmp r1, 0 +_082DEFA6: + bne GcMbIntrHandler_Stop + ldr r1, pool_MultiBootLoadAddr + str r1, [r0, GCMB_STRUCT_BASE_DEST_PTR] + str r1, [r0, GCMB_STRUCT_CUR_DEST_PTR] + adr r2, GcMbIntrHandler_82DEFB4 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEFB4: @ 82DEFB4 + lsrs r1, 1 @ is receive complete? + bcc GcMbIntrHandler_Stop @ branch if not + ldr r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] + movs r1, 0x4 + ands r1, r2 + adds r1, 0x8 + lsls r1, 2 + strh r1, [r3, OFFSET_REG_JOYSTAT - 0x120] + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + stm r2!, {r1} + str r2, [r0, GCMB_STRUCT_CUR_DEST_PTR] + ldrh r1, [r0, 0x12] + subs r1, 0x1 + strh r1, [r0, 0x12] + bne GameCubeMultiBoot_ReadVCount + +_082DEFD2: + ldrb r1, [r0, 0x1] + lsls r1, 8 + adds r1, 0xCC + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + adr r2, _082DEFE0 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +_082DEFE0: + lsls r1, 31 + +_082DEFE2: + bcc GcMbIntrHandler_Stop + ldr r1, [r0, 0x1C] + cmp r1, 0 + beq _082DEFD2 + str r1, [r3, OFFSET_REG_JOY_TRANS - 0x120] + adr r2, GcMbIntrHandler_82DEFF0 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEFF0: @ 82DEFF0 + lsls r1, 31 + bcc _082DEFE2 @ branch if send failed + bmi _082DF000 @ branch if receive is complete + adr r2, GcMbIntrHandler_82DEFFC + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DEFFC: @ 82DEFFC + lsrs r1, 1 @ is receive complete? + bcc _082DEFE2 @ branch if not + +_082DF000: + ldr r1, [r3, OFFSET_REG_JOY_RECV - 0x120] + lsrs r2, r1, 24 + cmp r2, 0xBB + bne _082DEFA6 + strh r1, [r0, 0x10] + adr r2, GcMbIntrHandler_82DF010 + b GameCubeMultiBoot_SetInterruptHandler + + .align 2, 0 + +GcMbIntrHandler_82DF010: @ 82DF010 + b GcMbIntrHandler_Stop + + thumb_func_end GameCubeMultiBoot_HandleSerialInterrupt + + non_word_aligned_thumb_func_start GameCubeMultiBoot_Quit +@ void GameCubeMultiBoot_Quit(); +GameCubeMultiBoot_Quit: @ 82DF012 + ldr r3, pool_InterruptRegs + +@ Save IME register. + ldrh r2, [r3, OFFSET_REG_IME - 0x200] + +@ Disable interrupts. + movs r1, 0 + strh r1, [r3, OFFSET_REG_IME - 0x200] + + ldr r3, pool_SerialRegs + +@ Acknowledge all JOYCNT flags. + movs r0, 0x7 + strh r0, [r3, OFFSET_REG_JOYCNT - 0x120] + +@ Turn off JOY Bus mode. + lsls r0, r3, 10 + strh r0, [r3, OFFSET_REG_RCNT - 0x120] @ store 0x8000 + + ldr r3, pool_InterruptRegs + +@ Acknowledge serial interrupt. + movs r0, INTR_FLAG_SERIAL + strh r0, [r3, OFFSET_REG_IF - 0x200] + +@ Disable serial interrupt. + ldrh r1, [r3, OFFSET_REG_IE - 0x200] + bics r1, r0 + strh r1, [r3, OFFSET_REG_IE - 0x200] + +@ Restore IME register. + strh r2, [r3, OFFSET_REG_IME - 0x200] + + bx lr + thumb_func_end GameCubeMultiBoot_Quit + + .align 2, 0 + +_082DF034: .4byte 0x4000 + +pool_InterruptRegs: .4byte REG_BASE + 0x200 + +pool_SerialRegs: .4byte REG_BASE + 0x120 + +pool_RegDispstat: .4byte REG_DISPSTAT + +pool_RubyUSAGameCode: .ascii "AXVE" + +pool_MultiBootLoadAddr: .4byte EWRAM_START + + .align 2, 0 @ Don't pad with nop. diff --git a/src/m4a_1.s b/src/m4a_1.s new file mode 100644 index 000000000..cab4ed174 --- /dev/null +++ b/src/m4a_1.s @@ -0,0 +1,1934 @@ + .include "asm/macros.inc" + .include "constants/gba_constants.inc" + .include "constants/m4a_constants.inc" + + .syntax unified + + .text + + thumb_func_start umul3232H32 +umul3232H32: + adr r2, __umul3232H32 + bx r2 + .arm +__umul3232H32: + umull r2, r3, r0, r1 + add r0, r3, 0 + bx lr + thumb_func_end umul3232H32 + + thumb_func_start SoundMain +SoundMain: + ldr r0, lt_SOUND_INFO_PTR + ldr r0, [r0] + ldr r2, lt_ID_NUMBER + ldr r3, [r0, o_SoundInfo_ident] + cmp r2, r3 + beq SoundMain_1 + bx lr @ Exit the function if ident doesn't match ID_NUMBER. +SoundMain_1: + adds r3, 1 + str r3, [r0, o_SoundInfo_ident] + push {r4-r7,lr} + mov r1, r8 + mov r2, r9 + mov r3, r10 + mov r4, r11 + push {r0-r4} + sub sp, 0x18 + ldrb r1, [r0, o_SoundInfo_maxLines] + cmp r1, 0 @ if maxLines is 0, there is no maximum + beq SoundMain_3 + ldr r2, lt_REG_VCOUNT + ldrb r2, [r2] + cmp r2, VCOUNT_VBLANK + bhs SoundMain_2 + adds r2, TOTAL_SCANLINES +SoundMain_2: + adds r1, r2 +SoundMain_3: + str r1, [sp, 0x14] + ldr r3, [r0, o_SoundInfo_func] + cmp r3, 0 + beq SoundMain_4 + ldr r0, [r0, o_SoundInfo_intp] + bl _081DD25E + ldr r0, [sp, 0x18] +SoundMain_4: + ldr r3, [r0, o_SoundInfo_CgbSound] + bl _081DD25E + ldr r0, [sp, 0x18] + ldr r3, [r0, o_SoundInfo_pcmSamplesPerVBlank] + mov r8, r3 + ldr r5, lt_o_SoundInfo_pcmBuffer + adds r5, r0 + ldrb r4, [r0, o_SoundInfo_pcmDmaCounter] + subs r7, r4, 1 + bls SoundMain_5 + ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] + subs r1, r7 + mov r2, r8 + muls r2, r1 + adds r5, r2 +SoundMain_5: + str r5, [sp, 0x8] + ldr r6, lt_PCM_DMA_BUF_SIZE + ldr r3, lt_SoundMainRAM_Buffer + bx r3 + + .align 2, 0 +lt_SOUND_INFO_PTR: .word SOUND_INFO_PTR +lt_ID_NUMBER: .word ID_NUMBER +lt_SoundMainRAM_Buffer: .word SoundMainRAM_Buffer + 1 +lt_REG_VCOUNT: .word REG_VCOUNT +lt_o_SoundInfo_pcmBuffer: .word o_SoundInfo_pcmBuffer +lt_PCM_DMA_BUF_SIZE: .word PCM_DMA_BUF_SIZE + thumb_func_end SoundMain + + thumb_func_start SoundMainRAM +SoundMainRAM: + ldrb r3, [r0, o_SoundInfo_reverb] + cmp r3, 0 + beq SoundMainRAM_NoReverb + adr r1, SoundMainRAM_Reverb + bx r1 + .arm +SoundMainRAM_Reverb: + cmp r4, 0x2 + addeq r7, r0, o_SoundInfo_pcmBuffer + addne r7, r5, r8 + mov r4, r8 +_081DCEC4: + ldrsb r0, [r5, r6] + ldrsb r1, [r5] + add r0, r0, r1 + ldrsb r1, [r7, r6] + add r0, r0, r1 + ldrsb r1, [r7], 0x1 + add r0, r0, r1 + mul r1, r0, r3 + mov r0, r1, asr 9 + tst r0, 0x80 + addne r0, r0, 0x1 + strb r0, [r5, r6] + strb r0, [r5], 0x1 + subs r4, r4, 0x1 + bgt _081DCEC4 + adr r0, _081DCF36 + 1 @ plus 1 because THUMB + bx r0 + .thumb +SoundMainRAM_NoReverb: + movs r0, 0 + mov r1, r8 + adds r6, r5 + lsrs r1, 3 + bcc SoundMainRAM_NoReverb_Ok + stm r5!, {r0} + stm r6!, {r0} +SoundMainRAM_NoReverb_Ok: + lsrs r1, 1 + bcc SoundMainRAM_NoReverb_Loop + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} +SoundMainRAM_NoReverb_Loop: + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + stm r5!, {r0} + stm r6!, {r0} + subs r1, 1 + bgt SoundMainRAM_NoReverb_Loop +_081DCF36: + ldr r4, [sp, 0x18] + ldr r0, [r4, o_SoundInfo_divFreq] + mov r12, r0 + ldrb r0, [r4, o_SoundInfo_maxChans] + adds r4, o_SoundInfo_chans + +SoundMainRAM_ChanLoop: + str r0, [sp, 0x4] + ldr r3, [r4, o_SoundChannel_wav] + ldr r0, [sp, 0x14] + cmp r0, 0 + beq _081DCF60 + ldr r1, =REG_VCOUNT + ldrb r1, [r1] + cmp r1, VCOUNT_VBLANK + bhs _081DCF54 + adds r1, TOTAL_SCANLINES +_081DCF54: + cmp r1, r0 + blo _081DCF60 + b _081DD24A + + .pool + +_081DCF60: + ldrb r6, [r4, o_SoundChannel_status] + movs r0, 0xC7 + tst r0, r6 + bne _081DCF6A + b _081DD240 +_081DCF6A: + movs r0, 0x80 + tst r0, r6 + beq _081DCFA0 + movs r0, 0x40 + tst r0, r6 + bne _081DCFB0 + movs r6, 0x3 + strb r6, [r4, o_SoundChannel_status] + adds r0, r3, 0 + adds r0, 0x10 + ldr r1, [r4, o_SoundChannel_ct] + adds r0, r1 + str r0, [r4, o_SoundChannel_cp] + ldr r0, [r3, 0xC] + subs r0, r1 + str r0, [r4, o_SoundChannel_ct] + movs r5, 0 + strb r5, [r4, o_SoundChannel_ev] + str r5, [r4, o_SoundChannel_fw] + ldrb r2, [r3, 0x3] + movs r0, 0xC0 + tst r0, r2 + beq _081DCFF8 + movs r0, 0x10 + orrs r6, r0 + strb r6, [r4, o_SoundChannel_status] + b _081DCFF8 +_081DCFA0: + ldrb r5, [r4, o_SoundChannel_ev] + movs r0, 0x4 + tst r0, r6 + beq _081DCFB6 + ldrb r0, [r4, o_SoundChannel_iel] + subs r0, 1 + strb r0, [r4, o_SoundChannel_iel] + bhi _081DD006 +_081DCFB0: + movs r0, 0 + strb r0, [r4, o_SoundChannel_status] + b _081DD240 +_081DCFB6: + movs r0, 0x40 + tst r0, r6 + beq _081DCFD6 + ldrb r0, [r4, o_SoundChannel_release] + muls r5, r0 + lsrs r5, 8 + ldrb r0, [r4, o_SoundChannel_iev] + cmp r5, r0 + bhi _081DD006 +_081DCFC8: + ldrb r5, [r4, o_SoundChannel_iev] + cmp r5, 0 + beq _081DCFB0 + movs r0, 0x4 + orrs r6, r0 + strb r6, [r4, o_SoundChannel_status] + b _081DD006 +_081DCFD6: + movs r2, 0x3 + ands r2, r6 + cmp r2, 0x2 + bne _081DCFF4 + ldrb r0, [r4, o_SoundChannel_decay] + muls r5, r0 + lsrs r5, 8 + ldrb r0, [r4, o_SoundChannel_sustain] + cmp r5, r0 + bhi _081DD006 + adds r5, r0, 0 + beq _081DCFC8 + subs r6, 0x1 + strb r6, [r4, o_SoundChannel_status] + b _081DD006 +_081DCFF4: + cmp r2, 0x3 + bne _081DD006 +_081DCFF8: + ldrb r0, [r4, o_SoundChannel_attack] + adds r5, r0 + cmp r5, 0xFF + bcc _081DD006 + movs r5, 0xFF + subs r6, 0x1 + strb r6, [r4, o_SoundChannel_status] +_081DD006: + strb r5, [r4, o_SoundChannel_ev] + ldr r0, [sp, 0x18] + ldrb r0, [r0, o_SoundChannel_release] + adds r0, 0x1 + muls r0, r5 + lsrs r5, r0, 4 + ldrb r0, [r4, o_SoundChannel_rightVolume] + muls r0, r5 + lsrs r0, 8 + strb r0, [r4, o_SoundChannel_er] + ldrb r0, [r4, o_SoundChannel_leftVolume] + muls r0, r5 + lsrs r0, 8 + strb r0, [r4, o_SoundChannel_el] + movs r0, 0x10 + ands r0, r6 + str r0, [sp, 0x10] + beq _081DD03A + adds r0, r3, 0 + adds r0, 0x10 + ldr r1, [r3, 0x8] + adds r0, r1 + str r0, [sp, 0xC] + ldr r0, [r3, 0xC] + subs r0, r1 + str r0, [sp, 0x10] +_081DD03A: + ldr r5, [sp, 0x8] + ldr r2, [r4, o_SoundChannel_ct] + ldr r3, [r4, o_SoundChannel_cp] + adr r0, _081DD044 + bx r0 + .arm +_081DD044: + str r8, [sp] + ldr r9, [r4, o_SoundChannel_fw] + ldrb r10, [r4, o_SoundChannel_er] + ldrb r11, [r4, o_SoundChannel_el] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x30 + beq _081DD068 + bl sub_82DF49C + b _081DD228 +_081DD068: + mov r10, r10, lsl 16 + mov r11, r11, lsl 16 + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x8 + beq _081DD19C +_081DD07C: + cmp r2, 0x4 + ble _081DD0EC + subs r2, r2, r8 + movgt r9, 0 + bgt _081DD0A8 + mov r9, r8 + add r2, r2, r8 + sub r8, r2, 0x4 + sub r9, r9, r8 + ands r2, r2, 0x3 + moveq r2, 0x4 +_081DD0A8: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD0B0: + ldrsb r0, [r3], 0x1 + mul r1, r10, r0 + bic r1, r1, 0xFF0000 + add r6, r1, r6, ror 8 + mul r1, r11, r0 + bic r1, r1, 0xFF0000 + add r7, r1, r7, ror 8 + adds r5, r5, 0x40000000 + bcc _081DD0B0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD0A8 + adds r8, r8, r9 + beq _081DD22C +_081DD0EC: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD0F4: + ldrsb r0, [r3], 0x1 + mul r1, r10, r0 + bic r1, r1, 0xFF0000 + add r6, r1, r6, ror 8 + mul r1, r11, r0 + bic r1, r1, 0xFF0000 + add r7, r1, r7, ror 8 + subs r2, r2, 0x1 + beq _081DD164 +_081DD118: + adds r5, r5, 0x40000000 + bcc _081DD0F4 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD07C + b _081DD22C +_081DD134: + ldr r0, [sp, 0x18] + cmp r0, 0 + beq _081DD158 + ldr r3, [sp, 0x14] + rsb lr, r2, 0 +_081DD148: + adds r2, r0, r2 + bgt _081DD1FC + sub lr, lr, r0 + b _081DD148 +_081DD158: + pop {r4,r12} + mov r2, 0 + b _081DD174 +_081DD164: + ldr r2, [sp, 0x10] + cmp r2, 0 + ldrne r3, [sp, 0xC] + bne _081DD118 +_081DD174: + strb r2, [r4, o_SoundChannel_status] + mov r0, r5, lsr 30 + bic r5, r5, 0xC0000000 + rsb r0, r0, 0x3 + mov r0, r0, lsl 3 + mov r6, r6, ror r0 + mov r7, r7, ror r0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + b _081DD234 +_081DD19C: + push {r4,r12} + ldr r1, [r4, o_SoundChannel_freq] + mul r4, r12, r1 + ldrsb r0, [r3] + ldrsb r1, [r3, 0x1]! + sub r1, r1, r0 +_081DD1B4: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD1BC: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r4 + movs lr, r9, lsr 23 + beq _081DD208 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD134 + subs lr, lr, 0x1 + addeq r0, r0, r1 +_081DD1FC: + ldrsbne r0, [r3, lr]! + ldrsb r1, [r3, 0x1]! + sub r1, r1, r0 +_081DD208: + adds r5, r5, 0x40000000 + bcc _081DD1BC + str r7, [r5, 0x630] + str r6, [r5], 0x4 + subs r8, r8, 0x4 + bgt _081DD1B4 + sub r3, r3, 0x1 + pop {r4,r12} +_081DD228: + str r9, [r4, o_SoundChannel_fw] +_081DD22C: + str r2, [r4, o_SoundChannel_ct] + str r3, [r4, o_SoundChannel_cp] +_081DD234: + ldr r8, [sp] + add r0, pc, 0x1 + bx r0 + .thumb +_081DD240: + ldr r0, [sp, 0x4] + subs r0, 1 + ble _081DD24A + adds r4, SoundChannel_size + b SoundMainRAM_ChanLoop +_081DD24A: + ldr r0, [sp, 0x18] + ldr r3, =ID_NUMBER + str r3, [r0] + add sp, 0x1C + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r3} +_081DD25E: + bx r3 + .pool + thumb_func_end SoundMainRAM + + arm_func_start sub_82DF49C +sub_82DF49C: + ldr r6, [r4, o_SoundChannel_wav] + ldrb r0, [r4, o_SoundChannel_status] + tst r0, 0x20 + bne _081DD2B4 + orr r0, r0, 0x20 + strb r0, [r4, o_SoundChannel_status] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + beq _081DD29C + ldr r1, [r6, 0xC] + add r1, r1, r6, lsl 1 + add r1, r1, 0x20 + sub r3, r1, r3 + str r3, [r4, o_SoundChannel_cp] +_081DD29C: + ldrh r0, [r6] + cmp r0, 0 + beq _081DD2B4 + sub r3, r3, r6 + sub r3, r3, 0x10 + str r3, [r4, o_SoundChannel_cp] +_081DD2B4: + push {r8,r12,lr} + mov r10, r10, lsl 16 + mov r11, r11, lsl 16 + ldr r1, [r4, o_SoundChannel_freq] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x8 + movne r8, 0x800000 + muleq r8, r12, r1 + ldrh r0, [r6] + cmp r0, 0 + beq _081DD468 + mov r0, 0xFF000000 + str r0, [r4, o_SoundChannel_xpi] + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + bne _081DD3C0 + bl sub_82DF758 + mov r0, r1 + add r3, r3, 0x1 + bl sub_82DF758 + sub r1, r1, r0 +_081DD308: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD310: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD370 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD398 + subs lr, lr, 0x1 + bne _081DD358 + add r0, r0, r1 + b _081DD364 +_081DD358: + add r3, r3, lr + bl sub_82DF758 + mov r0, r1 +_081DD364: + add r3, r3, 0x1 + bl sub_82DF758 + sub r1, r1, r0 +_081DD370: + adds r5, r5, 0x40000000 + bcc _081DD310 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD308 + sub r3, r3, 0x1 + b _081DD4F0 +_081DD398: + ldr r0, [sp, 0x1C] + cmp r0, 0 + beq _081DD4F4 + ldr r3, [r4, o_SoundChannel_wav] + ldr r3, [r3, 0x8] + rsb lr, r2, 0 +_081DD3B0: + adds r2, r2, r0 + bgt _081DD358 + sub lr, lr, r0 + b _081DD3B0 +_081DD3C0: + sub r3, r3, 0x1 + bl sub_82DF758 + mov r0, r1 + sub r3, r3, 0x1 + bl sub_82DF758 + sub r1, r1, r0 +_081DD3D8: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD3E0: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD440 + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD4F4 + subs lr, lr, 0x1 + bne _081DD428 + add r0, r0, r1 + b _081DD434 +_081DD428: + sub r3, r3, lr + bl sub_82DF758 + mov r0, r1 +_081DD434: + sub r3, r3, 0x1 + bl sub_82DF758 + sub r1, r1, r0 +_081DD440: + adds r5, r5, 0x40000000 + bcc _081DD3E0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD3D8 + add r3, r3, 0x2 + b _081DD4F0 +_081DD468: + ldrb r0, [r4, o_SoundChannel_type] + tst r0, 0x10 + beq _081DD4F0 + ldrsb r0, [r3, -0x1]! + ldrsb r1, [r3, -0x1] + sub r1, r1, r0 +_081DD480: + ldr r6, [r5] + ldr r7, [r5, 0x630] +_081DD488: + mul lr, r9, r1 + add lr, r0, lr, asr 23 + mul r12, r10, lr + bic r12, r12, 0xFF0000 + add r6, r12, r6, ror 8 + mul r12, r11, lr + bic r12, r12, 0xFF0000 + add r7, r12, r7, ror 8 + add r9, r9, r8 + movs lr, r9, lsr 23 + beq _081DD4CC + bic r9, r9, 0x3F800000 + subs r2, r2, lr + ble _081DD4F4 + ldrsb r0, [r3, -lr]! + ldrsb r1, [r3, -0x1] + sub r1, r1, r0 +_081DD4CC: + adds r5, r5, 0x40000000 + bcc _081DD488 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + ldr r6, [sp] + subs r6, r6, 0x4 + str r6, [sp] + bgt _081DD480 + add r3, r3, 0x1 +_081DD4F0: + pop {r8,r12,pc} +_081DD4F4: + mov r2, 0 + strb r2, [r4, o_SoundChannel_status] + mov r0, r5, lsr 30 + bic r5, r5, 0xC0000000 + rsb r0, r0, 0x3 + mov r0, r0, lsl 3 + mov r6, r6, ror r0 + mov r7, r7, ror r0 + str r7, [r5, 0x630] + str r6, [r5], 0x4 + pop {r8,r12,pc} + arm_func_end sub_82DF49C + + arm_func_start sub_82DF758 +sub_82DF758: + push {r0,r2,r5-r7,lr} + mov r0, r3, lsr 6 + ldr r1, [r4, o_SoundChannel_xpi] + cmp r0, r1 + beq _081DD594 + str r0, [r4, o_SoundChannel_xpi] + mov r1, 0x21 + mul r2, r1, r0 + ldr r1, [r4, o_SoundChannel_wav] + add r2, r2, r1 + add r2, r2, 0x10 + ldr r5, =gUnknown_03001300 + ldr r6, =gDeltaEncodingTable + mov r7, 0x40 + ldrb lr, [r2], 1 + strb lr, [r5], 1 + ldrb r1, [r2], 1 + b _081DD57C +_081DD568: + ldrb r1, [r2], 1 + mov r0, r1, lsr 4 + ldrsb r0, [r6, r0] + add lr, lr, r0 + strb lr, [r5], 1 +_081DD57C: + and r0, r1, 0xF + ldrsb r0, [r6, r0] + add lr, lr, r0 + strb lr, [r5], 1 + subs r7, r7, 2 + bgt _081DD568 +_081DD594: + ldr r5, =gUnknown_03001300 + and r0, r3, 0x3F + ldrsb r1, [r5, r0] + pop {r0,r2,r5-r7,pc} + .pool + arm_func_end sub_82DF758 + + thumb_func_start SoundMainBTM +SoundMainBTM: + mov r12, r4 + movs r1, 0 + movs r2, 0 + movs r3, 0 + movs r4, 0 + stm r0!, {r1-r4} + stm r0!, {r1-r4} + stm r0!, {r1-r4} + stm r0!, {r1-r4} + mov r4, r12 + bx lr + thumb_func_end SoundMainBTM + + thumb_func_start RealClearChain +RealClearChain: + ldr r3, [r0, 0x2C] + cmp r3, 0 + beq _081DD5E2 + ldr r1, [r0, 0x34] + ldr r2, [r0, 0x30] + cmp r2, 0 + beq _081DD5D6 + str r1, [r2, 0x34] + b _081DD5D8 +_081DD5D6: + str r1, [r3, 0x20] +_081DD5D8: + cmp r1, 0 + beq _081DD5DE + str r2, [r1, 0x30] +_081DD5DE: + movs r1, 0 + str r1, [r0, 0x2C] +_081DD5E2: + bx lr + thumb_func_end RealClearChain + + thumb_func_start ply_fine +ply_fine: + push {r4,r5,lr} + adds r5, r1, 0 + ldr r4, [r5, o_MusicPlayerTrack_chan] + cmp r4, 0 + beq ply_fine_done +ply_fine_loop: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq ply_fine_ok + movs r0, 0x40 + orrs r1, r0 + strb r1, [r4] +ply_fine_ok: + adds r0, r4, 0 + bl RealClearChain + ldr r4, [r4, 0x34] + cmp r4, 0 + bne ply_fine_loop +ply_fine_done: + movs r0, 0 + strb r0, [r5] + pop {r4,r5} + pop {r0} + bx r0 + thumb_func_end ply_fine + + thumb_func_start MPlayJumpTableCopy +MPlayJumpTableCopy: + mov r12, lr + movs r1, 0x24 + ldr r2, lt_MPlayJumpTableTemplate +MPlayJumpTableCopy_Loop: + ldr r3, [r2] + bl chk_adr_r2 + stm r0!, {r3} + adds r2, 0x4 + subs r1, 0x1 + bgt MPlayJumpTableCopy_Loop + bx r12 + thumb_func_end MPlayJumpTableCopy + + .align 2, 0 + .thumb_func +ldrb_r3_r2: + ldrb r3, [r2] + +@ This attempts to protect against reading anything from the BIOS ROM +@ besides the jump table template. +@ It assumes that the jump table template is located at the end of the ROM. + .thumb_func +chk_adr_r2: + push {r0} + lsrs r0, r2, 25 + bne chk_adr_r2_done @ if adr >= 0x2000000 (i.e. not in BIOS ROM), accept it + ldr r0, lt_MPlayJumpTableTemplate + cmp r2, r0 + blo chk_adr_r2_reject @ if adr < gMPlayJumpTableTemplate, reject it + lsrs r0, r2, 14 + beq chk_adr_r2_done @ if adr < 0x40000 (i.e. in BIOS ROM), accept it +chk_adr_r2_reject: + movs r3, 0 +chk_adr_r2_done: + pop {r0} + bx lr + + .align 2, 0 +lt_MPlayJumpTableTemplate: .word gMPlayJumpTableTemplate + + thumb_func_start ld_r3_tp_adr_i +ld_r3_tp_adr_i: + ldr r2, [r1, 0x40] +_081DD64A: + adds r3, r2, 0x1 + str r3, [r1, 0x40] + ldrb r3, [r2] + b chk_adr_r2 + thumb_func_end ld_r3_tp_adr_i + + thumb_func_start ply_goto +ply_goto: + push {lr} +ply_goto_1: + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r0, [r2, 0x3] + lsls r0, 8 + ldrb r3, [r2, 0x2] + orrs r0, r3 + lsls r0, 8 + ldrb r3, [r2, 0x1] + orrs r0, r3 + lsls r0, 8 + bl ldrb_r3_r2 + orrs r0, r3 + str r0, [r1, o_MusicPlayerTrack_cmdPtr] + pop {r0} + bx r0 + thumb_func_end ply_goto + + thumb_func_start ply_patt +ply_patt: + ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + cmp r2, 3 + bhs ply_patt_done + lsls r2, 2 + adds r3, r1, r2 + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + adds r2, 0x4 + str r2, [r3, o_MusicPlayerTrack_patternStack] + ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + adds r2, 1 + strb r2, [r1, o_MusicPlayerTrack_patternLevel] + b ply_goto +ply_patt_done: + b ply_fine + thumb_func_end ply_patt + + thumb_func_start ply_pend +ply_pend: + ldrb r2, [r1, o_MusicPlayerTrack_patternLevel] + cmp r2, 0 + beq ply_pend_done + subs r2, 1 + strb r2, [r1, o_MusicPlayerTrack_patternLevel] + lsls r2, 2 + adds r3, r1, r2 + ldr r2, [r3, o_MusicPlayerTrack_patternStack] + str r2, [r1, o_MusicPlayerTrack_cmdPtr] +ply_pend_done: + bx lr + thumb_func_end ply_pend + + thumb_func_start ply_rept +ply_rept: + push {lr} + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r3, [r2] + cmp r3, 0 + bne ply_rept_1 + adds r2, 1 + str r2, [r1, o_MusicPlayerTrack_cmdPtr] + b ply_goto_1 +ply_rept_1: + ldrb r3, [r1, o_MusicPlayerTrack_repN] + adds r3, 1 + strb r3, [r1, o_MusicPlayerTrack_repN] + mov r12, r3 + bl ld_r3_tp_adr_i + cmp r12, r3 + bhs ply_rept_2 + b ply_goto_1 +ply_rept_2: + movs r3, 0 + strb r3, [r1, o_MusicPlayerTrack_repN] + adds r2, 5 + str r2, [r1, o_MusicPlayerTrack_cmdPtr] + pop {r0} + bx r0 + thumb_func_end ply_rept + + thumb_func_start ply_prio +ply_prio: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, o_MusicPlayerTrack_priority] + bx r12 + thumb_func_end ply_prio + + thumb_func_start ply_tempo +ply_tempo: + mov r12, lr + bl ld_r3_tp_adr_i + lsls r3, 1 + strh r3, [r0, o_MusicPlayerInfo_tempoD] + ldrh r2, [r0, o_MusicPlayerInfo_tempoU] + muls r3, r2 + lsrs r3, 8 + strh r3, [r0, o_MusicPlayerInfo_tempoI] + bx r12 + thumb_func_end ply_tempo + + thumb_func_start ply_keysh +ply_keysh: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, o_MusicPlayerTrack_keyShift] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_keysh + + thumb_func_start ply_voice +ply_voice: + mov r12, lr + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r3, [r2] + adds r2, 1 + str r2, [r1, o_MusicPlayerTrack_cmdPtr] + lsls r2, r3, 1 + adds r2, r3 + lsls r2, 2 + ldr r3, [r0, o_MusicPlayerInfo_tone] + adds r2, r3 + ldr r3, [r2] + bl chk_adr_r2 + str r3, [r1, o_MusicPlayerTrack_ToneData_type] + ldr r3, [r2, 0x4] + bl chk_adr_r2 + str r3, [r1, o_MusicPlayerTrack_ToneData_wav] + ldr r3, [r2, 0x8] + bl chk_adr_r2 + str r3, [r1, o_MusicPlayerTrack_ToneData_attack] + bx r12 + thumb_func_end ply_voice + + thumb_func_start ply_vol +ply_vol: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, o_MusicPlayerTrack_vol] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0x3 + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_vol + + thumb_func_start ply_pan +ply_pan: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, o_MusicPlayerTrack_pan] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0x3 + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_pan + + thumb_func_start ply_bend +ply_bend: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, o_MusicPlayerTrack_bend] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_bend + + thumb_func_start ply_bendr +ply_bendr: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, o_MusicPlayerTrack_bendRange] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_bendr + + thumb_func_start ply_lfodl +ply_lfodl: + mov r12, lr + bl ld_r3_tp_adr_i + strb r3, [r1, o_MusicPlayerTrack_lfoDelay] + bx r12 + thumb_func_end ply_lfodl + + thumb_func_start ply_modt +ply_modt: + mov r12, lr + bl ld_r3_tp_adr_i + ldrb r0, [r1, o_MusicPlayerTrack_modT] + cmp r0, r3 + beq _081DD7AA + strb r3, [r1, o_MusicPlayerTrack_modT] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0xF + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] +_081DD7AA: + bx r12 + thumb_func_end ply_modt + + thumb_func_start ply_tune +ply_tune: + mov r12, lr + bl ld_r3_tp_adr_i + subs r3, 0x40 + strb r3, [r1, o_MusicPlayerTrack_tune] + ldrb r3, [r1, o_MusicPlayerTrack_flags] + movs r2, 0xC + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx r12 + thumb_func_end ply_tune + + thumb_func_start ply_port +ply_port: + mov r12, lr + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r3, [r2] + adds r2, 1 + ldr r0, =REG_SOUND1CNT_L @ sound register base address + adds r0, r3 + bl _081DD64A + strb r3, [r0] + bx r12 + .pool + thumb_func_end ply_port + + thumb_func_start m4aSoundVSync +m4aSoundVSync: + ldr r0, lt2_SOUND_INFO_PTR + ldr r0, [r0] + + @ Exit the function if ident is not ID_NUMBER or ID_NUMBER+1. + ldr r2, lt2_ID_NUMBER + ldr r3, [r0, o_SoundInfo_ident] + subs r3, r2 + cmp r3, 1 + bhi m4aSoundVSync_Done + + @ Decrement the PCM DMA counter. If it reaches 0, we need to do a DMA. + ldrb r1, [r0, o_SoundInfo_pcmDmaCounter] + subs r1, 1 + strb r1, [r0, o_SoundInfo_pcmDmaCounter] + bgt m4aSoundVSync_Done + + @ Reload the PCM DMA counter. + ldrb r1, [r0, o_SoundInfo_pcmDmaPeriod] + strb r1, [r0, o_SoundInfo_pcmDmaCounter] + + ldr r2, =REG_DMA1 + + ldr r1, [r2, 0x8] @ DMA1CNT + lsls r1, 7 + bcc m4aSoundVSync_SkipDMA1 @ branch if repeat bit isn't set + + ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 + str r1, [r2, 0x8] @ DMA1CNT + +m4aSoundVSync_SkipDMA1: + ldr r1, [r2, 0xC + 0x8] @ DMA2CNT + lsls r1, 7 + bcc m4aSoundVSync_SkipDMA2 @ branch if repeat bit isn't set + + ldr r1, =((DMA_ENABLE | DMA_START_NOW | DMA_32BIT | DMA_SRC_INC | DMA_DEST_FIXED) << 16) | 4 + str r1, [r2, 0xC + 0x8] @ DMA2CNT + +m4aSoundVSync_SkipDMA2: + + @ turn off DMA1/DMA2 + movs r1, DMA_32BIT >> 8 + lsls r1, 8 + strh r1, [r2, 0xA] @ DMA1CNT_H + strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H + + @ turn on DMA1/DMA2 direct-sound FIFO mode + movs r1, (DMA_ENABLE | DMA_START_SPECIAL | DMA_32BIT | DMA_REPEAT) >> 8 + lsls r1, 8 @ LSB is 0, so DMA_SRC_INC is used (destination is always fixed in FIFO mode) + strh r1, [r2, 0xA] @ DMA1CNT_H + strh r1, [r2, 0xC + 0xA] @ DMA2CNT_H + +m4aSoundVSync_Done: + bx lr + + .pool + thumb_func_end m4aSoundVSync + + thumb_func_start MPlayMain +MPlayMain: + ldr r2, lt2_ID_NUMBER + ldr r3, [r0, o_MusicPlayerInfo_ident] + cmp r2, r3 + beq _081DD82E + bx lr +_081DD82E: + adds r3, 0x1 + str r3, [r0, o_MusicPlayerInfo_ident] + push {r0,lr} + ldr r3, [r0, o_MusicPlayerInfo_func] + cmp r3, 0 + beq _081DD840 + ldr r0, [r0, o_MusicPlayerInfo_intp] + bl call_r3 +_081DD840: + pop {r0} + push {r4-r7} + mov r4, r8 + mov r5, r9 + mov r6, r10 + mov r7, r11 + push {r4-r7} + adds r7, r0, 0 + ldr r0, [r7, o_MusicPlayerInfo_status] + cmp r0, 0 + bge _081DD858 + b _081DDA6C +_081DD858: + ldr r0, lt2_SOUND_INFO_PTR + ldr r0, [r0] + mov r8, r0 + adds r0, r7, 0 + bl FadeOutBody + ldr r0, [r7, o_MusicPlayerInfo_status] + cmp r0, 0 + bge _081DD86C + b _081DDA6C +_081DD86C: + ldrh r0, [r7, o_MusicPlayerInfo_tempoC] + ldrh r1, [r7, o_MusicPlayerInfo_tempoI] + adds r0, r1 + b _081DD9BC +_081DD874: + ldrb r6, [r7, o_MusicPlayerInfo_trackCount] + ldr r5, [r7, o_MusicPlayerInfo_tracks] + movs r3, 0x1 + movs r4, 0 +_081DD87C: + ldrb r0, [r5] + movs r1, 0x80 + tst r1, r0 + bne _081DD886 + b _081DD998 +_081DD886: + mov r10, r3 + orrs r4, r3 + mov r11, r4 + ldr r4, [r5, o_MusicPlayerTrack_chan] + cmp r4, 0 + beq _081DD8BA +_081DD892: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DD8AE + ldrb r0, [r4, 0x10] + cmp r0, 0 + beq _081DD8B4 + subs r0, 0x1 + strb r0, [r4, 0x10] + bne _081DD8B4 + movs r0, 0x40 + orrs r1, r0 + strb r1, [r4] + b _081DD8B4 +_081DD8AE: + adds r0, r4, 0 + bl ClearChain +_081DD8B4: + ldr r4, [r4, 0x34] + cmp r4, 0 + bne _081DD892 +_081DD8BA: + ldrb r3, [r5, o_MusicPlayerTrack_flags] + movs r0, 0x40 + tst r0, r3 + beq _081DD938 + adds r0, r5, 0 + bl Clear64byte + movs r0, 0x80 + strb r0, [r5] + movs r0, 0x2 + strb r0, [r5, o_MusicPlayerTrack_bendRange] + movs r0, 0x40 + strb r0, [r5, o_MusicPlayerTrack_volX] + movs r0, 0x16 + strb r0, [r5, o_MusicPlayerTrack_lfoSpeed] + movs r0, 0x1 + adds r1, r5, 0x6 + strb r0, [r1, o_MusicPlayerTrack_ToneData_type - 0x6] + b _081DD938 +_081DD8E0: + ldr r2, [r5, o_MusicPlayerTrack_cmdPtr] + ldrb r1, [r2] + cmp r1, 0x80 + bhs _081DD8EC + ldrb r1, [r5, o_MusicPlayerTrack_runningStatus] + b _081DD8F6 +_081DD8EC: + adds r2, 0x1 + str r2, [r5, o_MusicPlayerTrack_cmdPtr] + cmp r1, 0xBD + bcc _081DD8F6 + strb r1, [r5, o_MusicPlayerTrack_runningStatus] +_081DD8F6: + cmp r1, 0xCF + bcc _081DD90C + mov r0, r8 + ldr r3, [r0, o_SoundInfo_plynote] + adds r0, r1, 0 + subs r0, 0xCF + adds r1, r7, 0 + adds r2, r5, 0 + bl call_r3 + b _081DD938 +_081DD90C: + cmp r1, 0xB0 + bls _081DD92E + adds r0, r1, 0 + subs r0, 0xB1 + strb r0, [r7, o_MusicPlayerInfo_cmd] + mov r3, r8 + ldr r3, [r3, o_SoundInfo_MPlayJumpTable] + lsls r0, 2 + ldr r3, [r3, r0] + adds r0, r7, 0 + adds r1, r5, 0 + bl call_r3 + ldrb r0, [r5, o_MusicPlayerTrack_flags] + cmp r0, 0 + beq _081DD994 + b _081DD938 +_081DD92E: + ldr r0, lt_gClockTable + subs r1, 0x80 + adds r1, r0 + ldrb r0, [r1] + strb r0, [r5, o_MusicPlayerTrack_wait] +_081DD938: + ldrb r0, [r5, o_MusicPlayerTrack_wait] + cmp r0, 0 + beq _081DD8E0 + subs r0, 0x1 + strb r0, [r5, o_MusicPlayerTrack_wait] + ldrb r1, [r5, o_MusicPlayerTrack_lfoSpeed] + cmp r1, 0 + beq _081DD994 + ldrb r0, [r5, o_MusicPlayerTrack_mod] + cmp r0, 0 + beq _081DD994 + ldrb r0, [r5, o_MusicPlayerTrack_lfoDelayC] + cmp r0, 0 + beq _081DD95A + subs r0, 0x1 + strb r0, [r5, o_MusicPlayerTrack_lfoDelayC] + b _081DD994 +_081DD95A: + ldrb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] + adds r0, r1 + strb r0, [r5, o_MusicPlayerTrack_lfoSpeedC] + adds r1, r0, 0 + subs r0, 0x40 + lsls r0, 24 + bpl _081DD96E + lsls r2, r1, 24 + asrs r2, 24 + b _081DD972 +_081DD96E: + movs r0, 0x80 + subs r2, r0, r1 +_081DD972: + ldrb r0, [r5, o_MusicPlayerTrack_mod] + muls r0, r2 + asrs r2, r0, 6 + ldrb r0, [r5, o_MusicPlayerTrack_modM] + eors r0, r2 + lsls r0, 24 + beq _081DD994 + strb r2, [r5, o_MusicPlayerTrack_modM] + ldrb r0, [r5] + ldrb r1, [r5, o_MusicPlayerTrack_modT] + cmp r1, 0 + bne _081DD98E + movs r1, 0xC + b _081DD990 +_081DD98E: + movs r1, 0x3 +_081DD990: + orrs r0, r1 + strb r0, [r5, o_MusicPlayerTrack_flags] +_081DD994: + mov r3, r10 + mov r4, r11 +_081DD998: + subs r6, 0x1 + ble _081DD9A4 + movs r0, 0x50 + adds r5, r0 + lsls r3, 1 + b _081DD87C +_081DD9A4: + ldr r0, [r7, o_MusicPlayerInfo_clock] + adds r0, 0x1 + str r0, [r7, o_MusicPlayerInfo_clock] + cmp r4, 0 + bne _081DD9B6 + movs r0, 0x80 + lsls r0, 24 + str r0, [r7, o_MusicPlayerInfo_status] + b _081DDA6C +_081DD9B6: + str r4, [r7, o_MusicPlayerInfo_status] + ldrh r0, [r7, o_MusicPlayerInfo_tempoC] + subs r0, 0x96 +_081DD9BC: + strh r0, [r7, o_MusicPlayerInfo_tempoC] + cmp r0, 0x96 + bcc _081DD9C4 + b _081DD874 +_081DD9C4: + ldrb r2, [r7, o_MusicPlayerInfo_trackCount] + ldr r5, [r7, o_MusicPlayerInfo_tracks] +_081DD9C8: + ldrb r0, [r5, o_MusicPlayerTrack_flags] + movs r1, 0x80 + tst r1, r0 + beq _081DDA62 + movs r1, 0xF + tst r1, r0 + beq _081DDA62 + mov r9, r2 + adds r0, r7, 0 + adds r1, r5, 0 + bl TrkVolPitSet + ldr r4, [r5, o_MusicPlayerTrack_chan] + cmp r4, 0 + beq _081DDA58 +_081DD9E6: + ldrb r1, [r4, o_SoundChannel_status] + movs r0, 0xC7 + tst r0, r1 + bne _081DD9F6 + adds r0, r4, 0 + bl ClearChain + b _081DDA52 +_081DD9F6: + ldrb r0, [r4, o_SoundChannel_type] + movs r6, 0x7 + ands r6, r0 + ldrb r3, [r5, o_MusicPlayerTrack_flags] + movs r0, 0x3 + tst r0, r3 + beq _081DDA14 + bl ChnVolSetAsm + cmp r6, 0 + beq _081DDA14 + ldrb r0, [r4, o_CgbChannel_mo] + movs r1, 0x1 + orrs r0, r1 + strb r0, [r4, o_CgbChannel_mo] +_081DDA14: + ldrb r3, [r5, o_MusicPlayerTrack_flags] + movs r0, 0xC + tst r0, r3 + beq _081DDA52 + ldrb r1, [r4, o_SoundChannel_ky] + movs r0, 0x8 + ldrsb r0, [r5, r0] + adds r2, r1, r0 + bpl _081DDA28 + movs r2, 0 +_081DDA28: + cmp r6, 0 + beq _081DDA46 + mov r0, r8 + ldr r3, [r0, o_SoundInfo_MidiKeyToCgbFreq] + adds r1, r2, 0 + ldrb r2, [r5, o_MusicPlayerTrack_pitM] + adds r0, r6, 0 + bl call_r3 + str r0, [r4, o_CgbChannel_fr] + ldrb r0, [r4, o_CgbChannel_mo] + movs r1, 0x2 + orrs r0, r1 + strb r0, [r4, o_CgbChannel_mo] + b _081DDA52 +_081DDA46: + adds r1, r2, 0 + ldrb r2, [r5, o_MusicPlayerTrack_pitM] + ldr r0, [r4, o_SoundChannel_wav] + bl MidiKeyToFreq + str r0, [r4, o_SoundChannel_freq] +_081DDA52: + ldr r4, [r4, o_SoundChannel_np] + cmp r4, 0 + bne _081DD9E6 +_081DDA58: + ldrb r0, [r5, o_MusicPlayerTrack_flags] + movs r1, 0xF0 + ands r0, r1 + strb r0, [r5, o_MusicPlayerTrack_flags] + mov r2, r9 +_081DDA62: + subs r2, 0x1 + ble _081DDA6C + movs r0, 0x50 + adds r5, r0 + bgt _081DD9C8 +_081DDA6C: + ldr r0, lt2_ID_NUMBER + str r0, [r7, o_MusicPlayerInfo_ident] + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r3} + +call_r3: + bx r3 + + .align 2, 0 +lt_gClockTable: .word gClockTable +lt2_SOUND_INFO_PTR: .word SOUND_INFO_PTR +lt2_ID_NUMBER: .word ID_NUMBER + thumb_func_end MPlayMain + + thumb_func_start TrackStop +TrackStop: + push {r4-r6,lr} + adds r5, r1, 0 + ldrb r1, [r5, o_MusicPlayerTrack_flags] + movs r0, 0x80 + tst r0, r1 + beq TrackStop_Done + ldr r4, [r5, o_MusicPlayerTrack_chan] + cmp r4, 0 + beq TrackStop_3 + movs r6, 0 +TrackStop_Loop: + ldrb r0, [r4, o_SoundChannel_status] + cmp r0, 0 + beq TrackStop_2 + ldrb r0, [r4, o_SoundChannel_type] + movs r3, 0x7 + ands r0, r3 + beq TrackStop_1 + ldr r3, =SOUND_INFO_PTR + ldr r3, [r3] + ldr r3, [r3, o_SoundInfo_CgbOscOff] + bl call_r3 +TrackStop_1: + strb r6, [r4, o_SoundChannel_status] +TrackStop_2: + str r6, [r4, o_SoundChannel_track] + ldr r4, [r4, o_SoundChannel_np] + cmp r4, 0 + bne TrackStop_Loop +TrackStop_3: + str r4, [r5, o_MusicPlayerTrack_chan] +TrackStop_Done: + pop {r4-r6} + pop {r0} + bx r0 + .pool + thumb_func_end TrackStop + + thumb_func_start ChnVolSetAsm +ChnVolSetAsm: + ldrb r1, [r4, 0x12] + movs r0, 0x14 + ldrsb r2, [r4, r0] + movs r3, 0x80 + adds r3, r2 + muls r3, r1 + ldrb r0, [r5, 0x10] + muls r0, r3 + asrs r0, 14 + cmp r0, 0xFF + bls _081DDAE8 + movs r0, 0xFF +_081DDAE8: + strb r0, [r4, 0x2] + movs r3, 0x7F + subs r3, r2 + muls r3, r1 + ldrb r0, [r5, 0x11] + muls r0, r3 + asrs r0, 14 + cmp r0, 0xFF + bls _081DDAFC + movs r0, 0xFF +_081DDAFC: + strb r0, [r4, 0x3] + bx lr + thumb_func_end ChnVolSetAsm + + thumb_func_start ply_note +ply_note: + push {r4-r7,lr} + mov r4, r8 + mov r5, r9 + mov r6, r10 + mov r7, r11 + push {r4-r7} + sub sp, 0x18 + str r1, [sp] + adds r5, r2, 0 + ldr r1, =SOUND_INFO_PTR + ldr r1, [r1] + str r1, [sp, 0x4] + ldr r1, =gClockTable + adds r0, r1 + ldrb r0, [r0] + strb r0, [r5, o_MusicPlayerTrack_gateTime] + ldr r3, [r5, o_MusicPlayerTrack_cmdPtr] + ldrb r0, [r3] + cmp r0, 0x80 + bhs _081DDB46 + strb r0, [r5, o_MusicPlayerTrack_key] + adds r3, 0x1 + ldrb r0, [r3] + cmp r0, 0x80 + bhs _081DDB44 + strb r0, [r5, o_MusicPlayerTrack_velocity] + adds r3, 0x1 + ldrb r0, [r3] + cmp r0, 0x80 + bhs _081DDB44 + ldrb r1, [r5, o_MusicPlayerTrack_gateTime] + adds r1, r0 + strb r1, [r5, o_MusicPlayerTrack_gateTime] + adds r3, 0x1 +_081DDB44: + str r3, [r5, o_MusicPlayerTrack_cmdPtr] +_081DDB46: + movs r0, 0 + str r0, [sp, 0x14] + adds r4, r5, 0 + adds r4, o_MusicPlayerTrack_ToneData_type + ldrb r2, [r4] + movs r0, TONEDATA_TYPE_RHY | TONEDATA_TYPE_SPL + tst r0, r2 + beq _081DDB98 + ldrb r3, [r5, o_MusicPlayerTrack_key] + movs r0, TONEDATA_TYPE_SPL + tst r0, r2 + beq _081DDB66 + ldr r1, [r5, o_MusicPlayerTrack_ToneData_keySplitTable] + adds r1, r3 + ldrb r0, [r1] + b _081DDB68 +_081DDB66: + adds r0, r3, 0 +_081DDB68: + lsls r1, r0, 1 + adds r1, r0 + lsls r1, 2 + ldr r0, [r5, o_MusicPlayerTrack_ToneData_wav] + adds r1, r0 + mov r9, r1 + mov r6, r9 + ldrb r1, [r6] + movs r0, 0xC0 + tst r0, r1 + beq _081DDB80 + b _081DDCEA +_081DDB80: + movs r0, 0x80 + tst r0, r2 + beq _081DDB9C + ldrb r1, [r6, 0x3] + movs r0, 0x80 + tst r0, r1 + beq _081DDB94 + subs r1, 0xC0 + lsls r1, 1 + str r1, [sp, 0x14] +_081DDB94: + ldrb r3, [r6, 0x1] + b _081DDB9C +_081DDB98: + mov r9, r4 + ldrb r3, [r5, 0x5] +_081DDB9C: + str r3, [sp, 0x8] + ldr r6, [sp] + ldrb r1, [r6, 0x9] + ldrb r0, [r5, 0x1D] + adds r0, r1 + cmp r0, 0xFF + bls _081DDBAC + movs r0, 0xFF +_081DDBAC: + str r0, [sp, 0x10] + mov r6, r9 + ldrb r0, [r6] + movs r6, 0x7 + ands r6, r0 + str r6, [sp, 0xC] + beq _081DDBEC + ldr r0, [sp, 0x4] + ldr r4, [r0, 0x1C] + cmp r4, 0 + bne _081DDBC4 + b _081DDCEA +_081DDBC4: + subs r6, 0x1 + lsls r0, r6, 6 + adds r4, r0 + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DDC40 + movs r0, 0x40 + tst r0, r1 + bne _081DDC40 + ldrb r1, [r4, 0x13] + ldr r0, [sp, 0x10] + cmp r1, r0 + bcc _081DDC40 + beq _081DDBE4 + b _081DDCEA +_081DDBE4: + ldr r0, [r4, 0x2C] + cmp r0, r5 + bcs _081DDC40 + b _081DDCEA +_081DDBEC: + ldr r6, [sp, 0x10] + adds r7, r5, 0 + movs r2, 0 + mov r8, r2 + ldr r4, [sp, 0x4] + ldrb r3, [r4, 0x6] + adds r4, 0x50 +_081DDBFA: + ldrb r1, [r4] + movs r0, 0xC7 + tst r0, r1 + beq _081DDC40 + movs r0, 0x40 + tst r0, r1 + beq _081DDC14 + cmp r2, 0 + bne _081DDC18 + adds r2, 0x1 + ldrb r6, [r4, 0x13] + ldr r7, [r4, 0x2C] + b _081DDC32 +_081DDC14: + cmp r2, 0 + bne _081DDC34 +_081DDC18: + ldrb r0, [r4, 0x13] + cmp r0, r6 + bcs _081DDC24 + adds r6, r0, 0 + ldr r7, [r4, 0x2C] + b _081DDC32 +_081DDC24: + bhi _081DDC34 + ldr r0, [r4, 0x2C] + cmp r0, r7 + bls _081DDC30 + adds r7, r0, 0 + b _081DDC32 +_081DDC30: + bcc _081DDC34 +_081DDC32: + mov r8, r4 +_081DDC34: + adds r4, 0x40 + subs r3, 0x1 + bgt _081DDBFA + mov r4, r8 + cmp r4, 0 + beq _081DDCEA +_081DDC40: + adds r0, r4, 0 + bl ClearChain + movs r1, 0 + str r1, [r4, 0x30] + ldr r3, [r5, 0x20] + str r3, [r4, 0x34] + cmp r3, 0 + beq _081DDC54 + str r4, [r3, 0x30] +_081DDC54: + str r4, [r5, 0x20] + str r5, [r4, 0x2C] + ldrb r0, [r5, 0x1B] + strb r0, [r5, 0x1C] + cmp r0, r1 + beq _081DDC66 + adds r1, r5, 0 + bl clear_modM +_081DDC66: + ldr r0, [sp] + adds r1, r5, 0 + bl TrkVolPitSet + ldr r0, [r5, 0x4] + str r0, [r4, 0x10] + ldr r0, [sp, 0x10] + strb r0, [r4, 0x13] + ldr r0, [sp, 0x8] + strb r0, [r4, 0x8] + ldr r0, [sp, 0x14] + strb r0, [r4, 0x14] + mov r6, r9 + ldrb r0, [r6] + strb r0, [r4, 0x1] + ldr r7, [r6, 0x4] + str r7, [r4, 0x24] + ldr r0, [r6, 0x8] + str r0, [r4, 0x4] + ldrh r0, [r5, 0x1E] + strh r0, [r4, 0xC] + bl ChnVolSetAsm + ldrb r1, [r4, 0x8] + movs r0, 0x8 + ldrsb r0, [r5, r0] + adds r3, r1, r0 + bpl _081DDCA0 + movs r3, 0 +_081DDCA0: + ldr r6, [sp, 0xC] + cmp r6, 0 + beq _081DDCCE + mov r6, r9 + ldrb r0, [r6, 0x2] + strb r0, [r4, 0x1E] + ldrb r1, [r6, 0x3] + movs r0, 0x80 + tst r0, r1 + bne _081DDCBA + movs r0, 0x70 + tst r0, r1 + bne _081DDCBC +_081DDCBA: + movs r1, 0x8 +_081DDCBC: + strb r1, [r4, 0x1F] + ldrb r2, [r5, 0x9] + adds r1, r3, 0 + ldr r0, [sp, 0xC] + ldr r3, [sp, 0x4] + ldr r3, [r3, 0x30] + bl call_r3 + b _081DDCDC +_081DDCCE: + ldr r0, [r5, o_MusicPlayerTrack_unk_3C] + str r0, [r4, 0x18] + ldrb r2, [r5, 0x9] + adds r1, r3, 0 + adds r0, r7, 0 + bl MidiKeyToFreq +_081DDCDC: + str r0, [r4, 0x20] + movs r0, 0x80 + strb r0, [r4] + ldrb r1, [r5] + movs r0, 0xF0 + ands r0, r1 + strb r0, [r5] +_081DDCEA: + add sp, 0x18 + pop {r0-r7} + mov r8, r0 + mov r9, r1 + mov r10, r2 + mov r11, r3 + pop {r0} + bx r0 + .pool + thumb_func_end ply_note + + thumb_func_start ply_endtie +ply_endtie: + push {r4,r5} + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r3, [r2] + cmp r3, 0x80 + bhs _081DDD16 + strb r3, [r1, o_MusicPlayerTrack_key] + adds r2, 0x1 + str r2, [r1, o_MusicPlayerTrack_cmdPtr] + b _081DDD18 +_081DDD16: + ldrb r3, [r1, o_MusicPlayerTrack_key] +_081DDD18: + ldr r1, [r1, o_MusicPlayerTrack_chan] + cmp r1, 0 + beq _081DDD40 + movs r4, 0x83 + movs r5, 0x40 +_081DDD22: + ldrb r2, [r1, o_SoundChannel_status] + tst r2, r4 + beq _081DDD3A + tst r2, r5 + bne _081DDD3A + ldrb r0, [r1, o_SoundChannel_mk] + cmp r0, r3 + bne _081DDD3A + movs r0, 0x40 + orrs r2, r0 + strb r2, [r1, o_SoundChannel_status] + b _081DDD40 +_081DDD3A: + ldr r1, [r1, o_SoundChannel_np] + cmp r1, 0 + bne _081DDD22 +_081DDD40: + pop {r4,r5} + bx lr + thumb_func_end ply_endtie + + thumb_func_start clear_modM +clear_modM: + movs r2, 0 + strb r2, [r1, o_MusicPlayerTrack_modM] + strb r2, [r1, o_MusicPlayerTrack_lfoSpeedC] + ldrb r2, [r1, o_MusicPlayerTrack_modT] + cmp r2, 0 + bne _081DDD54 + movs r2, 0xC + b _081DDD56 +_081DDD54: + movs r2, 0x3 +_081DDD56: + ldrb r3, [r1, o_MusicPlayerTrack_flags] + orrs r3, r2 + strb r3, [r1, o_MusicPlayerTrack_flags] + bx lr + thumb_func_end clear_modM + + thumb_func_start ld_r3_tp_adr_i +ld_r3_tp_adr_i_unchecked: + ldr r2, [r1, o_MusicPlayerTrack_cmdPtr] + adds r3, r2, 1 + str r3, [r1, o_MusicPlayerTrack_cmdPtr] + ldrb r3, [r2] + bx lr + thumb_func_end ld_r3_tp_adr_i + + thumb_func_start ply_lfos +ply_lfos: + mov r12, lr + bl ld_r3_tp_adr_i_unchecked + strb r3, [r1, o_MusicPlayerTrack_lfoSpeed] + cmp r3, 0 + bne _081DDD7C + bl clear_modM +_081DDD7C: + bx r12 + thumb_func_end ply_lfos + + thumb_func_start ply_mod +ply_mod: + mov r12, lr + bl ld_r3_tp_adr_i_unchecked + strb r3, [r1, o_MusicPlayerTrack_mod] + cmp r3, 0 + bne _081DDD90 + bl clear_modM +_081DDD90: + bx r12 + thumb_func_end ply_mod + + .align 2, 0 @ Don't pad with nop. + + .bss +gUnknown_03001300: + .space 0x40 + .size gUnknown_03001300, .-gUnknown_03001300 + + .global gMPlayTrack_BGM +gMPlayTrack_BGM: + .space 0x320 + .size gMPlayTrack_BGM, .-gMPlayTrack_BGM + + .global gMPlayTrack_SE1 +gMPlayTrack_SE1: + .space 0xF0 + .size gMPlayTrack_SE1, .-gMPlayTrack_SE1 + + .global gMPlayTrack_SE2 +gMPlayTrack_SE2: + .space 0x2D0 + .size gMPlayTrack_SE2, .-gMPlayTrack_SE2 + + .global gMPlayTrack_SE3 +gMPlayTrack_SE3: + .space 0x50 + .size gMPlayTrack_SE3, .-gMPlayTrack_SE3 diff --git a/sym_bss.txt b/sym_bss.txt index 4c974c3f6..29b30f2db 100644 --- a/sym_bss.txt +++ b/sym_bss.txt @@ -51,7 +51,7 @@ .include "src/pokenav_unk_10.o" .include "src/ereader_helpers.o" .include "src/faraway_island.o" - .include "asm/m4a_1.o" + .include "src/m4a_1.o" .include "src/agb_flash.o" .include "src/siirtc.o" .include "*libgcc.a:dp-bit.o" -- cgit v1.2.3 From a46f7952f9c820ab2e8bf633e2b2d2541a31cf01 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Wed, 7 Aug 2019 21:18:21 -0400 Subject: Use DIR constants for createvobject Also uses event object ids in LinkContestRoom1 --- .../scripts.inc | 126 ++++++++-------- data/maps/LinkContestRoom1/scripts.inc | 158 ++++++++++----------- include/constants/global.h | 10 ++ include/global.fieldmap.h | 13 -- 4 files changed, 152 insertions(+), 155 deletions(-) diff --git a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc index 96e9f86f5..59a010691 100644 --- a/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc +++ b/data/maps/BattleFrontier_BattleDomeBattleRoom/scripts.inc @@ -595,76 +595,76 @@ BattleFrontier_BattleDomeBattleRoom_EventScript_24C52F:: @ 824C52F return BattleFrontier_BattleDomeBattleRoom_EventScript_24C530:: @ 824C530 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1 - createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, 1 - createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1 - createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1 + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH return BattleFrontier_BattleDomeBattleRoom_EventScript_24C594:: @ 824C594 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1 - createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1 - createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, 1 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, 1 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, 1 - createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1 - createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1 - createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1 - createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, 1 + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, DIR_SOUTH createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, 1 return BattleFrontier_BattleDomeBattleRoom_EventScript_24C652:: @ 824C652 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 0, 2, 0, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, 1 - createvobject EVENT_OBJ_GFX_BEAUTY, 2, 15, 0, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_5, 3, 5, 0, 3, 1 - createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 5, 7, 0, 3, 1 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_3, 8, 10, 0, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, 1 - createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, 1 - createvobject EVENT_OBJ_GFX_BEAUTY, 12, 14, 0, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 2, 3, 1 - createvobject EVENT_OBJ_GFX_HIKER, 14, 12, 2, 3, 1 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, 1 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_3, 18, 6, 1, 3, 1 - createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, 1 - createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_2, 21, 10, 1, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, 1 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 14, 1, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, 1 - createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, 1 - createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, 1 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, 1 + createvobject EVENT_OBJ_GFX_NINJA_BOY, 0, 2, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 1, 3, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_BEAUTY, 2, 15, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_5, 3, 5, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_EXPERT_F, 4, 6, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 5, 7, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_NINJA_BOY, 6, 8, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_2, 7, 9, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_3, 8, 10, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 9, 11, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LASS, 10, 12, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 11, 13, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_BEAUTY, 12, 14, 0, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_5, 13, 15, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_HIKER, 14, 12, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_GENTLEMAN, 15, 2, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_NINJA_BOY, 16, 3, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_2, 17, 4, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_3, 18, 6, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_BEAUTY, 19, 7, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 9, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_2, 21, 10, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_5, 22, 11, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 23, 13, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 14, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 15, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 2, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 5, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 5, 1, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 6, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_5, 31, 8, 2, 3, DIR_SOUTH return BattleFrontier_BattleArenaBattleRoom_Movement_24C773: @ 824C773 diff --git a/data/maps/LinkContestRoom1/scripts.inc b/data/maps/LinkContestRoom1/scripts.inc index e58c08c50..9fb83a7a9 100644 --- a/data/maps/LinkContestRoom1/scripts.inc +++ b/data/maps/LinkContestRoom1/scripts.inc @@ -312,97 +312,97 @@ LinkContestRoom1_EventScript_23BB2B:: @ 823BB2B return LinkContestRoom1_EventScript_23BB78:: @ 823BB78 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 20, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1 + createvobject EVENT_OBJ_GFX_NINJA_BOY, 20, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH return LinkContestRoom1_EventScript_23BB8B:: @ 823BB8B - createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4 - createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4 - createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 3, 2, 8, 3, 4 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 13, 12, 8, 3, 3 - createvobject EVENT_OBJ_GFX_LASS, 20, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1 + createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 3, 2, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 13, 12, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_LASS, 20, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH return LinkContestRoom1_EventScript_23BBE6:: @ 823BBE6 - createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4 - createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4 - createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 3, 2, 8, 3, 4 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3 - createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3 - createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_2, 20, 6, 2, 3, 1 - createvobject EVENT_OBJ_GFX_WOMAN_5, 20, 7, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 8, 2, 3, 1 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 11, 2, 3, 1 - createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 3, 9, 3, 2 - createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, 2 - createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 5, 9, 3, 2 - createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, 2 - createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, 2 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, 2 + createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_GENTLEMAN, 3, 2, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_EXPERT_F, 20, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_2, 20, 6, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_WOMAN_5, 20, 7, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 8, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_GENTLEMAN, 24, 11, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_LITTLE_BOY, 25, 3, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_FAT_MAN, 27, 5, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, DIR_NORTH return LinkContestRoom1_EventScript_23BC92:: @ 823BC92 - createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4 - createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4 - createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, 4 - createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, 4 - createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, 4 - createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, 4 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, 4 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3 - createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3 - createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, 3 - createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, 3 - createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, 3 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, 3 - createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, 3 - createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SAILOR, 25, 3, 9, 3, 2 - createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, 2 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 27, 5, 9, 3, 2 - createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, 2 - createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, 2 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, 2 + createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SAILOR, 25, 3, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_YOUNGSTER, 26, 4, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_GENTLEMAN, 27, 5, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_HEX_MANIAC, 28, 9, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_SCHOOL_KID_M, 29, 10, 9, 3, DIR_NORTH + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 30, 11, 9, 3, DIR_NORTH return LinkContestRoom1_EventScript_23BD86:: @ 823BD86 - createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, 4 - createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, 4 - createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, 4 - createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, 4 - createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, 4 - createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, 4 - createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, 4 - createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, 4 - createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, 3 - createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, 3 - createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, 3 - createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, 3 - createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, 3 - createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, 3 - createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, 3 - createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, 3 - createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, 1 - createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, 1 - createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, 1 - createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, 1 + createvobject EVENT_OBJ_GFX_BEAUTY, 0, 2, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MAN_5, 1, 2, 4, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_HIKER, 2, 2, 7, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_LITTLE_GIRL, 3, 2, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_MANIAC, 4, 1, 3, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_WOMAN_5, 6, 1, 5, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_WOMAN_4, 7, 1, 6, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_GENTLEMAN, 9, 1, 8, 3, DIR_EAST + createvobject EVENT_OBJ_GFX_NINJA_BOY, 10, 12, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_2, 11, 12, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_WOMAN_3, 12, 12, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_BEAUTY, 13, 12, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_FISHERMAN, 14, 13, 3, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F, 15, 13, 4, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_MAN_4, 17, 13, 6, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_MART_EMPLOYEE, 18, 13, 7, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_DEVON_EMPLOYEE, 19, 13, 8, 3, DIR_WEST + createvobject EVENT_OBJ_GFX_POKEFAN_M, 20, 3, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_CAMPER, 21, 6, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_MAN_3, 22, 7, 2, 3, DIR_SOUTH + createvobject EVENT_OBJ_GFX_SCIENTIST_1, 24, 11, 2, 3, DIR_SOUTH return LinkContestRoom1_EventScript_23BE44:: @ 823BE44 diff --git a/include/constants/global.h b/include/constants/global.h index 1177f0444..a862ecad2 100644 --- a/include/constants/global.h +++ b/include/constants/global.h @@ -76,4 +76,14 @@ #define OPTIONS_BATTLE_STYLE_SHIFT 0 #define OPTIONS_BATTLE_STYLE_SET 1 +#define DIR_NONE 0 +#define DIR_SOUTH 1 +#define DIR_NORTH 2 +#define DIR_WEST 3 +#define DIR_EAST 4 +#define DIR_SOUTHWEST 5 +#define DIR_SOUTHEAST 6 +#define DIR_NORTHWEST 7 +#define DIR_NORTHEAST 8 + #endif // GUARD_CONSTANTS_GLOBAL_H diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index b5a86e311..a17180589 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -265,19 +265,6 @@ enum ACRO_BIKE_STATE6, }; -enum -{ - DIR_NONE, - DIR_SOUTH, - DIR_NORTH, - DIR_WEST, - DIR_EAST, - DIR_SOUTHWEST, - DIR_SOUTHEAST, - DIR_NORTHWEST, - DIR_NORTHEAST, -}; - enum { COLLISION_LEDGE_JUMP = 6 -- cgit v1.2.3 From f7cf4fa15464e8485e3d07f9ea12d3f12470268b Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 9 Aug 2019 20:31:24 -0400 Subject: Use HFLIP, VFLIP --- include/gba/types.h | 4 ++++ src/battle_anim_effects_1.c | 14 +++++++------- src/battle_anim_effects_2.c | 4 ++-- src/battle_anim_effects_3.c | 8 ++++---- src/battle_interface.c | 2 +- src/electric.c | 4 ++-- src/fight.c | 4 ++-- src/flying.c | 2 +- src/ghost.c | 2 +- src/rock.c | 2 +- 10 files changed, 25 insertions(+), 21 deletions(-) diff --git a/include/gba/types.h b/include/gba/types.h index 9f2594703..07e5d4c26 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -68,6 +68,10 @@ struct OamData /*0x06*/ u16 affineParam; }; +#define ST_OAM_MNUM_HFLIP 0x08 +#define ST_OAM_MNUM_VFLIP 0x10 +#define ST_OAM_MNUM_FLIP_MASK 0x18 + #define ST_OAM_OBJ_NORMAL 0 #define ST_OAM_OBJ_BLEND 1 #define ST_OAM_OBJ_WINDOW 2 diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index b3a67a509..242b7977c 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -2547,7 +2547,7 @@ static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite) { sprite->pos2.x += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5) - sprite->oam.matrixNum ^= 0x8; // horizontal flip + sprite->oam.matrixNum ^= ST_OAM_MNUM_HFLIP; sprite->data[5] += 5; sprite->data[5] &= 0xFF; @@ -4380,19 +4380,19 @@ void sub_8101898(struct Sprite* sprite) { sprite->pos1.x -= 0x18; sprite->pos1.y += 0x18; - sprite->oam.matrixNum = 16; + sprite->oam.matrixNum = ST_OAM_MNUM_VFLIP; } else if ((s16)sprite->oam.affineParam == 3) { sprite->pos1.x += 0x18; sprite->pos1.y -= 0x18; - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; } else { sprite->pos1.x += 0x18; sprite->pos1.y += 0x18; - sprite->oam.matrixNum = 24; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP; } sprite->oam.tileNum = (sprite->oam.tileNum + 16); @@ -5105,7 +5105,7 @@ void sub_8102844(struct Sprite* sprite) sprite->data[7] = sprite->pos1.y; if (IsContest()) { - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; sprite->pos1.x += 40; sprite->pos1.y += 20; sprite->data[2] = sprite->pos1.x << 7; @@ -5130,7 +5130,7 @@ void sub_8102844(struct Sprite* sprite) sprite->data[3] = -0x1400 / sprite->data[1]; sprite->data[4] = sprite->pos1.y << 7; sprite->data[5] = 0xA00 / sprite->data[1]; - sprite->oam.matrixNum = 24; + sprite->oam.matrixNum = (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); } sprite->callback = sub_810296C; @@ -5387,7 +5387,7 @@ void sub_8102FB8(struct Sprite* sprite) s16 a; if (gBattleAnimArgs[0] == 1) { - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; a = 16; } else diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 65cc55604..124b98381 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1609,10 +1609,10 @@ static void sub_8103C0C(u8 taskId) switch (gTasks[taskId].data[4]) { case 1: - sprite->oam.matrixNum |= 24; + sprite->oam.matrixNum |= (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); break; case 2: - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; break; } diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 5d79a9e6b..8c4ee34a9 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1618,7 +1618,7 @@ void sub_815AAA4(struct Sprite *sprite) if (gBattleAnimArgs[2] == 0) { - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; sprite->pos2.x = -12; sprite->data[1] = 2; } @@ -4167,7 +4167,7 @@ void AnimSmellingSaltsHand(struct Sprite *sprite) sprite->pos1.y = GetBattlerSpriteCoord(battler, 3); if (gBattleAnimArgs[1] == 0) { - sprite->oam.matrixNum |= 0x8; + sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; } else @@ -4317,7 +4317,7 @@ void AnimHelpingHandClap(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - sprite->oam.matrixNum |= 0x8; // horizontal flip + sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; sprite->pos1.x = 100; sprite->data[7] = 1; } @@ -4545,7 +4545,7 @@ void AnimForesightMagnifyingGlass(struct Sprite *sprite) } if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT) - sprite->oam.matrixNum = 8; // horizontal flip + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); sprite->oam.objMode = ST_OAM_OBJ_BLEND; diff --git a/src/battle_interface.c b/src/battle_interface.c index 922437597..39fa0c277 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1536,7 +1536,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, if (isOpponent) { gSprites[summaryBarSpriteId].pos1.x -= 96; - gSprites[summaryBarSpriteId].oam.matrixNum = 8; + gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_MNUM_HFLIP; } else { diff --git a/src/electric.c b/src/electric.c index 5e7729842..920c83f24 100644 --- a/src/electric.c +++ b/src/electric.c @@ -667,9 +667,9 @@ static void sub_810A75C(struct Sprite *sprite) sprite->oam.tileNum += gBattleAnimArgs[3] * 4; if (gBattleAnimArgs[3] == 1) - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; else if (gBattleAnimArgs[3] == 2) - sprite->oam.matrixNum = 16; + sprite->oam.matrixNum = ST_OAM_MNUM_VFLIP; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; diff --git a/src/fight.c b/src/fight.c index c924effae..99346651d 100644 --- a/src/fight.c +++ b/src/fight.c @@ -912,9 +912,9 @@ void sub_810D874(struct Sprite *sprite) } if (IsContest()) - sprite->oam.matrixNum |= 0x8; + sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; else if (GetBattlerSide(battler) == B_SIDE_PLAYER) - sprite->oam.matrixNum |= 0x18; + sprite->oam.matrixNum |= (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); sprite->data[0] = 16; sprite->data[1] = sprite->pos1.x; diff --git a/src/flying.c b/src/flying.c index a157582e9..45661c7fa 100644 --- a/src/flying.c +++ b/src/flying.c @@ -1800,7 +1800,7 @@ void sub_810EEF8(struct Sprite *sprite) sprite->data[2] = gBattleAnimArgs[0]; if (sprite->data[2]) - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; if (gBattleAnimArgs[1] == 0) { diff --git a/src/ghost.c b/src/ghost.c index dd29fb7ca..f1fb9166d 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -1039,7 +1039,7 @@ static void sub_81129F0(struct Sprite *sprite) { xDelta = 24; xDelta2 = -2; - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; } else { diff --git a/src/rock.c b/src/rock.c index f05816362..a4b4269fb 100644 --- a/src/rock.c +++ b/src/rock.c @@ -508,7 +508,7 @@ void AnimDirtParticleAcrossScreen(struct Sprite *sprite) sprite->pos1.x = 304; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->data[5] = 1; - sprite->oam.matrixNum = 8; + sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; } else { -- cgit v1.2.3 From 5b8d0f1c33278194d46625b2ea409ceaab04c4b0 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Aug 2019 12:09:06 -0400 Subject: Remove MNUM from oam flip constant names --- include/gba/types.h | 4 ++-- src/battle_anim_effects_1.c | 14 +++++++------- src/battle_anim_effects_2.c | 4 ++-- src/battle_anim_effects_3.c | 8 ++++---- src/battle_interface.c | 2 +- src/electric.c | 4 ++-- src/fight.c | 4 ++-- src/flying.c | 2 +- src/ghost.c | 2 +- src/rock.c | 2 +- 10 files changed, 23 insertions(+), 23 deletions(-) diff --git a/include/gba/types.h b/include/gba/types.h index 07e5d4c26..7163f925f 100644 --- a/include/gba/types.h +++ b/include/gba/types.h @@ -68,8 +68,8 @@ struct OamData /*0x06*/ u16 affineParam; }; -#define ST_OAM_MNUM_HFLIP 0x08 -#define ST_OAM_MNUM_VFLIP 0x10 +#define ST_OAM_HFLIP 0x08 +#define ST_OAM_VFLIP 0x10 #define ST_OAM_MNUM_FLIP_MASK 0x18 #define ST_OAM_OBJ_NORMAL 0 diff --git a/src/battle_anim_effects_1.c b/src/battle_anim_effects_1.c index 242b7977c..dfe5f0f3d 100644 --- a/src/battle_anim_effects_1.c +++ b/src/battle_anim_effects_1.c @@ -2547,7 +2547,7 @@ static void AnimPetalDanceSmallFlowerStep(struct Sprite* sprite) { sprite->pos2.x += Sin(sprite->data[5], 8); if ((u16)(sprite->data[5] - 59) < 5 || (u16)(sprite->data[5] - 187) < 5) - sprite->oam.matrixNum ^= ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum ^= ST_OAM_HFLIP; sprite->data[5] += 5; sprite->data[5] &= 0xFF; @@ -4380,19 +4380,19 @@ void sub_8101898(struct Sprite* sprite) { sprite->pos1.x -= 0x18; sprite->pos1.y += 0x18; - sprite->oam.matrixNum = ST_OAM_MNUM_VFLIP; + sprite->oam.matrixNum = ST_OAM_VFLIP; } else if ((s16)sprite->oam.affineParam == 3) { sprite->pos1.x += 0x18; sprite->pos1.y -= 0x18; - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; } else { sprite->pos1.x += 0x18; sprite->pos1.y += 0x18; - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP | ST_OAM_VFLIP; } sprite->oam.tileNum = (sprite->oam.tileNum + 16); @@ -5105,7 +5105,7 @@ void sub_8102844(struct Sprite* sprite) sprite->data[7] = sprite->pos1.y; if (IsContest()) { - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->pos1.x += 40; sprite->pos1.y += 20; sprite->data[2] = sprite->pos1.x << 7; @@ -5130,7 +5130,7 @@ void sub_8102844(struct Sprite* sprite) sprite->data[3] = -0x1400 / sprite->data[1]; sprite->data[4] = sprite->pos1.y << 7; sprite->data[5] = 0xA00 / sprite->data[1]; - sprite->oam.matrixNum = (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); + sprite->oam.matrixNum = (ST_OAM_HFLIP | ST_OAM_VFLIP); } sprite->callback = sub_810296C; @@ -5387,7 +5387,7 @@ void sub_8102FB8(struct Sprite* sprite) s16 a; if (gBattleAnimArgs[0] == 1) { - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; a = 16; } else diff --git a/src/battle_anim_effects_2.c b/src/battle_anim_effects_2.c index 124b98381..3b7d26aab 100755 --- a/src/battle_anim_effects_2.c +++ b/src/battle_anim_effects_2.c @@ -1609,10 +1609,10 @@ static void sub_8103C0C(u8 taskId) switch (gTasks[taskId].data[4]) { case 1: - sprite->oam.matrixNum |= (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); + sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP); break; case 2: - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; break; } diff --git a/src/battle_anim_effects_3.c b/src/battle_anim_effects_3.c index 8c4ee34a9..79b728e61 100755 --- a/src/battle_anim_effects_3.c +++ b/src/battle_anim_effects_3.c @@ -1618,7 +1618,7 @@ void sub_815AAA4(struct Sprite *sprite) if (gBattleAnimArgs[2] == 0) { - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->pos2.x = -12; sprite->data[1] = 2; } @@ -4167,7 +4167,7 @@ void AnimSmellingSaltsHand(struct Sprite *sprite) sprite->pos1.y = GetBattlerSpriteCoord(battler, 3); if (gBattleAnimArgs[1] == 0) { - sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum |= ST_OAM_HFLIP; sprite->pos1.x = GetBattlerSpriteCoordAttr(battler, BATTLER_COORD_ATTR_LEFT) - 8; } else @@ -4317,7 +4317,7 @@ void AnimHelpingHandClap(struct Sprite *sprite) { if (gBattleAnimArgs[0] == 0) { - sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum |= ST_OAM_HFLIP; sprite->pos1.x = 100; sprite->data[7] = 1; } @@ -4545,7 +4545,7 @@ void AnimForesightMagnifyingGlass(struct Sprite *sprite) } if (GetBattlerSide(sprite->data[7]) == B_SIDE_OPPONENT) - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; sprite->oam.priority = GetBattlerSpriteBGPriority(sprite->data[7]); sprite->oam.objMode = ST_OAM_OBJ_BLEND; diff --git a/src/battle_interface.c b/src/battle_interface.c index 39fa0c277..8fabfed68 100644 --- a/src/battle_interface.c +++ b/src/battle_interface.c @@ -1536,7 +1536,7 @@ u8 CreatePartyStatusSummarySprites(u8 battlerId, struct HpAndStatus *partyInfo, if (isOpponent) { gSprites[summaryBarSpriteId].pos1.x -= 96; - gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_MNUM_HFLIP; + gSprites[summaryBarSpriteId].oam.matrixNum = ST_OAM_HFLIP; } else { diff --git a/src/electric.c b/src/electric.c index 920c83f24..4b93119dc 100644 --- a/src/electric.c +++ b/src/electric.c @@ -667,9 +667,9 @@ static void sub_810A75C(struct Sprite *sprite) sprite->oam.tileNum += gBattleAnimArgs[3] * 4; if (gBattleAnimArgs[3] == 1) - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; else if (gBattleAnimArgs[3] == 2) - sprite->oam.matrixNum = ST_OAM_MNUM_VFLIP; + sprite->oam.matrixNum = ST_OAM_VFLIP; sprite->data[0] = gBattleAnimArgs[2]; sprite->callback = WaitAnimForDuration; diff --git a/src/fight.c b/src/fight.c index 99346651d..5230c2f39 100644 --- a/src/fight.c +++ b/src/fight.c @@ -912,9 +912,9 @@ void sub_810D874(struct Sprite *sprite) } if (IsContest()) - sprite->oam.matrixNum |= ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum |= ST_OAM_HFLIP; else if (GetBattlerSide(battler) == B_SIDE_PLAYER) - sprite->oam.matrixNum |= (ST_OAM_MNUM_HFLIP | ST_OAM_MNUM_VFLIP); + sprite->oam.matrixNum |= (ST_OAM_HFLIP | ST_OAM_VFLIP); sprite->data[0] = 16; sprite->data[1] = sprite->pos1.x; diff --git a/src/flying.c b/src/flying.c index 45661c7fa..3d04a543c 100644 --- a/src/flying.c +++ b/src/flying.c @@ -1800,7 +1800,7 @@ void sub_810EEF8(struct Sprite *sprite) sprite->data[2] = gBattleAnimArgs[0]; if (sprite->data[2]) - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; if (gBattleAnimArgs[1] == 0) { diff --git a/src/ghost.c b/src/ghost.c index f1fb9166d..41621ff54 100644 --- a/src/ghost.c +++ b/src/ghost.c @@ -1039,7 +1039,7 @@ static void sub_81129F0(struct Sprite *sprite) { xDelta = 24; xDelta2 = -2; - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; } else { diff --git a/src/rock.c b/src/rock.c index a4b4269fb..6f6e20955 100644 --- a/src/rock.c +++ b/src/rock.c @@ -508,7 +508,7 @@ void AnimDirtParticleAcrossScreen(struct Sprite *sprite) sprite->pos1.x = 304; gBattleAnimArgs[1] = -gBattleAnimArgs[1]; sprite->data[5] = 1; - sprite->oam.matrixNum = ST_OAM_MNUM_HFLIP; + sprite->oam.matrixNum = ST_OAM_HFLIP; } else { -- cgit v1.2.3 From 4228750e3828b70295bb8e1b86f414b06194e5c7 Mon Sep 17 00:00:00 2001 From: GriffinR <25753467+GriffinRichards@users.noreply.github.com> Date: Fri, 9 Aug 2019 16:28:22 -0400 Subject: more documentation in match_call_data Documents everything related to UnkStruct_08625388, names HasCheckPage functions, fixes mislabeled Brendan/May headers, and adds header count to pokenav_unk_3 --- include/pokenav.h | 32 ++++++++++-- src/pokenav_match_call_data.c | 116 +++++++++++++++++++++--------------------- src/pokenav_unk_3.c | 14 ++--- 3 files changed, 95 insertions(+), 67 deletions(-) diff --git a/include/pokenav.h b/include/pokenav.h index db32e3029..b1c3287f1 100644 --- a/include/pokenav.h +++ b/include/pokenav.h @@ -56,6 +56,32 @@ enum POKENAV_MENU_E, }; +enum +{ + MC_HEADER_MR_STONE, + MC_HEADER_PROF_BIRCH, + MC_HEADER_BRENDAN, + MC_HEADER_MAY, + MC_HEADER_WALLY, + MC_HEADER_NORMAN, + MC_HEADER_MOM, + MC_HEADER_STEVEN, + MC_HEADER_SCOTT, + MC_HEADER_ROXANNE, + MC_HEADER_BRAWLY, + MC_HEADER_WATTSON, + MC_HEADER_FLANNERY, + MC_HEADER_WINONA, + MC_HEADER_TATE_LIZA, + MC_HEADER_JUAN, + MC_HEADER_SIDNEY, + MC_HEADER_PHOEBE, + MC_HEADER_GLACIA, + MC_HEADER_DRAKE, + MC_HEADER_WALLACE, + MC_HEADER_COUNT +}; + // pokenav.c void sub_81C7694(u32); u32 sub_81C76AC(void); @@ -109,15 +135,15 @@ bool32 sub_81C81D4(const struct BgTemplate *arg0, struct MatchCallListTemplate * void sub_81C8234(void); // pokenav_match_call_data.c -bool32 sub_81D17E8(u32 idx); +bool32 MatchCall_HasCheckPage(u32 idx); u8 MatchCallMapSecGetByIndex(u32 idx); bool32 sub_81D1BF8(u32 idx); bool32 MatchCallFlagGetByIndex(u32 idx); u32 MatchCall_GetRematchTableIdx(u32 idx); u32 GetTrainerIdxByRematchIdx(u32 rematchIdx); -int sub_81D1BD0(u32 idx); +int MatchCall_GetOverrideFacilityClass(u32 idx); void MatchCall_GetMessage(u32 idx, u8 *dest); -const u8 *sub_81D1B40(u32 idx, u32 offset); +const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset); void sub_81D1A78(u32 idx, const u8 **desc, const u8 **name); // pokenav_main_menu.c diff --git a/src/pokenav_match_call_data.c b/src/pokenav_match_call_data.c index d2d89babf..5379ee88e 100644 --- a/src/pokenav_match_call_data.c +++ b/src/pokenav_match_call_data.c @@ -6,7 +6,9 @@ #include "battle.h" #include "gym_leader_rematch.h" #include "match_call.h" +#include "pokenav.h" #include "constants/region_map_sections.h" +#include "constants/trainers.h" // Static type declarations @@ -94,11 +96,11 @@ typedef union { const struct MatchCallStruct5 *type5; } match_call_t; -struct UnkStruct_08625388 { +struct MatchCallOverride { u16 idx; - u16 v2; - u32 v4; - const u8 *v8[4]; + u16 facilityClass; + u32 flag; + const u8 *flavorTexts[4]; }; // Static RAM declarations @@ -123,11 +125,11 @@ static bool32 MatchCall_IsRematchable_Type2(match_call_t); static bool32 MatchCall_IsRematchable_Type3(match_call_t); static bool32 MatchCall_IsRematchable_Type4(match_call_t); -static bool32 sub_81D1840(match_call_t); -static bool32 sub_81D1844(match_call_t); -static bool32 sub_81D1848(match_call_t); -static bool32 sub_81D184C(match_call_t); -static bool32 sub_81D1850(match_call_t); +static bool32 MatchCall_HasCheckPage_Type0(match_call_t); +static bool32 MatchCall_HasCheckPage_Type1(match_call_t); +static bool32 MatchCall_HasCheckPage_Type2(match_call_t); +static bool32 MatchCall_HasCheckPage_Type3(match_call_t); +static bool32 MatchCall_HasCheckPage_Type4(match_call_t); static u32 MatchCall_GetRematchTableIdx_Type0(match_call_t); static u32 MatchCall_GetRematchTableIdx_Type1(match_call_t); @@ -423,10 +425,10 @@ static const match_call_text_data_t sMayTextScripts[] = { { NULL, 0xFFFF, 0xFFFF } }; -static const struct MatchCallStruct4 sBrendanMatchCallHeader = +static const struct MatchCallStruct4 sMayMatchCallHeader = { .type = 4, - .gender = MALE, + .gender = MALE, //Gender of player .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, .desc = gMayBrendanMatchCallDesc, .name = gExpandedPlaceholder_May, @@ -452,10 +454,10 @@ static const match_call_text_data_t sBrendanTextScripts[] = { { NULL, 0xFFFF, 0xFFFF } }; -static const struct MatchCallStruct4 sMayMatchCallHeader = +static const struct MatchCallStruct4 sBrendanMatchCallHeader = { .type = 4, - .gender = FEMALE, + .gender = FEMALE, //Gender of player .flag = FLAG_ENABLE_RIVAL_MATCH_CALL, .desc = gMayBrendanMatchCallDesc, .name = gExpandedPlaceholder_Brendan, @@ -727,27 +729,27 @@ static const struct MatchCallStruct5 sWallaceMatchCallHeader = }; static const match_call_t sMatchCallHeaders[] = { - {.type0 = &sMrStoneMatchCallHeader}, - {.type3 = &sProfBirchMatchCallHeader}, - {.type4 = &sMayMatchCallHeader}, - {.type4 = &sBrendanMatchCallHeader}, - {.type2 = &sWallyMatchCallHeader}, - {.type5 = &sNormanMatchCallHeader}, - {.type0 = &sMomMatchCallHeader}, - {.type0 = &sStevenMatchCallHeader}, - {.type0 = &sScottMatchCallHeader}, - {.type5 = &sRoxanneMatchCallHeader}, - {.type5 = &sBrawlyMatchCallHeader}, - {.type5 = &sWattsonMatchCallHeader}, - {.type5 = &sFlanneryMatchCallHeader}, - {.type5 = &sWinonaMatchCallHeader}, - {.type5 = &sTateLizaMatchCallHeader}, - {.type5 = &sJuanMatchCallHeader}, - {.type5 = &sSidneyMatchCallHeader}, - {.type5 = &sPhoebeMatchCallHeader}, - {.type5 = &sGlaciaMatchCallHeader}, - {.type5 = &sDrakeMatchCallHeader}, - {.type5 = &sWallaceMatchCallHeader} + [MC_HEADER_MR_STONE] = {.type0 = &sMrStoneMatchCallHeader}, + [MC_HEADER_PROF_BIRCH] = {.type3 = &sProfBirchMatchCallHeader}, + [MC_HEADER_BRENDAN] = {.type4 = &sBrendanMatchCallHeader}, + [MC_HEADER_MAY] = {.type4 = &sMayMatchCallHeader}, + [MC_HEADER_WALLY] = {.type2 = &sWallyMatchCallHeader}, + [MC_HEADER_NORMAN] = {.type5 = &sNormanMatchCallHeader}, + [MC_HEADER_MOM] = {.type0 = &sMomMatchCallHeader}, + [MC_HEADER_STEVEN] = {.type0 = &sStevenMatchCallHeader}, + [MC_HEADER_SCOTT] = {.type0 = &sScottMatchCallHeader}, + [MC_HEADER_ROXANNE] = {.type5 = &sRoxanneMatchCallHeader}, + [MC_HEADER_BRAWLY] = {.type5 = &sBrawlyMatchCallHeader}, + [MC_HEADER_WATTSON] = {.type5 = &sWattsonMatchCallHeader}, + [MC_HEADER_FLANNERY] = {.type5 = &sFlanneryMatchCallHeader}, + [MC_HEADER_WINONA] = {.type5 = &sWinonaMatchCallHeader}, + [MC_HEADER_TATE_LIZA] = {.type5 = &sTateLizaMatchCallHeader}, + [MC_HEADER_JUAN] = {.type5 = &sJuanMatchCallHeader}, + [MC_HEADER_SIDNEY] = {.type5 = &sSidneyMatchCallHeader}, + [MC_HEADER_PHOEBE] = {.type5 = &sPhoebeMatchCallHeader}, + [MC_HEADER_GLACIA] = {.type5 = &sGlaciaMatchCallHeader}, + [MC_HEADER_DRAKE] = {.type5 = &sDrakeMatchCallHeader}, + [MC_HEADER_WALLACE] = {.type5 = &sWallaceMatchCallHeader} }; static bool32 (*const sMatchCallGetFlagFuncs[])(match_call_t) = { @@ -774,12 +776,12 @@ static bool32 (*const sMatchCall_IsRematchableFunctions[])(match_call_t) = { MatchCall_IsRematchable_Type3 }; -static bool32 (*const gUnknown_08625338[])(match_call_t) = { - sub_81D1840, - sub_81D1844, - sub_81D1848, - sub_81D184C, - sub_81D1850 +static bool32 (*const sMatchCall_HasCheckPageFunctions[])(match_call_t) = { + MatchCall_HasCheckPage_Type0, + MatchCall_HasCheckPage_Type1, + MatchCall_HasCheckPage_Type2, + MatchCall_HasCheckPage_Type4, + MatchCall_HasCheckPage_Type3 }; static u32 (*const sMatchCall_GetRematchTableIdxFunctions[])(match_call_t) = { @@ -806,11 +808,11 @@ static void (*const sMatchCall_GetNameAndDescFunctions[])(match_call_t, const u8 MatchCall_GetNameAndDesc_Type3 }; -static const struct UnkStruct_08625388 sMatchCallCheckPageOverrides[] = { - { 7, 0x4B, 0xffff, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN - { 7, 0x4B, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN - { 2, 0x3c, 0xffff, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan - { 3, 0x3f, 0xffff, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May +static const struct MatchCallOverride sMatchCallCheckPageOverrides[] = { + { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, 0xFFFF, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_BeforeMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_BeforeMeteorFallsBattle } }, // STEVEN + { MC_HEADER_STEVEN, FACILITY_CLASS_STEVEN, FLAG_DEFEATED_MOSSDEEP_GYM, { gMatchCallStevenStrategyText, gMatchCall_StevenTrainersPokemonText, gMatchCall_StevenSelfIntroductionText_Line1_AfterMeteorFallsBattle, gMatchCall_StevenSelfIntroductionText_Line2_AfterMeteorFallsBattle } }, // STEVEN + { MC_HEADER_BRENDAN, FACILITY_CLASS_BRENDAN, 0xFFFF, { gMatchCall_BrendanStrategyText, gMatchCall_BrendanTrainersPokemonText, gMatchCall_BrendanSelfIntroductionText_Line1, gMatchCall_BrendanSelfIntroductionText_Line2 } }, // Brendan + { MC_HEADER_MAY, FACILITY_CLASS_MAY, 0xFFFF, { gMatchCall_MayStrategyText, gMatchCall_MayTrainersPokemonText, gMatchCall_MaySelfIntroductionText_Line1, gMatchCall_MaySelfIntroductionText_Line2 } } // May }; // .text @@ -981,7 +983,7 @@ static bool32 MatchCall_IsRematchable_Type3(match_call_t matchCall) return FALSE; } -bool32 sub_81D17E8(u32 idx) +bool32 MatchCall_HasCheckPage(u32 idx) { match_call_t matchCall; u32 i; @@ -990,7 +992,7 @@ bool32 sub_81D17E8(u32 idx) return FALSE; matchCall = sMatchCallHeaders[idx]; i = MatchCallGetFunctionIndex(matchCall); - if (gUnknown_08625338[i](matchCall)) + if (sMatchCall_HasCheckPageFunctions[i](matchCall)) return TRUE; for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) { @@ -1000,27 +1002,27 @@ bool32 sub_81D17E8(u32 idx) return FALSE; } -static bool32 sub_81D1840(match_call_t matchCall) +static bool32 MatchCall_HasCheckPage_Type0(match_call_t matchCall) { return FALSE; } -static bool32 sub_81D1844(match_call_t matchCall) +static bool32 MatchCall_HasCheckPage_Type1(match_call_t matchCall) { return TRUE; } -static bool32 sub_81D1848(match_call_t matchCall) +static bool32 MatchCall_HasCheckPage_Type2(match_call_t matchCall) { return TRUE; } -static bool32 sub_81D184C(match_call_t matchCall) +static bool32 MatchCall_HasCheckPage_Type4(match_call_t matchCall) { return FALSE; } -static bool32 sub_81D1850(match_call_t matchCall) +static bool32 MatchCall_HasCheckPage_Type3(match_call_t matchCall) { return FALSE; } @@ -1210,7 +1212,7 @@ static void MatchCall_GetNameAndDescByRematchIdx(u32 idx, const u8 **desc, const *name = trainer->trainerName; } -const u8 *sub_81D1B40(u32 idx, u32 offset) +const u8 *MatchCall_GetOverrideFlavorText(u32 idx, u32 offset) { u32 i; @@ -1224,24 +1226,24 @@ const u8 *sub_81D1B40(u32 idx, u32 offset) break; if (sMatchCallCheckPageOverrides[i + 1].idx != idx) break; - if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].v4)) + if (!FlagGet(sMatchCallCheckPageOverrides[i + 1].flag)) break; i++; } - return sMatchCallCheckPageOverrides[i].v8[offset]; + return sMatchCallCheckPageOverrides[i].flavorTexts[offset]; } } return NULL; } -int sub_81D1BD0(u32 idx) +int MatchCall_GetOverrideFacilityClass(u32 idx) { u32 i; for (i = 0; i < ARRAY_COUNT(sMatchCallCheckPageOverrides); i++) { if (sMatchCallCheckPageOverrides[i].idx == idx) - return sMatchCallCheckPageOverrides[i].v2; + return sMatchCallCheckPageOverrides[i].facilityClass; } return -1; } diff --git a/src/pokenav_unk_3.c b/src/pokenav_unk_3.c index ffb1e0a4a..c66434192 100755 --- a/src/pokenav_unk_3.c +++ b/src/pokenav_unk_3.c @@ -84,7 +84,7 @@ static u32 sub_81CAB44(struct Pokenav3Struct *state) state->callback = sub_81CAC04; state->unk0 = 0; selectedMatchCall = GetSelectedMatchCall(); - if (!state->unk1C[selectedMatchCall].boxId || sub_81D17E8(state->unk1C[selectedMatchCall].unk6)) + if (!state->unk1C[selectedMatchCall].boxId || MatchCall_HasCheckPage(state->unk1C[selectedMatchCall].unk6)) { state->unk4 = gUnknown_0862250A; state->unk2 = 2; @@ -212,7 +212,7 @@ static u32 sub_81CAD20(s32 taskState) state->unkA++; } - if (++state->unk8 >= 21) // TODO: This is the size of sMatchCallHeaders + if (++state->unk8 >= MC_HEADER_COUNT) { state->unkC = state->unk8; state->unk8 = 0; @@ -331,7 +331,7 @@ int sub_81CAF04(int index) return gTrainers[index].trainerPic; } - index = sub_81D1BD0(var0); + index = MatchCall_GetOverrideFacilityClass(var0); return gFacilityClassToPicIndex[index]; } @@ -358,7 +358,7 @@ const u8 *sub_81CAFD8(int index, int textType) { var0 = MatchCall_GetRematchTableIdx(state->unk1C[index].unk6); if (var0 == REMATCH_TABLE_ENTRIES) - return sub_81D1B40(state->unk1C[index].unk6, textType); + return MatchCall_GetOverrideFlavorText(state->unk1C[index].unk6, textType); } else { @@ -426,7 +426,7 @@ int sub_81CB0E4(int index) { if (!state->unk1C[index].boxId) return count; - if (sub_81D17E8(state->unk1C[index].unk6)) + if (MatchCall_HasCheckPage(state->unk1C[index].unk6)) return count; count++; @@ -443,7 +443,7 @@ int sub_81CB128(int index) { if (!state->unk1C[index].boxId) return count; - if (sub_81D17E8(state->unk1C[index].unk6)) + if (MatchCall_HasCheckPage(state->unk1C[index].unk6)) return count; count--; @@ -462,7 +462,7 @@ bool32 unref_sub_81CB16C(void) return TRUE; } - for (i = 0; i < 21; i++) // TODO: This is the size of sMatchCallHeaders + for (i = 0; i < MC_HEADER_COUNT; i++) { if (MatchCallFlagGetByIndex(i)) { -- cgit v1.2.3 From f76f3955637478ea58b71a6c9e9c2f72ce05a3af Mon Sep 17 00:00:00 2001 From: Kevin Mills Date: Wed, 21 Aug 2019 17:57:51 -0400 Subject: use MENU_FIELD_MOVES in sub_81B31B0 --- src/party_menu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/party_menu.c b/src/party_menu.c index dd0a4dabd..f4b749bde 100755 --- a/src/party_menu.c +++ b/src/party_menu.c @@ -3650,7 +3650,7 @@ static u8 sub_81B31B0(u8 a) for (i = 0; i < gUnknown_0203CEC4->listSize; i++) { - u8 unk = (gUnknown_0203CEC4->actions[i] > 18) ? 4 : 3; + u8 unk = (gUnknown_0203CEC4->actions[i] >= MENU_FIELD_MOVES) ? 4 : 3; AddTextPrinterParameterized4(gUnknown_0203CEC4->windowId[0], 1, cursorDimension, (i * 16) + 1, fontAttribute, 0, sFontColorTable[unk], 0, sCursorOptions[gUnknown_0203CEC4->actions[i]].text); } -- cgit v1.2.3 From d09c290ebaf0be9a9dc4f2f9858ea0e9750df146 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Thu, 22 Aug 2019 16:46:33 +0200 Subject: bool8 to u8 --- include/pokemon.h | 2 +- src/pokemon.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/pokemon.h b/include/pokemon.h index 07bcff2e3..ec125573c 100644 --- a/include/pokemon.h +++ b/include/pokemon.h @@ -506,7 +506,7 @@ u8 CalculatePlayerPartyCount(void); u8 CalculateEnemyPartyCount(void); u8 GetMonsStateToDoubles(void); u8 GetMonsStateToDoubles_2(void); -u8 GetAbilityBySpecies(u16 species, bool8 abilityNum); +u8 GetAbilityBySpecies(u16 species, u8 abilityNum); u8 GetMonAbility(struct Pokemon *mon); void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord); u8 GetSecretBaseTrainerPicIndex(void); diff --git a/src/pokemon.c b/src/pokemon.c index cb7be1715..df31bc6b3 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -4424,7 +4424,7 @@ u8 GetMonsStateToDoubles_2(void) return (aliveCount > 1) ? PLAYER_HAS_TWO_USABLE_MONS : PLAYER_HAS_ONE_USABLE_MON; } -u8 GetAbilityBySpecies(u16 species, bool8 abilityNum) +u8 GetAbilityBySpecies(u16 species, u8 abilityNum) { if (abilityNum) gLastUsedAbility = gBaseStats[species].abilities[1]; -- cgit v1.2.3 From d3ea25ee7f40c3334a7acdefec8afd65ed7ec56c Mon Sep 17 00:00:00 2001 From: ultima-soul Date: Sat, 24 Aug 2019 11:17:11 -0700 Subject: Synchronize with pokefirered pokedex.c. --- include/pokedex.h | 3 ++- src/diploma.c | 2 +- src/pokedex.c | 54 +++++++++++++++++++++++++++--------------------------- 3 files changed, 30 insertions(+), 29 deletions(-) diff --git a/include/pokedex.h b/include/pokedex.h index a1b7378bf..532c823ee 100644 --- a/include/pokedex.h +++ b/include/pokedex.h @@ -4,6 +4,7 @@ extern u8 gUnusedPokedexU8; extern void (*gUnknown_030060B4)(void); +#define KANTO_DEX_COUNT 151 #define HOENN_DEX_COUNT 202 #define NATIONAL_DEX_COUNT 386 @@ -43,7 +44,7 @@ s8 GetSetPokedexFlag(u16 nationalNum, u8 caseId); u16 CreateMonSpriteFromNationalDexNumber(u16, s16, s16, u16); bool16 HasAllHoennMons(void); void ResetPokedexScrollPositions(void); -u16 sub_80C0944(void); +bool16 HasAllMons(void); void CB2_Pokedex(void); #endif // GUARD_POKEDEX_H diff --git a/src/diploma.c b/src/diploma.c index 92c7df703..8e0901fa8 100644 --- a/src/diploma.c +++ b/src/diploma.c @@ -127,7 +127,7 @@ static void Task_DiplomaFadeOut(u8 taskId) static void DisplayDiplomaText(void) { - if (sub_80C0944()) + if (HasAllMons()) { SetGpuReg(REG_OFFSET_BG1HOFS, DISPCNT_BG0_ON); StringCopy(gStringVar1, gText_DexNational); diff --git a/src/pokedex.c b/src/pokedex.c index 0e532ed92..c1787ef6a 100644 --- a/src/pokedex.c +++ b/src/pokedex.c @@ -4249,12 +4249,12 @@ u16 GetPokedexHeightWeight(u16 dexNum, u8 data) { switch (data) { - case 0: // height - return gPokedexEntries[dexNum].height; - case 1: // weight - return gPokedexEntries[dexNum].weight; - default: - return 1; + case 0: // height + return gPokedexEntries[dexNum].height; + case 1: // weight + return gPokedexEntries[dexNum].weight; + default: + return 1; } } @@ -4360,23 +4360,23 @@ u16 GetHoennPokedexCount(u8 caseID) return count; } -u16 sub_80C089C(u8 caseID) +u16 GetKantoPokedexCount(u8 caseID) { u16 count = 0; u16 i; - for (i = 0; i < 151; i++) + for (i = 0; i < KANTO_DEX_COUNT; i++) { switch (caseID) { - case FLAG_GET_SEEN: - if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) - count++; - break; - case FLAG_GET_CAUGHT: - if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) - count++; - break; + case FLAG_GET_SEEN: + if (GetSetPokedexFlag(i + 1, FLAG_GET_SEEN)) + count++; + break; + case FLAG_GET_CAUGHT: + if (GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) + count++; + break; } } return count; @@ -4386,7 +4386,7 @@ bool16 HasAllHoennMons(void) { u16 i; - for (i = 0; i < 200; i++) + for (i = 0; i < HOENN_DEX_COUNT - 2; i++) { if (!GetSetPokedexFlag(HoennToNationalOrder(i + 1), FLAG_GET_CAUGHT)) return FALSE; @@ -4394,11 +4394,11 @@ bool16 HasAllHoennMons(void) return TRUE; } -bool8 sub_80C0918(void) +bool8 HasAllKantoMons(void) { u16 i; - for (i = 0; i < 150; i++) + for (i = 0; i < KANTO_DEX_COUNT - 1; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) return FALSE; @@ -4406,26 +4406,26 @@ bool8 sub_80C0918(void) return TRUE; } -u16 sub_80C0944(void) +bool16 HasAllMons(void) { u16 i; - for (i = 0; i < 150; i++) + for (i = 0; i < NATIONAL_DEX_MEWTWO; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) - return 0; + return FALSE; } - for (i = 151; i < 248; i++) + for (i = NATIONAL_DEX_MEW; i < NATIONAL_DEX_TYRANITAR; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) - return 0; + return FALSE; } - for (i = 251; i < 384; i++) + for (i = NATIONAL_DEX_CELEBI; i < NATIONAL_DEX_RAYQUAZA; i++) { if (!GetSetPokedexFlag(i + 1, FLAG_GET_CAUGHT)) - return 0; + return FALSE; } - return 1; + return TRUE; } void sub_80C09B0(u16 a) -- cgit v1.2.3 From b420b98d633f16b0905295345cb671b2834b956e Mon Sep 17 00:00:00 2001 From: garak Date: Thu, 29 Aug 2019 10:02:56 -0400 Subject: allow CRLF line endings in asm files for preproc --- tools/preproc/asm_file.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tools/preproc/asm_file.cpp b/tools/preproc/asm_file.cpp index 383010aa3..98805c952 100644 --- a/tools/preproc/asm_file.cpp +++ b/tools/preproc/asm_file.cpp @@ -475,9 +475,11 @@ void AsmFile::ExpectEmptyRestOfLine() m_lineStart = m_pos; m_lineNum++; } - else if (m_buffer[m_pos] == '\r') + else if (m_buffer[m_pos] == '\r' && m_buffer[m_pos + 1] == '\n') { - RaiseError("only Unix-style LF newlines are supported"); + m_pos += 2; + m_lineStart = m_pos; + m_lineNum++; } else { -- cgit v1.2.3 From 1a2b43064638207b5267ed70cd3d12c385591292 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 28 Aug 2019 16:52:33 -0500 Subject: Update scaninc to include missing .include files in assembler files --- Makefile | 2 +- tools/scaninc/scaninc.cpp | 19 +++++++++++++------ tools/scaninc/source_file.cpp | 5 +++++ tools/scaninc/source_file.h | 1 + 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index c79647fd6..6222e8787 100644 --- a/Makefile +++ b/Makefile @@ -225,7 +225,7 @@ endif ifeq ($(NODEP),1) $(C_BUILDDIR)/%.o: c_dep := else -$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c) +$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include -I tools/agbcc/include $(C_SUBDIR)/$*.c) endif ifeq ($(DINFO),1) diff --git a/tools/scaninc/scaninc.cpp b/tools/scaninc/scaninc.cpp index b95cbd033..a3e40c5d9 100644 --- a/tools/scaninc/scaninc.cpp +++ b/tools/scaninc/scaninc.cpp @@ -97,19 +97,26 @@ int main(int argc, char **argv) } for (auto include : file.GetIncludes()) { + bool exists = false; + std::string path(""); for (auto includeDir : includeDirs) { - std::string path(includeDir + include); + path = includeDir + include; if (CanOpenFile(path)) { - bool inserted = dependencies.insert(path).second; - if (inserted) - { - filesToProcess.push(path); - } + exists = true; break; } } + if (!exists && file.FileType() == SourceFileType::Asm) + { + path = include; + } + bool inserted = dependencies.insert(path).second; + if (inserted && exists) + { + filesToProcess.push(path); + } } includeDirs.pop_back(); } diff --git a/tools/scaninc/source_file.cpp b/tools/scaninc/source_file.cpp index f23ff6db6..df31282f8 100644 --- a/tools/scaninc/source_file.cpp +++ b/tools/scaninc/source_file.cpp @@ -89,6 +89,11 @@ SourceFile::SourceFile(std::string path) } } +SourceFileType SourceFile::FileType() +{ + return m_file_type; +} + SourceFile::~SourceFile() { if (m_file_type == SourceFileType::Cpp || m_file_type == SourceFileType::Header) diff --git a/tools/scaninc/source_file.h b/tools/scaninc/source_file.h index f7b6412bd..854b3f116 100644 --- a/tools/scaninc/source_file.h +++ b/tools/scaninc/source_file.h @@ -50,6 +50,7 @@ public: const std::set& GetIncbins(); const std::set& GetIncludes(); std::string& GetSrcDir(); + SourceFileType FileType(); private: union InnerUnion { -- cgit v1.2.3 From cdae0c1444bed98e652c87dc3e3edcecacfef8be Mon Sep 17 00:00:00 2001 From: tustin2121 Date: Wed, 21 Aug 2019 22:46:52 -0400 Subject: Change event object graphics pointer table to use explicit indexes - This makes it easier for future hack makers to rearrange, add, or delete graphic object ids without having to count indexes or keep them in order. - Porymap will have to be updated, but I have some code for this already in a fork. --- .../event_object_graphics_info_pointers.h | 478 ++++++++++----------- 1 file changed, 239 insertions(+), 239 deletions(-) diff --git a/src/data/field_event_obj/event_object_graphics_info_pointers.h b/src/data/field_event_obj/event_object_graphics_info_pointers.h index 2f504737a..0b8aa79b2 100755 --- a/src/data/field_event_obj/event_object_graphics_info_pointers.h +++ b/src/data/field_event_obj/event_object_graphics_info_pointers.h @@ -247,245 +247,245 @@ const struct EventObjectGraphicsInfo gEventObjectGraphicsInfo_UnusedMauvilleOldM const struct EventObjectGraphicsInfo *const gEventObjectGraphicsInfoPointers[] = { - &gEventObjectGraphicsInfo_BrendanNormal, - &gEventObjectGraphicsInfo_BrendanMachBike, - &gEventObjectGraphicsInfo_BrendanSurfing, - &gEventObjectGraphicsInfo_BrendanFieldMove, - &gEventObjectGraphicsInfo_QuintyPlump, - &gEventObjectGraphicsInfo_NinjaBoy, - &gEventObjectGraphicsInfo_Twin, - &gEventObjectGraphicsInfo_Boy1, - &gEventObjectGraphicsInfo_Girl1, - &gEventObjectGraphicsInfo_Boy2, - &gEventObjectGraphicsInfo_Girl2, - &gEventObjectGraphicsInfo_LittleBoy, - &gEventObjectGraphicsInfo_LittleGirl, - &gEventObjectGraphicsInfo_Boy3, - &gEventObjectGraphicsInfo_Girl3, - &gEventObjectGraphicsInfo_RichBoy, - &gEventObjectGraphicsInfo_Woman1, - &gEventObjectGraphicsInfo_FatMan, - &gEventObjectGraphicsInfo_PokefanF, - &gEventObjectGraphicsInfo_Man1, - &gEventObjectGraphicsInfo_Woman2, - &gEventObjectGraphicsInfo_ExpertM, - &gEventObjectGraphicsInfo_ExpertF, - &gEventObjectGraphicsInfo_Man2, - &gEventObjectGraphicsInfo_Woman3, - &gEventObjectGraphicsInfo_PokefanM, - &gEventObjectGraphicsInfo_Woman4, - &gEventObjectGraphicsInfo_Cook, - &gEventObjectGraphicsInfo_LinkReceptionist, - &gEventObjectGraphicsInfo_OldMan, - &gEventObjectGraphicsInfo_OldWoman, - &gEventObjectGraphicsInfo_Camper, - &gEventObjectGraphicsInfo_Picnicker, - &gEventObjectGraphicsInfo_Man3, - &gEventObjectGraphicsInfo_Woman5, - &gEventObjectGraphicsInfo_Youngster, - &gEventObjectGraphicsInfo_BugCatcher, - &gEventObjectGraphicsInfo_PsychicM, - &gEventObjectGraphicsInfo_SchoolKidM, - &gEventObjectGraphicsInfo_Maniac, - &gEventObjectGraphicsInfo_HexManiac, - &gEventObjectGraphicsInfo_Rayquaza1, - &gEventObjectGraphicsInfo_SwimmerM, - &gEventObjectGraphicsInfo_SwimmerF, - &gEventObjectGraphicsInfo_BlackBelt, - &gEventObjectGraphicsInfo_Beauty, - &gEventObjectGraphicsInfo_Scientist1, - &gEventObjectGraphicsInfo_Lass, - &gEventObjectGraphicsInfo_Gentleman, - &gEventObjectGraphicsInfo_Sailor, - &gEventObjectGraphicsInfo_Fisherman, - &gEventObjectGraphicsInfo_RunningTriathleteM, - &gEventObjectGraphicsInfo_RunningTriathleteF, - &gEventObjectGraphicsInfo_TuberF, - &gEventObjectGraphicsInfo_TuberM, - &gEventObjectGraphicsInfo_Hiker, - &gEventObjectGraphicsInfo_CyclingTriathleteM, - &gEventObjectGraphicsInfo_CyclingTriathleteF, - &gEventObjectGraphicsInfo_Nurse, - &gEventObjectGraphicsInfo_ItemBall, - &gEventObjectGraphicsInfo_BerryTree, - &gEventObjectGraphicsInfo_BerryTreeEarlyStages, - &gEventObjectGraphicsInfo_BerryTreeLateStages, - &gEventObjectGraphicsInfo_BrendanAcroBike, - &gEventObjectGraphicsInfo_ProfBirch, - &gEventObjectGraphicsInfo_Man4, - &gEventObjectGraphicsInfo_Man5, - &gEventObjectGraphicsInfo_ReporterM, - &gEventObjectGraphicsInfo_ReporterF, - &gEventObjectGraphicsInfo_Bard, - &gEventObjectGraphicsInfo_Anabel, - &gEventObjectGraphicsInfo_Tucker, - &gEventObjectGraphicsInfo_Greta, - &gEventObjectGraphicsInfo_Spenser, - &gEventObjectGraphicsInfo_Noland, - &gEventObjectGraphicsInfo_Lucy, - &gEventObjectGraphicsInfo_UnusedNatuDoll, - &gEventObjectGraphicsInfo_UnusedMagnemiteDoll, - &gEventObjectGraphicsInfo_UnusedSquirtleDoll, - &gEventObjectGraphicsInfo_UnusedWooperDoll, - &gEventObjectGraphicsInfo_UnusedPikachuDoll, - &gEventObjectGraphicsInfo_UnusedPorygon2Doll, - &gEventObjectGraphicsInfo_CuttableTree, - &gEventObjectGraphicsInfo_MartEmployee, - &gEventObjectGraphicsInfo_RooftopSaleWoman, - &gEventObjectGraphicsInfo_Teala, - &gEventObjectGraphicsInfo_BreakableRock, - &gEventObjectGraphicsInfo_PushableBoulder, - &gEventObjectGraphicsInfo_MrBrineysBoat, - &gEventObjectGraphicsInfo_MayNormal, - &gEventObjectGraphicsInfo_MayMachBike, - &gEventObjectGraphicsInfo_MayAcroBike, - &gEventObjectGraphicsInfo_MaySurfing, - &gEventObjectGraphicsInfo_MayFieldMove, - &gEventObjectGraphicsInfo_Truck, - &gEventObjectGraphicsInfo_VigorothCarryingBox, - &gEventObjectGraphicsInfo_VigorothFacingAway, - &gEventObjectGraphicsInfo_BirchsBag, - &gEventObjectGraphicsInfo_EnemyZigzagoon, - &gEventObjectGraphicsInfo_Artist, - &gEventObjectGraphicsInfo_RivalBrendanNormal, - &gEventObjectGraphicsInfo_RivalBrendanMachBike, - &gEventObjectGraphicsInfo_RivalBrendanAcroBike, - &gEventObjectGraphicsInfo_RivalBrendanSurfing, - &gEventObjectGraphicsInfo_RivalBrendanFieldMove, - &gEventObjectGraphicsInfo_RivalMayNormal, - &gEventObjectGraphicsInfo_RivalMayMachBike, - &gEventObjectGraphicsInfo_RivalMayAcroBike, - &gEventObjectGraphicsInfo_RivalMaySurfing, - &gEventObjectGraphicsInfo_RivalMayFieldMove, - &gEventObjectGraphicsInfo_Cameraman, - &gEventObjectGraphicsInfo_BrendanUnderwater, - &gEventObjectGraphicsInfo_MayUnderwater, - &gEventObjectGraphicsInfo_MovingBox, - &gEventObjectGraphicsInfo_CableCar, - &gEventObjectGraphicsInfo_Scientist2, - &gEventObjectGraphicsInfo_DevonEmployee, - &gEventObjectGraphicsInfo_AquaMemberM, - &gEventObjectGraphicsInfo_AquaMemberF, - &gEventObjectGraphicsInfo_MagmaMemberM, - &gEventObjectGraphicsInfo_MagmaMemberF, - &gEventObjectGraphicsInfo_Sidney, - &gEventObjectGraphicsInfo_Phoebe, - &gEventObjectGraphicsInfo_Glacia, - &gEventObjectGraphicsInfo_Drake, - &gEventObjectGraphicsInfo_Roxanne, - &gEventObjectGraphicsInfo_Brawly, - &gEventObjectGraphicsInfo_Wattson, - &gEventObjectGraphicsInfo_Flannery, - &gEventObjectGraphicsInfo_Norman, - &gEventObjectGraphicsInfo_Winona, - &gEventObjectGraphicsInfo_Liza, - &gEventObjectGraphicsInfo_Tate, - &gEventObjectGraphicsInfo_Wallace, - &gEventObjectGraphicsInfo_Steven, - &gEventObjectGraphicsInfo_Wally, - &gEventObjectGraphicsInfo_RubySapphireLittleBoy, - &gEventObjectGraphicsInfo_BrendanFishing, - &gEventObjectGraphicsInfo_MayFishing, - &gEventObjectGraphicsInfo_HotSpringsOldWoman, - &gEventObjectGraphicsInfo_SSTidal, - &gEventObjectGraphicsInfo_SubmarineShadow, - &gEventObjectGraphicsInfo_PichuDoll, - &gEventObjectGraphicsInfo_PikachuDoll, - &gEventObjectGraphicsInfo_MarillDoll, - &gEventObjectGraphicsInfo_TogepiDoll, - &gEventObjectGraphicsInfo_CyndaquilDoll, - &gEventObjectGraphicsInfo_ChikoritaDoll, - &gEventObjectGraphicsInfo_TotodileDoll, - &gEventObjectGraphicsInfo_JigglypuffDoll, - &gEventObjectGraphicsInfo_MeowthDoll, - &gEventObjectGraphicsInfo_ClefairyDoll, - &gEventObjectGraphicsInfo_DittoDoll, - &gEventObjectGraphicsInfo_SmoochumDoll, - &gEventObjectGraphicsInfo_TreeckoDoll, - &gEventObjectGraphicsInfo_TorchicDoll, - &gEventObjectGraphicsInfo_MudkipDoll, - &gEventObjectGraphicsInfo_DuskullDoll, - &gEventObjectGraphicsInfo_WynautDoll, - &gEventObjectGraphicsInfo_BaltoyDoll, - &gEventObjectGraphicsInfo_KecleonDoll, - &gEventObjectGraphicsInfo_AzurillDoll, - &gEventObjectGraphicsInfo_SkittyDoll, - &gEventObjectGraphicsInfo_SwabluDoll, - &gEventObjectGraphicsInfo_GulpinDoll, - &gEventObjectGraphicsInfo_LotadDoll, - &gEventObjectGraphicsInfo_SeedotDoll, - &gEventObjectGraphicsInfo_PikaCushion, - &gEventObjectGraphicsInfo_RoundCushion, - &gEventObjectGraphicsInfo_KissCushion, - &gEventObjectGraphicsInfo_ZigzagCushion, - &gEventObjectGraphicsInfo_SpinCushion, - &gEventObjectGraphicsInfo_DiamondCushion, - &gEventObjectGraphicsInfo_BallCushion, - &gEventObjectGraphicsInfo_GrassCushion, - &gEventObjectGraphicsInfo_FireCushion, - &gEventObjectGraphicsInfo_WaterCushion, - &gEventObjectGraphicsInfo_BigSnorlaxDoll, - &gEventObjectGraphicsInfo_BigRhydonDoll, - &gEventObjectGraphicsInfo_BigLaprasDoll, - &gEventObjectGraphicsInfo_BigVenusaurDoll, - &gEventObjectGraphicsInfo_BigCharizardDoll, - &gEventObjectGraphicsInfo_BigBlastoiseDoll, - &gEventObjectGraphicsInfo_BigWailmerDoll, - &gEventObjectGraphicsInfo_BigRegirockDoll, - &gEventObjectGraphicsInfo_BigRegiceDoll, - &gEventObjectGraphicsInfo_BigRegisteelDoll, - &gEventObjectGraphicsInfo_Latias, - &gEventObjectGraphicsInfo_Latios, - &gEventObjectGraphicsInfo_GameboyKid, - &gEventObjectGraphicsInfo_ContestJudge, - &gEventObjectGraphicsInfo_BrendanWatering, - &gEventObjectGraphicsInfo_MayWatering, - &gEventObjectGraphicsInfo_BrendanDecorating, - &gEventObjectGraphicsInfo_MayDecorating, - &gEventObjectGraphicsInfo_Archie, - &gEventObjectGraphicsInfo_Maxie, - &gEventObjectGraphicsInfo_Kyogre1, - &gEventObjectGraphicsInfo_Groudon1, - &gEventObjectGraphicsInfo_Fossil, - &gEventObjectGraphicsInfo_Regirock, - &gEventObjectGraphicsInfo_Regice, - &gEventObjectGraphicsInfo_Registeel, - &gEventObjectGraphicsInfo_Skitty, - &gEventObjectGraphicsInfo_Kecleon1, - &gEventObjectGraphicsInfo_Kyogre2, - &gEventObjectGraphicsInfo_Groudon2, - &gEventObjectGraphicsInfo_Rayquaza2, - &gEventObjectGraphicsInfo_Zigzagoon, - &gEventObjectGraphicsInfo_Pikachu, - &gEventObjectGraphicsInfo_Azumarill, - &gEventObjectGraphicsInfo_Wingull, - &gEventObjectGraphicsInfo_Kecleon2, - &gEventObjectGraphicsInfo_TuberMSwimming, - &gEventObjectGraphicsInfo_Azurill, - &gEventObjectGraphicsInfo_Mom, - &gEventObjectGraphicsInfo_LinkBrendan, - &gEventObjectGraphicsInfo_LinkMay, - &gEventObjectGraphicsInfo_Juan, - &gEventObjectGraphicsInfo_Scott, - &gEventObjectGraphicsInfo_Poochyena, - &gEventObjectGraphicsInfo_Kyogre3, - &gEventObjectGraphicsInfo_Groudon3, - &gEventObjectGraphicsInfo_MysteryEventDeliveryman, - &gEventObjectGraphicsInfo_Statue, - &gEventObjectGraphicsInfo_Kirlia, - &gEventObjectGraphicsInfo_Dusclops, - &gEventObjectGraphicsInfo_UnionRoomAttendant, - &gEventObjectGraphicsInfo_Sudowoodo, - &gEventObjectGraphicsInfo_Mew, - &gEventObjectGraphicsInfo_Red, - &gEventObjectGraphicsInfo_Leaf, - &gEventObjectGraphicsInfo_Deoxys, - &gEventObjectGraphicsInfo_BirthIslandStone, - &gEventObjectGraphicsInfo_Brandon, - &gEventObjectGraphicsInfo_RubySapphireBrendan, - &gEventObjectGraphicsInfo_RubySapphireMay, - &gEventObjectGraphicsInfo_Lugia, - &gEventObjectGraphicsInfo_HoOh, + [EVENT_OBJ_GFX_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_BrendanNormal, + [EVENT_OBJ_GFX_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_BrendanMachBike, + [EVENT_OBJ_GFX_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_BrendanSurfing, + [EVENT_OBJ_GFX_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_BrendanFieldMove, + [EVENT_OBJ_GFX_QUINTY_PLUMP] = &gEventObjectGraphicsInfo_QuintyPlump, + [EVENT_OBJ_GFX_NINJA_BOY] = &gEventObjectGraphicsInfo_NinjaBoy, + [EVENT_OBJ_GFX_TWIN] = &gEventObjectGraphicsInfo_Twin, + [EVENT_OBJ_GFX_BOY_1] = &gEventObjectGraphicsInfo_Boy1, + [EVENT_OBJ_GFX_GIRL_1] = &gEventObjectGraphicsInfo_Girl1, + [EVENT_OBJ_GFX_BOY_2] = &gEventObjectGraphicsInfo_Boy2, + [EVENT_OBJ_GFX_GIRL_2] = &gEventObjectGraphicsInfo_Girl2, + [EVENT_OBJ_GFX_LITTLE_BOY] = &gEventObjectGraphicsInfo_LittleBoy, + [EVENT_OBJ_GFX_LITTLE_GIRL] = &gEventObjectGraphicsInfo_LittleGirl, + [EVENT_OBJ_GFX_BOY_3] = &gEventObjectGraphicsInfo_Boy3, + [EVENT_OBJ_GFX_GIRL_3] = &gEventObjectGraphicsInfo_Girl3, + [EVENT_OBJ_GFX_RICH_BOY] = &gEventObjectGraphicsInfo_RichBoy, + [EVENT_OBJ_GFX_WOMAN_1] = &gEventObjectGraphicsInfo_Woman1, + [EVENT_OBJ_GFX_FAT_MAN] = &gEventObjectGraphicsInfo_FatMan, + [EVENT_OBJ_GFX_POKEFAN_F] = &gEventObjectGraphicsInfo_PokefanF, + [EVENT_OBJ_GFX_MAN_1] = &gEventObjectGraphicsInfo_Man1, + [EVENT_OBJ_GFX_WOMAN_2] = &gEventObjectGraphicsInfo_Woman2, + [EVENT_OBJ_GFX_EXPERT_M] = &gEventObjectGraphicsInfo_ExpertM, + [EVENT_OBJ_GFX_EXPERT_F] = &gEventObjectGraphicsInfo_ExpertF, + [EVENT_OBJ_GFX_MAN_2] = &gEventObjectGraphicsInfo_Man2, + [EVENT_OBJ_GFX_WOMAN_3] = &gEventObjectGraphicsInfo_Woman3, + [EVENT_OBJ_GFX_POKEFAN_M] = &gEventObjectGraphicsInfo_PokefanM, + [EVENT_OBJ_GFX_WOMAN_4] = &gEventObjectGraphicsInfo_Woman4, + [EVENT_OBJ_GFX_COOK] = &gEventObjectGraphicsInfo_Cook, + [EVENT_OBJ_GFX_LINK_RECEPTIONIST] = &gEventObjectGraphicsInfo_LinkReceptionist, + [EVENT_OBJ_GFX_OLD_MAN] = &gEventObjectGraphicsInfo_OldMan, + [EVENT_OBJ_GFX_OLD_WOMAN] = &gEventObjectGraphicsInfo_OldWoman, + [EVENT_OBJ_GFX_CAMPER] = &gEventObjectGraphicsInfo_Camper, + [EVENT_OBJ_GFX_PICNICKER] = &gEventObjectGraphicsInfo_Picnicker, + [EVENT_OBJ_GFX_MAN_3] = &gEventObjectGraphicsInfo_Man3, + [EVENT_OBJ_GFX_WOMAN_5] = &gEventObjectGraphicsInfo_Woman5, + [EVENT_OBJ_GFX_YOUNGSTER] = &gEventObjectGraphicsInfo_Youngster, + [EVENT_OBJ_GFX_BUG_CATCHER] = &gEventObjectGraphicsInfo_BugCatcher, + [EVENT_OBJ_GFX_PSYCHIC_M] = &gEventObjectGraphicsInfo_PsychicM, + [EVENT_OBJ_GFX_SCHOOL_KID_M] = &gEventObjectGraphicsInfo_SchoolKidM, + [EVENT_OBJ_GFX_MANIAC] = &gEventObjectGraphicsInfo_Maniac, + [EVENT_OBJ_GFX_HEX_MANIAC] = &gEventObjectGraphicsInfo_HexManiac, + [EVENT_OBJ_GFX_RAYQUAZA_1] = &gEventObjectGraphicsInfo_Rayquaza1, + [EVENT_OBJ_GFX_SWIMMER_M] = &gEventObjectGraphicsInfo_SwimmerM, + [EVENT_OBJ_GFX_SWIMMER_F] = &gEventObjectGraphicsInfo_SwimmerF, + [EVENT_OBJ_GFX_BLACK_BELT] = &gEventObjectGraphicsInfo_BlackBelt, + [EVENT_OBJ_GFX_BEAUTY] = &gEventObjectGraphicsInfo_Beauty, + [EVENT_OBJ_GFX_SCIENTIST_1] = &gEventObjectGraphicsInfo_Scientist1, + [EVENT_OBJ_GFX_LASS] = &gEventObjectGraphicsInfo_Lass, + [EVENT_OBJ_GFX_GENTLEMAN] = &gEventObjectGraphicsInfo_Gentleman, + [EVENT_OBJ_GFX_SAILOR] = &gEventObjectGraphicsInfo_Sailor, + [EVENT_OBJ_GFX_FISHERMAN] = &gEventObjectGraphicsInfo_Fisherman, + [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_RunningTriathleteM, + [EVENT_OBJ_GFX_RUNNING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_RunningTriathleteF, + [EVENT_OBJ_GFX_TUBER_F] = &gEventObjectGraphicsInfo_TuberF, + [EVENT_OBJ_GFX_TUBER_M] = &gEventObjectGraphicsInfo_TuberM, + [EVENT_OBJ_GFX_HIKER] = &gEventObjectGraphicsInfo_Hiker, + [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_M] = &gEventObjectGraphicsInfo_CyclingTriathleteM, + [EVENT_OBJ_GFX_CYCLING_TRIATHLETE_F] = &gEventObjectGraphicsInfo_CyclingTriathleteF, + [EVENT_OBJ_GFX_NURSE] = &gEventObjectGraphicsInfo_Nurse, + [EVENT_OBJ_GFX_ITEM_BALL] = &gEventObjectGraphicsInfo_ItemBall, + [EVENT_OBJ_GFX_BERRY_TREE] = &gEventObjectGraphicsInfo_BerryTree, + [EVENT_OBJ_GFX_BERRY_TREE_EARLY_STAGES] = &gEventObjectGraphicsInfo_BerryTreeEarlyStages, + [EVENT_OBJ_GFX_BERRY_TREE_LATE_STAGES] = &gEventObjectGraphicsInfo_BerryTreeLateStages, + [EVENT_OBJ_GFX_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_BrendanAcroBike, + [EVENT_OBJ_GFX_PROF_BIRCH] = &gEventObjectGraphicsInfo_ProfBirch, + [EVENT_OBJ_GFX_MAN_4] = &gEventObjectGraphicsInfo_Man4, + [EVENT_OBJ_GFX_MAN_5] = &gEventObjectGraphicsInfo_Man5, + [EVENT_OBJ_GFX_REPORTER_M] = &gEventObjectGraphicsInfo_ReporterM, + [EVENT_OBJ_GFX_REPORTER_F] = &gEventObjectGraphicsInfo_ReporterF, + [EVENT_OBJ_GFX_BARD] = &gEventObjectGraphicsInfo_Bard, + [EVENT_OBJ_GFX_ANABEL] = &gEventObjectGraphicsInfo_Anabel, + [EVENT_OBJ_GFX_TUCKER] = &gEventObjectGraphicsInfo_Tucker, + [EVENT_OBJ_GFX_GRETA] = &gEventObjectGraphicsInfo_Greta, + [EVENT_OBJ_GFX_SPENSER] = &gEventObjectGraphicsInfo_Spenser, + [EVENT_OBJ_GFX_NOLAND] = &gEventObjectGraphicsInfo_Noland, + [EVENT_OBJ_GFX_LUCY] = &gEventObjectGraphicsInfo_Lucy, + [EVENT_OBJ_GFX_UNUSED_NATU_DOLL] = &gEventObjectGraphicsInfo_UnusedNatuDoll, + [EVENT_OBJ_GFX_UNUSED_MAGNEMITE_DOLL] = &gEventObjectGraphicsInfo_UnusedMagnemiteDoll, + [EVENT_OBJ_GFX_UNUSED_SQUIRTLE_DOLL] = &gEventObjectGraphicsInfo_UnusedSquirtleDoll, + [EVENT_OBJ_GFX_UNUSED_WOOPER_DOLL] = &gEventObjectGraphicsInfo_UnusedWooperDoll, + [EVENT_OBJ_GFX_UNUSED_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_UnusedPikachuDoll, + [EVENT_OBJ_GFX_UNUSED_PORYGON2_DOLL] = &gEventObjectGraphicsInfo_UnusedPorygon2Doll, + [EVENT_OBJ_GFX_CUTTABLE_TREE] = &gEventObjectGraphicsInfo_CuttableTree, + [EVENT_OBJ_GFX_MART_EMPLOYEE] = &gEventObjectGraphicsInfo_MartEmployee, + [EVENT_OBJ_GFX_ROOFTOP_SALE_WOMAN] = &gEventObjectGraphicsInfo_RooftopSaleWoman, + [EVENT_OBJ_GFX_TEALA] = &gEventObjectGraphicsInfo_Teala, + [EVENT_OBJ_GFX_BREAKABLE_ROCK] = &gEventObjectGraphicsInfo_BreakableRock, + [EVENT_OBJ_GFX_PUSHABLE_BOULDER] = &gEventObjectGraphicsInfo_PushableBoulder, + [EVENT_OBJ_GFX_MR_BRINEYS_BOAT] = &gEventObjectGraphicsInfo_MrBrineysBoat, + [EVENT_OBJ_GFX_MAY_NORMAL] = &gEventObjectGraphicsInfo_MayNormal, + [EVENT_OBJ_GFX_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_MayMachBike, + [EVENT_OBJ_GFX_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_MayAcroBike, + [EVENT_OBJ_GFX_MAY_SURFING] = &gEventObjectGraphicsInfo_MaySurfing, + [EVENT_OBJ_GFX_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_MayFieldMove, + [EVENT_OBJ_GFX_TRUCK] = &gEventObjectGraphicsInfo_Truck, + [EVENT_OBJ_GFX_VIGOROTH_CARRYING_BOX] = &gEventObjectGraphicsInfo_VigorothCarryingBox, + [EVENT_OBJ_GFX_VIGOROTH_FACING_AWAY] = &gEventObjectGraphicsInfo_VigorothFacingAway, + [EVENT_OBJ_GFX_BIRCHS_BAG] = &gEventObjectGraphicsInfo_BirchsBag, + [EVENT_OBJ_GFX_ZIGZAGOON_1] = &gEventObjectGraphicsInfo_EnemyZigzagoon, + [EVENT_OBJ_GFX_ARTIST] = &gEventObjectGraphicsInfo_Artist, + [EVENT_OBJ_GFX_RIVAL_BRENDAN_NORMAL] = &gEventObjectGraphicsInfo_RivalBrendanNormal, + [EVENT_OBJ_GFX_RIVAL_BRENDAN_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanMachBike, + [EVENT_OBJ_GFX_RIVAL_BRENDAN_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalBrendanAcroBike, + [EVENT_OBJ_GFX_RIVAL_BRENDAN_SURFING] = &gEventObjectGraphicsInfo_RivalBrendanSurfing, + [EVENT_OBJ_GFX_RIVAL_BRENDAN_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalBrendanFieldMove, + [EVENT_OBJ_GFX_RIVAL_MAY_NORMAL] = &gEventObjectGraphicsInfo_RivalMayNormal, + [EVENT_OBJ_GFX_RIVAL_MAY_MACH_BIKE] = &gEventObjectGraphicsInfo_RivalMayMachBike, + [EVENT_OBJ_GFX_RIVAL_MAY_ACRO_BIKE] = &gEventObjectGraphicsInfo_RivalMayAcroBike, + [EVENT_OBJ_GFX_RIVAL_MAY_SURFING] = &gEventObjectGraphicsInfo_RivalMaySurfing, + [EVENT_OBJ_GFX_RIVAL_MAY_FIELD_MOVE] = &gEventObjectGraphicsInfo_RivalMayFieldMove, + [EVENT_OBJ_GFX_CAMERAMAN] = &gEventObjectGraphicsInfo_Cameraman, + [EVENT_OBJ_GFX_BRENDAN_UNDERWATER] = &gEventObjectGraphicsInfo_BrendanUnderwater, + [EVENT_OBJ_GFX_MAY_UNDERWATER] = &gEventObjectGraphicsInfo_MayUnderwater, + [EVENT_OBJ_GFX_MOVING_BOX] = &gEventObjectGraphicsInfo_MovingBox, + [EVENT_OBJ_GFX_CABLE_CAR] = &gEventObjectGraphicsInfo_CableCar, + [EVENT_OBJ_GFX_SCIENTIST_2] = &gEventObjectGraphicsInfo_Scientist2, + [EVENT_OBJ_GFX_DEVON_EMPLOYEE] = &gEventObjectGraphicsInfo_DevonEmployee, + [EVENT_OBJ_GFX_AQUA_MEMBER_M] = &gEventObjectGraphicsInfo_AquaMemberM, + [EVENT_OBJ_GFX_AQUA_MEMBER_F] = &gEventObjectGraphicsInfo_AquaMemberF, + [EVENT_OBJ_GFX_MAGMA_MEMBER_M] = &gEventObjectGraphicsInfo_MagmaMemberM, + [EVENT_OBJ_GFX_MAGMA_MEMBER_F] = &gEventObjectGraphicsInfo_MagmaMemberF, + [EVENT_OBJ_GFX_SIDNEY] = &gEventObjectGraphicsInfo_Sidney, + [EVENT_OBJ_GFX_PHOEBE] = &gEventObjectGraphicsInfo_Phoebe, + [EVENT_OBJ_GFX_GLACIA] = &gEventObjectGraphicsInfo_Glacia, + [EVENT_OBJ_GFX_DRAKE] = &gEventObjectGraphicsInfo_Drake, + [EVENT_OBJ_GFX_ROXANNE] = &gEventObjectGraphicsInfo_Roxanne, + [EVENT_OBJ_GFX_BRAWLY] = &gEventObjectGraphicsInfo_Brawly, + [EVENT_OBJ_GFX_WATTSON] = &gEventObjectGraphicsInfo_Wattson, + [EVENT_OBJ_GFX_FLANNERY] = &gEventObjectGraphicsInfo_Flannery, + [EVENT_OBJ_GFX_NORMAN] = &gEventObjectGraphicsInfo_Norman, + [EVENT_OBJ_GFX_WINONA] = &gEventObjectGraphicsInfo_Winona, + [EVENT_OBJ_GFX_LIZA] = &gEventObjectGraphicsInfo_Liza, + [EVENT_OBJ_GFX_TATE] = &gEventObjectGraphicsInfo_Tate, + [EVENT_OBJ_GFX_WALLACE] = &gEventObjectGraphicsInfo_Wallace, + [EVENT_OBJ_GFX_STEVEN] = &gEventObjectGraphicsInfo_Steven, + [EVENT_OBJ_GFX_WALLY] = &gEventObjectGraphicsInfo_Wally, + [EVENT_OBJ_GFX_LITTLE_BOY_3] = &gEventObjectGraphicsInfo_RubySapphireLittleBoy, + [EVENT_OBJ_GFX_BRENDAN_FISHING] = &gEventObjectGraphicsInfo_BrendanFishing, + [EVENT_OBJ_GFX_MAY_FISHING] = &gEventObjectGraphicsInfo_MayFishing, + [EVENT_OBJ_GFX_HOT_SPRINGS_OLD_WOMAN] = &gEventObjectGraphicsInfo_HotSpringsOldWoman, + [EVENT_OBJ_GFX_SS_TIDAL] = &gEventObjectGraphicsInfo_SSTidal, + [EVENT_OBJ_GFX_SUBMARINE_SHADOW] = &gEventObjectGraphicsInfo_SubmarineShadow, + [EVENT_OBJ_GFX_PICHU_DOLL] = &gEventObjectGraphicsInfo_PichuDoll, + [EVENT_OBJ_GFX_PIKACHU_DOLL] = &gEventObjectGraphicsInfo_PikachuDoll, + [EVENT_OBJ_GFX_MARILL_DOLL] = &gEventObjectGraphicsInfo_MarillDoll, + [EVENT_OBJ_GFX_TOGEPI_DOLL] = &gEventObjectGraphicsInfo_TogepiDoll, + [EVENT_OBJ_GFX_CYNDAQUIL_DOLL] = &gEventObjectGraphicsInfo_CyndaquilDoll, + [EVENT_OBJ_GFX_CHIKORITA_DOLL] = &gEventObjectGraphicsInfo_ChikoritaDoll, + [EVENT_OBJ_GFX_TOTODILE_DOLL] = &gEventObjectGraphicsInfo_TotodileDoll, + [EVENT_OBJ_GFX_JIGGLYPUFF_DOLL] = &gEventObjectGraphicsInfo_JigglypuffDoll, + [EVENT_OBJ_GFX_MEOWTH_DOLL] = &gEventObjectGraphicsInfo_MeowthDoll, + [EVENT_OBJ_GFX_CLEFAIRY_DOLL] = &gEventObjectGraphicsInfo_ClefairyDoll, + [EVENT_OBJ_GFX_DITTO_DOLL] = &gEventObjectGraphicsInfo_DittoDoll, + [EVENT_OBJ_GFX_SMOOCHUM_DOLL] = &gEventObjectGraphicsInfo_SmoochumDoll, + [EVENT_OBJ_GFX_TREECKO_DOLL] = &gEventObjectGraphicsInfo_TreeckoDoll, + [EVENT_OBJ_GFX_TORCHIC_DOLL] = &gEventObjectGraphicsInfo_TorchicDoll, + [EVENT_OBJ_GFX_MUDKIP_DOLL] = &gEventObjectGraphicsInfo_MudkipDoll, + [EVENT_OBJ_GFX_DUSKULL_DOLL] = &gEventObjectGraphicsInfo_DuskullDoll, + [EVENT_OBJ_GFX_WYNAUT_DOLL] = &gEventObjectGraphicsInfo_WynautDoll, + [EVENT_OBJ_GFX_BALTOY_DOLL] = &gEventObjectGraphicsInfo_BaltoyDoll, + [EVENT_OBJ_GFX_KECLEON_DOLL] = &gEventObjectGraphicsInfo_KecleonDoll, + [EVENT_OBJ_GFX_AZURILL_DOLL] = &gEventObjectGraphicsInfo_AzurillDoll, + [EVENT_OBJ_GFX_SKITTY_DOLL] = &gEventObjectGraphicsInfo_SkittyDoll, + [EVENT_OBJ_GFX_SWABLU_DOLL] = &gEventObjectGraphicsInfo_SwabluDoll, + [EVENT_OBJ_GFX_GULPIN_DOLL] = &gEventObjectGraphicsInfo_GulpinDoll, + [EVENT_OBJ_GFX_LOTAD_DOLL] = &gEventObjectGraphicsInfo_LotadDoll, + [EVENT_OBJ_GFX_SEEDOT_DOLL] = &gEventObjectGraphicsInfo_SeedotDoll, + [EVENT_OBJ_GFX_PIKA_CUSHION] = &gEventObjectGraphicsInfo_PikaCushion, + [EVENT_OBJ_GFX_ROUND_CUSHION] = &gEventObjectGraphicsInfo_RoundCushion, + [EVENT_OBJ_GFX_KISS_CUSHION] = &gEventObjectGraphicsInfo_KissCushion, + [EVENT_OBJ_GFX_ZIGZAG_CUSHION] = &gEventObjectGraphicsInfo_ZigzagCushion, + [EVENT_OBJ_GFX_SPIN_CUSHION] = &gEventObjectGraphicsInfo_SpinCushion, + [EVENT_OBJ_GFX_DIAMOND_CUSHION] = &gEventObjectGraphicsInfo_DiamondCushion, + [EVENT_OBJ_GFX_BALL_CUSHION] = &gEventObjectGraphicsInfo_BallCushion, + [EVENT_OBJ_GFX_GRASS_CUSHION] = &gEventObjectGraphicsInfo_GrassCushion, + [EVENT_OBJ_GFX_FIRE_CUSHION] = &gEventObjectGraphicsInfo_FireCushion, + [EVENT_OBJ_GFX_WATER_CUSHION] = &gEventObjectGraphicsInfo_WaterCushion, + [EVENT_OBJ_GFX_BIG_SNORLAX_DOLL] = &gEventObjectGraphicsInfo_BigSnorlaxDoll, + [EVENT_OBJ_GFX_BIG_RHYDON_DOLL] = &gEventObjectGraphicsInfo_BigRhydonDoll, + [EVENT_OBJ_GFX_BIG_LAPRAS_DOLL] = &gEventObjectGraphicsInfo_BigLaprasDoll, + [EVENT_OBJ_GFX_BIG_VENUSAUR_DOLL] = &gEventObjectGraphicsInfo_BigVenusaurDoll, + [EVENT_OBJ_GFX_BIG_CHARIZARD_DOLL] = &gEventObjectGraphicsInfo_BigCharizardDoll, + [EVENT_OBJ_GFX_BIG_BLASTOISE_DOLL] = &gEventObjectGraphicsInfo_BigBlastoiseDoll, + [EVENT_OBJ_GFX_BIG_WAILMER_DOLL] = &gEventObjectGraphicsInfo_BigWailmerDoll, + [EVENT_OBJ_GFX_BIG_REGIROCK_DOLL] = &gEventObjectGraphicsInfo_BigRegirockDoll, + [EVENT_OBJ_GFX_BIG_REGICE_DOLL] = &gEventObjectGraphicsInfo_BigRegiceDoll, + [EVENT_OBJ_GFX_BIG_REGISTEEL_DOLL] = &gEventObjectGraphicsInfo_BigRegisteelDoll, + [EVENT_OBJ_GFX_LATIAS] = &gEventObjectGraphicsInfo_Latias, + [EVENT_OBJ_GFX_LATIOS] = &gEventObjectGraphicsInfo_Latios, + [EVENT_OBJ_GFX_GAMEBOY_KID] = &gEventObjectGraphicsInfo_GameboyKid, + [EVENT_OBJ_GFX_CONTEST_JUDGE] = &gEventObjectGraphicsInfo_ContestJudge, + [EVENT_OBJ_GFX_BRENDAN_WATERING] = &gEventObjectGraphicsInfo_BrendanWatering, + [EVENT_OBJ_GFX_MAY_WATERING] = &gEventObjectGraphicsInfo_MayWatering, + [EVENT_OBJ_GFX_BRENDAN_DECORATING] = &gEventObjectGraphicsInfo_BrendanDecorating, + [EVENT_OBJ_GFX_MAY_DECORATING] = &gEventObjectGraphicsInfo_MayDecorating, + [EVENT_OBJ_GFX_ARCHIE] = &gEventObjectGraphicsInfo_Archie, + [EVENT_OBJ_GFX_MAXIE] = &gEventObjectGraphicsInfo_Maxie, + [EVENT_OBJ_GFX_KYOGRE_1] = &gEventObjectGraphicsInfo_Kyogre1, + [EVENT_OBJ_GFX_GROUDON_1] = &gEventObjectGraphicsInfo_Groudon1, + [EVENT_OBJ_GFX_FOSSIL] = &gEventObjectGraphicsInfo_Fossil, + [EVENT_OBJ_GFX_REGIROCK] = &gEventObjectGraphicsInfo_Regirock, + [EVENT_OBJ_GFX_REGICE] = &gEventObjectGraphicsInfo_Regice, + [EVENT_OBJ_GFX_REGISTEEL] = &gEventObjectGraphicsInfo_Registeel, + [EVENT_OBJ_GFX_SKITTY] = &gEventObjectGraphicsInfo_Skitty, + [EVENT_OBJ_GFX_KECLEON_1] = &gEventObjectGraphicsInfo_Kecleon1, + [EVENT_OBJ_GFX_KYOGRE_2] = &gEventObjectGraphicsInfo_Kyogre2, + [EVENT_OBJ_GFX_GROUDON_2] = &gEventObjectGraphicsInfo_Groudon2, + [EVENT_OBJ_GFX_RAYQUAZA_2] = &gEventObjectGraphicsInfo_Rayquaza2, + [EVENT_OBJ_GFX_ZIGZAGOON_2] = &gEventObjectGraphicsInfo_Zigzagoon, + [EVENT_OBJ_GFX_PIKACHU] = &gEventObjectGraphicsInfo_Pikachu, + [EVENT_OBJ_GFX_AZUMARILL] = &gEventObjectGraphicsInfo_Azumarill, + [EVENT_OBJ_GFX_WINGULL] = &gEventObjectGraphicsInfo_Wingull, + [EVENT_OBJ_GFX_KECLEON_2] = &gEventObjectGraphicsInfo_Kecleon2, + [EVENT_OBJ_GFX_TUBER_M_SWIMMING] = &gEventObjectGraphicsInfo_TuberMSwimming, + [EVENT_OBJ_GFX_AZURILL] = &gEventObjectGraphicsInfo_Azurill, + [EVENT_OBJ_GFX_MOM] = &gEventObjectGraphicsInfo_Mom, + [EVENT_OBJ_GFX_LINK_BRENDAN] = &gEventObjectGraphicsInfo_LinkBrendan, + [EVENT_OBJ_GFX_LINK_MAY] = &gEventObjectGraphicsInfo_LinkMay, + [EVENT_OBJ_GFX_JUAN] = &gEventObjectGraphicsInfo_Juan, + [EVENT_OBJ_GFX_SCOTT] = &gEventObjectGraphicsInfo_Scott, + [EVENT_OBJ_GFX_POOCHYENA] = &gEventObjectGraphicsInfo_Poochyena, + [EVENT_OBJ_GFX_KYOGRE_3] = &gEventObjectGraphicsInfo_Kyogre3, + [EVENT_OBJ_GFX_GROUDON_3] = &gEventObjectGraphicsInfo_Groudon3, + [EVENT_OBJ_GFX_MYSTERY_GIFT_MAN] = &gEventObjectGraphicsInfo_MysteryEventDeliveryman, + [EVENT_OBJ_GFX_TRICK_HOUSE_STATUE] = &gEventObjectGraphicsInfo_Statue, + [EVENT_OBJ_GFX_KIRLIA] = &gEventObjectGraphicsInfo_Kirlia, + [EVENT_OBJ_GFX_DUSCLOPS] = &gEventObjectGraphicsInfo_Dusclops, + [EVENT_OBJ_GFX_UNION_ROOM_NURSE] = &gEventObjectGraphicsInfo_UnionRoomAttendant, + [EVENT_OBJ_GFX_SUDOWOODO] = &gEventObjectGraphicsInfo_Sudowoodo, + [EVENT_OBJ_GFX_MEW] = &gEventObjectGraphicsInfo_Mew, + [EVENT_OBJ_GFX_RED] = &gEventObjectGraphicsInfo_Red, + [EVENT_OBJ_GFX_LEAF] = &gEventObjectGraphicsInfo_Leaf, + [EVENT_OBJ_GFX_DEOXYS] = &gEventObjectGraphicsInfo_Deoxys, + [EVENT_OBJ_GFX_DEOXYS_TRIANGLE] = &gEventObjectGraphicsInfo_BirthIslandStone, + [EVENT_OBJ_GFX_BRANDON] = &gEventObjectGraphicsInfo_Brandon, + [EVENT_OBJ_GFX_LINK_RS_BRENDAN] = &gEventObjectGraphicsInfo_RubySapphireBrendan, + [EVENT_OBJ_GFX_LINK_RS_MAY] = &gEventObjectGraphicsInfo_RubySapphireMay, + [EVENT_OBJ_GFX_LUGIA] = &gEventObjectGraphicsInfo_Lugia, + [EVENT_OBJ_GFX_HOOH] = &gEventObjectGraphicsInfo_HoOh, }; const struct EventObjectGraphicsInfo *const gMauvilleOldManGraphicsInfoPointers[] = { -- cgit v1.2.3 From 6a3b74c59c28e3853b9850f369006e0e9d700439 Mon Sep 17 00:00:00 2001 From: DizzyEggg Date: Fri, 30 Aug 2019 09:48:59 +0200 Subject: Use item constant in pretty petal flower shop --- data/maps/Route104_PrettyPetalFlowerShop/scripts.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc index b4d10cf0f..c70318fc9 100644 --- a/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc +++ b/data/maps/Route104_PrettyPetalFlowerShop/scripts.inc @@ -88,7 +88,7 @@ Route104_PrettyPetalFlowerShop_EventScript_22A442:: @ 822A442 goto_if_set FLAG_DAILY_FLOWER_SHOP_RECEIVED_BERRY, Route104_PrettyPetalFlowerShop_EventScript_22A482 msgbox Route104_PrettyPetalFlowerShop_Text_2A7A98, MSGBOX_DEFAULT random 8 - addvar VAR_RESULT, 133 + addvar VAR_RESULT, FIRST_BERRY_INDEX giveitem_std VAR_RESULT compare VAR_RESULT, 0 goto_if_eq Common_EventScript_ShowBagIsFull -- cgit v1.2.3 From 5d30304f4e9ce26d4061cc3697439588126d6bdc Mon Sep 17 00:00:00 2001 From: GriffinR Date: Fri, 30 Aug 2019 23:06:43 -0400 Subject: Use OTID constants for CreateMon --- src/battle_controllers.c | 2 +- src/battle_factory.c | 4 ++-- src/battle_main.c | 6 +++--- src/battle_tower.c | 2 +- src/daycare.c | 4 ++-- src/egg_hatch.c | 2 +- src/field_specials.c | 2 +- src/frontier_util.c | 2 +- src/pokemon.c | 12 ++++++------ src/roamer.c | 2 +- src/script_pokemon_util_80F87D8.c | 4 ++-- src/trade.c | 4 ++-- 12 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/battle_controllers.c b/src/battle_controllers.c index 4b5bb7a8a..1225d1953 100644 --- a/src/battle_controllers.c +++ b/src/battle_controllers.c @@ -64,7 +64,7 @@ void SetUpBattleVarsAndBirchZigzagoon(void) if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, 0, 0); + CreateMon(&gEnemyParty[0], SPECIES_ZIGZAGOON, 2, 32, 0, 0, OT_ID_PLAYER_ID, 0); i = 0; SetMonData(&gEnemyParty[0], MON_DATA_HELD_ITEM, &i); } diff --git a/src/battle_factory.c b/src/battle_factory.c index 6c249bccc..bc47b1fda 100644 --- a/src/battle_factory.c +++ b/src/battle_factory.c @@ -415,7 +415,7 @@ static void SetPlayerAndOpponentParties(void) monLevel, ivs, TRUE, gSaveBlock2Ptr->frontier.rentalMons[i].personality, - 0, 0); + OT_ID_PLAYER_ID, 0); count = 0; bits = gFacilityTrainerMons[monSetId].evSpread; @@ -456,7 +456,7 @@ static void SetPlayerAndOpponentParties(void) monLevel, ivs, TRUE, gSaveBlock2Ptr->frontier.rentalMons[i + 3].personality, - 0, 0); + OT_ID_PLAYER_ID, 0); count = 0; bits = gFacilityTrainerMons[monSetId].evSpread; diff --git a/src/battle_main.c b/src/battle_main.c index 61b6a5a12..92e21db75 100644 --- a/src/battle_main.c +++ b/src/battle_main.c @@ -2004,7 +2004,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir personalityValue += nameHash << 8; fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0); + CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); for (j = 0; j < MAX_MON_MOVES; j++) { @@ -2022,7 +2022,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir personalityValue += nameHash << 8; fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0); + CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); break; @@ -2036,7 +2036,7 @@ static u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum, bool8 fir personalityValue += nameHash << 8; fixedIV = partyData[i].iv * 31 / 255; - CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, 2, 0); + CreateMon(&party[i], partyData[i].species, partyData[i].lvl, fixedIV, TRUE, personalityValue, OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&party[i], MON_DATA_HELD_ITEM, &partyData[i].heldItem); diff --git a/src/battle_tower.c b/src/battle_tower.c index 6f8e3e25f..8ef848e39 100644 --- a/src/battle_tower.c +++ b/src/battle_tower.c @@ -3190,7 +3190,7 @@ static void FillPartnerParty(u16 trainerId) sStevenMons[i].level, sStevenMons[i].fixedIV, TRUE, i, // BUG: personality was stored in the 'j' variable. As a result, Steven's pokemon do not have the intended natures. - TRUE, STEVEN_OTID); + OT_ID_PRESET, STEVEN_OTID); for (j = 0; j < 6; j++) SetMonData(&gPlayerParty[3 + i], MON_DATA_HP_EV + j, &sStevenMons[i].evs[j]); for (j = 0; j < MAX_MON_MOVES; j++) diff --git a/src/daycare.c b/src/daycare.c index 885ac31a1..2d05035d7 100644 --- a/src/daycare.c +++ b/src/daycare.c @@ -835,7 +835,7 @@ void CreateEgg(struct Pokemon *mon, u16 species, bool8 setHotSpringsLocation) u8 metLocation; u8 isEgg; - CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, FALSE, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; @@ -862,7 +862,7 @@ static void SetInitialEggData(struct Pokemon *mon, u16 species, struct DayCare * u8 language; personality = daycare->offspringPersonality; - CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, FALSE, 0); + CreateMon(mon, species, EGG_HATCH_LEVEL, 0x20, TRUE, personality, OT_ID_PLAYER_ID, 0); metLevel = 0; ball = ITEM_POKE_BALL; language = LANGUAGE_JAPANESE; diff --git a/src/egg_hatch.c b/src/egg_hatch.c index 835141ef2..5e16f1479 100644 --- a/src/egg_hatch.c +++ b/src/egg_hatch.c @@ -322,7 +322,7 @@ static void CreatedHatchedMon(struct Pokemon *egg, struct Pokemon *temp) pokerus = GetMonData(egg, MON_DATA_POKERUS); obedience = GetMonData(egg, MON_DATA_OBEDIENCE); - CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, 0, 0); + CreateMon(temp, species, EGG_HATCH_LEVEL, 32, TRUE, personality, OT_ID_PLAYER_ID, 0); for (i = 0; i < 4; i++) { diff --git a/src/field_specials.c b/src/field_specials.c index efe77bd70..99e8e93a9 100644 --- a/src/field_specials.c +++ b/src/field_specials.c @@ -1442,7 +1442,7 @@ void SetShoalItemFlag(u16 v0) void PutZigzagoonInPlayerParty(void) { u16 monData; - CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, FALSE, 0); + CreateMon(&gPlayerParty[0], SPECIES_ZIGZAGOON, 7, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0); monData = TRUE; SetMonData(&gPlayerParty[0], MON_DATA_ABILITY_NUM, &monData); monData = MOVE_TACKLE; diff --git a/src/frontier_util.c b/src/frontier_util.c index 4dd8159cb..536e23e30 100644 --- a/src/frontier_util.c +++ b/src/frontier_util.c @@ -2503,7 +2503,7 @@ void CreateFrontierBrainPokemon(void) monLevel, sFrontierBrainsMons[facility][symbol][i].fixedIV, TRUE, j, - TRUE, FRONTIER_BRAIN_OTID); + OT_ID_PRESET, FRONTIER_BRAIN_OTID); SetMonData(&gEnemyParty[monPartyId], MON_DATA_HELD_ITEM, &sFrontierBrainsMons[facility][symbol][i].heldItem); for (j = 0; j < NUM_STATS; j++) SetMonData(&gEnemyParty[monPartyId], MON_DATA_HP_EV + j, &sFrontierBrainsMons[facility][symbol][i].evs[j]); diff --git a/src/pokemon.c b/src/pokemon.c index df31bc6b3..f5e79243e 100644 --- a/src/pokemon.c +++ b/src/pokemon.c @@ -2341,7 +2341,7 @@ void CreateMonWithEVSpread(struct Pokemon *mon, u16 species, u8 level, u8 fixedI u16 evAmount; u8 evsBits; - CreateMon(mon, species, level, fixedIV, 0, 0, 0, 0); + CreateMon(mon, species, level, fixedIV, 0, 0, OT_ID_PLAYER_ID, 0); evsBits = evSpread; @@ -2373,7 +2373,7 @@ void CreateBattleTowerMon(struct Pokemon *mon, struct BattleTowerPokemon *src) u8 language; u8 value; - CreateMon(mon, src->species, src->level, 0, 1, src->personality, 1, src->otId); + CreateMon(mon, src->species, src->level, 0, 1, src->personality, OT_ID_PRESET, src->otId); for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); @@ -2435,7 +2435,7 @@ void CreateBattleTowerMon2(struct Pokemon *mon, struct BattleTowerPokemon *src, else level = src->level; - CreateMon(mon, src->species, level, 0, 1, src->personality, 1, src->otId); + CreateMon(mon, src->species, level, 0, 1, src->personality, OT_ID_PRESET, src->otId); for (i = 0; i < MAX_MON_MOVES; i++) SetMonMoveSlot(mon, src->moves[i], i); @@ -2497,7 +2497,7 @@ void CreateApprenticeMon(struct Pokemon *mon, const struct Apprentice *src, u8 m 0x1F, TRUE, personality, - TRUE, + OT_ID_PRESET, otId); SetMonData(mon, MON_DATA_HELD_ITEM, &src->party[monId].item); @@ -2527,7 +2527,7 @@ void CreateMonWithEVSpreadNatureOTID(struct Pokemon *mon, u16 species, u8 level, i = Random32(); } while (nature != GetNatureFromPersonality(i)); - CreateMon(mon, species, level, fixedIV, TRUE, i, TRUE, otId); + CreateMon(mon, species, level, fixedIV, TRUE, i, OT_ID_PRESET, otId); evsBits = evSpread; for (i = 0; i < NUM_STATS; i++) { @@ -4458,7 +4458,7 @@ void CreateSecretBaseEnemyParty(struct SecretBase *secretBaseRecord) 15, 1, gBattleResources->secretBase->party.personality[i], - 2, + OT_ID_RANDOM_NO_SHINY, 0); SetMonData(&gEnemyParty[i], MON_DATA_HELD_ITEM, &gBattleResources->secretBase->party.heldItems[i]); diff --git a/src/roamer.c b/src/roamer.c index be45642e0..8a67234e3 100644 --- a/src/roamer.c +++ b/src/roamer.c @@ -67,7 +67,7 @@ static void CreateInitialRoamerMon(bool16 createLatios) else (&gSaveBlock1Ptr->roamer)->species = SPECIES_LATIOS; - CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, 0, 0); + CreateMon(&gEnemyParty[0], (&gSaveBlock1Ptr->roamer)->species, 40, 0x20, 0, 0, OT_ID_PLAYER_ID, 0); (&gSaveBlock1Ptr->roamer)->level = 40; (&gSaveBlock1Ptr->roamer)->status = 0; (&gSaveBlock1Ptr->roamer)->active = TRUE; diff --git a/src/script_pokemon_util_80F87D8.c b/src/script_pokemon_util_80F87D8.c index 2c7a9c775..51bd73b1c 100755 --- a/src/script_pokemon_util_80F87D8.c +++ b/src/script_pokemon_util_80F87D8.c @@ -551,7 +551,7 @@ u8 ScriptGiveMon(u16 species, u8 level, u16 item, u32 unused1, u32 unused2, u8 u u8 heldItem[2]; struct Pokemon mon; - CreateMon(&mon, species, level, 32, 0, 0, 0, 0); + CreateMon(&mon, species, level, 32, 0, 0, OT_ID_PLAYER_ID, 0); heldItem[0] = item; heldItem[1] = item >> 8; SetMonData(&mon, MON_DATA_HELD_ITEM, heldItem); @@ -624,7 +624,7 @@ void CreateScriptedWildMon(u16 species, u8 level, u16 item) u8 heldItem[2]; ZeroEnemyPartyMons(); - CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, 0, 0); + CreateMon(&gEnemyParty[0], species, level, 0x20, 0, 0, OT_ID_PLAYER_ID, 0); if (item) { heldItem[0] = item; diff --git a/src/trade.c b/src/trade.c index 94accc43c..d95e4ebf5 100644 --- a/src/trade.c +++ b/src/trade.c @@ -1551,7 +1551,7 @@ static void sub_80773D0(void) for (i = 0; i < PARTY_SIZE; i++) { - CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, 0, 0); + CreateMon(&gEnemyParty[i], SPECIES_NONE, 0, 0x20, FALSE, 0, OT_ID_PLAYER_ID, 0); } sub_807A19C(0); @@ -5832,7 +5832,7 @@ static void _CreateInGameTradePokemon(u8 whichPlayerMon, u8 whichInGameTrade) u8 isMail; struct Pokemon *pokemon = &gEnemyParty[0]; - CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, TRUE, inGameTrade->otId); + CreateMon(pokemon, inGameTrade->species, level, 32, TRUE, inGameTrade->personality, OT_ID_PRESET, inGameTrade->otId); SetMonData(pokemon, MON_DATA_HP_IV, &inGameTrade->ivs[0]); SetMonData(pokemon, MON_DATA_ATK_IV, &inGameTrade->ivs[1]); -- cgit v1.2.3 From 1f4c88c95243e8d75f25d5b7868c837c47aa578d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 3 Sep 2019 15:33:11 -0400 Subject: Copy Berry Fix MB dism from FR (#777) * Copy Berry Fix MB dism from FR --- Makefile | 17 +- berry_fix/Makefile | 166 ++++ berry_fix/asm/berry_fix_header.inc | 35 + berry_fix/asm/loader.s | 119 +++ berry_fix/charmap.txt | 1067 +++++++++++++++++++++++ berry_fix/data/data.s | 4 + berry_fix/ld_script.sed | 14 + berry_fix/ld_script.txt | 31 + berry_fix/payload/Makefile | 172 ++++ berry_fix/payload/asm/crt0.s | 82 ++ berry_fix/payload/asm/libagbsyscall.s | 46 + berry_fix/payload/asm/macros/function.inc | 29 + berry_fix/payload/charmap.txt | 1067 +++++++++++++++++++++++ berry_fix/payload/common_syms/agb_flash.txt | 10 + berry_fix/payload/common_syms/main.txt | 9 + berry_fix/payload/common_syms/rtc.txt | 2 + berry_fix/payload/constants/gba_constants.inc | 490 +++++++++++ berry_fix/payload/graphics/debug_digits.png | Bin 0 -> 166 bytes berry_fix/payload/graphics/msg_box.png | Bin 0 -> 2631 bytes berry_fix/payload/graphics/msg_box.tilemap | Bin 0 -> 8192 bytes berry_fix/payload/include/constants/game_stat.h | 56 ++ berry_fix/payload/include/constants/vars.h | 196 +++++ berry_fix/payload/include/flash.h | 55 ++ berry_fix/payload/include/gba/defines.h | 87 ++ berry_fix/payload/include/gba/flash_internal.h | 85 ++ berry_fix/payload/include/gba/gba.h | 12 + berry_fix/payload/include/gba/io_reg.h | 770 ++++++++++++++++ berry_fix/payload/include/gba/isagbprint.h | 50 ++ berry_fix/payload/include/gba/m4a_internal.h | 467 ++++++++++ berry_fix/payload/include/gba/macro.h | 247 ++++++ berry_fix/payload/include/gba/multiboot.h | 55 ++ berry_fix/payload/include/gba/syscall.h | 57 ++ berry_fix/payload/include/gba/types.h | 146 ++++ berry_fix/payload/include/global.berry.h | 62 ++ berry_fix/payload/include/global.fieldmap.h | 317 +++++++ berry_fix/payload/include/global.h | 875 +++++++++++++++++++ berry_fix/payload/include/main.h | 45 + berry_fix/payload/include/pokemon.h | 154 ++++ berry_fix/payload/include/rtc.h | 15 + berry_fix/payload/include/siirtc.h | 54 ++ berry_fix/payload/ld_script.sed | 14 + berry_fix/payload/ld_script.txt | 107 +++ berry_fix/payload/rom.sha1 | 1 + berry_fix/payload/src/agb_flash.c | 296 +++++++ berry_fix/payload/src/agb_flash_1m.c | 86 ++ berry_fix/payload/src/agb_flash_le.c | 31 + berry_fix/payload/src/agb_flash_mx.c | 193 ++++ berry_fix/payload/src/flash.c | 752 ++++++++++++++++ berry_fix/payload/src/main.c | 289 ++++++ berry_fix/payload/src/rtc.c | 346 ++++++++ berry_fix/payload/src/siirtc.c | 432 +++++++++ berry_fix/payload/sym_bss.txt | 5 + berry_fix/payload/sym_common.txt | 29 + berry_fix/payload/sym_ewram.txt | 3 + berry_fix/rom.sha1 | 1 + data/berry_fix.mb | Bin 15348 -> 0 bytes data/multiboot_berry_glitch_fix.s | 2 +- tools/gbagfx/Makefile | 9 +- tools/gbagfx/huff.c | 398 +++++++++ tools/gbagfx/huff.h | 38 + tools/gbagfx/lz.c | 4 +- tools/gbagfx/lz.h | 2 +- tools/gbagfx/main.c | 74 +- tools/ramscrgen/elf.cpp | 101 ++- tools/ramscrgen/elf.h | 2 +- tools/ramscrgen/main.cpp | 24 +- 66 files changed, 10373 insertions(+), 31 deletions(-) create mode 100644 berry_fix/Makefile create mode 100644 berry_fix/asm/berry_fix_header.inc create mode 100644 berry_fix/asm/loader.s create mode 100644 berry_fix/charmap.txt create mode 100644 berry_fix/data/data.s create mode 100644 berry_fix/ld_script.sed create mode 100644 berry_fix/ld_script.txt create mode 100644 berry_fix/payload/Makefile create mode 100644 berry_fix/payload/asm/crt0.s create mode 100644 berry_fix/payload/asm/libagbsyscall.s create mode 100644 berry_fix/payload/asm/macros/function.inc create mode 100644 berry_fix/payload/charmap.txt create mode 100644 berry_fix/payload/common_syms/agb_flash.txt create mode 100644 berry_fix/payload/common_syms/main.txt create mode 100644 berry_fix/payload/common_syms/rtc.txt create mode 100644 berry_fix/payload/constants/gba_constants.inc create mode 100644 berry_fix/payload/graphics/debug_digits.png create mode 100644 berry_fix/payload/graphics/msg_box.png create mode 100644 berry_fix/payload/graphics/msg_box.tilemap create mode 100644 berry_fix/payload/include/constants/game_stat.h create mode 100644 berry_fix/payload/include/constants/vars.h create mode 100644 berry_fix/payload/include/flash.h create mode 100644 berry_fix/payload/include/gba/defines.h create mode 100644 berry_fix/payload/include/gba/flash_internal.h create mode 100644 berry_fix/payload/include/gba/gba.h create mode 100644 berry_fix/payload/include/gba/io_reg.h create mode 100644 berry_fix/payload/include/gba/isagbprint.h create mode 100644 berry_fix/payload/include/gba/m4a_internal.h create mode 100644 berry_fix/payload/include/gba/macro.h create mode 100644 berry_fix/payload/include/gba/multiboot.h create mode 100644 berry_fix/payload/include/gba/syscall.h create mode 100644 berry_fix/payload/include/gba/types.h create mode 100644 berry_fix/payload/include/global.berry.h create mode 100644 berry_fix/payload/include/global.fieldmap.h create mode 100644 berry_fix/payload/include/global.h create mode 100644 berry_fix/payload/include/main.h create mode 100644 berry_fix/payload/include/pokemon.h create mode 100644 berry_fix/payload/include/rtc.h create mode 100644 berry_fix/payload/include/siirtc.h create mode 100644 berry_fix/payload/ld_script.sed create mode 100644 berry_fix/payload/ld_script.txt create mode 100644 berry_fix/payload/rom.sha1 create mode 100644 berry_fix/payload/src/agb_flash.c create mode 100644 berry_fix/payload/src/agb_flash_1m.c create mode 100644 berry_fix/payload/src/agb_flash_le.c create mode 100644 berry_fix/payload/src/agb_flash_mx.c create mode 100644 berry_fix/payload/src/flash.c create mode 100644 berry_fix/payload/src/main.c create mode 100644 berry_fix/payload/src/rtc.c create mode 100644 berry_fix/payload/src/siirtc.c create mode 100644 berry_fix/payload/sym_bss.txt create mode 100644 berry_fix/payload/sym_common.txt create mode 100644 berry_fix/payload/sym_ewram.txt create mode 100644 berry_fix/rom.sha1 delete mode 100644 data/berry_fix.mb create mode 100644 tools/gbagfx/huff.c create mode 100644 tools/gbagfx/huff.h diff --git a/Makefile b/Makefile index 6222e8787..e38869ca6 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,5 @@ TOOLCHAIN := $(DEVKITARM) +COMPARE ?= 0 ifeq ($(CC),) HOSTCC := gcc @@ -108,7 +109,7 @@ MAKEFLAGS += --no-print-directory # Secondary expansion is required for dependency variables in object rules. .SECONDEXPANSION: -.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) +.PHONY: all rom clean compare tidy tools mostlyclean clean-tools $(TOOLDIRS) berry_fix infoshell = $(foreach line, $(shell $1 | sed "s/ /__SPACE__/g"), $(info $(subst __SPACE__, ,$(line)))) @@ -154,11 +155,13 @@ tools: $(TOOLDIRS) $(TOOLDIRS): @$(MAKE) -C $@ CC=$(HOSTCC) CXX=$(HOSTCXX) -rom: $(ROM) +rom: berry_fix $(ROM) +ifeq ($(COMPARE),1) + @$(SHA1) rom.sha1 +endif # For contributors to make sure a change didn't affect the contents of the ROM. -compare: all - @$(SHA1) rom.sha1 +compare: ; @$(MAKE) COMPARE=1 clean: mostlyclean clean-tools @@ -173,6 +176,7 @@ mostlyclean: tidy rm -f $(DATA_ASM_SUBDIR)/maps/connections.inc $(DATA_ASM_SUBDIR)/maps/events.inc $(DATA_ASM_SUBDIR)/maps/groups.inc $(DATA_ASM_SUBDIR)/maps/headers.inc find $(DATA_ASM_SUBDIR)/maps \( -iname 'connections.inc' -o -iname 'events.inc' -o -iname 'header.inc' \) -exec rm {} + rm -f $(AUTO_GEN_TARGETS) + @$(MAKE) clean -C berry_fix tidy: rm -f $(ROM) $(ELF) $(MAP) @@ -297,3 +301,8 @@ $(ROM): $(ELF) $(FIX) $@ -p --silent modern: ; @$(MAKE) MODERN=1 + +berry_fix/berry_fix.gba: berry_fix + +berry_fix: + @$(MAKE) -C berry_fix COMPARE=$(COMPARE) diff --git a/berry_fix/Makefile b/berry_fix/Makefile new file mode 100644 index 000000000..2bc225eba --- /dev/null +++ b/berry_fix/Makefile @@ -0,0 +1,166 @@ +include $(DEVKITARM)/base_tools +export CPP := $(PREFIX)cpp +export LD := $(PREFIX)ld +COMPARE ?= 0 + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +GAME_CODE := AGBJ +MAKER_CODE := 01 +REVISION := 0 + +SHELL := /bin/bash -o pipefail + +CPPFLAGS := -I ../tools/agbcc/include -I ../tools/agbcc -iquote include -nostdinc -undef + +ROM := berry_fix.gba +OBJ_DIR := build +CC1 := ../tools/agbcc/bin/agbcc$(EXE) +override CFLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm + + +ELF = $(ROM:.gba=.elf) +MAP = $(ROM:.gba=.map) + +C_SUBDIR = src +ASM_SUBDIR = asm +DATA_ASM_SUBDIR = data + +C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR) +ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR) +DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR) + +ASFLAGS := -mcpu=arm7tdmi + +LDFLAGS = -Map ../$(MAP) + +SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c +GFX := ../tools/gbagfx/gbagfx$(EXE) +AIF := ../tools/aif2pcm/aif2pcm$(EXE) +MID := ../tools/mid2agb/mid2agb$(EXE) +SCANINC := ../tools/scaninc/scaninc$(EXE) +PREPROC := ../tools/preproc/preproc$(EXE) +RAMSCRGEN := ../tools/ramscrgen/ramscrgen$(EXE) +FIX := ../tools/gbafix/gbafix$(EXE) + +# Clear the default suffixes +.SUFFIXES: +# Don't delete intermediate files +.SECONDARY: +# Delete files that weren't built properly +.DELETE_ON_ERROR: + +# Secondary expansion is required for dependency variables in object rules. +.SECONDEXPANSION: + +.PHONY: all rom clean compare tidy payload + +C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c) +C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) + +ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s) +ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS)) + +DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s) +DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS)) + +SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s) +SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS)) + +MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid) +MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS)) + +OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) +# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS)) + +SUBDIRS := $(sort $(dir $(OBJS))) + +$(shell mkdir -p $(SUBDIRS)) + +all: payload rom + @: + +rom: $(ROM) +ifeq ($(COMPARE),1) + @$(SHA1) rom.sha1 +endif + +# For contributors to make sure a change didn't affect the contents of the ROM. +compare: ; @$(MAKE) COMPARE=1 + +clean: tidy + rm -f sound/direct_sound_samples/*.bin + rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + + make -C payload clean + +tidy: + rm -f $(ROM) $(ELF) $(MAP) + rm -r build/* + make -C payload tidy + +%.s: ; +%.png: ; +%.pal: ; +%.aif: ; + +%.1bpp: %.png ; $(GFX) $< $@ +%.4bpp: %.png ; $(GFX) $< $@ +%.8bpp: %.png ; $(GFX) $< $@ +%.gbapal: %.pal ; $(GFX) $< $@ +%.gbapal: %.png ; $(GFX) $< $@ +%.lz: % ; $(GFX) $< $@ +%.rl: % ; $(GFX) $< $@ + + +ifeq ($(NODEP),1) +$(C_BUILDDIR)/%.o: c_dep := +else +$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c) +endif + +$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep) + @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i + @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CFLAGS) -o $(C_BUILDDIR)/$*.s + $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s + +ifeq ($(NODEP),1) +$(ASM_BUILDDIR)/%.o: asm_dep := +else +$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s) +endif + +$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep) + $(AS) $(ASFLAGS) -o $@ $< + +ifeq ($(NODEP),1) +$(DATA_ASM_BUILDDIR)/%.o: data_dep := +else +$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s) +endif + +payload: + @$(MAKE) -C payload COMPARE=$(COMPARE) + +payload/payload.gba: payload + +data/payload.gba.lz: payload/payload.gba + $(GFX) $< $@ -search 1 + +$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep) + $(PREPROC) $< charmap.txt | $(CPP) -I include - | $(AS) $(ASFLAGS) -o $@ + +$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s + $(AS) $(ASFLAGS) -I sound -o $@ $< + +$(ELF): ld_script.txt $(OBJS) + cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ../ld_script.txt -o ../$@ + +$(ROM): $(ELF) + $(OBJCOPY) -O binary $< $@ + $(FIX) $@ -c$(GAME_CODE) -m$(MAKER_CODE) -r$(REVISION) --silent + diff --git a/berry_fix/asm/berry_fix_header.inc b/berry_fix/asm/berry_fix_header.inc new file mode 100644 index 000000000..5167d2ff0 --- /dev/null +++ b/berry_fix/asm/berry_fix_header.inc @@ -0,0 +1,35 @@ + .global BerryFixMBHeaderNintendoLogo +BerryFixMBHeaderNintendoLogo: + .space 156 + +BerryFixMBHeaderGameTitle: + .space 12 + + .global BerryFixMBHeaderGameCode +BerryFixMBHeaderGameCode: + .space 4 + +BerryFixMBHeaderMakerCode: + .space 2 + +BerryFixMBHeaderMagic: + .byte 0 + +BerryFixMBHeaderMainUnitCode: + .byte 0 + +BerryFixMBHeaderDeviceType: + .byte 0 + +BerryFixMBHeaderReserved1: + .space 7 + + .global BerryFixMBHeaderSoftwareVersion +BerryFixMBHeaderSoftwareVersion: + .byte 0 + +BerryFixMBHeaderChecksum: + .byte 0 + +BerryFixMBHeaderReserved2: + .space 2 diff --git a/berry_fix/asm/loader.s b/berry_fix/asm/loader.s new file mode 100644 index 000000000..39e0b768a --- /dev/null +++ b/berry_fix/asm/loader.s @@ -0,0 +1,119 @@ + .include "../asm/macros/asm.inc" + .include "../asm/macros/function.inc" + .include "../constants/gba_constants.inc" + + .set SIO_ERROR, 0x0040 + .set SIO_MULTI_BUSY, 0x0080 + + .set EWRAM_ORIG, 0x02000000 + .set gCode, 0x02010000 + .set PROG_ORIG, 0x00008000 + + .syntax unified + + .text + + arm_func_start _start +_start: @ 0 + b _entry + arm_func_end _start + + .include "asm/berry_fix_header.inc" + +@ C0 + .word 0 + + .global _GPIOPortData +_GPIOPortData: @ C4 + .2byte 0 + + .global _GPIOPortDirection +_GPIOPortDirection: @ C6 + .2byte 0 + + .global _GPIOPortReadEnable +_GPIOPortReadEnable: @ C8 + .2byte 0 + +@ CA + .2byte 0 + +@ CC + .space 0x34 + + arm_func_start _entry +_entry: @ 100 + b _send + arm_func_end _entry + + .space 0x1C + + arm_func_start _recv +_recv: + @ Waits until link cable is no longer busy. + @ Returns nz if an error has occurred + @ Otherwise, returns the received short in r1. + @ Preserves r0 +_120: + ldrh r1, [r0, 0x8] @ SIOCNT + tst r1, SIO_MULTI_BUSY + beq _120 +_12c: + ldrh r1, [r0, 0x8] @ SIOCNT + tst r1, SIO_MULTI_BUSY + bne _12c + ldrh r1, [r0, 0x8] @ SIOCNT + tst r1, SIO_ERROR + bxne lr + ldrh r1, [r0] @ SIOMULTI0 + bx lr + arm_func_end _recv + + arm_func_start _send +_send: @ 14c + ldr r0, =REG_SIOMULTI0 +_150: + bl _recv + bne _150 + mov r2, 0 + strh r2, [r0, 0xa] @ SIOMLT_SEND + cmp r1, 0 + bne _150 + mov r2, 0x8000 +_16c: + mov r1, 0 +_170: + strh r1, [r0, 0xa] @ SIOMLT_SEND + bl _recv + bne _150 + cmp r1, r2 + bne _16c + lsr r2, 5 + cmp r1, 0 + bne _170 + ldr r3, =BerryFixMBHeaderGameCode + ldrh r2, [r3] + strh r2, [r0, 0xa] @ SIOMLT_SEND + bl _recv +_1a0: + bne _1a0 + cmp r1, r2 + bne _1a0 + ldrh r2, [r3, 0x2] + strh r2, [r0, 0xa] @ SIOMLT_SEND + bl _recv + bne _1a0 + cmp r1, r2 + bne _1a0 + mov r1, 0 + strh r1, [r0, 0xa] @ SIOMLT_SEND + ldr r0, =_data_2f0 + ldr r1, =gCode + swi 0x11 << 16 + ldr lr, =gCode + bx lr + .pool + arm_func_end _send + @ 1f0 + + .align 2, 0 @ don't pad with nop diff --git a/berry_fix/charmap.txt b/berry_fix/charmap.txt new file mode 100644 index 000000000..a736b40f2 --- /dev/null +++ b/berry_fix/charmap.txt @@ -0,0 +1,1067 @@ +' ' = 00 +'À' = 01 +'Á' = 02 +'Â' = 03 +'Ç' = 04 +'È' = 05 +'É' = 06 +'Ê' = 07 +'Ë' = 08 +'Ì' = 09 +'Î' = 0B +'Ï' = 0C +'Ò' = 0D +'Ó' = 0E +'Ô' = 0F +'Œ' = 10 +'Ù' = 11 +'Ú' = 12 +'Û' = 13 +'Ñ' = 14 +'ß' = 15 +'à' = 16 +'á' = 17 +'ç' = 19 +'è' = 1A +'é' = 1B +'ê' = 1C +'ë' = 1D +'ì' = 1E +'î' = 20 +'ï' = 21 +'ò' = 22 +'ó' = 23 +'ô' = 24 +'œ' = 25 +'ù' = 26 +'ú' = 27 +'û' = 28 +'ñ' = 29 +'º' = 2A +'ª' = 2B +SUPER_ER = 2C +'&' = 2D +'+' = 2E +LV = 34 +'=' = 35 +';' = 36 +'¿' = 51 +'¡' = 52 +PK = 53 +PKMN = 53 54 +POKEBLOCK = 55 56 57 58 59 +'Í' = 5A +'%' = 5B +'(' = 5C +')' = 5D +'â' = 68 +'í' = 6F +UNK_SPACER = 77 +UP_ARROW = 79 +DOWN_ARROW = 7A +LEFT_ARROW = 7B +RIGHT_ARROW = 7C +'0' = A1 +'1' = A2 +'2' = A3 +'3' = A4 +'4' = A5 +'5' = A6 +'6' = A7 +'7' = A8 +'8' = A9 +'9' = AA +'!' = AB +'?' = AC +'.' = AD +'-' = AE +'·' = AF +'…' = B0 +'“' = B1 +'”' = B2 +'‘' = B3 +'’' = B4 +'♂' = B5 +'♀' = B6 +'¥' = B7 +',' = B8 +'×' = B9 +'/' = BA +'A' = BB +'B' = BC +'C' = BD +'D' = BE +'E' = BF +'F' = C0 +'G' = C1 +'H' = C2 +'I' = C3 +'J' = C4 +'K' = C5 +'L' = C6 +'M' = C7 +'N' = C8 +'O' = C9 +'P' = CA +'Q' = CB +'R' = CC +'S' = CD +'T' = CE +'U' = CF +'V' = D0 +'W' = D1 +'X' = D2 +'Y' = D3 +'Z' = D4 +'a' = D5 +'b' = D6 +'c' = D7 +'d' = D8 +'e' = D9 +'f' = DA +'g' = DB +'h' = DC +'i' = DD +'j' = DE +'k' = DF +'l' = E0 +'m' = E1 +'n' = E2 +'o' = E3 +'p' = E4 +'q' = E5 +'r' = E6 +'s' = E7 +'t' = E8 +'u' = E9 +'v' = EA +'w' = EB +'x' = EC +'y' = ED +'z' = EE +'▶' = EF +':' = F0 +'Ä' = F1 +'Ö' = F2 +'Ü' = F3 +'ä' = F4 +'ö' = F5 +'ü' = F6 +TALL_PLUS = FC 0C FB +'$' = FF + +@ Hiragana +'あ' = 01 +'い' = 02 +'う' = 03 +'え' = 04 +'お' = 05 +'か' = 06 +'き' = 07 +'く' = 08 +'け' = 09 +'こ' = 0A +'さ' = 0B +'し' = 0C +'す' = 0D +'せ' = 0E +'そ' = 0F +'た' = 10 +'ち' = 11 +'つ' = 12 +'て' = 13 +'と' = 14 +'な' = 15 +'に' = 16 +'ぬ' = 17 +'ね' = 18 +'の' = 19 +'は' = 1A +'ひ' = 1B +'ふ' = 1C +'へ' = 1D +'ほ' = 1E +'ま' = 1F +'み' = 20 +'む' = 21 +'め' = 22 +'も' = 23 +'や' = 24 +'ゆ' = 25 +'よ' = 26 +'ら' = 27 +'り' = 28 +'る' = 29 +'れ' = 2A +'ろ' = 2B +'わ' = 2C +'を' = 2D +'ん' = 2E +'ぁ' = 2F +'ぃ' = 30 +'ぅ' = 31 +'ぇ' = 32 +'ぉ' = 33 +'ゃ' = 34 +'ゅ' = 35 +'ょ' = 36 +'が' = 37 +'ぎ' = 38 +'ぐ' = 39 +'げ' = 3A +'ご' = 3B +'ざ' = 3C +'じ' = 3D +'ず' = 3E +'ぜ' = 3F +'ぞ' = 40 +'だ' = 41 +'ぢ' = 42 +'づ' = 43 +'で' = 44 +'ど' = 45 +'ば' = 46 +'び' = 47 +'ぶ' = 48 +'べ' = 49 +'ぼ' = 4A +'ぱ' = 4B +'ぴ' = 4C +'ぷ' = 4D +'ぺ' = 4E +'ぽ' = 4F +'っ' = 50 + +@ Katakana +'ア' = 51 +'イ' = 52 +'ウ' = 53 +'エ' = 54 +'オ' = 55 +'カ' = 56 +'キ' = 57 +'ク' = 58 +'ケ' = 59 +'コ' = 5A +'サ' = 5B +'シ' = 5C +'ス' = 5D +'セ' = 5E +'ソ' = 5F +'タ' = 60 +'チ' = 61 +'ツ' = 62 +'テ' = 63 +'ト' = 64 +'ナ' = 65 +'ニ' = 66 +'ヌ' = 67 +'ネ' = 68 +'ノ' = 69 +'ハ' = 6A +'ヒ' = 6B +'フ' = 6C +'ヘ' = 6D +'ホ' = 6E +'マ' = 6F +'ミ' = 70 +'ム' = 71 +'メ' = 72 +'モ' = 73 +'ヤ' = 74 +'ユ' = 75 +'ヨ' = 76 +'ラ' = 77 +'リ' = 78 +'ル' = 79 +'レ' = 7A +'ロ' = 7B +'ワ' = 7C +'ヲ' = 7D +'ン' = 7E +'ァ' = 7F +'ィ' = 80 +'ゥ' = 81 +'ェ' = 82 +'ォ' = 83 +'ャ' = 84 +'ュ' = 85 +'ョ' = 86 +'ガ' = 87 +'ギ' = 88 +'グ' = 89 +'ゲ' = 8A +'ゴ' = 8B +'ザ' = 8C +'ジ' = 8D +'ズ' = 8E +'ゼ' = 8F +'ゾ' = 90 +'ダ' = 91 +'ヂ' = 92 +'ヅ' = 93 +'デ' = 94 +'ド' = 95 +'バ' = 96 +'ビ' = 97 +'ブ' = 98 +'ベ' = 99 +'ボ' = 9A +'パ' = 9B +'ピ' = 9C +'プ' = 9D +'ペ' = 9E +'ポ' = 9F +'ッ' = A0 + +@ Japanese punctuation +' ' = 00 +'!' = AB +'?' = AC +'。' = AD +'ー' = AE +'⋯' = B0 + +STRING = FD + +@ string placeholders +PLAYER = FD 01 +STR_VAR_1 = FD 02 +STR_VAR_2 = FD 03 +STR_VAR_3 = FD 04 +KUN = FD 05 +RIVAL = FD 06 +@ version-dependent strings (originally made for Ruby/Sapphire differences) +@ Emerald uses the Sapphire strings (except for VERSION). +VERSION = FD 07 @ "EMERALD" +AQUA = FD 08 +MAGMA = FD 09 +ARCHIE = FD 0A +MAXIE = FD 0B +KYOGRE = FD 0C +GROUDON = FD 0D + +@ battle string placeholders + +B_BUFF1 = FD 00 +B_BUFF2 = FD 01 +B_COPY_VAR_1 = FD 02 +B_COPY_VAR_2 = FD 03 +B_COPY_VAR_3 = FD 04 +B_PLAYER_MON1_NAME = FD 05 +B_OPPONENT_MON1_NAME = FD 06 +B_PLAYER_MON2_NAME = FD 07 +B_OPPONENT_MON2_NAME = FD 08 +B_LINK_PLAYER_MON1_NAME = FD 09 +B_LINK_OPPONENT_MON1_NAME = FD 0A +B_LINK_PLAYER_MON2_NAME = FD 0B +B_LINK_OPPONENT_MON2_NAME = FD 0C +B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D +B_ATK_PARTNER_NAME = FD 0E +B_ATK_NAME_WITH_PREFIX = FD 0F +B_DEF_NAME_WITH_PREFIX = FD 10 +B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler +B_ACTIVE_NAME_WITH_PREFIX = FD 12 +B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13 +B_CURRENT_MOVE = FD 14 +B_LAST_MOVE = FD 15 +B_LAST_ITEM = FD 16 +B_LAST_ABILITY = FD 17 +B_ATK_ABILITY = FD 18 +B_DEF_ABILITY = FD 19 +B_SCR_ACTIVE_ABILITY = FD 1A +B_EFF_ABILITY = FD 1B +B_TRAINER1_CLASS = FD 1C +B_TRAINER1_NAME = FD 1D +B_LINK_PLAYER_NAME = FD 1E +B_LINK_PARTNER_NAME = FD 1F +B_LINK_OPPONENT1_NAME = FD 20 +B_LINK_OPPONENT2_NAME = FD 21 +B_LINK_SCR_TRAINER_NAME = FD 22 +B_PLAYER_NAME = FD 23 +B_TRAINER1_LOSE_TEXT = FD 24 +B_TRAINER1_WIN_TEXT = FD 25 +B_26 = FD 26 +B_PC_CREATOR_NAME = FD 27 +B_ATK_PREFIX1 = FD 28 +B_DEF_PREFIX1 = FD 29 +B_ATK_PREFIX2 = FD 2A +B_DEF_PREFIX2 = FD 2B +B_ATK_PREFIX3 = FD 2C +B_DEF_PREFIX3 = FD 2D +B_TRAINER2_CLASS = FD 2E +B_TRAINER2_NAME = FD 2F +B_TRAINER2_LOSE_TEXT = FD 30 +B_TRAINER2_WIN_TEXT = FD 31 +B_PARTNER_CLASS = FD 32 +B_PARTNER_NAME = FD 33 +B_BUFF3 = FD 34 + +@ indicates the end of a town/city name (before " TOWN" or " CITY") +NAME_END = FC 00 + +@ special 0xF7 character +SPECIAL_F7 = F7 + +@ more text functions + +COLOR = FC 01 @ use a color listed below right after +HIGHLIGHT = FC 02 @ same as fc 01 +SHADOW = FC 03 @ same as fc 01 +COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes +PALETTE = FC 05 @ used in credits +SIZE = FC 06 @ note that anything other than "SMALL" is invalid +UNKNOWN_7 = FC 07 +PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them +PAUSE_UNTIL_PRESS = FC 09 +UNKNOWN_A = FC 0A +PLAY_BGM = FC 0B +ESCAPE = FC 0C +SHIFT_TEXT = FC 0D +UNKNOWN_E = FC 0E +UNKNOWN_F = FC 0F +PLAY_SE = FC 10 +CLEAR = FC 11 +SKIP = FC 12 +CLEAR_TO = FC 13 +UNKNOWN_14 = FC 14 +JPN = FC 15 +ENG = FC 16 +PAUSE_MUSIC = FC 17 +RESUME_MUSIC = FC 18 + +@ colors + +TRANSPARENT = 00 +WHITE = 01 +DARK_GREY = 02 +LIGHT_GREY = 03 +RED = 04 +LIGHT_RED = 05 +GREEN = 06 +LIGHT_GREEN = 07 +BLUE = 08 +LIGHT_BLUE = 09 +@ these next colors can be set to anything arbitrary at runtime +@ usually though they'll have the textbox border colors as described below +DYNAMIC_COLOR1 = 0A @ white +DYNAMIC_COLOR2 = 0B @ white with a tinge of green +DYNAMIC_COLOR3 = 0C @ white 2 +DYNAMIC_COLOR4 = 0D @ aquamarine +DYNAMIC_COLOR5 = 0E @ blue-green +DYNAMIC_COLOR6 = 0F @ cerulean + +@ sound and music + +MUS_DUMMY = 00 00 +SE_KAIFUKU = 01 00 +SE_PC_LOGIN = 02 00 +SE_PC_OFF = 03 00 +SE_PC_ON = 04 00 +SE_SELECT = 05 00 +SE_WIN_OPEN = 06 00 +SE_WALL_HIT = 07 00 +SE_DOOR = 08 00 +SE_KAIDAN = 09 00 +SE_DANSA = 0A 00 +SE_JITENSYA = 0B 00 +SE_KOUKA_L = 0C 00 +SE_KOUKA_M = 0D 00 +SE_KOUKA_H = 0E 00 +SE_BOWA2 = 0F 00 +SE_POKE_DEAD = 10 00 +SE_NIGERU = 11 00 +SE_JIDO_DOA = 12 00 +SE_NAMINORI = 13 00 +SE_BAN = 14 00 +SE_PIN = 15 00 +SE_BOO = 16 00 +SE_BOWA = 17 00 +SE_JYUNI = 18 00 +SE_A = 19 00 +SE_I = 1A 00 +SE_U = 1B 00 +SE_E = 1C 00 +SE_O = 1D 00 +SE_N = 1E 00 +SE_SEIKAI = 1F 00 +SE_HAZURE = 20 00 +SE_EXP = 21 00 +SE_JITE_PYOKO = 22 00 +SE_MU_PACHI = 23 00 +SE_TK_KASYA = 24 00 +SE_FU_ZAKU = 25 00 +SE_FU_ZAKU2 = 26 00 +SE_FU_ZUZUZU = 27 00 +SE_RU_GASHIN = 28 00 +SE_RU_GASYAN = 29 00 +SE_RU_BARI = 2A 00 +SE_RU_HYUU = 2B 00 +SE_KI_GASYAN = 2C 00 +SE_TK_WARPIN = 2D 00 +SE_TK_WARPOUT = 2E 00 +SE_TU_SAA = 2F 00 +SE_HI_TURUN = 30 00 +SE_TRACK_MOVE = 31 00 +SE_TRACK_STOP = 32 00 +SE_TRACK_HAIKI = 33 00 +SE_TRACK_DOOR = 34 00 +SE_MOTER = 35 00 +SE_CARD = 36 00 +SE_SAVE = 37 00 +SE_KON = 38 00 +SE_KON2 = 39 00 +SE_KON3 = 3A 00 +SE_KON4 = 3B 00 +SE_SUIKOMU = 3C 00 +SE_NAGERU = 3D 00 +SE_TOY_C = 3E 00 +SE_TOY_D = 3F 00 +SE_TOY_E = 40 00 +SE_TOY_F = 41 00 +SE_TOY_G = 42 00 +SE_TOY_A = 43 00 +SE_TOY_B = 44 00 +SE_TOY_C1 = 45 00 +SE_MIZU = 46 00 +SE_HASHI = 47 00 +SE_DAUGI = 48 00 +SE_PINPON = 49 00 +SE_FUUSEN1 = 4A 00 +SE_FUUSEN2 = 4B 00 +SE_FUUSEN3 = 4C 00 +SE_TOY_KABE = 4D 00 +SE_TOY_DANGO = 4E 00 +SE_DOKU = 4F 00 +SE_ESUKA = 50 00 +SE_T_AME = 51 00 +SE_T_AME_E = 52 00 +SE_T_OOAME = 53 00 +SE_T_OOAME_E = 54 00 +SE_T_KOAME = 55 00 +SE_T_KOAME_E = 56 00 +SE_T_KAMI = 57 00 +SE_T_KAMI2 = 58 00 +SE_ELEBETA = 59 00 +SE_HINSI = 5A 00 +SE_EXPMAX = 5B 00 +SE_TAMAKORO = 5C 00 +SE_TAMAKORO_E = 5D 00 +SE_BASABASA = 5E 00 +SE_REGI = 5F 00 +SE_C_GAJI = 60 00 +SE_C_MAKU_U = 61 00 +SE_C_MAKU_D = 62 00 +SE_C_PASI = 63 00 +SE_C_SYU = 64 00 +SE_C_PIKON = 65 00 +SE_REAPOKE = 66 00 +SE_OP_BASYU = 67 00 +SE_BT_START = 68 00 +SE_DENDOU = 69 00 +SE_JIHANKI = 6A 00 +SE_TAMA = 6B 00 +SE_Z_SCROLL = 6C 00 +SE_Z_PAGE = 6D 00 +SE_PN_ON = 6E 00 +SE_PN_OFF = 6F 00 +SE_Z_SEARCH = 70 00 +SE_TAMAGO = 71 00 +SE_TB_START = 72 00 +SE_TB_KON = 73 00 +SE_TB_KARA = 74 00 +SE_BIDORO = 75 00 +SE_W085 = 76 00 +SE_W085B = 77 00 +SE_W231 = 78 00 +SE_W171 = 79 00 +SE_W233 = 7A 00 +SE_W233B = 7B 00 +SE_W145 = 7C 00 +SE_W145B = 7D 00 +SE_W145C = 7E 00 +SE_W240 = 7F 00 +SE_W015 = 80 00 +SE_W081 = 81 00 +SE_W081B = 82 00 +SE_W088 = 83 00 +SE_W016 = 84 00 +SE_W016B = 85 00 +SE_W003 = 86 00 +SE_W104 = 87 00 +SE_W013 = 88 00 +SE_W196 = 89 00 +SE_W086 = 8A 00 +SE_W004 = 8B 00 +SE_W025 = 8C 00 +SE_W025B = 8D 00 +SE_W152 = 8E 00 +SE_W026 = 8F 00 +SE_W172 = 90 00 +SE_W172B = 91 00 +SE_W053 = 92 00 +SE_W007 = 93 00 +SE_W092 = 94 00 +SE_W221 = 95 00 +SE_W221B = 96 00 +SE_W052 = 97 00 +SE_W036 = 98 00 +SE_W059 = 99 00 +SE_W059B = 9A 00 +SE_W010 = 9B 00 +SE_W011 = 9C 00 +SE_W017 = 9D 00 +SE_W019 = 9E 00 +SE_W028 = 9F 00 +SE_W013B = A0 00 +SE_W044 = A1 00 +SE_W029 = A2 00 +SE_W057 = A3 00 +SE_W056 = A4 00 +SE_W250 = A5 00 +SE_W030 = A6 00 +SE_W039 = A7 00 +SE_W054 = A8 00 +SE_W077 = A9 00 +SE_W020 = AA 00 +SE_W082 = AB 00 +SE_W047 = AC 00 +SE_W195 = AD 00 +SE_W006 = AE 00 +SE_W091 = AF 00 +SE_W146 = B0 00 +SE_W120 = B1 00 +SE_W153 = B2 00 +SE_W071B = B3 00 +SE_W071 = B4 00 +SE_W103 = B5 00 +SE_W062 = B6 00 +SE_W062B = B7 00 +SE_W048 = B8 00 +SE_W187 = B9 00 +SE_W118 = BA 00 +SE_W155 = BB 00 +SE_W122 = BC 00 +SE_W060 = BD 00 +SE_W185 = BE 00 +SE_W014 = BF 00 +SE_W043 = C0 00 +SE_W207 = C1 00 +SE_W207B = C2 00 +SE_W215 = C3 00 +SE_W109 = C4 00 +SE_W173 = C5 00 +SE_W280 = C6 00 +SE_W202 = C7 00 +SE_W060B = C8 00 +SE_W076 = C9 00 +SE_W080 = CA 00 +SE_W100 = CB 00 +SE_W107 = CC 00 +SE_W166 = CD 00 +SE_W129 = CE 00 +SE_W115 = CF 00 +SE_W112 = D0 00 +SE_W197 = D1 00 +SE_W199 = D2 00 +SE_W236 = D3 00 +SE_W204 = D4 00 +SE_W268 = D5 00 +SE_W070 = D6 00 +SE_W063 = D7 00 +SE_W127 = D8 00 +SE_W179 = D9 00 +SE_W151 = DA 00 +SE_W201 = DB 00 +SE_W161 = DC 00 +SE_W161B = DD 00 +SE_W227 = DE 00 +SE_W227B = DF 00 +SE_W226 = E0 00 +SE_W208 = E1 00 +SE_W213 = E2 00 +SE_W213B = E3 00 +SE_W234 = E4 00 +SE_W260 = E5 00 +SE_W328 = E6 00 +SE_W320 = E7 00 +SE_W255 = E8 00 +SE_W291 = E9 00 +SE_W089 = EA 00 +SE_W239 = EB 00 +SE_W230 = EC 00 +SE_W281 = ED 00 +SE_W327 = EE 00 +SE_W287 = EF 00 +SE_W257 = F0 00 +SE_W253 = F1 00 +SE_W258 = F2 00 +SE_W322 = F3 00 +SE_W298 = F4 00 +SE_W287B = F5 00 +SE_W114 = F6 00 +SE_W063B = F7 00 +SE_RG_W_DOOR = F8 00 +SE_RG_CARD1 = F9 00 +SE_RG_CARD2 = FA 00 +SE_RG_CARD3 = FB 00 +SE_RG_BAG1 = FC 00 +SE_RG_BAG2 = FD 00 +SE_RG_GETTING = FE 00 +SE_RG_SHOP = FF 00 +SE_RG_KITEKI = 00 01 +SE_RG_HELP_OP = 01 01 +SE_RG_HELP_CL = 02 01 +SE_RG_HELP_NG = 03 01 +SE_RG_DEOMOV = 04 01 +SE_RG_EXCELLENT = 05 01 +SE_RG_NAWAMISS = 06 01 +SE_TOREEYE = 07 01 +SE_TOREOFF = 08 01 +SE_HANTEI1 = 09 01 +SE_HANTEI2 = 0A 01 +SE_CURTAIN = 0B 01 +SE_CURTAIN1 = 0C 01 +SE_USSOKI = 0D 01 +MUS_TETSUJI = 5E 01 +MUS_FIELD13 = 5F 01 +MUS_KACHI22 = 60 01 +MUS_KACHI2 = 61 01 +MUS_KACHI3 = 62 01 +MUS_KACHI5 = 63 01 +MUS_PCC = 64 01 +MUS_NIBI = 65 01 +MUS_SUIKUN = 66 01 +MUS_DOORO1 = 67 01 +MUS_DOORO_X1 = 68 01 +MUS_DOORO_X3 = 69 01 +MUS_MACHI_S2 = 6A 01 +MUS_MACHI_S4 = 6B 01 +MUS_GIM = 6C 01 +MUS_NAMINORI = 6D 01 +MUS_DAN01 = 6E 01 +MUS_FANFA1 = 6F 01 +MUS_ME_ASA = 70 01 +MUS_ME_BACHI = 71 01 +MUS_FANFA4 = 72 01 +MUS_FANFA5 = 73 01 +MUS_ME_WAZA = 74 01 +MUS_BIJYUTU = 75 01 +MUS_DOORO_X4 = 76 01 +MUS_FUNE_KAN = 77 01 +MUS_ME_SHINKA = 78 01 +MUS_SHINKA = 79 01 +MUS_ME_WASURE = 7A 01 +MUS_SYOUJOEYE = 7B 01 +MUS_BOYEYE = 7C 01 +MUS_DAN02 = 7D 01 +MUS_MACHI_S3 = 7E 01 +MUS_ODAMAKI = 7F 01 +MUS_B_TOWER = 80 01 +MUS_SWIMEYE = 81 01 +MUS_DAN03 = 82 01 +MUS_ME_KINOMI = 83 01 +MUS_ME_TAMA = 84 01 +MUS_ME_B_BIG = 85 01 +MUS_ME_B_SMALL = 86 01 +MUS_ME_ZANNEN = 87 01 +MUS_BD_TIME = 88 01 +MUS_TEST1 = 89 01 +MUS_TEST2 = 8A 01 +MUS_TEST3 = 8B 01 +MUS_TEST4 = 8C 01 +MUS_TEST = 8D 01 +MUS_GOMACHI0 = 8E 01 +MUS_GOTOWN = 8F 01 +MUS_POKECEN = 90 01 +MUS_NEXTROAD = 91 01 +MUS_GRANROAD = 92 01 +MUS_CYCLING = 93 01 +MUS_FRIENDLY = 94 01 +MUS_MISHIRO = 95 01 +MUS_TOZAN = 96 01 +MUS_GIRLEYE = 97 01 +MUS_MINAMO = 98 01 +MUS_ASHROAD = 99 01 +MUS_EVENT0 = 9A 01 +MUS_DEEPDEEP = 9B 01 +MUS_KACHI1 = 9C 01 +MUS_TITLE3 = 9D 01 +MUS_DEMO1 = 9E 01 +MUS_GIRL_SUP = 9F 01 +MUS_HAGESHII = A0 01 +MUS_KAKKOII = A1 01 +MUS_KAZANBAI = A2 01 +MUS_AQA_0 = A3 01 +MUS_TSURETEK = A4 01 +MUS_BOY_SUP = A5 01 +MUS_RAINBOW = A6 01 +MUS_AYASII = A7 01 +MUS_KACHI4 = A8 01 +MUS_ROPEWAY = A9 01 +MUS_CASINO = AA 01 +MUS_HIGHTOWN = AB 01 +MUS_SAFARI = AC 01 +MUS_C_ROAD = AD 01 +MUS_AJITO = AE 01 +MUS_M_BOAT = AF 01 +MUS_M_DUNGON = B0 01 +MUS_FINECITY = B1 01 +MUS_MACHUPI = B2 01 +MUS_P_SCHOOL = B3 01 +MUS_DENDOU = B4 01 +MUS_TONEKUSA = B5 01 +MUS_MABOROSI = B6 01 +MUS_CON_FAN = B7 01 +MUS_CONTEST0 = B8 01 +MUS_MGM0 = B9 01 +MUS_T_BATTLE = BA 01 +MUS_OOAME = BB 01 +MUS_HIDERI = BC 01 +MUS_RUNECITY = BD 01 +MUS_CON_K = BE 01 +MUS_EIKOU_R = BF 01 +MUS_KARAKURI = C0 01 +MUS_HUTAGO = C1 01 +MUS_SITENNOU = C2 01 +MUS_YAMA_EYE = C3 01 +MUS_CONLOBBY = C4 01 +MUS_INTER_V = C5 01 +MUS_DAIGO = C6 01 +MUS_THANKFOR = C7 01 +MUS_END = C8 01 +MUS_B_FRONTIER = C9 01 +MUS_B_ARENA = CA 01 +MUS_ME_POINTGET = CB 01 +MUS_ME_TORE_EYE = CC 01 +MUS_PYRAMID = CD 01 +MUS_PYRAMID_TOP = CE 01 +MUS_B_PALACE = CF 01 +MUS_REKKUU_KOURIN = D0 01 +MUS_SATTOWER = D1 01 +MUS_ME_SYMBOLGET = D2 01 +MUS_B_DOME = D3 01 +MUS_B_TUBE = D4 01 +MUS_B_FACTORY = D5 01 +MUS_VS_REKKU = D6 01 +MUS_VS_FRONT = D7 01 +MUS_VS_MEW = D8 01 +MUS_B_DOME1 = D9 01 +MUS_BATTLE27 = DA 01 +MUS_BATTLE31 = DB 01 +MUS_BATTLE20 = DC 01 +MUS_BATTLE32 = DD 01 +MUS_BATTLE33 = DE 01 +MUS_BATTLE36 = DF 01 +MUS_BATTLE34 = E0 01 +MUS_BATTLE35 = E1 01 +MUS_BATTLE38 = E2 01 +MUS_BATTLE30 = E3 01 +MUS_RG_ANNAI = E4 01 +MUS_RG_SLOT = E5 01 +MUS_RG_AJITO = E6 01 +MUS_RG_GYM = E7 01 +MUS_RG_PURIN = E8 01 +MUS_RG_DEMO = E9 01 +MUS_RG_TITLE = EA 01 +MUS_RG_GUREN = EB 01 +MUS_RG_SHION = EC 01 +MUS_RG_KAIHUKU = ED 01 +MUS_RG_CYCLING = EE 01 +MUS_RG_ROCKET = EF 01 +MUS_RG_SHOUJO = F0 01 +MUS_RG_SHOUNEN = F1 01 +MUS_RG_DENDOU = F2 01 +MUS_RG_T_MORI = F3 01 +MUS_RG_OTSUKIMI = F4 01 +MUS_RG_POKEYASHI = F5 01 +MUS_RG_ENDING = F6 01 +MUS_RG_LOAD01 = F7 01 +MUS_RG_OPENING = F8 01 +MUS_RG_LOAD02 = F9 01 +MUS_RG_LOAD03 = FA 01 +MUS_RG_CHAMP_R = FB 01 +MUS_RG_VS_GYM = FC 01 +MUS_RG_VS_TORE = FD 01 +MUS_RG_VS_YASEI = FE 01 +MUS_RG_VS_LAST = FF 01 +MUS_RG_MASARA = 00 02 +MUS_RG_KENKYU = 01 02 +MUS_RG_OHKIDO = 02 02 +MUS_RG_POKECEN = 03 02 +MUS_RG_SANTOAN = 04 02 +MUS_RG_NAMINORI = 05 02 +MUS_RG_P_TOWER = 06 02 +MUS_RG_SHIRUHU = 07 02 +MUS_RG_HANADA = 08 02 +MUS_RG_TAMAMUSI = 09 02 +MUS_RG_WIN_TRE = 0A 02 +MUS_RG_WIN_YASEI = 0B 02 +MUS_RG_WIN_GYM = 0C 02 +MUS_RG_KUCHIBA = 0D 02 +MUS_RG_NIBI = 0E 02 +MUS_RG_RIVAL1 = 0F 02 +MUS_RG_RIVAL2 = 10 02 +MUS_RG_FAN2 = 11 02 +MUS_RG_FAN5 = 12 02 +MUS_RG_FAN6 = 13 02 +MUS_ME_RG_PHOTO = 14 02 +MUS_RG_TITLEROG = 15 02 +MUS_RG_GET_YASEI = 16 02 +MUS_RG_SOUSA = 17 02 +MUS_RG_SEKAIKAN = 18 02 +MUS_RG_SEIBETU = 19 02 +MUS_RG_JUMP = 1A 02 +MUS_RG_UNION = 1B 02 +MUS_RG_NETWORK = 1C 02 +MUS_RG_OKURIMONO = 1D 02 +MUS_RG_KINOMIKUI = 1E 02 +MUS_RG_NANADUNGEON = 1F 02 +MUS_RG_OSHIE_TV = 20 02 +MUS_RG_NANASHIMA = 21 02 +MUS_RG_NANAISEKI = 22 02 +MUS_RG_NANA123 = 23 02 +MUS_RG_NANA45 = 24 02 +MUS_RG_NANA67 = 25 02 +MUS_RG_POKEFUE = 26 02 +MUS_RG_VS_DEO = 27 02 +MUS_RG_VS_MYU2 = 28 02 +MUS_RG_VS_DEN = 29 02 +MUS_RG_EXEYE = 2A 02 +MUS_RG_DEOEYE = 2B 02 +MUS_RG_T_TOWER = 2C 02 +MUS_RG_SLOWMASARA = 2D 02 +MUS_RG_TVNOIZE = 2E 02 +PH_TRAP_BLEND = 2F 02 +PH_TRAP_HELD = 30 02 +PH_TRAP_SOLO = 31 02 +PH_FACE_BLEND = 32 02 +PH_FACE_HELD = 33 02 +PH_FACE_SOLO = 34 02 +PH_CLOTH_BLEND = 35 02 +PH_CLOTH_HELD = 36 02 +PH_CLOTH_SOLO = 37 02 +PH_DRESS_BLEND = 38 02 +PH_DRESS_HELD = 39 02 +PH_DRESS_SOLO = 3A 02 +PH_FLEECE_BLEND = 3B 02 +PH_FLEECE_HELD = 3C 02 +PH_FLEECE_SOLO = 3D 02 +PH_KIT_BLEND = 3E 02 +PH_KIT_HELD = 3F 02 +PH_KIT_SOLO = 40 02 +PH_PRICE_BLEND = 41 02 +PH_PRICE_HELD = 42 02 +PH_PRICE_SOLO = 43 02 +PH_LOT_BLEND = 44 02 +PH_LOT_HELD = 45 02 +PH_LOT_SOLO = 46 02 +PH_GOAT_BLEND = 47 02 +PH_GOAT_HELD = 48 02 +PH_GOAT_SOLO = 49 02 +PH_THOUGHT_BLEND = 4A 02 +PH_THOUGHT_HELD = 4B 02 +PH_THOUGHT_SOLO = 4C 02 +PH_CHOICE_BLEND = 4D 02 +PH_CHOICE_HELD = 4E 02 +PH_CHOICE_SOLO = 4F 02 +PH_MOUTH_BLEND = 50 02 +PH_MOUTH_HELD = 51 02 +PH_MOUTH_SOLO = 52 02 +PH_FOOT_BLEND = 53 02 +PH_FOOT_HELD = 54 02 +PH_FOOT_SOLO = 55 02 +PH_GOOSE_BLEND = 56 02 +PH_GOOSE_HELD = 57 02 +PH_GOOSE_SOLO = 58 02 +PH_STRUT_BLEND = 59 02 +PH_STRUT_HELD = 5A 02 +PH_STRUT_SOLO = 5B 02 +PH_CURE_BLEND = 5C 02 +PH_CURE_HELD = 5D 02 +PH_CURE_SOLO = 5E 02 +PH_NURSE_BLEND = 5F 02 +PH_NURSE_HELD = 60 02 +PH_NURSE_SOLO = 61 02 + +A_BUTTON = F8 00 +B_BUTTON = F8 01 +DPAD_UPDOWN = F8 0A +DPAD_NONE = F8 0C + +UP_ARROW_2 = F9 00 +DOWN_ARROW_2 = F9 01 +LEFT_ARROW_2 = F9 02 +RIGHT_ARROW_2 = F9 03 +PLUS = F9 04 +LV_2 = F9 05 +PP = F9 06 +ID = F9 07 +NO = F9 08 +UNDERSCORE = F9 09 +CIRCLE_1 = F9 0A +CIRCLE_2 = F9 0B +CIRCLE_3 = F9 0C +CIRCLE_4 = F9 0D +CIRCLE_5 = F9 0E +CIRCLE_6 = F9 0F +CIRCLE_7 = F9 10 +CIRCLE_8 = F9 11 +CIRCLE_9 = F9 12 +ROUND_LEFT_PAREN = F9 13 +ROUND_RIGHT_PAREN = F9 14 +CIRCLE_DOT = F9 15 +TRIANGLE = F9 16 +BIG_MULT_X = F9 17 + +EMOJI_UNDERSCORE = F9 D0 +EMOJI_PIPE = F9 D1 +EMOJI_HIGHBAR = F9 D2 +EMOJI_TILDE = F9 D3 +EMOJI_LEFT_PAREN = F9 D4 +EMOJI_RIGHT_PAREN = F9 D5 +EMOJI_UNION = F9 D6 @ ⊂ +EMOJI_GREATER_THAN = F9 D7 +EMOJI_LEFT_EYE = F9 D8 +EMOJI_RIGHT_EYE = F9 D9 +EMOJI_AT = F9 DA +EMOJI_SEMICOLON = F9 DB +EMOJI_PLUS = F9 DC +EMOJI_MINUS = F9 DD +EMOJI_EQUALS = F9 DE +EMOJI_SPIRAL = F9 DF +EMOJI_TONGUE = F9 E0 +EMOJI_TRIANGLE_OUTLINE = F9 E1 +EMOJI_ACUTE = F9 E2 +EMOJI_GRAVE = F9 E3 +EMOJI_CIRCLE = F9 E4 +EMOJI_TRIANGLE = F9 E5 +EMOJI_SQUARE = F9 E6 +EMOJI_HEART = F9 E7 +EMOJI_MOON = F9 E8 +EMOJI_NOTE = F9 E9 +EMOJI_BALL = F9 EA +EMOJI_BOLT = F9 EB +EMOJI_LEAF = F9 EC +EMOJI_FIRE = F9 ED +EMOJI_WATER = F9 EE +EMOJI_LEFT_FIST = F9 EF +EMOJI_RIGHT_FIST = F9 F0 +EMOJI_BIGWHEEL = F9 F1 +EMOJI_SMALLWHEEL = F9 F2 +EMOJI_SPHERE = F9 F3 +EMOJI_IRRITATED = F9 F4 +EMOJI_MISCHIEVOUS = F9 F5 +EMOJI_HAPPY = F9 F6 +EMOJI_ANGRY = F9 F7 +EMOJI_SURPRISED = F9 F8 +EMOJI_BIGSMILE = F9 F9 +EMOJI_EVIL = F9 FA +EMOJI_TIRED = F9 FB +EMOJI_NEUTRAL = F9 FC +EMOJI_SHOCKED = F9 FD +EMOJI_BIGANGER = F9 FE + +'\l' = FA @ scroll up window text +'\p' = FB @ new paragraph +'\n' = FE @ new line diff --git a/berry_fix/data/data.s b/berry_fix/data/data.s new file mode 100644 index 000000000..dbb86b13b --- /dev/null +++ b/berry_fix/data/data.s @@ -0,0 +1,4 @@ + .section .rodata + +_data_2f0:: + .incbin "data/payload.gba.lz" diff --git a/berry_fix/ld_script.sed b/berry_fix/ld_script.sed new file mode 100644 index 000000000..b91542b6f --- /dev/null +++ b/berry_fix/ld_script.sed @@ -0,0 +1,14 @@ +// { + r sym_ewram.ld + d +} + +// { + r sym_bss.ld + d +} + +// { + r sym_common.ld + d +} diff --git a/berry_fix/ld_script.txt b/berry_fix/ld_script.txt new file mode 100644 index 000000000..2edeaef7c --- /dev/null +++ b/berry_fix/ld_script.txt @@ -0,0 +1,31 @@ +ENTRY(_start) + +SECTIONS { + . = 0x2000000; + + .text : + ALIGN(4) + { + asm/loader.o(.text); + } =0 + + . += 0x100; + .rodata : + ALIGN(4) + { + data/data.o(.rodata); + } =0 + + . = 0x2010000; + + ewram (NOLOAD) : + ALIGN(4) + { + gCode = .; + } + + /DISCARD/ : + { + *(*); + } +} diff --git a/berry_fix/payload/Makefile b/berry_fix/payload/Makefile new file mode 100644 index 000000000..dfcf2a796 --- /dev/null +++ b/berry_fix/payload/Makefile @@ -0,0 +1,172 @@ +include $(DEVKITARM)/base_tools +export CPP := $(PREFIX)cpp +export LD := $(PREFIX)ld +COMPARE ?= 0 + +ifeq ($(OS),Windows_NT) +EXE := .exe +else +EXE := +endif + +SHELL := /bin/bash -o pipefail + +CPPFLAGS := -I ../../tools/agbcc/include -I ../../tools/agbcc -iquote include -nostdinc -undef + +ROM := payload.gba +OBJ_DIR := build +CC1 := ../../tools/agbcc/bin/agbcc$(EXE) +override CC1FLAGS += -mthumb-interwork -Wimplicit -Wparentheses -Werror -O2 -fhex-asm + + +ELF = $(ROM:.gba=.elf) +MAP = $(ROM:.gba=.map) + +C_SUBDIR = src +ASM_SUBDIR = asm +DATA_ASM_SUBDIR = data + +C_BUILDDIR = $(OBJ_DIR)/$(C_SUBDIR) +ASM_BUILDDIR = $(OBJ_DIR)/$(ASM_SUBDIR) +DATA_ASM_BUILDDIR = $(OBJ_DIR)/$(DATA_ASM_SUBDIR) + +ASFLAGS := -mcpu=arm7tdmi + +LDFLAGS = -Map ../$(MAP) + +LIB := -L ../../../tools/agbcc/lib -lgcc + +SHA1 := $(shell { command -v sha1sum || command -v shasum; } 2>/dev/null) -c +GFX := ../../tools/gbagfx/gbagfx$(EXE) +AIF := ../../tools/aif2pcm/aif2pcm$(EXE) +MID := ../../tools/mid2agb/mid2agb$(EXE) +SCANINC := ../../tools/scaninc/scaninc$(EXE) +PREPROC := ../../tools/preproc/preproc$(EXE) +RAMSCRGEN := ../../tools/ramscrgen/ramscrgen$(EXE) +FIX := ../../tools/gbafix/gbafix$(EXE) + +# Clear the default suffixes +.SUFFIXES: +# Don't delete intermediate files +.SECONDARY: +# Delete files that weren't built properly +.DELETE_ON_ERROR: + +# Secondary expansion is required for dependency variables in object rules. +.SECONDEXPANSION: + +.PHONY: all rom clean compare tidy + +C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c $(C_SUBDIR)/*/*/*.c) +C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) + +ASM_SRCS := $(wildcard $(ASM_SUBDIR)/*.s) +ASM_OBJS := $(patsubst $(ASM_SUBDIR)/%.s,$(ASM_BUILDDIR)/%.o,$(ASM_SRCS)) + +DATA_ASM_SRCS := $(wildcard $(DATA_ASM_SUBDIR)/*.s) +DATA_ASM_OBJS := $(patsubst $(DATA_ASM_SUBDIR)/%.s,$(DATA_ASM_BUILDDIR)/%.o,$(DATA_ASM_SRCS)) + +SONG_SRCS := $(wildcard $(SONG_SUBDIR)/*.s) +SONG_OBJS := $(patsubst $(SONG_SUBDIR)/%.s,$(SONG_BUILDDIR)/%.o,$(SONG_SRCS)) + +MID_SRCS := $(wildcard $(MID_SUBDIR)/*.mid) +MID_OBJS := $(patsubst $(MID_SUBDIR)/%.mid,$(MID_BUILDDIR)/%.o,$(MID_SRCS)) + +OBJS := $(C_OBJS) $(ASM_OBJS) $(DATA_ASM_OBJS) $(SONG_OBJS) $(MID_OBJS) +# OBJS_REL := $(patsubst $(OBJ_DIR)/%,%,$(OBJS)) + +SUBDIRS := $(sort $(dir $(OBJS))) + +$(shell mkdir -p $(SUBDIRS)) + +$(C_BUILDDIR)/siirtc.o: CC1FLAGS := -mthumb-interwork +$(C_BUILDDIR)/agb_flash.o: CC1FLAGS := -O1 -mthumb-interwork +$(C_BUILDDIR)/agb_flash_1m.o: CC1FLAGS := -O1 -mthumb-interwork +$(C_BUILDDIR)/agb_flash_mx.o: CC1FLAGS := -O1 -mthumb-interwork +$(C_BUILDDIR)/agb_flash_le.o: CC1FLAGS := -O1 -mthumb-interwork + +all: rom + @: + +rom: $(ROM) +ifeq ($(COMPARE),1) + @$(SHA1) rom.sha1 +endif + +# For contributors to make sure a change didn't affect the contents of the ROM. +compare: ; @$(MAKE) COMPARE=1 + +clean: tidy + rm -f sound/direct_sound_samples/*.bin + rm -f $(SONG_OBJS) $(MID_OBJS) $(MID_SUBDIR)/*.s + find . \( -iname '*.1bpp' -o -iname '*.4bpp' -o -iname '*.8bpp' -o -iname '*.gbapal' -o -iname '*.lz' -o -iname '*.latfont' -o -iname '*.hwjpnfont' -o -iname '*.fwjpnfont' \) -exec rm {} + + +tidy: + rm -f $(ROM) $(ELF) $(MAP) + rm -r build/* + +%.s: ; +%.png: ; +%.pal: ; +%.aif: ; + +%.1bpp: %.png ; $(GFX) $< $@ +%.4bpp: %.png ; $(GFX) $< $@ +%.8bpp: %.png ; $(GFX) $< $@ +%.gbapal: %.pal ; $(GFX) $< $@ +%.gbapal: %.png ; $(GFX) $< $@ +%.lz: % ; $(GFX) $< $@ +%.rl: % ; $(GFX) $< $@ + + +ifeq ($(NODEP),1) +$(C_BUILDDIR)/%.o: c_dep := +else +$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c) +endif + +$(C_BUILDDIR)/%.o : $(C_SUBDIR)/%.c $$(c_dep) + @$(CPP) $(CPPFLAGS) $< -o $(C_BUILDDIR)/$*.i + @$(PREPROC) $(C_BUILDDIR)/$*.i charmap.txt | $(CC1) $(CC1FLAGS) -o $(C_BUILDDIR)/$*.s + @echo -e ".text\n\t.align\t2, 0\n" >> $(C_BUILDDIR)/$*.s + $(AS) $(ASFLAGS) -o $@ $(C_BUILDDIR)/$*.s + +ifeq ($(NODEP),1) +$(ASM_BUILDDIR)/%.o: asm_dep := +else +$(ASM_BUILDDIR)/%.o: asm_dep = $(shell $(SCANINC) $(ASM_SUBDIR)/$*.s) +endif + +$(ASM_BUILDDIR)/%.o: $(ASM_SUBDIR)/%.s $$(asm_dep) + $(AS) $(ASFLAGS) -o $@ $< + +ifeq ($(NODEP),1) +$(DATA_ASM_BUILDDIR)/%.o: data_dep := +else +$(DATA_ASM_BUILDDIR)/%.o: data_dep = $(shell $(SCANINC) $(DATA_ASM_SUBDIR)/$*.s) +endif + +$(DATA_ASM_BUILDDIR)/%.o: $(DATA_ASM_SUBDIR)/%.s $$(data_dep) + $(PREPROC) $< charmap.txt | $(CPP) -I include | $(AS) $(ASFLAGS) -o $@ + +$(SONG_BUILDDIR)/%.o: $(SONG_SUBDIR)/%.s + $(AS) $(ASFLAGS) -I sound -o $@ $< + +$(OBJ_DIR)/sym_bss.ld: sym_bss.txt + $(RAMSCRGEN) .bss $< ENGLISH > $@ + +$(OBJ_DIR)/sym_common.ld: sym_common.txt $(C_OBJS) $(wildcard common_syms/*.txt) + $(RAMSCRGEN) COMMON $< ENGLISH -c $(C_BUILDDIR),common_syms,../../tools/agbcc/lib > $@ + +$(OBJ_DIR)/sym_ewram.ld: sym_ewram.txt + $(RAMSCRGEN) ewram_data $< ENGLISH > $@ + +$(OBJ_DIR)/ld_script.ld: ld_script.txt $(OBJ_DIR)/sym_bss.ld $(OBJ_DIR)/sym_common.ld $(OBJ_DIR)/sym_ewram.ld + cd $(OBJ_DIR) && sed -f ../../ld_script.sed ../$< | sed "s#tools/#../tools/#g" > ld_script.ld + +$(ELF): $(OBJ_DIR)/ld_script.ld $(OBJS) + cd $(OBJ_DIR) && $(LD) $(LDFLAGS) -T ld_script.ld -o ../$@ $(LIB) + +$(ROM): $(ELF) + $(OBJCOPY) -O binary $< $@ + diff --git a/berry_fix/payload/asm/crt0.s b/berry_fix/payload/asm/crt0.s new file mode 100644 index 000000000..872a63018 --- /dev/null +++ b/berry_fix/payload/asm/crt0.s @@ -0,0 +1,82 @@ + .include "asm/macros/function.inc" + .include "constants/gba_constants.inc" + + .syntax unified + + .text + + .arm + .align 2, 0 + .global Init +Init: + mov r0, PSR_IRQ_MODE + msr cpsr_cf, r0 + ldr sp, sp_irq + mov r0, PSR_SYS_MODE + msr cpsr_cf, r0 + ldr sp, sp_sys + ldr r1, =INTR_VECTOR + ldr r0, =IntrMain + str r0, [r1] + ldr r1, =AgbMain + 1 + mov lr, pc + bx r1 + b Init + + .align 2, 0 +sp_sys: .word IWRAM_END - 0x100 +sp_irq: .word IWRAM_END - 0x60 + + .pool + .size Init, .-Init + + .arm + .align 2, 0 + .global IntrMain +IntrMain: @ 0x2010048 + mov ip, REG_BASE + add r3, ip, OFFSET_REG_IE + ldr r2, [r3] + and r1, r2, r2, lsr #16 + mov r2, #0 + ands r0, r1, #0x2000 + strbne r0, [r3, #-0x17c] +_02010064: + bne _02010064 + ands r0, r1, #0xc0 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #1 + strhne r0, [ip, #-8] + bne _020100DC + add r2, r2, #4 + ands r0, r1, #2 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #4 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #0x100 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #0x200 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #0x400 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #0x800 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #0x1000 + bne _020100DC + add r2, r2, #4 + ands r0, r1, #8 +_020100DC: + strh r0, [r3, #2] + ldr r1, =gIntrTable + add r1, r1, r2 + ldr r0, [r1] + bx r0 + .pool + .size IntrMain, .-IntrMain diff --git a/berry_fix/payload/asm/libagbsyscall.s b/berry_fix/payload/asm/libagbsyscall.s new file mode 100644 index 000000000..ea8ef3e89 --- /dev/null +++ b/berry_fix/payload/asm/libagbsyscall.s @@ -0,0 +1,46 @@ + .include "asm/macros/function.inc" + .include "constants/gba_constants.inc" + + .syntax unified + + .text + + thumb_func_start CpuSet +CpuSet: @ 81E3B64 + swi 0xB + bx lr + thumb_func_end CpuSet + + thumb_func_start Div +Div: @ 81E3B68 + swi 0x6 + bx lr + thumb_func_end Div + + thumb_func_start Mod +Mod: + swi 0x6 + adds r0, r1, 0 + bx lr + thumb_func_end Mod + + thumb_func_start LZ77UnCompVram +LZ77UnCompVram: @ 81E3B6C + swi 0x12 + bx lr + thumb_func_end LZ77UnCompVram + + thumb_func_start RegisterRamReset +RegisterRamReset: @ 81E3B80 + swi 0x1 + bx lr + thumb_func_end RegisterRamReset + + thumb_func_start VBlankIntrWait +VBlankIntrWait: @ 81E3BA0 + movs r2, 0 + swi 0x5 + bx lr + thumb_func_end VBlankIntrWait + + .align 2, 0 @ Don't pad with nop. diff --git a/berry_fix/payload/asm/macros/function.inc b/berry_fix/payload/asm/macros/function.inc new file mode 100644 index 000000000..67fb373a8 --- /dev/null +++ b/berry_fix/payload/asm/macros/function.inc @@ -0,0 +1,29 @@ + .macro arm_func_start name + .align 2, 0 + .global \name + .arm + .type \name, function + .endm + + .macro arm_func_end name + .size \name, .-\name + .endm + + .macro thumb_func_start name + .align 2, 0 + .global \name + .thumb + .thumb_func + .type \name, function + .endm + + .macro non_word_aligned_thumb_func_start name + .global \name + .thumb + .thumb_func + .type \name, function + .endm + + .macro thumb_func_end name + .size \name, .-\name + .endm diff --git a/berry_fix/payload/charmap.txt b/berry_fix/payload/charmap.txt new file mode 100644 index 000000000..a736b40f2 --- /dev/null +++ b/berry_fix/payload/charmap.txt @@ -0,0 +1,1067 @@ +' ' = 00 +'À' = 01 +'Á' = 02 +'Â' = 03 +'Ç' = 04 +'È' = 05 +'É' = 06 +'Ê' = 07 +'Ë' = 08 +'Ì' = 09 +'Î' = 0B +'Ï' = 0C +'Ò' = 0D +'Ó' = 0E +'Ô' = 0F +'Œ' = 10 +'Ù' = 11 +'Ú' = 12 +'Û' = 13 +'Ñ' = 14 +'ß' = 15 +'à' = 16 +'á' = 17 +'ç' = 19 +'è' = 1A +'é' = 1B +'ê' = 1C +'ë' = 1D +'ì' = 1E +'î' = 20 +'ï' = 21 +'ò' = 22 +'ó' = 23 +'ô' = 24 +'œ' = 25 +'ù' = 26 +'ú' = 27 +'û' = 28 +'ñ' = 29 +'º' = 2A +'ª' = 2B +SUPER_ER = 2C +'&' = 2D +'+' = 2E +LV = 34 +'=' = 35 +';' = 36 +'¿' = 51 +'¡' = 52 +PK = 53 +PKMN = 53 54 +POKEBLOCK = 55 56 57 58 59 +'Í' = 5A +'%' = 5B +'(' = 5C +')' = 5D +'â' = 68 +'í' = 6F +UNK_SPACER = 77 +UP_ARROW = 79 +DOWN_ARROW = 7A +LEFT_ARROW = 7B +RIGHT_ARROW = 7C +'0' = A1 +'1' = A2 +'2' = A3 +'3' = A4 +'4' = A5 +'5' = A6 +'6' = A7 +'7' = A8 +'8' = A9 +'9' = AA +'!' = AB +'?' = AC +'.' = AD +'-' = AE +'·' = AF +'…' = B0 +'“' = B1 +'”' = B2 +'‘' = B3 +'’' = B4 +'♂' = B5 +'♀' = B6 +'¥' = B7 +',' = B8 +'×' = B9 +'/' = BA +'A' = BB +'B' = BC +'C' = BD +'D' = BE +'E' = BF +'F' = C0 +'G' = C1 +'H' = C2 +'I' = C3 +'J' = C4 +'K' = C5 +'L' = C6 +'M' = C7 +'N' = C8 +'O' = C9 +'P' = CA +'Q' = CB +'R' = CC +'S' = CD +'T' = CE +'U' = CF +'V' = D0 +'W' = D1 +'X' = D2 +'Y' = D3 +'Z' = D4 +'a' = D5 +'b' = D6 +'c' = D7 +'d' = D8 +'e' = D9 +'f' = DA +'g' = DB +'h' = DC +'i' = DD +'j' = DE +'k' = DF +'l' = E0 +'m' = E1 +'n' = E2 +'o' = E3 +'p' = E4 +'q' = E5 +'r' = E6 +'s' = E7 +'t' = E8 +'u' = E9 +'v' = EA +'w' = EB +'x' = EC +'y' = ED +'z' = EE +'▶' = EF +':' = F0 +'Ä' = F1 +'Ö' = F2 +'Ü' = F3 +'ä' = F4 +'ö' = F5 +'ü' = F6 +TALL_PLUS = FC 0C FB +'$' = FF + +@ Hiragana +'あ' = 01 +'い' = 02 +'う' = 03 +'え' = 04 +'お' = 05 +'か' = 06 +'き' = 07 +'く' = 08 +'け' = 09 +'こ' = 0A +'さ' = 0B +'し' = 0C +'す' = 0D +'せ' = 0E +'そ' = 0F +'た' = 10 +'ち' = 11 +'つ' = 12 +'て' = 13 +'と' = 14 +'な' = 15 +'に' = 16 +'ぬ' = 17 +'ね' = 18 +'の' = 19 +'は' = 1A +'ひ' = 1B +'ふ' = 1C +'へ' = 1D +'ほ' = 1E +'ま' = 1F +'み' = 20 +'む' = 21 +'め' = 22 +'も' = 23 +'や' = 24 +'ゆ' = 25 +'よ' = 26 +'ら' = 27 +'り' = 28 +'る' = 29 +'れ' = 2A +'ろ' = 2B +'わ' = 2C +'を' = 2D +'ん' = 2E +'ぁ' = 2F +'ぃ' = 30 +'ぅ' = 31 +'ぇ' = 32 +'ぉ' = 33 +'ゃ' = 34 +'ゅ' = 35 +'ょ' = 36 +'が' = 37 +'ぎ' = 38 +'ぐ' = 39 +'げ' = 3A +'ご' = 3B +'ざ' = 3C +'じ' = 3D +'ず' = 3E +'ぜ' = 3F +'ぞ' = 40 +'だ' = 41 +'ぢ' = 42 +'づ' = 43 +'で' = 44 +'ど' = 45 +'ば' = 46 +'び' = 47 +'ぶ' = 48 +'べ' = 49 +'ぼ' = 4A +'ぱ' = 4B +'ぴ' = 4C +'ぷ' = 4D +'ぺ' = 4E +'ぽ' = 4F +'っ' = 50 + +@ Katakana +'ア' = 51 +'イ' = 52 +'ウ' = 53 +'エ' = 54 +'オ' = 55 +'カ' = 56 +'キ' = 57 +'ク' = 58 +'ケ' = 59 +'コ' = 5A +'サ' = 5B +'シ' = 5C +'ス' = 5D +'セ' = 5E +'ソ' = 5F +'タ' = 60 +'チ' = 61 +'ツ' = 62 +'テ' = 63 +'ト' = 64 +'ナ' = 65 +'ニ' = 66 +'ヌ' = 67 +'ネ' = 68 +'ノ' = 69 +'ハ' = 6A +'ヒ' = 6B +'フ' = 6C +'ヘ' = 6D +'ホ' = 6E +'マ' = 6F +'ミ' = 70 +'ム' = 71 +'メ' = 72 +'モ' = 73 +'ヤ' = 74 +'ユ' = 75 +'ヨ' = 76 +'ラ' = 77 +'リ' = 78 +'ル' = 79 +'レ' = 7A +'ロ' = 7B +'ワ' = 7C +'ヲ' = 7D +'ン' = 7E +'ァ' = 7F +'ィ' = 80 +'ゥ' = 81 +'ェ' = 82 +'ォ' = 83 +'ャ' = 84 +'ュ' = 85 +'ョ' = 86 +'ガ' = 87 +'ギ' = 88 +'グ' = 89 +'ゲ' = 8A +'ゴ' = 8B +'ザ' = 8C +'ジ' = 8D +'ズ' = 8E +'ゼ' = 8F +'ゾ' = 90 +'ダ' = 91 +'ヂ' = 92 +'ヅ' = 93 +'デ' = 94 +'ド' = 95 +'バ' = 96 +'ビ' = 97 +'ブ' = 98 +'ベ' = 99 +'ボ' = 9A +'パ' = 9B +'ピ' = 9C +'プ' = 9D +'ペ' = 9E +'ポ' = 9F +'ッ' = A0 + +@ Japanese punctuation +' ' = 00 +'!' = AB +'?' = AC +'。' = AD +'ー' = AE +'⋯' = B0 + +STRING = FD + +@ string placeholders +PLAYER = FD 01 +STR_VAR_1 = FD 02 +STR_VAR_2 = FD 03 +STR_VAR_3 = FD 04 +KUN = FD 05 +RIVAL = FD 06 +@ version-dependent strings (originally made for Ruby/Sapphire differences) +@ Emerald uses the Sapphire strings (except for VERSION). +VERSION = FD 07 @ "EMERALD" +AQUA = FD 08 +MAGMA = FD 09 +ARCHIE = FD 0A +MAXIE = FD 0B +KYOGRE = FD 0C +GROUDON = FD 0D + +@ battle string placeholders + +B_BUFF1 = FD 00 +B_BUFF2 = FD 01 +B_COPY_VAR_1 = FD 02 +B_COPY_VAR_2 = FD 03 +B_COPY_VAR_3 = FD 04 +B_PLAYER_MON1_NAME = FD 05 +B_OPPONENT_MON1_NAME = FD 06 +B_PLAYER_MON2_NAME = FD 07 +B_OPPONENT_MON2_NAME = FD 08 +B_LINK_PLAYER_MON1_NAME = FD 09 +B_LINK_OPPONENT_MON1_NAME = FD 0A +B_LINK_PLAYER_MON2_NAME = FD 0B +B_LINK_OPPONENT_MON2_NAME = FD 0C +B_ATK_NAME_WITH_PREFIX_MON1 = FD 0D +B_ATK_PARTNER_NAME = FD 0E +B_ATK_NAME_WITH_PREFIX = FD 0F +B_DEF_NAME_WITH_PREFIX = FD 10 +B_EFF_NAME_WITH_PREFIX = FD 11 @ EFF = short for gEffectBattler +B_ACTIVE_NAME_WITH_PREFIX = FD 12 +B_SCR_ACTIVE_NAME_WITH_PREFIX = FD 13 +B_CURRENT_MOVE = FD 14 +B_LAST_MOVE = FD 15 +B_LAST_ITEM = FD 16 +B_LAST_ABILITY = FD 17 +B_ATK_ABILITY = FD 18 +B_DEF_ABILITY = FD 19 +B_SCR_ACTIVE_ABILITY = FD 1A +B_EFF_ABILITY = FD 1B +B_TRAINER1_CLASS = FD 1C +B_TRAINER1_NAME = FD 1D +B_LINK_PLAYER_NAME = FD 1E +B_LINK_PARTNER_NAME = FD 1F +B_LINK_OPPONENT1_NAME = FD 20 +B_LINK_OPPONENT2_NAME = FD 21 +B_LINK_SCR_TRAINER_NAME = FD 22 +B_PLAYER_NAME = FD 23 +B_TRAINER1_LOSE_TEXT = FD 24 +B_TRAINER1_WIN_TEXT = FD 25 +B_26 = FD 26 +B_PC_CREATOR_NAME = FD 27 +B_ATK_PREFIX1 = FD 28 +B_DEF_PREFIX1 = FD 29 +B_ATK_PREFIX2 = FD 2A +B_DEF_PREFIX2 = FD 2B +B_ATK_PREFIX3 = FD 2C +B_DEF_PREFIX3 = FD 2D +B_TRAINER2_CLASS = FD 2E +B_TRAINER2_NAME = FD 2F +B_TRAINER2_LOSE_TEXT = FD 30 +B_TRAINER2_WIN_TEXT = FD 31 +B_PARTNER_CLASS = FD 32 +B_PARTNER_NAME = FD 33 +B_BUFF3 = FD 34 + +@ indicates the end of a town/city name (before " TOWN" or " CITY") +NAME_END = FC 00 + +@ special 0xF7 character +SPECIAL_F7 = F7 + +@ more text functions + +COLOR = FC 01 @ use a color listed below right after +HIGHLIGHT = FC 02 @ same as fc 01 +SHADOW = FC 03 @ same as fc 01 +COLOR_HIGHLIGHT_SHADOW = FC 04 @ takes 3 bytes +PALETTE = FC 05 @ used in credits +SIZE = FC 06 @ note that anything other than "SMALL" is invalid +UNKNOWN_7 = FC 07 +PAUSE = FC 08 @ manually print the wait byte after this, havent mapped them +PAUSE_UNTIL_PRESS = FC 09 +UNKNOWN_A = FC 0A +PLAY_BGM = FC 0B +ESCAPE = FC 0C +SHIFT_TEXT = FC 0D +UNKNOWN_E = FC 0E +UNKNOWN_F = FC 0F +PLAY_SE = FC 10 +CLEAR = FC 11 +SKIP = FC 12 +CLEAR_TO = FC 13 +UNKNOWN_14 = FC 14 +JPN = FC 15 +ENG = FC 16 +PAUSE_MUSIC = FC 17 +RESUME_MUSIC = FC 18 + +@ colors + +TRANSPARENT = 00 +WHITE = 01 +DARK_GREY = 02 +LIGHT_GREY = 03 +RED = 04 +LIGHT_RED = 05 +GREEN = 06 +LIGHT_GREEN = 07 +BLUE = 08 +LIGHT_BLUE = 09 +@ these next colors can be set to anything arbitrary at runtime +@ usually though they'll have the textbox border colors as described below +DYNAMIC_COLOR1 = 0A @ white +DYNAMIC_COLOR2 = 0B @ white with a tinge of green +DYNAMIC_COLOR3 = 0C @ white 2 +DYNAMIC_COLOR4 = 0D @ aquamarine +DYNAMIC_COLOR5 = 0E @ blue-green +DYNAMIC_COLOR6 = 0F @ cerulean + +@ sound and music + +MUS_DUMMY = 00 00 +SE_KAIFUKU = 01 00 +SE_PC_LOGIN = 02 00 +SE_PC_OFF = 03 00 +SE_PC_ON = 04 00 +SE_SELECT = 05 00 +SE_WIN_OPEN = 06 00 +SE_WALL_HIT = 07 00 +SE_DOOR = 08 00 +SE_KAIDAN = 09 00 +SE_DANSA = 0A 00 +SE_JITENSYA = 0B 00 +SE_KOUKA_L = 0C 00 +SE_KOUKA_M = 0D 00 +SE_KOUKA_H = 0E 00 +SE_BOWA2 = 0F 00 +SE_POKE_DEAD = 10 00 +SE_NIGERU = 11 00 +SE_JIDO_DOA = 12 00 +SE_NAMINORI = 13 00 +SE_BAN = 14 00 +SE_PIN = 15 00 +SE_BOO = 16 00 +SE_BOWA = 17 00 +SE_JYUNI = 18 00 +SE_A = 19 00 +SE_I = 1A 00 +SE_U = 1B 00 +SE_E = 1C 00 +SE_O = 1D 00 +SE_N = 1E 00 +SE_SEIKAI = 1F 00 +SE_HAZURE = 20 00 +SE_EXP = 21 00 +SE_JITE_PYOKO = 22 00 +SE_MU_PACHI = 23 00 +SE_TK_KASYA = 24 00 +SE_FU_ZAKU = 25 00 +SE_FU_ZAKU2 = 26 00 +SE_FU_ZUZUZU = 27 00 +SE_RU_GASHIN = 28 00 +SE_RU_GASYAN = 29 00 +SE_RU_BARI = 2A 00 +SE_RU_HYUU = 2B 00 +SE_KI_GASYAN = 2C 00 +SE_TK_WARPIN = 2D 00 +SE_TK_WARPOUT = 2E 00 +SE_TU_SAA = 2F 00 +SE_HI_TURUN = 30 00 +SE_TRACK_MOVE = 31 00 +SE_TRACK_STOP = 32 00 +SE_TRACK_HAIKI = 33 00 +SE_TRACK_DOOR = 34 00 +SE_MOTER = 35 00 +SE_CARD = 36 00 +SE_SAVE = 37 00 +SE_KON = 38 00 +SE_KON2 = 39 00 +SE_KON3 = 3A 00 +SE_KON4 = 3B 00 +SE_SUIKOMU = 3C 00 +SE_NAGERU = 3D 00 +SE_TOY_C = 3E 00 +SE_TOY_D = 3F 00 +SE_TOY_E = 40 00 +SE_TOY_F = 41 00 +SE_TOY_G = 42 00 +SE_TOY_A = 43 00 +SE_TOY_B = 44 00 +SE_TOY_C1 = 45 00 +SE_MIZU = 46 00 +SE_HASHI = 47 00 +SE_DAUGI = 48 00 +SE_PINPON = 49 00 +SE_FUUSEN1 = 4A 00 +SE_FUUSEN2 = 4B 00 +SE_FUUSEN3 = 4C 00 +SE_TOY_KABE = 4D 00 +SE_TOY_DANGO = 4E 00 +SE_DOKU = 4F 00 +SE_ESUKA = 50 00 +SE_T_AME = 51 00 +SE_T_AME_E = 52 00 +SE_T_OOAME = 53 00 +SE_T_OOAME_E = 54 00 +SE_T_KOAME = 55 00 +SE_T_KOAME_E = 56 00 +SE_T_KAMI = 57 00 +SE_T_KAMI2 = 58 00 +SE_ELEBETA = 59 00 +SE_HINSI = 5A 00 +SE_EXPMAX = 5B 00 +SE_TAMAKORO = 5C 00 +SE_TAMAKORO_E = 5D 00 +SE_BASABASA = 5E 00 +SE_REGI = 5F 00 +SE_C_GAJI = 60 00 +SE_C_MAKU_U = 61 00 +SE_C_MAKU_D = 62 00 +SE_C_PASI = 63 00 +SE_C_SYU = 64 00 +SE_C_PIKON = 65 00 +SE_REAPOKE = 66 00 +SE_OP_BASYU = 67 00 +SE_BT_START = 68 00 +SE_DENDOU = 69 00 +SE_JIHANKI = 6A 00 +SE_TAMA = 6B 00 +SE_Z_SCROLL = 6C 00 +SE_Z_PAGE = 6D 00 +SE_PN_ON = 6E 00 +SE_PN_OFF = 6F 00 +SE_Z_SEARCH = 70 00 +SE_TAMAGO = 71 00 +SE_TB_START = 72 00 +SE_TB_KON = 73 00 +SE_TB_KARA = 74 00 +SE_BIDORO = 75 00 +SE_W085 = 76 00 +SE_W085B = 77 00 +SE_W231 = 78 00 +SE_W171 = 79 00 +SE_W233 = 7A 00 +SE_W233B = 7B 00 +SE_W145 = 7C 00 +SE_W145B = 7D 00 +SE_W145C = 7E 00 +SE_W240 = 7F 00 +SE_W015 = 80 00 +SE_W081 = 81 00 +SE_W081B = 82 00 +SE_W088 = 83 00 +SE_W016 = 84 00 +SE_W016B = 85 00 +SE_W003 = 86 00 +SE_W104 = 87 00 +SE_W013 = 88 00 +SE_W196 = 89 00 +SE_W086 = 8A 00 +SE_W004 = 8B 00 +SE_W025 = 8C 00 +SE_W025B = 8D 00 +SE_W152 = 8E 00 +SE_W026 = 8F 00 +SE_W172 = 90 00 +SE_W172B = 91 00 +SE_W053 = 92 00 +SE_W007 = 93 00 +SE_W092 = 94 00 +SE_W221 = 95 00 +SE_W221B = 96 00 +SE_W052 = 97 00 +SE_W036 = 98 00 +SE_W059 = 99 00 +SE_W059B = 9A 00 +SE_W010 = 9B 00 +SE_W011 = 9C 00 +SE_W017 = 9D 00 +SE_W019 = 9E 00 +SE_W028 = 9F 00 +SE_W013B = A0 00 +SE_W044 = A1 00 +SE_W029 = A2 00 +SE_W057 = A3 00 +SE_W056 = A4 00 +SE_W250 = A5 00 +SE_W030 = A6 00 +SE_W039 = A7 00 +SE_W054 = A8 00 +SE_W077 = A9 00 +SE_W020 = AA 00 +SE_W082 = AB 00 +SE_W047 = AC 00 +SE_W195 = AD 00 +SE_W006 = AE 00 +SE_W091 = AF 00 +SE_W146 = B0 00 +SE_W120 = B1 00 +SE_W153 = B2 00 +SE_W071B = B3 00 +SE_W071 = B4 00 +SE_W103 = B5 00 +SE_W062 = B6 00 +SE_W062B = B7 00 +SE_W048 = B8 00 +SE_W187 = B9 00 +SE_W118 = BA 00 +SE_W155 = BB 00 +SE_W122 = BC 00 +SE_W060 = BD 00 +SE_W185 = BE 00 +SE_W014 = BF 00 +SE_W043 = C0 00 +SE_W207 = C1 00 +SE_W207B = C2 00 +SE_W215 = C3 00 +SE_W109 = C4 00 +SE_W173 = C5 00 +SE_W280 = C6 00 +SE_W202 = C7 00 +SE_W060B = C8 00 +SE_W076 = C9 00 +SE_W080 = CA 00 +SE_W100 = CB 00 +SE_W107 = CC 00 +SE_W166 = CD 00 +SE_W129 = CE 00 +SE_W115 = CF 00 +SE_W112 = D0 00 +SE_W197 = D1 00 +SE_W199 = D2 00 +SE_W236 = D3 00 +SE_W204 = D4 00 +SE_W268 = D5 00 +SE_W070 = D6 00 +SE_W063 = D7 00 +SE_W127 = D8 00 +SE_W179 = D9 00 +SE_W151 = DA 00 +SE_W201 = DB 00 +SE_W161 = DC 00 +SE_W161B = DD 00 +SE_W227 = DE 00 +SE_W227B = DF 00 +SE_W226 = E0 00 +SE_W208 = E1 00 +SE_W213 = E2 00 +SE_W213B = E3 00 +SE_W234 = E4 00 +SE_W260 = E5 00 +SE_W328 = E6 00 +SE_W320 = E7 00 +SE_W255 = E8 00 +SE_W291 = E9 00 +SE_W089 = EA 00 +SE_W239 = EB 00 +SE_W230 = EC 00 +SE_W281 = ED 00 +SE_W327 = EE 00 +SE_W287 = EF 00 +SE_W257 = F0 00 +SE_W253 = F1 00 +SE_W258 = F2 00 +SE_W322 = F3 00 +SE_W298 = F4 00 +SE_W287B = F5 00 +SE_W114 = F6 00 +SE_W063B = F7 00 +SE_RG_W_DOOR = F8 00 +SE_RG_CARD1 = F9 00 +SE_RG_CARD2 = FA 00 +SE_RG_CARD3 = FB 00 +SE_RG_BAG1 = FC 00 +SE_RG_BAG2 = FD 00 +SE_RG_GETTING = FE 00 +SE_RG_SHOP = FF 00 +SE_RG_KITEKI = 00 01 +SE_RG_HELP_OP = 01 01 +SE_RG_HELP_CL = 02 01 +SE_RG_HELP_NG = 03 01 +SE_RG_DEOMOV = 04 01 +SE_RG_EXCELLENT = 05 01 +SE_RG_NAWAMISS = 06 01 +SE_TOREEYE = 07 01 +SE_TOREOFF = 08 01 +SE_HANTEI1 = 09 01 +SE_HANTEI2 = 0A 01 +SE_CURTAIN = 0B 01 +SE_CURTAIN1 = 0C 01 +SE_USSOKI = 0D 01 +MUS_TETSUJI = 5E 01 +MUS_FIELD13 = 5F 01 +MUS_KACHI22 = 60 01 +MUS_KACHI2 = 61 01 +MUS_KACHI3 = 62 01 +MUS_KACHI5 = 63 01 +MUS_PCC = 64 01 +MUS_NIBI = 65 01 +MUS_SUIKUN = 66 01 +MUS_DOORO1 = 67 01 +MUS_DOORO_X1 = 68 01 +MUS_DOORO_X3 = 69 01 +MUS_MACHI_S2 = 6A 01 +MUS_MACHI_S4 = 6B 01 +MUS_GIM = 6C 01 +MUS_NAMINORI = 6D 01 +MUS_DAN01 = 6E 01 +MUS_FANFA1 = 6F 01 +MUS_ME_ASA = 70 01 +MUS_ME_BACHI = 71 01 +MUS_FANFA4 = 72 01 +MUS_FANFA5 = 73 01 +MUS_ME_WAZA = 74 01 +MUS_BIJYUTU = 75 01 +MUS_DOORO_X4 = 76 01 +MUS_FUNE_KAN = 77 01 +MUS_ME_SHINKA = 78 01 +MUS_SHINKA = 79 01 +MUS_ME_WASURE = 7A 01 +MUS_SYOUJOEYE = 7B 01 +MUS_BOYEYE = 7C 01 +MUS_DAN02 = 7D 01 +MUS_MACHI_S3 = 7E 01 +MUS_ODAMAKI = 7F 01 +MUS_B_TOWER = 80 01 +MUS_SWIMEYE = 81 01 +MUS_DAN03 = 82 01 +MUS_ME_KINOMI = 83 01 +MUS_ME_TAMA = 84 01 +MUS_ME_B_BIG = 85 01 +MUS_ME_B_SMALL = 86 01 +MUS_ME_ZANNEN = 87 01 +MUS_BD_TIME = 88 01 +MUS_TEST1 = 89 01 +MUS_TEST2 = 8A 01 +MUS_TEST3 = 8B 01 +MUS_TEST4 = 8C 01 +MUS_TEST = 8D 01 +MUS_GOMACHI0 = 8E 01 +MUS_GOTOWN = 8F 01 +MUS_POKECEN = 90 01 +MUS_NEXTROAD = 91 01 +MUS_GRANROAD = 92 01 +MUS_CYCLING = 93 01 +MUS_FRIENDLY = 94 01 +MUS_MISHIRO = 95 01 +MUS_TOZAN = 96 01 +MUS_GIRLEYE = 97 01 +MUS_MINAMO = 98 01 +MUS_ASHROAD = 99 01 +MUS_EVENT0 = 9A 01 +MUS_DEEPDEEP = 9B 01 +MUS_KACHI1 = 9C 01 +MUS_TITLE3 = 9D 01 +MUS_DEMO1 = 9E 01 +MUS_GIRL_SUP = 9F 01 +MUS_HAGESHII = A0 01 +MUS_KAKKOII = A1 01 +MUS_KAZANBAI = A2 01 +MUS_AQA_0 = A3 01 +MUS_TSURETEK = A4 01 +MUS_BOY_SUP = A5 01 +MUS_RAINBOW = A6 01 +MUS_AYASII = A7 01 +MUS_KACHI4 = A8 01 +MUS_ROPEWAY = A9 01 +MUS_CASINO = AA 01 +MUS_HIGHTOWN = AB 01 +MUS_SAFARI = AC 01 +MUS_C_ROAD = AD 01 +MUS_AJITO = AE 01 +MUS_M_BOAT = AF 01 +MUS_M_DUNGON = B0 01 +MUS_FINECITY = B1 01 +MUS_MACHUPI = B2 01 +MUS_P_SCHOOL = B3 01 +MUS_DENDOU = B4 01 +MUS_TONEKUSA = B5 01 +MUS_MABOROSI = B6 01 +MUS_CON_FAN = B7 01 +MUS_CONTEST0 = B8 01 +MUS_MGM0 = B9 01 +MUS_T_BATTLE = BA 01 +MUS_OOAME = BB 01 +MUS_HIDERI = BC 01 +MUS_RUNECITY = BD 01 +MUS_CON_K = BE 01 +MUS_EIKOU_R = BF 01 +MUS_KARAKURI = C0 01 +MUS_HUTAGO = C1 01 +MUS_SITENNOU = C2 01 +MUS_YAMA_EYE = C3 01 +MUS_CONLOBBY = C4 01 +MUS_INTER_V = C5 01 +MUS_DAIGO = C6 01 +MUS_THANKFOR = C7 01 +MUS_END = C8 01 +MUS_B_FRONTIER = C9 01 +MUS_B_ARENA = CA 01 +MUS_ME_POINTGET = CB 01 +MUS_ME_TORE_EYE = CC 01 +MUS_PYRAMID = CD 01 +MUS_PYRAMID_TOP = CE 01 +MUS_B_PALACE = CF 01 +MUS_REKKUU_KOURIN = D0 01 +MUS_SATTOWER = D1 01 +MUS_ME_SYMBOLGET = D2 01 +MUS_B_DOME = D3 01 +MUS_B_TUBE = D4 01 +MUS_B_FACTORY = D5 01 +MUS_VS_REKKU = D6 01 +MUS_VS_FRONT = D7 01 +MUS_VS_MEW = D8 01 +MUS_B_DOME1 = D9 01 +MUS_BATTLE27 = DA 01 +MUS_BATTLE31 = DB 01 +MUS_BATTLE20 = DC 01 +MUS_BATTLE32 = DD 01 +MUS_BATTLE33 = DE 01 +MUS_BATTLE36 = DF 01 +MUS_BATTLE34 = E0 01 +MUS_BATTLE35 = E1 01 +MUS_BATTLE38 = E2 01 +MUS_BATTLE30 = E3 01 +MUS_RG_ANNAI = E4 01 +MUS_RG_SLOT = E5 01 +MUS_RG_AJITO = E6 01 +MUS_RG_GYM = E7 01 +MUS_RG_PURIN = E8 01 +MUS_RG_DEMO = E9 01 +MUS_RG_TITLE = EA 01 +MUS_RG_GUREN = EB 01 +MUS_RG_SHION = EC 01 +MUS_RG_KAIHUKU = ED 01 +MUS_RG_CYCLING = EE 01 +MUS_RG_ROCKET = EF 01 +MUS_RG_SHOUJO = F0 01 +MUS_RG_SHOUNEN = F1 01 +MUS_RG_DENDOU = F2 01 +MUS_RG_T_MORI = F3 01 +MUS_RG_OTSUKIMI = F4 01 +MUS_RG_POKEYASHI = F5 01 +MUS_RG_ENDING = F6 01 +MUS_RG_LOAD01 = F7 01 +MUS_RG_OPENING = F8 01 +MUS_RG_LOAD02 = F9 01 +MUS_RG_LOAD03 = FA 01 +MUS_RG_CHAMP_R = FB 01 +MUS_RG_VS_GYM = FC 01 +MUS_RG_VS_TORE = FD 01 +MUS_RG_VS_YASEI = FE 01 +MUS_RG_VS_LAST = FF 01 +MUS_RG_MASARA = 00 02 +MUS_RG_KENKYU = 01 02 +MUS_RG_OHKIDO = 02 02 +MUS_RG_POKECEN = 03 02 +MUS_RG_SANTOAN = 04 02 +MUS_RG_NAMINORI = 05 02 +MUS_RG_P_TOWER = 06 02 +MUS_RG_SHIRUHU = 07 02 +MUS_RG_HANADA = 08 02 +MUS_RG_TAMAMUSI = 09 02 +MUS_RG_WIN_TRE = 0A 02 +MUS_RG_WIN_YASEI = 0B 02 +MUS_RG_WIN_GYM = 0C 02 +MUS_RG_KUCHIBA = 0D 02 +MUS_RG_NIBI = 0E 02 +MUS_RG_RIVAL1 = 0F 02 +MUS_RG_RIVAL2 = 10 02 +MUS_RG_FAN2 = 11 02 +MUS_RG_FAN5 = 12 02 +MUS_RG_FAN6 = 13 02 +MUS_ME_RG_PHOTO = 14 02 +MUS_RG_TITLEROG = 15 02 +MUS_RG_GET_YASEI = 16 02 +MUS_RG_SOUSA = 17 02 +MUS_RG_SEKAIKAN = 18 02 +MUS_RG_SEIBETU = 19 02 +MUS_RG_JUMP = 1A 02 +MUS_RG_UNION = 1B 02 +MUS_RG_NETWORK = 1C 02 +MUS_RG_OKURIMONO = 1D 02 +MUS_RG_KINOMIKUI = 1E 02 +MUS_RG_NANADUNGEON = 1F 02 +MUS_RG_OSHIE_TV = 20 02 +MUS_RG_NANASHIMA = 21 02 +MUS_RG_NANAISEKI = 22 02 +MUS_RG_NANA123 = 23 02 +MUS_RG_NANA45 = 24 02 +MUS_RG_NANA67 = 25 02 +MUS_RG_POKEFUE = 26 02 +MUS_RG_VS_DEO = 27 02 +MUS_RG_VS_MYU2 = 28 02 +MUS_RG_VS_DEN = 29 02 +MUS_RG_EXEYE = 2A 02 +MUS_RG_DEOEYE = 2B 02 +MUS_RG_T_TOWER = 2C 02 +MUS_RG_SLOWMASARA = 2D 02 +MUS_RG_TVNOIZE = 2E 02 +PH_TRAP_BLEND = 2F 02 +PH_TRAP_HELD = 30 02 +PH_TRAP_SOLO = 31 02 +PH_FACE_BLEND = 32 02 +PH_FACE_HELD = 33 02 +PH_FACE_SOLO = 34 02 +PH_CLOTH_BLEND = 35 02 +PH_CLOTH_HELD = 36 02 +PH_CLOTH_SOLO = 37 02 +PH_DRESS_BLEND = 38 02 +PH_DRESS_HELD = 39 02 +PH_DRESS_SOLO = 3A 02 +PH_FLEECE_BLEND = 3B 02 +PH_FLEECE_HELD = 3C 02 +PH_FLEECE_SOLO = 3D 02 +PH_KIT_BLEND = 3E 02 +PH_KIT_HELD = 3F 02 +PH_KIT_SOLO = 40 02 +PH_PRICE_BLEND = 41 02 +PH_PRICE_HELD = 42 02 +PH_PRICE_SOLO = 43 02 +PH_LOT_BLEND = 44 02 +PH_LOT_HELD = 45 02 +PH_LOT_SOLO = 46 02 +PH_GOAT_BLEND = 47 02 +PH_GOAT_HELD = 48 02 +PH_GOAT_SOLO = 49 02 +PH_THOUGHT_BLEND = 4A 02 +PH_THOUGHT_HELD = 4B 02 +PH_THOUGHT_SOLO = 4C 02 +PH_CHOICE_BLEND = 4D 02 +PH_CHOICE_HELD = 4E 02 +PH_CHOICE_SOLO = 4F 02 +PH_MOUTH_BLEND = 50 02 +PH_MOUTH_HELD = 51 02 +PH_MOUTH_SOLO = 52 02 +PH_FOOT_BLEND = 53 02 +PH_FOOT_HELD = 54 02 +PH_FOOT_SOLO = 55 02 +PH_GOOSE_BLEND = 56 02 +PH_GOOSE_HELD = 57 02 +PH_GOOSE_SOLO = 58 02 +PH_STRUT_BLEND = 59 02 +PH_STRUT_HELD = 5A 02 +PH_STRUT_SOLO = 5B 02 +PH_CURE_BLEND = 5C 02 +PH_CURE_HELD = 5D 02 +PH_CURE_SOLO = 5E 02 +PH_NURSE_BLEND = 5F 02 +PH_NURSE_HELD = 60 02 +PH_NURSE_SOLO = 61 02 + +A_BUTTON = F8 00 +B_BUTTON = F8 01 +DPAD_UPDOWN = F8 0A +DPAD_NONE = F8 0C + +UP_ARROW_2 = F9 00 +DOWN_ARROW_2 = F9 01 +LEFT_ARROW_2 = F9 02 +RIGHT_ARROW_2 = F9 03 +PLUS = F9 04 +LV_2 = F9 05 +PP = F9 06 +ID = F9 07 +NO = F9 08 +UNDERSCORE = F9 09 +CIRCLE_1 = F9 0A +CIRCLE_2 = F9 0B +CIRCLE_3 = F9 0C +CIRCLE_4 = F9 0D +CIRCLE_5 = F9 0E +CIRCLE_6 = F9 0F +CIRCLE_7 = F9 10 +CIRCLE_8 = F9 11 +CIRCLE_9 = F9 12 +ROUND_LEFT_PAREN = F9 13 +ROUND_RIGHT_PAREN = F9 14 +CIRCLE_DOT = F9 15 +TRIANGLE = F9 16 +BIG_MULT_X = F9 17 + +EMOJI_UNDERSCORE = F9 D0 +EMOJI_PIPE = F9 D1 +EMOJI_HIGHBAR = F9 D2 +EMOJI_TILDE = F9 D3 +EMOJI_LEFT_PAREN = F9 D4 +EMOJI_RIGHT_PAREN = F9 D5 +EMOJI_UNION = F9 D6 @ ⊂ +EMOJI_GREATER_THAN = F9 D7 +EMOJI_LEFT_EYE = F9 D8 +EMOJI_RIGHT_EYE = F9 D9 +EMOJI_AT = F9 DA +EMOJI_SEMICOLON = F9 DB +EMOJI_PLUS = F9 DC +EMOJI_MINUS = F9 DD +EMOJI_EQUALS = F9 DE +EMOJI_SPIRAL = F9 DF +EMOJI_TONGUE = F9 E0 +EMOJI_TRIANGLE_OUTLINE = F9 E1 +EMOJI_ACUTE = F9 E2 +EMOJI_GRAVE = F9 E3 +EMOJI_CIRCLE = F9 E4 +EMOJI_TRIANGLE = F9 E5 +EMOJI_SQUARE = F9 E6 +EMOJI_HEART = F9 E7 +EMOJI_MOON = F9 E8 +EMOJI_NOTE = F9 E9 +EMOJI_BALL = F9 EA +EMOJI_BOLT = F9 EB +EMOJI_LEAF = F9 EC +EMOJI_FIRE = F9 ED +EMOJI_WATER = F9 EE +EMOJI_LEFT_FIST = F9 EF +EMOJI_RIGHT_FIST = F9 F0 +EMOJI_BIGWHEEL = F9 F1 +EMOJI_SMALLWHEEL = F9 F2 +EMOJI_SPHERE = F9 F3 +EMOJI_IRRITATED = F9 F4 +EMOJI_MISCHIEVOUS = F9 F5 +EMOJI_HAPPY = F9 F6 +EMOJI_ANGRY = F9 F7 +EMOJI_SURPRISED = F9 F8 +EMOJI_BIGSMILE = F9 F9 +EMOJI_EVIL = F9 FA +EMOJI_TIRED = F9 FB +EMOJI_NEUTRAL = F9 FC +EMOJI_SHOCKED = F9 FD +EMOJI_BIGANGER = F9 FE + +'\l' = FA @ scroll up window text +'\p' = FB @ new paragraph +'\n' = FE @ new line diff --git a/berry_fix/payload/common_syms/agb_flash.txt b/berry_fix/payload/common_syms/agb_flash.txt new file mode 100644 index 000000000..cb421ec80 --- /dev/null +++ b/berry_fix/payload/common_syms/agb_flash.txt @@ -0,0 +1,10 @@ +gFlashTimeoutFlag +PollFlashStatus +WaitForFlashWrite +ProgramFlashSector +gFlash +ProgramFlashByte +gFlashNumRemainingBytes +EraseFlashChip +EraseFlashSector +gFlashMaxTime diff --git a/berry_fix/payload/common_syms/main.txt b/berry_fix/payload/common_syms/main.txt new file mode 100644 index 000000000..b62c72124 --- /dev/null +++ b/berry_fix/payload/common_syms/main.txt @@ -0,0 +1,9 @@ +gIntrTable +gHeldKeys +gNewKeys +gIntrVector +gUpdateSuccessful +gUnknown_3001194 +gUnknown_30011A0 +gMainCallbackState +gGameVersion diff --git a/berry_fix/payload/common_syms/rtc.txt b/berry_fix/payload/common_syms/rtc.txt new file mode 100644 index 000000000..7aafbe65d --- /dev/null +++ b/berry_fix/payload/common_syms/rtc.txt @@ -0,0 +1,2 @@ +gTimeSinceBerryUpdate +gRtcUTCTime diff --git a/berry_fix/payload/constants/gba_constants.inc b/berry_fix/payload/constants/gba_constants.inc new file mode 100644 index 000000000..9d59c8fcd --- /dev/null +++ b/berry_fix/payload/constants/gba_constants.inc @@ -0,0 +1,490 @@ + .set PSR_USR_MODE, 0x00000010 + .set PSR_FIQ_MODE, 0x00000011 + .set PSR_IRQ_MODE, 0x00000012 + .set PSR_SVC_MODE, 0x00000013 + .set PSR_ABT_MODE, 0x00000017 + .set PSR_UND_MODE, 0x0000001b + .set PSR_SYS_MODE, 0x0000001f + .set PSR_MODE_MASK, 0x0000001f + .set PSR_T_BIT, 0x00000020 + .set PSR_F_BIT, 0x00000040 + .set PSR_I_BIT, 0x00000080 + + .set EWRAM_START, 0x02000000 + .set EWRAM_END, EWRAM_START + 0x40000 + .set IWRAM_START, 0x03000000 + .set IWRAM_END, IWRAM_START + 0x8000 + + .set PLTT, 0x5000000 + .set BG_PLTT, PLTT + .set OBJ_PLTT, PLTT + 0x200 + + .set VRAM, 0x6000000 + .set BG_VRAM, VRAM + .set OBJ_VRAM0, VRAM + 0x10000 @ text-mode BG + .set OBJ_VRAM1, VRAM + 0x14000 @ bitmap-mode BG + + .set OAM, 0x7000000 + + .set SOUND_INFO_PTR, 0x3007FF0 + .set INTR_CHECK, 0x3007FF8 + .set INTR_VECTOR, 0x3007FFC + + .set INTR_FLAG_VBLANK, 1 << 0 + .set INTR_FLAG_HBLANK, 1 << 1 + .set INTR_FLAG_VCOUNT, 1 << 2 + .set INTR_FLAG_TIMER0, 1 << 3 + .set INTR_FLAG_TIMER1, 1 << 4 + .set INTR_FLAG_TIMER2, 1 << 5 + .set INTR_FLAG_TIMER3, 1 << 6 + .set INTR_FLAG_SERIAL, 1 << 7 + .set INTR_FLAG_DMA0, 1 << 8 + .set INTR_FLAG_DMA1, 1 << 9 + .set INTR_FLAG_DMA2, 1 << 10 + .set INTR_FLAG_DMA3, 1 << 11 + .set INTR_FLAG_KEYPAD, 1 << 12 + .set INTR_FLAG_GAMEPAK, 1 << 13 + + .set VCOUNT_VBLANK, 160 + .set TOTAL_SCANLINES, 228 + + .set REG_BASE, 0x4000000 @ I/O register base address + +@ I/O register offsets + .set OFFSET_REG_DISPCNT, 0x0 + .set OFFSET_REG_DISPSTAT, 0x4 + .set OFFSET_REG_VCOUNT, 0x6 + .set OFFSET_REG_BG0CNT, 0x8 + .set OFFSET_REG_BG1CNT, 0xa + .set OFFSET_REG_BG2CNT, 0xc + .set OFFSET_REG_BG3CNT, 0xe + .set OFFSET_REG_BG0HOFS, 0x10 + .set OFFSET_REG_BG0VOFS, 0x12 + .set OFFSET_REG_BG1HOFS, 0x14 + .set OFFSET_REG_BG1VOFS, 0x16 + .set OFFSET_REG_BG2HOFS, 0x18 + .set OFFSET_REG_BG2VOFS, 0x1a + .set OFFSET_REG_BG3HOFS, 0x1c + .set OFFSET_REG_BG3VOFS, 0x1e + .set OFFSET_REG_BG2PA, 0x20 + .set OFFSET_REG_BG2PB, 0x22 + .set OFFSET_REG_BG2PC, 0x24 + .set OFFSET_REG_BG2PD, 0x26 + .set OFFSET_REG_BG2X_L, 0x28 + .set OFFSET_REG_BG2X_H, 0x2a + .set OFFSET_REG_BG2Y_L, 0x2c + .set OFFSET_REG_BG2Y_H, 0x2e + .set OFFSET_REG_BG3PA, 0x30 + .set OFFSET_REG_BG3PB, 0x32 + .set OFFSET_REG_BG3PC, 0x34 + .set OFFSET_REG_BG3PD, 0x36 + .set OFFSET_REG_BG3X_L, 0x38 + .set OFFSET_REG_BG3X_H, 0x3a + .set OFFSET_REG_BG3Y_L, 0x3c + .set OFFSET_REG_BG3Y_H, 0x3e + .set OFFSET_REG_WIN0H, 0x40 + .set OFFSET_REG_WIN1H, 0x42 + .set OFFSET_REG_WIN0V, 0x44 + .set OFFSET_REG_WIN1V, 0x46 + .set OFFSET_REG_WININ, 0x48 + .set OFFSET_REG_WINOUT, 0x4a + .set OFFSET_REG_MOSAIC, 0x4c + .set OFFSET_REG_BLDCNT, 0x50 + .set OFFSET_REG_BLDALPHA, 0x52 + .set OFFSET_REG_BLDY, 0x54 + + .set OFFSET_REG_SOUND1CNT, 0x60 + .set OFFSET_REG_SOUND1CNT_L, 0x60 + .set OFFSET_REG_NR10, 0x60 + .set OFFSET_REG_SOUND1CNT_H, 0x62 + .set OFFSET_REG_NR11, 0x62 + .set OFFSET_REG_NR12, 0x63 + .set OFFSET_REG_SOUND1CNT_X, 0x64 + .set OFFSET_REG_NR13, 0x64 + .set OFFSET_REG_NR14, 0x65 + .set OFFSET_REG_SOUND2CNT, 0x68 + .set OFFSET_REG_SOUND2CNT_L, 0x68 + .set OFFSET_REG_NR21, 0x68 + .set OFFSET_REG_NR22, 0x69 + .set OFFSET_REG_SOUND2CNT_H, 0x6c + .set OFFSET_REG_NR23, 0x6c + .set OFFSET_REG_NR24, 0x6d + .set OFFSET_REG_SOUND3CNT, 0x70 + .set OFFSET_REG_SOUND3CNT_L, 0x70 + .set OFFSET_REG_NR30, 0x70 + .set OFFSET_REG_SOUND3CNT_H, 0x72 + .set OFFSET_REG_NR31, 0x72 + .set OFFSET_REG_NR32, 0x73 + .set OFFSET_REG_SOUND3CNT_X, 0x74 + .set OFFSET_REG_NR33, 0x74 + .set OFFSET_REG_NR34, 0x75 + .set OFFSET_REG_SOUND4CNT, 0x78 + .set OFFSET_REG_SOUND4CNT_L, 0x78 + .set OFFSET_REG_NR41, 0x78 + .set OFFSET_REG_NR42, 0x79 + .set OFFSET_REG_SOUND4CNT_H, 0x7c + .set OFFSET_REG_NR43, 0x7c + .set OFFSET_REG_NR44, 0x7d + .set OFFSET_REG_SOUNDCNT, 0x80 + .set OFFSET_REG_SOUNDCNT_L, 0x80 + .set OFFSET_REG_NR50, 0x80 + .set OFFSET_REG_NR51, 0x81 + .set OFFSET_REG_SOUNDCNT_H, 0x82 + .set OFFSET_REG_SOUNDCNT_X, 0x84 + .set OFFSET_REG_NR52, 0x84 + .set OFFSET_REG_SOUNDBIAS, 0x88 + .set OFFSET_REG_WAVE_RAM, 0x90 + .set OFFSET_REG_WAVE_RAM0, 0x90 + .set OFFSET_REG_WAVE_RAM0_L, 0x90 + .set OFFSET_REG_WAVE_RAM0_H, 0x92 + .set OFFSET_REG_WAVE_RAM1, 0x94 + .set OFFSET_REG_WAVE_RAM1_L, 0x94 + .set OFFSET_REG_WAVE_RAM1_H, 0x96 + .set OFFSET_REG_WAVE_RAM2, 0x98 + .set OFFSET_REG_WAVE_RAM2_L, 0x98 + .set OFFSET_REG_WAVE_RAM2_H, 0x9a + .set OFFSET_REG_WAVE_RAM3, 0x9c + .set OFFSET_REG_WAVE_RAM3_L, 0x9c + .set OFFSET_REG_WAVE_RAM3_H, 0x9e + .set OFFSET_REG_FIFO, 0xa0 + .set OFFSET_REG_FIFO_A, 0xa0 + .set OFFSET_REG_FIFO_A_L, 0xa0 + .set OFFSET_REG_FIFO_A_H, 0xa2 + .set OFFSET_REG_FIFO_B, 0xa4 + .set OFFSET_REG_FIFO_B_L, 0xa4 + .set OFFSET_REG_FIFO_B_H, 0xa6 + + .set OFFSET_REG_DMA0, 0xb0 + .set OFFSET_REG_DMA0SAD, 0xb0 + .set OFFSET_REG_DMA0SAD_L, 0xb0 + .set OFFSET_REG_DMA0SAD_H, 0xb2 + .set OFFSET_REG_DMA0DAD, 0xb4 + .set OFFSET_REG_DMA0DAD_L, 0xb4 + .set OFFSET_REG_DMA0DAD_H, 0xb6 + .set OFFSET_REG_DMA0CNT, 0xb8 + .set OFFSET_REG_DMA0CNT_L, 0xb8 + .set OFFSET_REG_DMA0CNT_H, 0xba + .set OFFSET_REG_DMA1, 0xbc + .set OFFSET_REG_DMA1SAD, 0xbc + .set OFFSET_REG_DMA1SAD_L, 0xbc + .set OFFSET_REG_DMA1SAD_H, 0xbe + .set OFFSET_REG_DMA1DAD, 0xc0 + .set OFFSET_REG_DMA1DAD_L, 0xc0 + .set OFFSET_REG_DMA1DAD_H, 0xc2 + .set OFFSET_REG_DMA1CNT, 0xc4 + .set OFFSET_REG_DMA1CNT_L, 0xc4 + .set OFFSET_REG_DMA1CNT_H, 0xc6 + .set OFFSET_REG_DMA2, 0xc8 + .set OFFSET_REG_DMA2SAD, 0xc8 + .set OFFSET_REG_DMA2SAD_L, 0xc8 + .set OFFSET_REG_DMA2SAD_H, 0xca + .set OFFSET_REG_DMA2DAD, 0xcc + .set OFFSET_REG_DMA2DAD_L, 0xcc + .set OFFSET_REG_DMA2DAD_H, 0xce + .set OFFSET_REG_DMA2CNT, 0xd0 + .set OFFSET_REG_DMA2CNT_L, 0xd0 + .set OFFSET_REG_DMA2CNT_H, 0xd2 + .set OFFSET_REG_DMA3, 0xd4 + .set OFFSET_REG_DMA3SAD, 0xd4 + .set OFFSET_REG_DMA3SAD_L, 0xd4 + .set OFFSET_REG_DMA3SAD_H, 0xd6 + .set OFFSET_REG_DMA3DAD, 0xd8 + .set OFFSET_REG_DMA3DAD_L, 0xd8 + .set OFFSET_REG_DMA3DAD_H, 0xda + .set OFFSET_REG_DMA3CNT, 0xdc + .set OFFSET_REG_DMA3CNT_L, 0xdc + .set OFFSET_REG_DMA3CNT_H, 0xde + + .set OFFSET_REG_TM0CNT, 0x100 + .set OFFSET_REG_TM0CNT_L, 0x100 + .set OFFSET_REG_TM0CNT_H, 0x102 + .set OFFSET_REG_TM1CNT, 0x104 + .set OFFSET_REG_TM1CNT_L, 0x104 + .set OFFSET_REG_TM1CNT_H, 0x106 + .set OFFSET_REG_TM2CNT, 0x108 + .set OFFSET_REG_TM2CNT_L, 0x108 + .set OFFSET_REG_TM2CNT_H, 0x10a + .set OFFSET_REG_TM3CNT, 0x10c + .set OFFSET_REG_TM3CNT_L, 0x10c + .set OFFSET_REG_TM3CNT_H, 0x10e + + .set OFFSET_REG_SIOCNT, 0x128 + .set OFFSET_REG_SIODATA8, 0x12a + .set OFFSET_REG_SIODATA32, 0x120 + .set OFFSET_REG_SIOMLT_SEND, 0x12a + .set OFFSET_REG_SIOMLT_RECV, 0x120 + .set OFFSET_REG_SIOMULTI0, 0x120 + .set OFFSET_REG_SIOMULTI1, 0x122 + .set OFFSET_REG_SIOMULTI2, 0x124 + .set OFFSET_REG_SIOMULTI3, 0x126 + + .set OFFSET_REG_KEYINPUT, 0x130 + .set OFFSET_REG_KEYCNT, 0x132 + + .set OFFSET_REG_RCNT, 0x134 + + .set OFFSET_REG_JOYCNT, 0x140 + .set OFFSET_REG_JOYSTAT, 0x158 + .set OFFSET_REG_JOY_RECV, 0x150 + .set OFFSET_REG_JOY_RECV_L, 0x150 + .set OFFSET_REG_JOY_RECV_H, 0x152 + .set OFFSET_REG_JOY_TRANS, 0x154 + .set OFFSET_REG_JOY_TRANS_L, 0x154 + .set OFFSET_REG_JOY_TRANS_H, 0x156 + + .set OFFSET_REG_IME, 0x208 + .set OFFSET_REG_IE, 0x200 + .set OFFSET_REG_IF, 0x202 + + .set OFFSET_REG_WAITCNT, 0x204 + +@ I/O register addresses + .set REG_DISPCNT, REG_BASE + OFFSET_REG_DISPCNT + .set REG_DISPSTAT, REG_BASE + OFFSET_REG_DISPSTAT + .set REG_VCOUNT, REG_BASE + OFFSET_REG_VCOUNT + .set REG_BG0CNT, REG_BASE + OFFSET_REG_BG0CNT + .set REG_BG1CNT, REG_BASE + OFFSET_REG_BG1CNT + .set REG_BG2CNT, REG_BASE + OFFSET_REG_BG2CNT + .set REG_BG3CNT, REG_BASE + OFFSET_REG_BG3CNT + .set REG_BG0HOFS, REG_BASE + OFFSET_REG_BG0HOFS + .set REG_BG0VOFS, REG_BASE + OFFSET_REG_BG0VOFS + .set REG_BG1HOFS, REG_BASE + OFFSET_REG_BG1HOFS + .set REG_BG1VOFS, REG_BASE + OFFSET_REG_BG1VOFS + .set REG_BG2HOFS, REG_BASE + OFFSET_REG_BG2HOFS + .set REG_BG2VOFS, REG_BASE + OFFSET_REG_BG2VOFS + .set REG_BG3HOFS, REG_BASE + OFFSET_REG_BG3HOFS + .set REG_BG3VOFS, REG_BASE + OFFSET_REG_BG3VOFS + .set REG_BG2PA, REG_BASE + OFFSET_REG_BG2PA + .set REG_BG2PB, REG_BASE + OFFSET_REG_BG2PB + .set REG_BG2PC, REG_BASE + OFFSET_REG_BG2PC + .set REG_BG2PD, REG_BASE + OFFSET_REG_BG2PD + .set REG_BG2X_L, REG_BASE + OFFSET_REG_BG2X_L + .set REG_BG2X_H, REG_BASE + OFFSET_REG_BG2X_H + .set REG_BG2Y_L, REG_BASE + OFFSET_REG_BG2Y_L + .set REG_BG2Y_H, REG_BASE + OFFSET_REG_BG2Y_H + .set REG_BG3PA, REG_BASE + OFFSET_REG_BG3PA + .set REG_BG3PB, REG_BASE + OFFSET_REG_BG3PB + .set REG_BG3PC, REG_BASE + OFFSET_REG_BG3PC + .set REG_BG3PD, REG_BASE + OFFSET_REG_BG3PD + .set REG_BG3X_L, REG_BASE + OFFSET_REG_BG3X_L + .set REG_BG3X_H, REG_BASE + OFFSET_REG_BG3X_H + .set REG_BG3Y_L, REG_BASE + OFFSET_REG_BG3Y_L + .set REG_BG3Y_H, REG_BASE + OFFSET_REG_BG3Y_H + .set REG_WIN0H, REG_BASE + OFFSET_REG_WIN0H + .set REG_WIN1H, REG_BASE + OFFSET_REG_WIN1H + .set REG_WIN0V, REG_BASE + OFFSET_REG_WIN0V + .set REG_WIN1V, REG_BASE + OFFSET_REG_WIN1V + .set REG_WININ, REG_BASE + OFFSET_REG_WININ + .set REG_WINOUT, REG_BASE + OFFSET_REG_WINOUT + .set REG_MOSAIC, REG_BASE + OFFSET_REG_MOSAIC + .set REG_BLDCNT, REG_BASE + OFFSET_REG_BLDCNT + .set REG_BLDALPHA, REG_BASE + OFFSET_REG_BLDALPHA + .set REG_BLDY, REG_BASE + OFFSET_REG_BLDY + + .set REG_SOUND1CNT, REG_BASE + OFFSET_REG_SOUND1CNT + .set REG_SOUND1CNT_L, REG_BASE + OFFSET_REG_SOUND1CNT_L + .set REG_NR10, REG_BASE + OFFSET_REG_NR10 + .set REG_SOUND1CNT_H, REG_BASE + OFFSET_REG_SOUND1CNT_H + .set REG_NR11, REG_BASE + OFFSET_REG_NR11 + .set REG_NR12, REG_BASE + OFFSET_REG_NR12 + .set REG_SOUND1CNT_X, REG_BASE + OFFSET_REG_SOUND1CNT_X + .set REG_NR13, REG_BASE + OFFSET_REG_NR13 + .set REG_NR14, REG_BASE + OFFSET_REG_NR14 + .set REG_SOUND2CNT, REG_BASE + OFFSET_REG_SOUND2CNT + .set REG_SOUND2CNT_L, REG_BASE + OFFSET_REG_SOUND2CNT_L + .set REG_NR21, REG_BASE + OFFSET_REG_NR21 + .set REG_NR22, REG_BASE + OFFSET_REG_NR22 + .set REG_SOUND2CNT_H, REG_BASE + OFFSET_REG_SOUND2CNT_H + .set REG_NR23, REG_BASE + OFFSET_REG_NR23 + .set REG_NR24, REG_BASE + OFFSET_REG_NR24 + .set REG_SOUND3CNT, REG_BASE + OFFSET_REG_SOUND3CNT + .set REG_SOUND3CNT_L, REG_BASE + OFFSET_REG_SOUND3CNT_L + .set REG_NR30, REG_BASE + OFFSET_REG_NR30 + .set REG_SOUND3CNT_H, REG_BASE + OFFSET_REG_SOUND3CNT_H + .set REG_NR31, REG_BASE + OFFSET_REG_NR31 + .set REG_NR32, REG_BASE + OFFSET_REG_NR32 + .set REG_SOUND3CNT_X, REG_BASE + OFFSET_REG_SOUND3CNT_X + .set REG_NR33, REG_BASE + OFFSET_REG_NR33 + .set REG_NR34, REG_BASE + OFFSET_REG_NR34 + .set REG_SOUND4CNT, REG_BASE + OFFSET_REG_SOUND4CNT + .set REG_SOUND4CNT_L, REG_BASE + OFFSET_REG_SOUND4CNT_L + .set REG_NR41, REG_BASE + OFFSET_REG_NR41 + .set REG_NR42, REG_BASE + OFFSET_REG_NR42 + .set REG_SOUND4CNT_H, REG_BASE + OFFSET_REG_SOUND4CNT_H + .set REG_NR43, REG_BASE + OFFSET_REG_NR43 + .set REG_NR44, REG_BASE + OFFSET_REG_NR44 + .set REG_SOUNDCNT, REG_BASE + OFFSET_REG_SOUNDCNT + .set REG_SOUNDCNT_L, REG_BASE + OFFSET_REG_SOUNDCNT_L + .set REG_NR50, REG_BASE + OFFSET_REG_NR50 + .set REG_NR51, REG_BASE + OFFSET_REG_NR51 + .set REG_SOUNDCNT_H, REG_BASE + OFFSET_REG_SOUNDCNT_H + .set REG_SOUNDCNT_X, REG_BASE + OFFSET_REG_SOUNDCNT_X + .set REG_NR52, REG_BASE + OFFSET_REG_NR52 + .set REG_SOUNDBIAS, REG_BASE + OFFSET_REG_SOUNDBIAS + .set REG_WAVE_RAM, REG_BASE + OFFSET_REG_WAVE_RAM + .set REG_WAVE_RAM0, REG_BASE + OFFSET_REG_WAVE_RAM0 + .set REG_WAVE_RAM0_L, REG_BASE + OFFSET_REG_WAVE_RAM0_L + .set REG_WAVE_RAM0_H, REG_BASE + OFFSET_REG_WAVE_RAM0_H + .set REG_WAVE_RAM1, REG_BASE + OFFSET_REG_WAVE_RAM1 + .set REG_WAVE_RAM1_L, REG_BASE + OFFSET_REG_WAVE_RAM1_L + .set REG_WAVE_RAM1_H, REG_BASE + OFFSET_REG_WAVE_RAM1_H + .set REG_WAVE_RAM2, REG_BASE + OFFSET_REG_WAVE_RAM2 + .set REG_WAVE_RAM2_L, REG_BASE + OFFSET_REG_WAVE_RAM2_L + .set REG_WAVE_RAM2_H, REG_BASE + OFFSET_REG_WAVE_RAM2_H + .set REG_WAVE_RAM3, REG_BASE + OFFSET_REG_WAVE_RAM3 + .set REG_WAVE_RAM3_L, REG_BASE + OFFSET_REG_WAVE_RAM3_L + .set REG_WAVE_RAM3_H, REG_BASE + OFFSET_REG_WAVE_RAM3_H + .set REG_FIFO, REG_BASE + OFFSET_REG_FIFO + .set REG_FIFO_A, REG_BASE + OFFSET_REG_FIFO_A + .set REG_FIFO_A_L, REG_BASE + OFFSET_REG_FIFO_A_L + .set REG_FIFO_A_H, REG_BASE + OFFSET_REG_FIFO_A_H + .set REG_FIFO_B, REG_BASE + OFFSET_REG_FIFO_B + .set REG_FIFO_B_L, REG_BASE + OFFSET_REG_FIFO_B_L + .set REG_FIFO_B_H, REG_BASE + OFFSET_REG_FIFO_B_H + + .set REG_DMA0, REG_BASE + OFFSET_REG_DMA0 + .set REG_DMA0SAD, REG_BASE + OFFSET_REG_DMA0SAD + .set REG_DMA0SAD_L, REG_BASE + OFFSET_REG_DMA0SAD_L + .set REG_DMA0SAD_H, REG_BASE + OFFSET_REG_DMA0SAD_H + .set REG_DMA0DAD, REG_BASE + OFFSET_REG_DMA0DAD + .set REG_DMA0DAD_L, REG_BASE + OFFSET_REG_DMA0DAD_L + .set REG_DMA0DAD_H, REG_BASE + OFFSET_REG_DMA0DAD_H + .set REG_DMA0CNT, REG_BASE + OFFSET_REG_DMA0CNT + .set REG_DMA0CNT_L, REG_BASE + OFFSET_REG_DMA0CNT_L + .set REG_DMA0CNT_H, REG_BASE + OFFSET_REG_DMA0CNT_H + .set REG_DMA1, REG_BASE + OFFSET_REG_DMA1 + .set REG_DMA1SAD, REG_BASE + OFFSET_REG_DMA1SAD + .set REG_DMA1SAD_L, REG_BASE + OFFSET_REG_DMA1SAD_L + .set REG_DMA1SAD_H, REG_BASE + OFFSET_REG_DMA1SAD_H + .set REG_DMA1DAD, REG_BASE + OFFSET_REG_DMA1DAD + .set REG_DMA1DAD_L, REG_BASE + OFFSET_REG_DMA1DAD_L + .set REG_DMA1DAD_H, REG_BASE + OFFSET_REG_DMA1DAD_H + .set REG_DMA1CNT, REG_BASE + OFFSET_REG_DMA1CNT + .set REG_DMA1CNT_L, REG_BASE + OFFSET_REG_DMA1CNT_L + .set REG_DMA1CNT_H, REG_BASE + OFFSET_REG_DMA1CNT_H + .set REG_DMA2, REG_BASE + OFFSET_REG_DMA2 + .set REG_DMA2SAD, REG_BASE + OFFSET_REG_DMA2SAD + .set REG_DMA2SAD_L, REG_BASE + OFFSET_REG_DMA2SAD_L + .set REG_DMA2SAD_H, REG_BASE + OFFSET_REG_DMA2SAD_H + .set REG_DMA2DAD, REG_BASE + OFFSET_REG_DMA2DAD + .set REG_DMA2DAD_L, REG_BASE + OFFSET_REG_DMA2DAD_L + .set REG_DMA2DAD_H, REG_BASE + OFFSET_REG_DMA2DAD_H + .set REG_DMA2CNT, REG_BASE + OFFSET_REG_DMA2CNT + .set REG_DMA2CNT_L, REG_BASE + OFFSET_REG_DMA2CNT_L + .set REG_DMA2CNT_H, REG_BASE + OFFSET_REG_DMA2CNT_H + .set REG_DMA3, REG_BASE + OFFSET_REG_DMA3 + .set REG_DMA3SAD, REG_BASE + OFFSET_REG_DMA3SAD + .set REG_DMA3SAD_L, REG_BASE + OFFSET_REG_DMA3SAD_L + .set REG_DMA3SAD_H, REG_BASE + OFFSET_REG_DMA3SAD_H + .set REG_DMA3DAD, REG_BASE + OFFSET_REG_DMA3DAD + .set REG_DMA3DAD_L, REG_BASE + OFFSET_REG_DMA3DAD_L + .set REG_DMA3DAD_H, REG_BASE + OFFSET_REG_DMA3DAD_H + .set REG_DMA3CNT, REG_BASE + OFFSET_REG_DMA3CNT + .set REG_DMA3CNT_L, REG_BASE + OFFSET_REG_DMA3CNT_L + .set REG_DMA3CNT_H, REG_BASE + OFFSET_REG_DMA3CNT_H + + .set REG_TM0CNT, REG_BASE + OFFSET_REG_TM0CNT + .set REG_TM0CNT_L, REG_BASE + OFFSET_REG_TM0CNT_L + .set REG_TM0CNT_H, REG_BASE + OFFSET_REG_TM0CNT_H + .set REG_TM1CNT, REG_BASE + OFFSET_REG_TM1CNT + .set REG_TM1CNT_L, REG_BASE + OFFSET_REG_TM1CNT_L + .set REG_TM1CNT_H, REG_BASE + OFFSET_REG_TM1CNT_H + .set REG_TM2CNT, REG_BASE + OFFSET_REG_TM2CNT + .set REG_TM2CNT_L, REG_BASE + OFFSET_REG_TM2CNT_L + .set REG_TM2CNT_H, REG_BASE + OFFSET_REG_TM2CNT_H + .set REG_TM3CNT, REG_BASE + OFFSET_REG_TM3CNT + .set REG_TM3CNT_L, REG_BASE + OFFSET_REG_TM3CNT_L + .set REG_TM3CNT_H, REG_BASE + OFFSET_REG_TM3CNT_H + + .set REG_SIOCNT, REG_BASE + OFFSET_REG_SIOCNT + .set REG_SIODATA8, REG_BASE + OFFSET_REG_SIODATA8 + .set REG_SIODATA32, REG_BASE + OFFSET_REG_SIODATA32 + .set REG_SIOMLT_SEND, REG_BASE + OFFSET_REG_SIOMLT_SEND + .set REG_SIOMLT_RECV, REG_BASE + OFFSET_REG_SIOMLT_RECV + .set REG_SIOMULTI0, REG_BASE + OFFSET_REG_SIOMULTI0 + .set REG_SIOMULTI1, REG_BASE + OFFSET_REG_SIOMULTI1 + .set REG_SIOMULTI2, REG_BASE + OFFSET_REG_SIOMULTI2 + .set REG_SIOMULTI3, REG_BASE + OFFSET_REG_SIOMULTI3 + + .set REG_KEYINPUT, REG_BASE + OFFSET_REG_KEYINPUT + .set REG_KEYCNT, REG_BASE + OFFSET_REG_KEYCNT + + .set REG_RCNT, REG_BASE + OFFSET_REG_RCNT + + .set REG_JOYCNT, REG_BASE + OFFSET_REG_JOYCNT + .set REG_JOYSTAT, REG_BASE + OFFSET_REG_JOYSTAT + .set REG_JOY_RECV, REG_BASE + OFFSET_REG_JOY_RECV + .set REG_JOY_RECV_L, REG_BASE + OFFSET_REG_JOY_RECV_L + .set REG_JOY_RECV_H, REG_BASE + OFFSET_REG_JOY_RECV_H + .set REG_JOY_TRANS, REG_BASE + OFFSET_REG_JOY_TRANS + .set REG_JOY_TRANS_L, REG_BASE + OFFSET_REG_JOY_TRANS_L + .set REG_JOY_TRANS_H, REG_BASE + OFFSET_REG_JOY_TRANS_H + + .set REG_IME, REG_BASE + OFFSET_REG_IME + .set REG_IE, REG_BASE + OFFSET_REG_IE + .set REG_IF, REG_BASE + OFFSET_REG_IF + + .set REG_WAITCNT, REG_BASE + OFFSET_REG_WAITCNT + +@ DMA register constants + + .set DMA_DEST_INC, 0x0000 + .set DMA_DEST_DEC, 0x0020 + .set DMA_DEST_FIXED, 0x0040 + .set DMA_DEST_RELOAD, 0x0060 + .set DMA_SRC_INC, 0x0000 + .set DMA_SRC_DEC, 0x0080 + .set DMA_SRC_FIXED, 0x0100 + .set DMA_REPEAT, 0x0200 + .set DMA_16BIT, 0x0000 + .set DMA_32BIT, 0x0400 + .set DMA_DREQ_ON, 0x0800 + .set DMA_START_NOW, 0x0000 + .set DMA_START_VBLANK, 0x1000 + .set DMA_START_HBLANK, 0x2000 + .set DMA_START_SPECIAL, 0x3000 + .set DMA_INTR_ENABLE, 0x4000 + .set DMA_ENABLE, 0x8000 + +@ OAM attribute constants + + .set OAM_OBJ_NORMAL, 0x00000000 + .set OAM_OBJ_BLEND, 0x00000400 + .set OAM_OBJ_WINDOW, 0x00000800 + + .set OAM_AFFINE_NONE, 0x00000000 + .set OAM_AFFINE_NORMAL_SIZE, 0x00000100 + .set OAM_OBJ_DISABLED, 0x00000200 + .set OAM_AFFINE_DOUBLE_SIZE, 0x00000300 + + .set OAM_MOSAIC_OFF, 0x00000000 + .set OAM_MOSAIC_ON, 0x00001000 + + .set OAM_4BPP, 0x00000000 + .set OAM_8BPP, 0x00002000 + + .set OAM_H_FLIP, 0x10000000 + .set OAM_V_FLIP, 0x20000000 + + .set OAM_SQUARE, 0x00000000 + .set OAM_H_RECTANGLE, 0x00004000 + .set OAM_V_RECTANGLE, 0x00008000 + .set OAM_SIZE_0, 0x00000000 + .set OAM_SIZE_1, 0x40000000 + .set OAM_SIZE_2, 0x80000000 + .set OAM_SIZE_3, 0xc0000000 + + .set OAM_SIZE_8x8, OAM_SIZE_0 | OAM_SQUARE + .set OAM_SIZE_16x16, OAM_SIZE_1 | OAM_SQUARE + .set OAM_SIZE_32x32, OAM_SIZE_2 | OAM_SQUARE + .set OAM_SIZE_64x64, OAM_SIZE_3 | OAM_SQUARE + + .set OAM_SIZE_16x8, OAM_SIZE_0 | OAM_H_RECTANGLE + .set OAM_SIZE_32x8, OAM_SIZE_1 | OAM_H_RECTANGLE + .set OAM_SIZE_32x16, OAM_SIZE_2 | OAM_H_RECTANGLE + .set OAM_SIZE_64x32, OAM_SIZE_3 | OAM_H_RECTANGLE + + .set OAM_SIZE_8x16, OAM_SIZE_0 | OAM_V_RECTANGLE + .set OAM_SIZE_8x32, OAM_SIZE_1 | OAM_V_RECTANGLE + .set OAM_SIZE_16x32, OAM_SIZE_2 | OAM_V_RECTANGLE + .set OAM_SIZE_32x64, OAM_SIZE_3 | OAM_V_RECTANGLE diff --git a/berry_fix/payload/graphics/debug_digits.png b/berry_fix/payload/graphics/debug_digits.png new file mode 100644 index 000000000..edf0d36c9 Binary files /dev/null and b/berry_fix/payload/graphics/debug_digits.png differ diff --git a/berry_fix/payload/graphics/msg_box.png b/berry_fix/payload/graphics/msg_box.png new file mode 100644 index 000000000..00d1bbe37 Binary files /dev/null and b/berry_fix/payload/graphics/msg_box.png differ diff --git a/berry_fix/payload/graphics/msg_box.tilemap b/berry_fix/payload/graphics/msg_box.tilemap new file mode 100644 index 000000000..5b82401ba Binary files /dev/null and b/berry_fix/payload/graphics/msg_box.tilemap differ diff --git a/berry_fix/payload/include/constants/game_stat.h b/berry_fix/payload/include/constants/game_stat.h new file mode 100644 index 000000000..47d703d85 --- /dev/null +++ b/berry_fix/payload/include/constants/game_stat.h @@ -0,0 +1,56 @@ +#ifndef GUARD_CONSTANTS_GAME_STAT_H +#define GUARD_CONSTANTS_GAME_STAT_H + +#define GAME_STAT_SAVED_GAME 0 +#define GAME_STAT_FIRST_HOF_PLAY_TIME 1 +#define GAME_STAT_STARTED_TRENDS 2 +#define GAME_STAT_PLANTED_BERRIES 3 +#define GAME_STAT_TRADED_BIKES 4 +#define GAME_STAT_STEPS 5 +#define GAME_STAT_GOT_INTERVIEWED 6 +#define GAME_STAT_TOTAL_BATTLES 7 +#define GAME_STAT_WILD_BATTLES 8 +#define GAME_STAT_TRAINER_BATTLES 9 +#define GAME_STAT_ENTERED_HOF 10 +#define GAME_STAT_POKEMON_CAPTURES 11 +#define GAME_STAT_FISHING_CAPTURES 12 +#define GAME_STAT_HATCHED_EGGS 13 +#define GAME_STAT_EVOLVED_POKEMON 14 +#define GAME_STAT_USED_POKECENTER 15 +#define GAME_STAT_RESTED_AT_HOME 16 +#define GAME_STAT_ENTERED_SAFARI_ZONE 17 +#define GAME_STAT_USED_CUT 18 +#define GAME_STAT_USED_ROCK_SMASH 19 +#define GAME_STAT_MOVED_SECRET_BASE 20 +#define GAME_STAT_POKEMON_TRADES 21 +#define GAME_STAT_UNKNOWN_22 22 +#define GAME_STAT_LINK_BATTLE_WINS 23 +#define GAME_STAT_LINK_BATTLE_LOSSES 24 +#define GAME_STAT_LINK_BATTLE_DRAWS 25 +#define GAME_STAT_USED_SPLASH 26 +#define GAME_STAT_USED_STRUGGLE 27 +#define GAME_STAT_SLOT_JACKPOTS 28 +#define GAME_STAT_CONSECUTIVE_ROULETTE_WINS 29 +#define GAME_STAT_ENTERED_BATTLE_TOWER 30 +#define GAME_STAT_UNKNOWN_31 31 +#define GAME_STAT_BATTLE_TOWER_BEST_STREAK 32 +#define GAME_STAT_POKEBLOCKS 33 +#define GAME_STAT_POKEBLOCKS_WITH_FRIENDS 34 +#define GAME_STAT_WON_LINK_CONTEST 35 +#define GAME_STAT_ENTERED_CONTEST 36 +#define GAME_STAT_WON_CONTEST 37 +#define GAME_STAT_SHOPPED 38 +#define GAME_STAT_USED_ITEMFINDER 39 +#define GAME_STAT_GOT_RAINED_ON 40 +#define GAME_STAT_CHECKED_POKEDEX 41 +#define GAME_STAT_RECEIVED_RIBBONS 42 +#define GAME_STAT_JUMPED_DOWN_LEDGES 43 +#define GAME_STAT_WATCHED_TV 44 +#define GAME_STAT_CHECKED_CLOCK 45 +#define GAME_STAT_WON_POKEMON_LOTTERY 46 +#define GAME_STAT_USED_DAYCARE 47 +#define GAME_STAT_RODE_CABLE_CAR 48 +#define GAME_STAT_ENTERED_HOT_SPRINGS 49 +#define NUM_GAME_STATS 50 + +#endif // GUARD_CONSTANTS_GAME_STAT_H diff --git a/berry_fix/payload/include/constants/vars.h b/berry_fix/payload/include/constants/vars.h new file mode 100644 index 000000000..4b40c1d8c --- /dev/null +++ b/berry_fix/payload/include/constants/vars.h @@ -0,0 +1,196 @@ +#ifndef GUARD_CONSTANTS_VARS_H +#define GUARD_CONSTANTS_VARS_H + +#define VAR_0x3F20 0x3F20 + +#define VARS_START 0x4000 + +// temporary vars +// The first 0x10 vars are are temporary--they are cleared every time a map is loaded. +#define VAR_TEMP_0 0x4000 +#define VAR_TEMP_1 0x4001 +#define VAR_TEMP_2 0x4002 +#define VAR_TEMP_3 0x4003 +#define VAR_TEMP_4 0x4004 +#define VAR_TEMP_5 0x4005 +#define VAR_TEMP_6 0x4006 +#define VAR_TEMP_7 0x4007 +#define VAR_TEMP_8 0x4008 +#define VAR_TEMP_9 0x4009 +#define VAR_TEMP_A 0x400A +#define VAR_TEMP_B 0x400B +#define VAR_TEMP_C 0x400C +#define VAR_TEMP_D 0x400D +#define VAR_TEMP_E 0x400E +#define VAR_TEMP_F 0x400F + +// object gfx id vars +// These 0x10 vars are used to dynamically control a event object's sprite. +// For example, the rival's sprite id is dynamically set based on the player's gender. +// See VarGetEventObjectGraphicsId(). +#define VAR_OBJ_GFX_ID_0 0x4010 +#define VAR_OBJ_GFX_ID_1 0x4011 +#define VAR_OBJ_GFX_ID_2 0x4012 +#define VAR_OBJ_GFX_ID_3 0x4013 +#define VAR_OBJ_GFX_ID_4 0x4014 +#define VAR_OBJ_GFX_ID_5 0x4015 +#define VAR_OBJ_GFX_ID_6 0x4016 +#define VAR_OBJ_GFX_ID_7 0x4017 +#define VAR_OBJ_GFX_ID_8 0x4018 +#define VAR_OBJ_GFX_ID_9 0x4019 +#define VAR_OBJ_GFX_ID_A 0x401A +#define VAR_OBJ_GFX_ID_B 0x401B +#define VAR_OBJ_GFX_ID_C 0x401C +#define VAR_OBJ_GFX_ID_D 0x401D +#define VAR_OBJ_GFX_ID_E 0x401E +#define VAR_OBJ_GFX_ID_F 0x401F + +// general purpose vars +#define VAR_RECYCLE_GOODS 0x4020 +#define VAR_REPEL_STEP_COUNT 0x4021 +#define VAR_ICE_STEP_COUNT 0x4022 +#define VAR_STARTER_MON 0x4023 // 0=Treecko, 1=Torchic, 2=Mudkip +#define VAR_MIRAGE_RND_H 0x4024 +#define VAR_MIRAGE_RND_L 0x4025 +#define VAR_SECRET_BASE_MAP 0x4026 +#define VAR_CYCLING_ROAD_RECORD_COLLISIONS 0x4027 +#define VAR_CYCLING_ROAD_RECORD_TIME_L 0x4028 +#define VAR_CYCLING_ROAD_RECORD_TIME_H 0x4029 +#define VAR_HAPPINESS_STEP_COUNTER 0x402A +#define VAR_POISON_STEP_COUNTER 0x402B +#define VAR_RESET_RTC_ENABLE 0x402C +#define VAR_ENIGMA_BERRY_AVAILABLE 0x402D + +#define VAR_DAYS 0x4040 +#define VAR_FANCLUB_UNKNOWN_1 0x4041 // TODO: document these two fanclub vars +#define VAR_FANCLUB_UNKNOWN_2 0x4042 +#define VAR_DEPT_STORE_FLOOR 0x4043 +#define VAR_TRICK_HOUSE_ROOMS_COMPLETED 0x4044 +#define VAR_LOTTERY_PRIZE 0x4045 +#define VAR_NATIONAL_DEX 0x4046 +#define VAR_SHROOMISH_SIZE_RECORD 0x4047 +#define VAR_ASH_GATHER_COUNT 0x4048 +#define VAR_BIRCH_STATE 0x4049 +#define VAR_CRUISE_STEP_COUNT 0x404A +#define VAR_LOTTERY_RND_L 0x404B +#define VAR_LOTTERY_RND_H 0x404C + +#define VAR_BARBOACH_SIZE_RECORD 0x404F +#define VAR_LITTLEROOT_STATE 0x4050 +#define VAR_ROUTE102_ACCESSIBLE 0x4051 + +#define VAR_LAVARIDGE_RIVAL_STATE 0x4053 +#define VAR_CURRENT_SECRET_BASE 0x4054 + +#define VAR_PETALBURG_STATE 0x4057 +#define VAR_SLATEPORT_STATE 0x4058 + +#define VAR_RUSTBORO_STATE 0x405A + +#define VAR_SOOTOPOLIS_STATE 0x405E + +#define VAR_ROUTE101_STATE 0x4060 + +#define VAR_ROUTE103_STATE 0x4062 + +#define VAR_ROUTE110_STATE 0x4069 + +#define VAR_ROUTE116_STATE 0x406F + +#define VAR_ROUTE118_STATE 0x4071 +#define VAR_ROUTE119_STATE 0x4072 + +#define VAR_ROUTE121_STATE 0x4074 +#define VAR_ROUTE128_STATE 0x407B + +#define VAR_LITTLEROOT_HOUSES_STATE 0x4082 // TODO: needs more investigation + +#define VAR_BIRCH_LAB_STATE 0x4084 +#define VAR_PETALBURG_GYM_STATE 0x4085 +#define VAR_LINK_CONTEST_ROOM_STATE 0x4086 +#define VAR_CABLE_CLUB_STATE 0x4087 +#define VAR_CONTEST_LOCATION 0x4088 +#define VAR_MAP_SCENE_SIX_ISLAND_POKEMON_CENTER_1F 0x4089 // TODO: related to decorations +#define VAR_CONTEST_PRIZE_PICKUP 0x408A + +#define VAR_LITTLEROOT_HOUSES_STATE_2 0x408C // TODO: needs more investigation +#define VAR_LITTLEROOT_RIVAL_STATE 0x408D +#define VAR_BOARD_BRINEY_BOAT_ROUTE104_STATE 0x408E +#define VAR_DEVON_CORP_3F_STATE 0x408F +#define VAR_BRINEY_HOUSE_STATE 0x4090 + +#define VAR_LITTLEROOT_INTRO_STATE 0x4092 +#define VAR_MAUVILLE_GYM_STATE 0x4093 +#define VAR_LILYCOVE_MUSEUM_2F_STATE 0x4094 +#define VAR_LILYCOVE_FAN_CLUB_STATE 0x4095 +#define VAR_BRINEY_LOCATION 0x4096 +#define VAR_0x4097 0x4097 // TODO: related to creating new secret base +#define VAR_PETALBURG_WOODS_STATE 0x4098 +#define VAR_LILYCOVE_CONTEST_LOBBY_STATE 0x4099 +#define VAR_RUSTURF_TUNNEL_STATE 0x409a +#define VAR_CAVE_OF_ORIGIN_B4F_STATE 0x409B +#define VAR_ELITE_4_STATE 0x409C + +#define VAR_SLATEPORT_HARBOR_STATE 0x40A0 + +#define VAR_SEAFLOOR_CAVERN_STATE 0x40A2 +#define VAR_CABLE_CAR_STATION_STATE 0x40A3 +#define VAR_SAFARI_ZONE_STATE 0x40A4 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE 0x40A5 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE_2 0x40A6 +#define VAR_TRICK_HOUSE_ENTRANCE_STATE_3 0x40A7 + +#define VAR_CYCLING_CHALLENGE_STATE 0x40A9 +#define VAR_SLATEPORT_MUSEUM_1F_STATE 0x40AA +#define VAR_TRICK_HOUSE_PUZZLE_1_STATE 0x40AB +#define VAR_TRICK_HOUSE_PUZZLE_2_STATE 0x40AC +#define VAR_TRICK_HOUSE_PUZZLE_3_STATE 0x40AD +#define VAR_TRICK_HOUSE_PUZZLE_4_STATE 0x40AE +#define VAR_TRICK_HOUSE_PUZZLE_5_STATE 0x40AF +#define VAR_TRICK_HOUSE_PUZZLE_6_STATE 0x40B0 +#define VAR_TRICK_HOUSE_PUZZLE_7_STATE 0x40B1 +#define VAR_TRICK_HOUSE_PUZZLE_8_STATE 0x40B2 +#define VAR_WEATHER_INSTITUTE_STATE 0x40B3 +#define VAR_PORTHOLE_STATE 0x40B4 +#define VAR_TRICK_HOUSE_STATE 0x40B5 // TODO: needs some further investigation +#define VAR_TRICK_HOUSE_PUZZLE_7_STATE_2 0x40B6 +#define VAR_SLATEPORT_FAN_CLUB_STATE 0x40B7 + +#define VAR_MT_PYRE_STATE 0x40B9 +#define VAR_NEW_MAUVILLE_STATE 0x40BA + +#define VAR_BRAVO_TRAINER_BATTLE_TOWER_ON 0x40BC +#define VAR_JAGGED_PASS_VOLCANIC_ASH_WEATHER 0x40BD +#define VAR_GLASS_WORKSHOP_STATE 0x40BE +#define VAR_METEOR_FALLS_STATE 0x40BF +#define VAR_GAME_CORNER_STATE 0x40C0 +#define VAR_TRICK_HOUSE_PRIZE_PICKUP 0x40C1 +#define VAR_PACIFIDLOG_TM_RECEIVED_DAY 0x40C2 +#define VAR_VICTORY_ROAD_1F_STATE 0x40C3 +#define VAR_FOSSIL_RESURRECTION_STATE 0x40C4 +#define VAR_WHICH_FOSSIL_REVIVED 0x40C5 +#define VAR_STEVENS_HOUSE_STATE 0x40C6 +#define VAR_OLDALE_STATE 0x40C7 + +// special vars +// They are commonly used as parameters to commands, or return values from commands. +#define VAR_SPECIAL_0 0x8000 +#define VAR_SPECIAL_1 0x8001 +#define VAR_SPECIAL_2 0x8002 +#define VAR_SPECIAL_3 0x8003 +#define VAR_SPECIAL_4 0x8004 +#define VAR_SPECIAL_5 0x8005 +#define VAR_SPECIAL_6 0x8006 +#define VAR_SPECIAL_7 0x8007 +#define VAR_SPECIAL_8 0x8008 +#define VAR_SPECIAL_9 0x8009 +#define VAR_SPECIAL_A 0x800A +#define VAR_SPECIAL_B 0x800B +#define FACING 0x800C +#define RESULT 0x800D +#define ITEM_ID 0x800E +#define LAST_TALKED 0x800F +#define CONTEST_RANK 0x8010 +#define CONTEST_CATEGORY 0x8011 + +#endif // GUARD_CONSTANTS_VARS_H diff --git a/berry_fix/payload/include/flash.h b/berry_fix/payload/include/flash.h new file mode 100644 index 000000000..7fc35896d --- /dev/null +++ b/berry_fix/payload/include/flash.h @@ -0,0 +1,55 @@ +#ifndef GUARD_FLASH_H +#define GUARD_FLASH_H + +#include "gba/gba.h" + +enum +{ + SECTOR_DAMAGED, + SECTOR_OK, + SECTOR_CHECK, // unused +}; + +enum MsgBoxUpdateMessage +{ + MSGBOX_WILL_NOW_UPDATE = 0, + MSGBOX_HAS_BEEN_UPDATED, + MSGBOX_UNABLE_TO_UPDATE, + MSGBOX_NO_NEED_TO_UPDATE, + MSGBOX_UPDATING +}; + +struct SaveSector +{ + u8 data[0xFF4]; + u16 id; + u16 checksum; + u32 signature; + u32 counter; +}; // size is 0x1000 + +// headless save section? +struct UnkSaveSection +{ + u8 data[0xFF4]; + u32 signature; +}; // size is 0xFF8 + +#define eSaveSection ((struct SaveSector *)0x2020000) + +#define NUM_SECTORS_PER_SAVE_SLOT 14 // Number of sectors occupied by a save slot +#define FILE_SIGNATURE 0x08012025 + +#define SAVE_STATUS_EMPTY 0 +#define SAVE_STATUS_OK 1 +#define SAVE_STATUS_NO_FLASH 4 +#define SAVE_STATUS_ERROR 0xFF + +bool32 flash_maincb_ident_is_valid(void); +bool8 flash_maincb_read_save(u32); +void msg_load_gfx(void); +void msg_display(enum MsgBoxUpdateMessage); +bool32 flash_maincb_check_need_reset_pacifidlog_tm(void); +bool32 flash_maincb_reset_pacifidlog_tm(void); + +#endif //GUARD_FLASH_H diff --git a/berry_fix/payload/include/gba/defines.h b/berry_fix/payload/include/gba/defines.h new file mode 100644 index 000000000..289518cf3 --- /dev/null +++ b/berry_fix/payload/include/gba/defines.h @@ -0,0 +1,87 @@ +#ifndef GUARD_GBA_DEFINES +#define GUARD_GBA_DEFINES + +#include + +#define TRUE 1 +#define FALSE 0 + +#define BSS_DATA __attribute__((section(".bss"))) +#define IWRAM_DATA __attribute__((section("iwram_data"))) +#define EWRAM_DATA __attribute__((section("ewram_data"))) +#define UNUSED __attribute__((unused)) +#define NAKED __attribute__((naked)) + +#define ALIGNED(n) __attribute__((aligned(n))) + +#define SOUND_INFO_PTR (*(struct SoundInfo **)0x3007FF0) +#define INTR_CHECK (*(u16 *)0x3007FF8) +#define INTR_VECTOR (*(void **)0x3007FFC) + +#define EWRAM_START 0x02000000 +#define EWRAM_END (EWRAM_START + 0x40000) +#define IWRAM_START 0x03000000 +#define IWRAM_END (IWRAM_START + 0x8000) + +#define PLTT 0x5000000 +#define PLTT_SIZE 0x400 + +#define BG_PLTT PLTT +#define BG_PLTT_SIZE 0x200 + +#define OBJ_PLTT (PLTT + 0x200) +#define OBJ_PLTT_SIZE 0x200 + +#define VRAM 0x6000000 +#define VRAM_SIZE 0x18000 + +#define BG_VRAM VRAM +#define BG_VRAM_SIZE 0x10000 +#define BG_CHAR_SIZE 0x4000 +#define BG_SCREEN_SIZE 0x800 +#define BG_CHAR_ADDR(n) (void *)(BG_VRAM + (0x4000 * (n))) +#define BG_SCREEN_ADDR(n) (void *)(BG_VRAM + (0x800 * (n))) +#define BG_TILE_ADDR(n) (void *)(BG_VRAM + (0x80 * (n))) + +#define BG_TILE_H_FLIP(n) (0x400 + (n)) +#define BG_TILE_V_FLIP(n) (0x800 + (n)) + +// text-mode BG +#define OBJ_VRAM0 (void *)(VRAM + 0x10000) +#define OBJ_VRAM0_SIZE 0x8000 + +// bitmap-mode BG +#define OBJ_VRAM1 (void *)(VRAM + 0x14000) +#define OBJ_VRAM1_SIZE 0x4000 + +#define OAM 0x7000000 +#define OAM_SIZE 0x400 + +#define ROM_HEADER_SIZE 0xC0 + +#define DISPLAY_WIDTH 240 +#define DISPLAY_HEIGHT 160 + +#define TILE_SIZE_4BPP 32 +#define TILE_SIZE_8BPP 64 + +#define TILE_OFFSET_4BPP(n) ((n) * TILE_SIZE_4BPP) +#define TILE_OFFSET_8BPP(n) ((n) * TILE_SIZE_8BPP) + +#define TOTAL_OBJ_TILE_COUNT 1024 + +#define RGB(r, g, b) ((r) | ((g) << 5) | ((b) << 10)) +#define RGB2(r, g, b) (((b) << 10) | ((g) << 5) | (r)) +#define _RGB(r, g, b) ((((b) & 0x1F) << 10) + (((g) & 0x1F) << 5) + ((r) & 0x1F)) + +#define RGB_BLACK RGB(0, 0, 0) +#define RGB_WHITE RGB(31, 31, 31) +#define RGB_RED RGB(31, 0, 0) +#define RGB_GREEN RGB(0, 31, 0) +#define RGB_BLUE RGB(0, 0, 31) +#define RGB_YELLOW RGB(31, 31, 0) +#define RGB_MAGENTA RGB(31, 0, 31) +#define RGB_CYAN RGB(0, 31, 31) +#define RGB_WHITEALPHA (RGB_WHITE | 0x8000) + +#endif // GUARD_GBA_DEFINES diff --git a/berry_fix/payload/include/gba/flash_internal.h b/berry_fix/payload/include/gba/flash_internal.h new file mode 100644 index 000000000..6fbec31f1 --- /dev/null +++ b/berry_fix/payload/include/gba/flash_internal.h @@ -0,0 +1,85 @@ +#ifndef GUARD_GBA_FLASH_INTERNAL_H +#define GUARD_GBA_FLASH_INTERNAL_H + +#include "gba/gba.h" + +#define FLASH_BASE ((u8 *)0xE000000) + +#define FLASH_WRITE(addr, data) ((*(vu8 *)(FLASH_BASE + (addr))) = (data)) + +#define FLASH_ROM_SIZE_1M 131072 // 1 megabit ROM + +#define SECTORS_PER_BANK 16 + +struct FlashSector +{ + u32 size; + u8 shift; + u16 count; + u16 top; +}; + +struct FlashType { + u32 romSize; + struct FlashSector sector; + u16 wait[2]; // game pak bus read/write wait + + // TODO: add support for anonymous unions/structs if possible + union { + struct { + u8 makerId; + u8 deviceId; + } separate; + u16 joined; + } ids; +}; + +struct FlashSetupInfo +{ + u16 (*programFlashByte)(u16, u32, u8); + u16 (*programFlashSector)(u16, void *); + u16 (*eraseFlashChip)(void); + u16 (*eraseFlashSector)(u16); + u16 (*WaitForFlashWrite)(u8, u8 *, u8); + const u16 *maxTime; + struct FlashType type; +}; + +extern u16 gFlashNumRemainingBytes; + +extern u16 (*ProgramFlashByte)(u16, u32, u8); +extern u16 (*ProgramFlashSector)(u16, void *); +extern u16 (*EraseFlashChip)(void); +extern u16 (*EraseFlashSector)(u16); +extern u16 (*WaitForFlashWrite)(u8, u8 *, u8); +extern const u16 *gFlashMaxTime; +extern const struct FlashType *gFlash; + +extern u8 (*PollFlashStatus)(u8 *); +extern u8 gFlashTimeoutFlag; + +extern const struct FlashSetupInfo MX29L010; +extern const struct FlashSetupInfo LE26FV10N1TS; +extern const struct FlashSetupInfo DefaultFlash; + +void SwitchFlashBank(u8 bankNum); +u16 ReadFlashId(void); +void StartFlashTimer(u8 phase); +void SetReadFlash1(u16 *dest); +void StopFlashTimer(void); +u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)); +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src); +void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size); +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *dataSrc, u32 n); + +u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData); + +u16 EraseFlashChip_MX(void); +u16 EraseFlashSector_MX(u16 sectorNum); +u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data); +u16 ProgramFlashSector_MX(u16 sectorNum, void *src); + +// agb_flash_1m +u32 IdentifyFlash(void); + +#endif // GUARD_GBA_FLASH_INTERNAL_H diff --git a/berry_fix/payload/include/gba/gba.h b/berry_fix/payload/include/gba/gba.h new file mode 100644 index 000000000..349344031 --- /dev/null +++ b/berry_fix/payload/include/gba/gba.h @@ -0,0 +1,12 @@ +#ifndef GUARD_GBA_GBA_H +#define GUARD_GBA_GBA_H + +#include "gba/defines.h" +#include "gba/io_reg.h" +#include "gba/types.h" +#include "gba/multiboot.h" +#include "gba/syscall.h" +#include "gba/macro.h" +#include "gba/isagbprint.h" + +#endif // GUARD_GBA_GBA_H diff --git a/berry_fix/payload/include/gba/io_reg.h b/berry_fix/payload/include/gba/io_reg.h new file mode 100644 index 000000000..df79b084d --- /dev/null +++ b/berry_fix/payload/include/gba/io_reg.h @@ -0,0 +1,770 @@ +#ifndef GUARD_GBA_IO_REG_H +#define GUARD_GBA_IO_REG_H + +#define REG_BASE 0x4000000 // I/O register base address + +// I/O register offsets + +#define REG_OFFSET_DISPCNT 0x0 +#define REG_OFFSET_DISPSTAT 0x4 +#define REG_OFFSET_VCOUNT 0x6 +#define REG_OFFSET_BG0CNT 0x8 +#define REG_OFFSET_BG1CNT 0xa +#define REG_OFFSET_BG2CNT 0xc +#define REG_OFFSET_BG3CNT 0xe +#define REG_OFFSET_BG0HOFS 0x10 +#define REG_OFFSET_BG0VOFS 0x12 +#define REG_OFFSET_BG1HOFS 0x14 +#define REG_OFFSET_BG1VOFS 0x16 +#define REG_OFFSET_BG2HOFS 0x18 +#define REG_OFFSET_BG2VOFS 0x1a +#define REG_OFFSET_BG3HOFS 0x1c +#define REG_OFFSET_BG3VOFS 0x1e +#define REG_OFFSET_BG2PA 0x20 +#define REG_OFFSET_BG2PB 0x22 +#define REG_OFFSET_BG2PC 0x24 +#define REG_OFFSET_BG2PD 0x26 +#define REG_OFFSET_BG2X 0x28 +#define REG_OFFSET_BG2X_L 0x28 +#define REG_OFFSET_BG2X_H 0x2a +#define REG_OFFSET_BG2Y 0x2c +#define REG_OFFSET_BG2Y_L 0x2c +#define REG_OFFSET_BG2Y_H 0x2e +#define REG_OFFSET_BG3PA 0x30 +#define REG_OFFSET_BG3PB 0x32 +#define REG_OFFSET_BG3PC 0x34 +#define REG_OFFSET_BG3PD 0x36 +#define REG_OFFSET_BG3X 0x38 +#define REG_OFFSET_BG3X_L 0x38 +#define REG_OFFSET_BG3X_H 0x3a +#define REG_OFFSET_BG3Y 0x3c +#define REG_OFFSET_BG3Y_L 0x3c +#define REG_OFFSET_BG3Y_H 0x3e +#define REG_OFFSET_WIN0H 0x40 +#define REG_OFFSET_WIN1H 0x42 +#define REG_OFFSET_WIN0V 0x44 +#define REG_OFFSET_WIN1V 0x46 +#define REG_OFFSET_WININ 0x48 +#define REG_OFFSET_WINOUT 0x4a +#define REG_OFFSET_MOSAIC 0x4c +#define REG_OFFSET_BLDCNT 0x50 +#define REG_OFFSET_BLDALPHA 0x52 +#define REG_OFFSET_BLDY 0x54 + +#define REG_OFFSET_SOUND1CNT_L 0x60 +#define REG_OFFSET_NR10 0x60 +#define REG_OFFSET_SOUND1CNT_H 0x62 +#define REG_OFFSET_NR11 0x62 +#define REG_OFFSET_NR12 0x63 +#define REG_OFFSET_SOUND1CNT_X 0x64 +#define REG_OFFSET_NR13 0x64 +#define REG_OFFSET_NR14 0x65 +#define REG_OFFSET_SOUND2CNT_L 0x68 +#define REG_OFFSET_NR21 0x68 +#define REG_OFFSET_NR22 0x69 +#define REG_OFFSET_SOUND2CNT_H 0x6c +#define REG_OFFSET_NR23 0x6c +#define REG_OFFSET_NR24 0x6d +#define REG_OFFSET_SOUND3CNT_L 0x70 +#define REG_OFFSET_NR30 0x70 +#define REG_OFFSET_SOUND3CNT_H 0x72 +#define REG_OFFSET_NR31 0x72 +#define REG_OFFSET_NR32 0x73 +#define REG_OFFSET_SOUND3CNT_X 0x74 +#define REG_OFFSET_NR33 0x74 +#define REG_OFFSET_NR34 0x75 +#define REG_OFFSET_SOUND4CNT_L 0x78 +#define REG_OFFSET_NR41 0x78 +#define REG_OFFSET_NR42 0x79 +#define REG_OFFSET_SOUND4CNT_H 0x7c +#define REG_OFFSET_NR43 0x7c +#define REG_OFFSET_NR44 0x7d +#define REG_OFFSET_SOUNDCNT_L 0x80 +#define REG_OFFSET_NR50 0x80 +#define REG_OFFSET_NR51 0x81 +#define REG_OFFSET_SOUNDCNT_H 0x82 +#define REG_OFFSET_SOUNDCNT_X 0x84 +#define REG_OFFSET_NR52 0x84 +#define REG_OFFSET_SOUNDBIAS 0x88 +#define REG_OFFSET_SOUNDBIAS_L 0x88 +#define REG_OFFSET_SOUNDBIAS_H 0x89 +#define REG_OFFSET_WAVE_RAM0 0x90 +#define REG_OFFSET_WAVE_RAM1 0x94 +#define REG_OFFSET_WAVE_RAM2 0x98 +#define REG_OFFSET_WAVE_RAM3 0x9c +#define REG_OFFSET_FIFO_A 0xa0 +#define REG_OFFSET_FIFO_B 0xa4 + +#define REG_OFFSET_DMA0 0xb0 +#define REG_OFFSET_DMA0SAD 0xb0 +#define REG_OFFSET_DMA0SAD_L 0xb0 +#define REG_OFFSET_DMA0SAD_H 0xb2 +#define REG_OFFSET_DMA0DAD 0xb4 +#define REG_OFFSET_DMA0DAD_L 0xb4 +#define REG_OFFSET_DMA0DAD_H 0xb6 +#define REG_OFFSET_DMA0CNT 0xb8 +#define REG_OFFSET_DMA0CNT_L 0xb8 +#define REG_OFFSET_DMA0CNT_H 0xba +#define REG_OFFSET_DMA1 0xbc +#define REG_OFFSET_DMA1SAD 0xbc +#define REG_OFFSET_DMA1SAD_L 0xbc +#define REG_OFFSET_DMA1SAD_H 0xbe +#define REG_OFFSET_DMA1DAD 0xc0 +#define REG_OFFSET_DMA1DAD_L 0xc0 +#define REG_OFFSET_DMA1DAD_H 0xc2 +#define REG_OFFSET_DMA1CNT 0xc4 +#define REG_OFFSET_DMA1CNT_L 0xc4 +#define REG_OFFSET_DMA1CNT_H 0xc6 +#define REG_OFFSET_DMA2 0xc8 +#define REG_OFFSET_DMA2SAD 0xc8 +#define REG_OFFSET_DMA2SAD_L 0xc8 +#define REG_OFFSET_DMA2SAD_H 0xca +#define REG_OFFSET_DMA2DAD 0xcc +#define REG_OFFSET_DMA2DAD_L 0xcc +#define REG_OFFSET_DMA2DAD_H 0xce +#define REG_OFFSET_DMA2CNT 0xd0 +#define REG_OFFSET_DMA2CNT_L 0xd0 +#define REG_OFFSET_DMA2CNT_H 0xd2 +#define REG_OFFSET_DMA3 0xd4 +#define REG_OFFSET_DMA3SAD 0xd4 +#define REG_OFFSET_DMA3SAD_L 0xd4 +#define REG_OFFSET_DMA3SAD_H 0xd6 +#define REG_OFFSET_DMA3DAD 0xd8 +#define REG_OFFSET_DMA3DAD_L 0xd8 +#define REG_OFFSET_DMA3DAD_H 0xda +#define REG_OFFSET_DMA3CNT 0xdc +#define REG_OFFSET_DMA3CNT_L 0xdc +#define REG_OFFSET_DMA3CNT_H 0xde + +#define REG_OFFSET_TMCNT 0x100 +#define REG_OFFSET_TMCNT_L 0x100 +#define REG_OFFSET_TMCNT_H 0x102 +#define REG_OFFSET_TM0CNT 0x100 +#define REG_OFFSET_TM0CNT_L 0x100 +#define REG_OFFSET_TM0CNT_H 0x102 +#define REG_OFFSET_TM1CNT 0x104 +#define REG_OFFSET_TM1CNT_L 0x104 +#define REG_OFFSET_TM1CNT_H 0x106 +#define REG_OFFSET_TM2CNT 0x108 +#define REG_OFFSET_TM2CNT_L 0x108 +#define REG_OFFSET_TM2CNT_H 0x10a +#define REG_OFFSET_TM3CNT 0x10c +#define REG_OFFSET_TM3CNT_L 0x10c +#define REG_OFFSET_TM3CNT_H 0x10e + +#define REG_OFFSET_SIOCNT 0x128 +#define REG_OFFSET_SIODATA8 0x12a +#define REG_OFFSET_SIODATA32 0x120 +#define REG_OFFSET_SIOMLT_SEND 0x12a +#define REG_OFFSET_SIOMLT_RECV 0x120 +#define REG_OFFSET_SIOMULTI0 0x120 +#define REG_OFFSET_SIOMULTI1 0x122 +#define REG_OFFSET_SIOMULTI2 0x124 +#define REG_OFFSET_SIOMULTI3 0x126 + +#define REG_OFFSET_KEYINPUT 0x130 +#define REG_OFFSET_KEYCNT 0x132 + +#define REG_OFFSET_RCNT 0x134 + +#define REG_OFFSET_JOYCNT 0x140 +#define REG_OFFSET_JOYSTAT 0x158 +#define REG_OFFSET_JOY_RECV 0x150 +#define REG_OFFSET_JOY_RECV_L 0x150 +#define REG_OFFSET_JOY_RECV_H 0x152 +#define REG_OFFSET_JOY_TRANS 0x154 +#define REG_OFFSET_JOY_TRANS_L 0x154 +#define REG_OFFSET_JOY_TRANS_H 0x156 + +#define REG_OFFSET_IME 0x208 +#define REG_OFFSET_IE 0x200 +#define REG_OFFSET_IF 0x202 + +#define REG_OFFSET_WAITCNT 0x204 + +// I/O register addresses + +#define REG_ADDR_DISPCNT (REG_BASE + REG_OFFSET_DISPCNT) +#define REG_ADDR_DISPSTAT (REG_BASE + REG_OFFSET_DISPSTAT) +#define REG_ADDR_VCOUNT (REG_BASE + REG_OFFSET_VCOUNT) +#define REG_ADDR_BG0CNT (REG_BASE + REG_OFFSET_BG0CNT) +#define REG_ADDR_BG1CNT (REG_BASE + REG_OFFSET_BG1CNT) +#define REG_ADDR_BG2CNT (REG_BASE + REG_OFFSET_BG2CNT) +#define REG_ADDR_BG3CNT (REG_BASE + REG_OFFSET_BG3CNT) +#define REG_ADDR_BG0HOFS (REG_BASE + REG_OFFSET_BG0HOFS) +#define REG_ADDR_BG0VOFS (REG_BASE + REG_OFFSET_BG0VOFS) +#define REG_ADDR_BG1HOFS (REG_BASE + REG_OFFSET_BG1HOFS) +#define REG_ADDR_BG1VOFS (REG_BASE + REG_OFFSET_BG1VOFS) +#define REG_ADDR_BG2HOFS (REG_BASE + REG_OFFSET_BG2HOFS) +#define REG_ADDR_BG2VOFS (REG_BASE + REG_OFFSET_BG2VOFS) +#define REG_ADDR_BG3HOFS (REG_BASE + REG_OFFSET_BG3HOFS) +#define REG_ADDR_BG3VOFS (REG_BASE + REG_OFFSET_BG3VOFS) +#define REG_ADDR_BG2PA (REG_BASE + REG_OFFSET_BG2PA) +#define REG_ADDR_BG2PB (REG_BASE + REG_OFFSET_BG2PB) +#define REG_ADDR_BG2PC (REG_BASE + REG_OFFSET_BG2PC) +#define REG_ADDR_BG2PD (REG_BASE + REG_OFFSET_BG2PD) +#define REG_ADDR_BG2X (REG_BASE + REG_OFFSET_BG2X) +#define REG_ADDR_BG2X_L (REG_BASE + REG_OFFSET_BG2X_L) +#define REG_ADDR_BG2X_H (REG_BASE + REG_OFFSET_BG2X_H) +#define REG_ADDR_BG2Y (REG_BASE + REG_OFFSET_BG2Y) +#define REG_ADDR_BG2Y_L (REG_BASE + REG_OFFSET_BG2Y_L) +#define REG_ADDR_BG2Y_H (REG_BASE + REG_OFFSET_BG2Y_H) +#define REG_ADDR_BG3PA (REG_BASE + REG_OFFSET_BG3PA) +#define REG_ADDR_BG3PB (REG_BASE + REG_OFFSET_BG3PB) +#define REG_ADDR_BG3PC (REG_BASE + REG_OFFSET_BG3PC) +#define REG_ADDR_BG3PD (REG_BASE + REG_OFFSET_BG3PD) +#define REG_ADDR_BG3X (REG_BASE + REG_OFFSET_BG3X) +#define REG_ADDR_BG3X_L (REG_BASE + REG_OFFSET_BG3X_L) +#define REG_ADDR_BG3X_H (REG_BASE + REG_OFFSET_BG3X_H) +#define REG_ADDR_BG3Y (REG_BASE + REG_OFFSET_BG3Y) +#define REG_ADDR_BG3Y_L (REG_BASE + REG_OFFSET_BG3Y_L) +#define REG_ADDR_BG3Y_H (REG_BASE + REG_OFFSET_BG3Y_H) +#define REG_ADDR_WIN0H (REG_BASE + REG_OFFSET_WIN0H) +#define REG_ADDR_WIN1H (REG_BASE + REG_OFFSET_WIN1H) +#define REG_ADDR_WIN0V (REG_BASE + REG_OFFSET_WIN0V) +#define REG_ADDR_WIN1V (REG_BASE + REG_OFFSET_WIN1V) +#define REG_ADDR_WININ (REG_BASE + REG_OFFSET_WININ) +#define REG_ADDR_WINOUT (REG_BASE + REG_OFFSET_WINOUT) +#define REG_ADDR_MOSAIC (REG_BASE + REG_OFFSET_MOSAIC) +#define REG_ADDR_BLDCNT (REG_BASE + REG_OFFSET_BLDCNT) +#define REG_ADDR_BLDALPHA (REG_BASE + REG_OFFSET_BLDALPHA) +#define REG_ADDR_BLDY (REG_BASE + REG_OFFSET_BLDY) + +#define REG_ADDR_SOUND1CNT_L (REG_BASE + REG_OFFSET_SOUND1CNT_L) +#define REG_ADDR_NR10 (REG_BASE + REG_OFFSET_NR10) +#define REG_ADDR_SOUND1CNT_H (REG_BASE + REG_OFFSET_SOUND1CNT_H) +#define REG_ADDR_NR11 (REG_BASE + REG_OFFSET_NR11) +#define REG_ADDR_NR12 (REG_BASE + REG_OFFSET_NR12) +#define REG_ADDR_SOUND1CNT_X (REG_BASE + REG_OFFSET_SOUND1CNT_X) +#define REG_ADDR_NR13 (REG_BASE + REG_OFFSET_NR13) +#define REG_ADDR_NR14 (REG_BASE + REG_OFFSET_NR14) +#define REG_ADDR_SOUND2CNT_L (REG_BASE + REG_OFFSET_SOUND2CNT_L) +#define REG_ADDR_NR21 (REG_BASE + REG_OFFSET_NR21) +#define REG_ADDR_NR22 (REG_BASE + REG_OFFSET_NR22) +#define REG_ADDR_SOUND2CNT_H (REG_BASE + REG_OFFSET_SOUND2CNT_H) +#define REG_ADDR_NR23 (REG_BASE + REG_OFFSET_NR23) +#define REG_ADDR_NR24 (REG_BASE + REG_OFFSET_NR24) +#define REG_ADDR_SOUND3CNT_L (REG_BASE + REG_OFFSET_SOUND3CNT_L) +#define REG_ADDR_NR30 (REG_BASE + REG_OFFSET_NR30) +#define REG_ADDR_SOUND3CNT_H (REG_BASE + REG_OFFSET_SOUND3CNT_H) +#define REG_ADDR_NR31 (REG_BASE + REG_OFFSET_NR31) +#define REG_ADDR_NR32 (REG_BASE + REG_OFFSET_NR32) +#define REG_ADDR_SOUND3CNT_X (REG_BASE + REG_OFFSET_SOUND3CNT_X) +#define REG_ADDR_NR33 (REG_BASE + REG_OFFSET_NR33) +#define REG_ADDR_NR34 (REG_BASE + REG_OFFSET_NR34) +#define REG_ADDR_SOUND4CNT_L (REG_BASE + REG_OFFSET_SOUND4CNT_L) +#define REG_ADDR_NR41 (REG_BASE + REG_OFFSET_NR41) +#define REG_ADDR_NR42 (REG_BASE + REG_OFFSET_NR42) +#define REG_ADDR_SOUND4CNT_H (REG_BASE + REG_OFFSET_SOUND4CNT_H) +#define REG_ADDR_NR43 (REG_BASE + REG_OFFSET_NR43) +#define REG_ADDR_NR44 (REG_BASE + REG_OFFSET_NR44) +#define REG_ADDR_SOUNDCNT_L (REG_BASE + REG_OFFSET_SOUNDCNT_L) +#define REG_ADDR_NR50 (REG_BASE + REG_OFFSET_NR50) +#define REG_ADDR_NR51 (REG_BASE + REG_OFFSET_NR51) +#define REG_ADDR_SOUNDCNT_H (REG_BASE + REG_OFFSET_SOUNDCNT_H) +#define REG_ADDR_SOUNDCNT_X (REG_BASE + REG_OFFSET_SOUNDCNT_X) +#define REG_ADDR_NR52 (REG_BASE + REG_OFFSET_NR52) +#define REG_ADDR_SOUNDBIAS (REG_BASE + REG_OFFSET_SOUNDBIAS) +#define REG_ADDR_SOUNDBIAS_L (REG_BASE + REG_OFFSET_SOUNDBIAS_L) +#define REG_ADDR_SOUNDBIAS_H (REG_BASE + REG_OFFSET_SOUNDBIAS_H) +#define REG_ADDR_WAVE_RAM0 (REG_BASE + REG_OFFSET_WAVE_RAM0) +#define REG_ADDR_WAVE_RAM1 (REG_BASE + REG_OFFSET_WAVE_RAM1) +#define REG_ADDR_WAVE_RAM2 (REG_BASE + REG_OFFSET_WAVE_RAM2) +#define REG_ADDR_WAVE_RAM3 (REG_BASE + REG_OFFSET_WAVE_RAM3) +#define REG_ADDR_FIFO_A (REG_BASE + REG_OFFSET_FIFO_A) +#define REG_ADDR_FIFO_B (REG_BASE + REG_OFFSET_FIFO_B) + +#define REG_ADDR_DMA0 (REG_BASE + REG_OFFSET_DMA0) +#define REG_ADDR_DMA0SAD (REG_BASE + REG_OFFSET_DMA0SAD) +#define REG_ADDR_DMA0DAD (REG_BASE + REG_OFFSET_DMA0DAD) +#define REG_ADDR_DMA0CNT (REG_BASE + REG_OFFSET_DMA0CNT) +#define REG_ADDR_DMA0CNT_L (REG_BASE + REG_OFFSET_DMA0CNT_L) +#define REG_ADDR_DMA0CNT_H (REG_BASE + REG_OFFSET_DMA0CNT_H) +#define REG_ADDR_DMA1 (REG_BASE + REG_OFFSET_DMA1) +#define REG_ADDR_DMA1SAD (REG_BASE + REG_OFFSET_DMA1SAD) +#define REG_ADDR_DMA1DAD (REG_BASE + REG_OFFSET_DMA1DAD) +#define REG_ADDR_DMA1CNT (REG_BASE + REG_OFFSET_DMA1CNT) +#define REG_ADDR_DMA1CNT_L (REG_BASE + REG_OFFSET_DMA1CNT_L) +#define REG_ADDR_DMA1CNT_H (REG_BASE + REG_OFFSET_DMA1CNT_H) +#define REG_ADDR_DMA2 (REG_BASE + REG_OFFSET_DMA2) +#define REG_ADDR_DMA2SAD (REG_BASE + REG_OFFSET_DMA2SAD) +#define REG_ADDR_DMA2DAD (REG_BASE + REG_OFFSET_DMA2DAD) +#define REG_ADDR_DMA2CNT (REG_BASE + REG_OFFSET_DMA2CNT) +#define REG_ADDR_DMA2CNT_L (REG_BASE + REG_OFFSET_DMA2CNT_L) +#define REG_ADDR_DMA2CNT_H (REG_BASE + REG_OFFSET_DMA2CNT_H) +#define REG_ADDR_DMA3 (REG_BASE + REG_OFFSET_DMA3) +#define REG_ADDR_DMA3SAD (REG_BASE + REG_OFFSET_DMA3SAD) +#define REG_ADDR_DMA3DAD (REG_BASE + REG_OFFSET_DMA3DAD) +#define REG_ADDR_DMA3CNT (REG_BASE + REG_OFFSET_DMA3CNT) +#define REG_ADDR_DMA3CNT_L (REG_BASE + REG_OFFSET_DMA3CNT_L) +#define REG_ADDR_DMA3CNT_H (REG_BASE + REG_OFFSET_DMA3CNT_H) + +#define REG_ADDR_TMCNT (REG_BASE + REG_OFFSET_TMCNT) +#define REG_ADDR_TMCNT_L (REG_BASE + REG_OFFSET_TMCNT_L) +#define REG_ADDR_TMCNT_H (REG_BASE + REG_OFFSET_TMCNT_H) +#define REG_ADDR_TM0CNT (REG_BASE + REG_OFFSET_TM0CNT) +#define REG_ADDR_TM0CNT_L (REG_BASE + REG_OFFSET_TM0CNT_L) +#define REG_ADDR_TM0CNT_H (REG_BASE + REG_OFFSET_TM0CNT_H) +#define REG_ADDR_TM1CNT (REG_BASE + REG_OFFSET_TM1CNT) +#define REG_ADDR_TM1CNT_L (REG_BASE + REG_OFFSET_TM1CNT_L) +#define REG_ADDR_TM1CNT_H (REG_BASE + REG_OFFSET_TM1CNT_H) +#define REG_ADDR_TM2CNT (REG_BASE + REG_OFFSET_TM2CNT) +#define REG_ADDR_TM2CNT_L (REG_BASE + REG_OFFSET_TM2CNT_L) +#define REG_ADDR_TM2CNT_H (REG_BASE + REG_OFFSET_TM2CNT_H) +#define REG_ADDR_TM3CNT (REG_BASE + REG_OFFSET_TM3CNT) +#define REG_ADDR_TM3CNT_L (REG_BASE + REG_OFFSET_TM3CNT_L) +#define REG_ADDR_TM3CNT_H (REG_BASE + REG_OFFSET_TM3CNT_H) + +#define REG_ADDR_SIOCNT (REG_BASE + REG_OFFSET_SIOCNT) +#define REG_ADDR_SIODATA8 (REG_BASE + REG_OFFSET_SIODATA8) +#define REG_ADDR_SIODATA32 (REG_BASE + REG_OFFSET_SIODATA32) +#define REG_ADDR_SIOMLT_SEND (REG_BASE + REG_OFFSET_SIOMLT_SEND) +#define REG_ADDR_SIOMLT_RECV (REG_BASE + REG_OFFSET_SIOMLT_RECV) +#define REG_ADDR_SIOMULTI0 (REG_BASE + REG_OFFSET_SIOMULTI0) +#define REG_ADDR_SIOMULTI1 (REG_BASE + REG_OFFSET_SIOMULTI1) +#define REG_ADDR_SIOMULTI2 (REG_BASE + REG_OFFSET_SIOMULTI2) +#define REG_ADDR_SIOMULTI3 (REG_BASE + REG_OFFSET_SIOMULTI3) + +#define REG_ADDR_KEYINPUT (REG_BASE + REG_OFFSET_KEYINPUT) +#define REG_ADDR_KEYCNT (REG_BASE + REG_OFFSET_KEYCNT) + +#define REG_ADDR_RCNT (REG_BASE + REG_OFFSET_RCNT) + +#define REG_ADDR_JOYCNT (REG_BASE + REG_OFFSET_JOYCNT) +#define REG_ADDR_JOYSTAT (REG_BASE + REG_OFFSET_JOYSTAT) +#define REG_ADDR_JOY_RECV (REG_BASE + REG_OFFSET_JOY_RECV) +#define REG_ADDR_JOY_RECV_L (REG_BASE + REG_OFFSET_JOY_RECV_L) +#define REG_ADDR_JOY_RECV_H (REG_BASE + REG_OFFSET_JOY_RECV_H) +#define REG_ADDR_JOY_TRANS (REG_BASE + REG_OFFSET_JOY_TRANS) +#define REG_ADDR_JOY_TRANS_L (REG_BASE + REG_OFFSET_JOY_TRANS_L) +#define REG_ADDR_JOY_TRANS_H (REG_BASE + REG_OFFSET_JOY_TRANS_H) + +#define REG_ADDR_IME (REG_BASE + REG_OFFSET_IME) +#define REG_ADDR_IE (REG_BASE + REG_OFFSET_IE) +#define REG_ADDR_IF (REG_BASE + REG_OFFSET_IF) + +#define REG_ADDR_WAITCNT (REG_BASE + REG_OFFSET_WAITCNT) + +// I/O registers + +#define REG_DISPCNT (*(vu16 *)REG_ADDR_DISPCNT) +#define REG_DISPSTAT (*(vu16 *)REG_ADDR_DISPSTAT) +#define REG_VCOUNT (*(vu16 *)REG_ADDR_VCOUNT) +#define REG_BG0CNT (*(vu16 *)REG_ADDR_BG0CNT) +#define REG_BG1CNT (*(vu16 *)REG_ADDR_BG1CNT) +#define REG_BG2CNT (*(vu16 *)REG_ADDR_BG2CNT) +#define REG_BG3CNT (*(vu16 *)REG_ADDR_BG3CNT) +#define REG_BG0HOFS (*(vu16 *)REG_ADDR_BG0HOFS) +#define REG_BG0VOFS (*(vu16 *)REG_ADDR_BG0VOFS) +#define REG_BG1HOFS (*(vu16 *)REG_ADDR_BG1HOFS) +#define REG_BG1VOFS (*(vu16 *)REG_ADDR_BG1VOFS) +#define REG_BG2HOFS (*(vu16 *)REG_ADDR_BG2HOFS) +#define REG_BG2VOFS (*(vu16 *)REG_ADDR_BG2VOFS) +#define REG_BG3HOFS (*(vu16 *)REG_ADDR_BG3HOFS) +#define REG_BG3VOFS (*(vu16 *)REG_ADDR_BG3VOFS) +#define REG_BG2PA (*(vu16 *)REG_ADDR_BG2PA) +#define REG_BG2PB (*(vu16 *)REG_ADDR_BG2PB) +#define REG_BG2PC (*(vu16 *)REG_ADDR_BG2PC) +#define REG_BG2PD (*(vu16 *)REG_ADDR_BG2PD) +#define REG_BG2X (*(vu32 *)REG_ADDR_BG2X) +#define REG_BG2X_L (*(vu16 *)REG_ADDR_BG2X_L) +#define REG_BG2X_H (*(vu16 *)REG_ADDR_BG2X_H) +#define REG_BG2Y (*(vu32 *)REG_ADDR_BG2Y) +#define REG_BG2Y_L (*(vu16 *)REG_ADDR_BG2Y_L) +#define REG_BG2Y_H (*(vu16 *)REG_ADDR_BG2Y_H) +#define REG_BG3PA (*(vu16 *)REG_ADDR_BG3PA) +#define REG_BG3PB (*(vu16 *)REG_ADDR_BG3PB) +#define REG_BG3PC (*(vu16 *)REG_ADDR_BG3PC) +#define REG_BG3PD (*(vu16 *)REG_ADDR_BG3PD) +#define REG_BG3X (*(vu32 *)REG_ADDR_BG3X) +#define REG_BG3X_L (*(vu16 *)REG_ADDR_BG3X_L) +#define REG_BG3X_H (*(vu16 *)REG_ADDR_BG3X_H) +#define REG_BG3Y (*(vu32 *)REG_ADDR_BG3Y) +#define REG_BG3Y_L (*(vu16 *)REG_ADDR_BG3Y_L) +#define REG_BG3Y_H (*(vu16 *)REG_ADDR_BG3Y_H) +#define REG_WIN0H (*(vu16 *)REG_ADDR_WIN0H) +#define REG_WIN1H (*(vu16 *)REG_ADDR_WIN1H) +#define REG_WIN0V (*(vu16 *)REG_ADDR_WIN0V) +#define REG_WIN1V (*(vu16 *)REG_ADDR_WIN1V) +#define REG_WININ (*(vu16 *)REG_ADDR_WININ) +#define REG_WINOUT (*(vu16 *)REG_ADDR_WINOUT) +#define REG_MOSAIC (*(vu16 *)REG_ADDR_MOSAIC) +#define REG_BLDCNT (*(vu16 *)REG_ADDR_BLDCNT) +#define REG_BLDALPHA (*(vu16 *)REG_ADDR_BLDALPHA) +#define REG_BLDY (*(vu16 *)REG_ADDR_BLDY) + +#define REG_SOUND1CNT_L (*(vu16 *)REG_ADDR_SOUND1CNT_L) +#define REG_NR10 (*(vu8 *)REG_ADDR_NR10) +#define REG_SOUND1CNT_H (*(vu16 *)REG_ADDR_SOUND1CNT_H) +#define REG_NR11 (*(vu8 *)REG_ADDR_NR11) +#define REG_NR12 (*(vu8 *)REG_ADDR_NR12) +#define REG_SOUND1CNT_X (*(vu16 *)REG_ADDR_SOUND1CNT_X) +#define REG_NR13 (*(vu8 *)REG_ADDR_NR13) +#define REG_NR14 (*(vu8 *)REG_ADDR_NR14) +#define REG_SOUND2CNT_L (*(vu16 *)REG_ADDR_SOUND2CNT_L) +#define REG_NR21 (*(vu8 *)REG_ADDR_NR21) +#define REG_NR22 (*(vu8 *)REG_ADDR_NR22) +#define REG_SOUND2CNT_H (*(vu16 *)REG_ADDR_SOUND2CNT_H) +#define REG_NR23 (*(vu8 *)REG_ADDR_NR23) +#define REG_NR24 (*(vu8 *)REG_ADDR_NR24) +#define REG_SOUND3CNT_L (*(vu16 *)REG_ADDR_SOUND3CNT_L) +#define REG_NR30 (*(vu8 *)REG_ADDR_NR30) +#define REG_SOUND3CNT_H (*(vu16 *)REG_ADDR_SOUND3CNT_H) +#define REG_NR31 (*(vu8 *)REG_ADDR_NR31) +#define REG_NR32 (*(vu8 *)REG_ADDR_NR32) +#define REG_SOUND3CNT_X (*(vu16 *)REG_ADDR_SOUND3CNT_X) +#define REG_NR33 (*(vu8 *)REG_ADDR_NR33) +#define REG_NR34 (*(vu8 *)REG_ADDR_NR34) +#define REG_SOUND4CNT_L (*(vu16 *)REG_ADDR_SOUND4CNT_L) +#define REG_NR41 (*(vu8 *)REG_ADDR_NR41) +#define REG_NR42 (*(vu8 *)REG_ADDR_NR42) +#define REG_SOUND4CNT_H (*(vu16 *)REG_ADDR_SOUND4CNT_H) +#define REG_NR43 (*(vu8 *)REG_ADDR_NR43) +#define REG_NR44 (*(vu8 *)REG_ADDR_NR44) +#define REG_SOUNDCNT_L (*(vu16 *)REG_ADDR_SOUNDCNT_L) +#define REG_NR50 (*(vu8 *)REG_ADDR_NR50) +#define REG_NR51 (*(vu8 *)REG_ADDR_NR51) +#define REG_SOUNDCNT_H (*(vu16 *)REG_ADDR_SOUNDCNT_H) +#define REG_SOUNDCNT_X (*(vu16 *)REG_ADDR_SOUNDCNT_X) +#define REG_NR52 (*(vu8 *)REG_ADDR_NR52) +#define REG_SOUNDBIAS (*(vu16 *)REG_ADDR_SOUNDBIAS) +#define REG_SOUNDBIAS_L (*(vu8 *)REG_ADDR_SOUNDBIAS_L) +#define REG_SOUNDBIAS_H (*(vu8 *)REG_ADDR_SOUNDBIAS_H) +#define REG_WAVE_RAM0 (*(vu32 *)REG_ADDR_WAVE_RAM0) +#define REG_WAVE_RAM1 (*(vu32 *)REG_ADDR_WAVE_RAM1) +#define REG_WAVE_RAM2 (*(vu32 *)REG_ADDR_WAVE_RAM2) +#define REG_WAVE_RAM3 (*(vu32 *)REG_ADDR_WAVE_RAM3) +#define REG_FIFO_A (*(vu32 *)REG_ADDR_FIFO_A) +#define REG_FIFO_B (*(vu32 *)REG_ADDR_FIFO_B) + +#define REG_DMA0SAD (*(vu32 *)REG_ADDR_DMA0SAD) +#define REG_DMA0DAD (*(vu32 *)REG_ADDR_DMA0DAD) +#define REG_DMA0CNT (*(vu32 *)REG_ADDR_DMA0CNT) +#define REG_DMA0CNT_L (*(vu16 *)REG_ADDR_DMA0CNT_L) +#define REG_DMA0CNT_H (*(vu16 *)REG_ADDR_DMA0CNT_H) + +#define REG_DMA1SAD (*(vu32 *)REG_ADDR_DMA1SAD) +#define REG_DMA1DAD (*(vu32 *)REG_ADDR_DMA1DAD) +#define REG_DMA1CNT (*(vu32 *)REG_ADDR_DMA1CNT) +#define REG_DMA1CNT_L (*(vu16 *)REG_ADDR_DMA1CNT_L) +#define REG_DMA1CNT_H (*(vu16 *)REG_ADDR_DMA1CNT_H) + +#define REG_DMA2SAD (*(vu32 *)REG_ADDR_DMA2SAD) +#define REG_DMA2DAD (*(vu32 *)REG_ADDR_DMA2DAD) +#define REG_DMA2CNT (*(vu32 *)REG_ADDR_DMA2CNT) +#define REG_DMA2CNT_L (*(vu16 *)REG_ADDR_DMA2CNT_L) +#define REG_DMA2CNT_H (*(vu16 *)REG_ADDR_DMA2CNT_H) + +#define REG_DMA3SAD (*(vu32 *)REG_ADDR_DMA3SAD) +#define REG_DMA3DAD (*(vu32 *)REG_ADDR_DMA3DAD) +#define REG_DMA3CNT (*(vu32 *)REG_ADDR_DMA3CNT) +#define REG_DMA3CNT_L (*(vu16 *)REG_ADDR_DMA3CNT_L) +#define REG_DMA3CNT_H (*(vu16 *)REG_ADDR_DMA3CNT_H) + +#define REG_TMCNT(n) (*(vu16 *)(REG_ADDR_TMCNT + ((n) * 4))) +#define REG_TMCNT_L(n) (*(vu16 *)(REG_ADDR_TMCNT_L + ((n) * 4))) +#define REG_TMCNT_H(n) (*(vu16 *)(REG_ADDR_TMCNT_H + ((n) * 4))) +#define REG_TM0CNT (*(vu32 *)REG_ADDR_TM0CNT) +#define REG_TM0CNT_L (*(vu16 *)REG_ADDR_TM0CNT_L) +#define REG_TM0CNT_H (*(vu16 *)REG_ADDR_TM0CNT_H) +#define REG_TM1CNT (*(vu32 *)REG_ADDR_TM1CNT) +#define REG_TM1CNT_L (*(vu16 *)REG_ADDR_TM1CNT_L) +#define REG_TM1CNT_H (*(vu16 *)REG_ADDR_TM1CNT_H) +#define REG_TM2CNT (*(vu32 *)REG_ADDR_TM2CNT) +#define REG_TM2CNT_L (*(vu16 *)REG_ADDR_TM2CNT_L) +#define REG_TM2CNT_H (*(vu16 *)REG_ADDR_TM2CNT_H) +#define REG_TM3CNT (*(vu32 *)REG_ADDR_TM3CNT) +#define REG_TM3CNT_L (*(vu16 *)REG_ADDR_TM3CNT_L) +#define REG_TM3CNT_H (*(vu16 *)REG_ADDR_TM3CNT_H) + +#define REG_SIOCNT (*(vu16 *)REG_ADDR_SIOCNT) +#define REG_SIODATA8 (*(vu16 *)REG_ADDR_SIODATA8) +#define REG_SIODATA32 (*(vu32 *)REG_ADDR_SIODATA32) +#define REG_SIOMLT_SEND (*(vu16 *)REG_ADDR_SIOMLT_SEND) +#define REG_SIOMLT_RECV (*(vu64 *)REG_ADDR_SIOMLT_RECV) +#define REG_SIOMULTI0 (*(vu16 *)REG_ADDR_SIOMULTI0) +#define REG_SIOMULTI1 (*(vu16 *)REG_ADDR_SIOMULTI1) +#define REG_SIOMULTI2 (*(vu16 *)REG_ADDR_SIOMULTI2) +#define REG_SIOMULTI3 (*(vu16 *)REG_ADDR_SIOMULTI3) + +#define REG_KEYINPUT (*(vu16 *)REG_ADDR_KEYINPUT) +#define REG_KEYCNT (*(vu16 *)REG_ADDR_KEYCNT) + +#define REG_RCNT (*(vu16 *)REG_ADDR_RCNT) + +#define REG_IME (*(vu16 *)REG_ADDR_IME) +#define REG_IE (*(vu16 *)REG_ADDR_IE) +#define REG_IF (*(vu16 *)REG_ADDR_IF) + +#define REG_WAITCNT (*(vu16 *)REG_ADDR_WAITCNT) + +// I/O register fields + +// DISPCNT +#define DISPCNT_MODE_0 0x0000 // BG0: text, BG1: text, BG2: text, BG3: text +#define DISPCNT_MODE_1 0x0001 // BG0: text, BG1: text, BG2: affine, BG3: off +#define DISPCNT_MODE_2 0x0002 // BG0: off, BG1: off, BG2: affine, BG3: affine +#define DISPCNT_MODE_3 0x0003 // Bitmap mode, 240x160, BGR555 color +#define DISPCNT_MODE_4 0x0004 // Bitmap mode, 240x160, 256 color palette +#define DISPCNT_MODE_5 0x0005 // Bitmap mode, 160x128, BGR555 color +#define DISPCNT_HBLANK_INTERVAL 0x0020 // Allow access to OAM during H-Blank +#define DISPCNT_OBJ_1D_MAP 0x0040 +#define DISPCNT_FORCED_BLANK 0x0080 +#define DISPCNT_BG0_ON 0x0100 +#define DISPCNT_BG1_ON 0x0200 +#define DISPCNT_BG2_ON 0x0400 +#define DISPCNT_BG3_ON 0x0800 +#define DISPCNT_BG_ALL_ON 0x0F00 +#define DISPCNT_OBJ_ON 0x1000 +#define DISPCNT_WIN0_ON 0x2000 +#define DISPCNT_WIN1_ON 0x4000 +#define DISPCNT_OBJWIN_ON 0x8000 + +// DISPSTAT +#define DISPSTAT_VBLANK 0x0001 // in V-Blank +#define DISPSTAT_HBLANK 0x0002 // in H-Blank +#define DISPSTAT_VCOUNT 0x0004 // V-Count match +#define DISPSTAT_VBLANK_INTR 0x0008 // V-Blank interrupt enabled +#define DISPSTAT_HBLANK_INTR 0x0010 // H-Blank interrupt enabled +#define DISPSTAT_VCOUNT_INTR 0x0020 // V-Count interrupt enabled + +// BGCNT +#define BGCNT_PRIORITY(n) (n) // Values 0 - 3. Lower priority BGs will be drawn on top of higher priority BGs. +#define BGCNT_CHARBASE(n) ((n) << 2) // Values 0 - 3. Base block for tile pixel data. +#define BGCNT_MOSAIC 0x0040 +#define BGCNT_16COLOR 0x0000 // 4 bits per pixel +#define BGCNT_256COLOR 0x0080 // 8 bits per pixel +#define BGCNT_SCREENBASE(n) ((n) << 8) // Values 0 - 31. Base block for tile map. +#define BGCNT_WRAP 0x2000 // Only affects affine BGs. Text BGs wrap by default. +#define BGCNT_TXT256x256 0x0000 // Internal screen size size of text mode BG in pixels. +#define BGCNT_TXT512x256 0x4000 +#define BGCNT_TXT256x512 0x8000 +#define BGCNT_TXT512x512 0xC000 +#define BGCNT_AFF128x128 0x0000 // Internal screen size size of affine mode BG in pixels. +#define BGCNT_AFF256x256 0x4000 +#define BGCNT_AFF512x512 0x8000 +#define BGCNT_AFF1024x1024 0xC000 + +// WININ/OUT +#define WININ_WIN0_BG0 (1 << 0) +#define WININ_WIN0_BG1 (1 << 1) +#define WININ_WIN0_BG2 (1 << 2) +#define WININ_WIN0_BG3 (1 << 3) +#define WININ_WIN0_BG_ALL (WININ_WIN0_BG0 | WININ_WIN0_BG1 | WININ_WIN0_BG2 | WININ_WIN0_BG3) +#define WININ_WIN0_OBJ (1 << 4) +#define WININ_WIN0_CLR (1 << 5) +#define WININ_WIN1_BG0 (1 << 8) +#define WININ_WIN1_BG1 (1 << 9) +#define WININ_WIN1_BG2 (1 << 10) +#define WININ_WIN1_BG3 (1 << 11) +#define WININ_WIN1_BG_ALL (WININ_WIN1_BG0 | WININ_WIN1_BG1 | WININ_WIN1_BG2 | WININ_WIN1_BG3) +#define WININ_WIN1_OBJ (1 << 12) +#define WININ_WIN1_CLR (1 << 13) + +#define WINOUT_WIN01_BG0 (1 << 0) +#define WINOUT_WIN01_BG1 (1 << 1) +#define WINOUT_WIN01_BG2 (1 << 2) +#define WINOUT_WIN01_BG3 (1 << 3) +#define WINOUT_WIN01_BG_ALL (WINOUT_WIN01_BG0 | WINOUT_WIN01_BG1 | WINOUT_WIN01_BG2 | WINOUT_WIN01_BG3) +#define WINOUT_WIN01_OBJ (1 << 4) +#define WINOUT_WIN01_CLR (1 << 5) +#define WINOUT_WINOBJ_BG0 (1 << 8) +#define WINOUT_WINOBJ_BG1 (1 << 9) +#define WINOUT_WINOBJ_BG2 (1 << 10) +#define WINOUT_WINOBJ_BG3 (1 << 11) +#define WINOUT_WINOBJ_BG_ALL (WINOUT_WINOBJ_BG0 | WINOUT_WINOBJ_BG1 | WINOUT_WINOBJ_BG2 | WINOUT_WINOBJ_BG3) +#define WINOUT_WINOBJ_OBJ (1 << 12) +#define WINOUT_WINOBJ_CLR (1 << 13) + +#define WIN_RANGE(a, b) (((a) << 8) | (b)) +#define WIN_RANGE2(a, b) ((b) | ((a) << 8)) + +// BLDCNT +// Bits 0-5 select layers for the 1st target +#define BLDCNT_TGT1_BG0 (1 << 0) +#define BLDCNT_TGT1_BG1 (1 << 1) +#define BLDCNT_TGT1_BG2 (1 << 2) +#define BLDCNT_TGT1_BG3 (1 << 3) +#define BLDCNT_TGT1_OBJ (1 << 4) +#define BLDCNT_TGT1_BD (1 << 5) +#define BLDCNT_TGT1_ALL (BLDCNT_TGT1_BG0 | BLDCNT_TGT1_BG1 | BLDCNT_TGT1_BG2 | BLDCNT_TGT1_BG3 | BLDCNT_TGT1_OBJ | BLDCNT_TGT1_BD) +// Bits 6-7 select the special effect +#define BLDCNT_EFFECT_NONE (0 << 6) // no special effect +#define BLDCNT_EFFECT_BLEND (1 << 6) // 1st+2nd targets mixed (controlled by BLDALPHA) +#define BLDCNT_EFFECT_LIGHTEN (2 << 6) // 1st target becomes whiter (controlled by BLDY) +#define BLDCNT_EFFECT_DARKEN (3 << 6) // 1st target becomes blacker (controlled by BLDY) +// Bits 8-13 select layers for the 2nd target +#define BLDCNT_TGT2_BG0 (1 << 8) +#define BLDCNT_TGT2_BG1 (1 << 9) +#define BLDCNT_TGT2_BG2 (1 << 10) +#define BLDCNT_TGT2_BG3 (1 << 11) +#define BLDCNT_TGT2_OBJ (1 << 12) +#define BLDCNT_TGT2_BD (1 << 13) +#define BLDCNT_TGT2_ALL (BLDCNT_TGT2_BG0 | BLDCNT_TGT2_BG1 | BLDCNT_TGT2_BG2 | BLDCNT_TGT2_BG3 | BLDCNT_TGT2_OBJ | BLDCNT_TGT2_BD) + +// BLDALPHA +#define BLDALPHA_BLEND(target1, target2) (((target2) << 8) | (target1)) + +// SOUNDCNT_H +#define SOUND_CGB_MIX_QUARTER 0x0000 +#define SOUND_CGB_MIX_HALF 0x0001 +#define SOUND_CGB_MIX_FULL 0x0002 +#define SOUND_A_MIX_HALF 0x0000 +#define SOUND_A_MIX_FULL 0x0004 +#define SOUND_B_MIX_HALF 0x0000 +#define SOUND_B_MIX_FULL 0x0008 +#define SOUND_ALL_MIX_FULL 0x000E +#define SOUND_A_RIGHT_OUTPUT 0x0100 +#define SOUND_A_LEFT_OUTPUT 0x0200 +#define SOUND_A_TIMER_0 0x0000 +#define SOUND_A_TIMER_1 0x0400 +#define SOUND_A_FIFO_RESET 0x0800 +#define SOUND_B_RIGHT_OUTPUT 0x1000 +#define SOUND_B_LEFT_OUTPUT 0x2000 +#define SOUND_B_TIMER_0 0x0000 +#define SOUND_B_TIMER_1 0x4000 +#define SOUND_B_FIFO_RESET 0x8000 + +// SOUNDCNT_X +#define SOUND_1_ON 0x0001 +#define SOUND_2_ON 0x0002 +#define SOUND_3_ON 0x0004 +#define SOUND_4_ON 0x0008 +#define SOUND_MASTER_ENABLE 0x0080 + +// DMA +#define DMA_DEST_INC 0x0000 +#define DMA_DEST_DEC 0x0020 +#define DMA_DEST_FIXED 0x0040 +#define DMA_DEST_RELOAD 0x0060 +#define DMA_SRC_INC 0x0000 +#define DMA_SRC_DEC 0x0080 +#define DMA_SRC_FIXED 0x0100 +#define DMA_REPEAT 0x0200 +#define DMA_16BIT 0x0000 +#define DMA_32BIT 0x0400 +#define DMA_DREQ_ON 0x0800 +#define DMA_START_NOW 0x0000 +#define DMA_START_VBLANK 0x1000 +#define DMA_START_HBLANK 0x2000 +#define DMA_START_SPECIAL 0x3000 +#define DMA_START_MASK 0x3000 +#define DMA_INTR_ENABLE 0x4000 +#define DMA_ENABLE 0x8000 + +// timer +#define TIMER_1CLK 0x00 +#define TIMER_64CLK 0x01 +#define TIMER_256CLK 0x02 +#define TIMER_1024CLK 0x03 +#define TIMER_INTR_ENABLE 0x40 +#define TIMER_ENABLE 0x80 + +// serial +#define SIO_ID 0x0030 // Communication ID + +#define SIO_8BIT_MODE 0x0000 // Normal 8-bit communication mode +#define SIO_32BIT_MODE 0x1000 // Normal 32-bit communication mode +#define SIO_MULTI_MODE 0x2000 // Multi-player communication mode +#define SIO_UART_MODE 0x3000 // UART communication mode + +#define SIO_9600_BPS 0x0000 // baud rate 9600 bps +#define SIO_38400_BPS 0x0001 // 38400 bps +#define SIO_57600_BPS 0x0002 // 57600 bps +#define SIO_115200_BPS 0x0003 // 115200 bps + +#define SIO_MULTI_SI 0x0004 // Multi-player communication SI terminal +#define SIO_MULTI_SD 0x0008 // SD terminal +#define SIO_MULTI_BUSY 0x0080 + +#define SIO_ERROR 0x0040 // Detect error +#define SIO_START 0x0080 // Start transfer +#define SIO_ENABLE 0x0080 // Enable SIO + +#define SIO_INTR_ENABLE 0x4000 + +#define SIO_MULTI_SI_SHIFT 2 +#define SIO_MULTI_SI_MASK 0x1 +#define SIO_MULTI_DI_SHIFT 3 +#define SIO_MULTI_DI_MASK 0x1 + +// keys +#define A_BUTTON 0x0001 +#define B_BUTTON 0x0002 +#define SELECT_BUTTON 0x0004 +#define START_BUTTON 0x0008 +#define DPAD_RIGHT 0x0010 +#define DPAD_LEFT 0x0020 +#define DPAD_UP 0x0040 +#define DPAD_DOWN 0x0080 +#define R_BUTTON 0x0100 +#define L_BUTTON 0x0200 +#define KEYS_MASK 0x03FF +#define KEY_INTR_ENABLE 0x0400 +#define KEY_OR_INTR 0x0000 +#define KEY_AND_INTR 0x8000 +#define DPAD_ANY ((DPAD_RIGHT | DPAD_LEFT | DPAD_UP | DPAD_DOWN)) +#define JOY_EXCL_DPAD 0x030F + +// interrupt flags +#define INTR_FLAG_VBLANK (1 << 0) +#define INTR_FLAG_HBLANK (1 << 1) +#define INTR_FLAG_VCOUNT (1 << 2) +#define INTR_FLAG_TIMER0 (1 << 3) +#define INTR_FLAG_TIMER1 (1 << 4) +#define INTR_FLAG_TIMER2 (1 << 5) +#define INTR_FLAG_TIMER3 (1 << 6) +#define INTR_FLAG_SERIAL (1 << 7) +#define INTR_FLAG_DMA0 (1 << 8) +#define INTR_FLAG_DMA1 (1 << 9) +#define INTR_FLAG_DMA2 (1 << 10) +#define INTR_FLAG_DMA3 (1 << 11) +#define INTR_FLAG_KEYPAD (1 << 12) +#define INTR_FLAG_GAMEPAK (1 << 13) + +// WAITCNT +#define WAITCNT_SRAM_4 (0 << 0) +#define WAITCNT_SRAM_3 (1 << 0) +#define WAITCNT_SRAM_2 (2 << 0) +#define WAITCNT_SRAM_8 (3 << 0) +#define WAITCNT_SRAM_MASK (3 << 0) + +#define WAITCNT_WS0_N_4 (0 << 2) +#define WAITCNT_WS0_N_3 (1 << 2) +#define WAITCNT_WS0_N_2 (2 << 2) +#define WAITCNT_WS0_N_8 (3 << 2) +#define WAITCNT_WS0_N_MASK (3 << 2) + +#define WAITCNT_WS0_S_2 (0 << 4) +#define WAITCNT_WS0_S_1 (1 << 4) + +#define WAITCNT_WS1_N_4 (0 << 5) +#define WAITCNT_WS1_N_3 (1 << 5) +#define WAITCNT_WS1_N_2 (2 << 5) +#define WAITCNT_WS1_N_8 (3 << 5) +#define WAITCNT_WS1_N_MASK (3 << 5) + +#define WAITCNT_WS1_S_4 (0 << 7) +#define WAITCNT_WS1_S_1 (1 << 7) + +#define WAITCNT_WS2_N_4 (0 << 8) +#define WAITCNT_WS2_N_3 (1 << 8) +#define WAITCNT_WS2_N_2 (2 << 8) +#define WAITCNT_WS2_N_8 (3 << 8) +#define WAITCNT_WS2_N_MASK (3 << 8) + +#define WAITCNT_WS2_S_8 (0 << 10) +#define WAITCNT_WS2_S_1 (1 << 10) + +#define WAITCNT_PHI_OUT_NONE (0 << 11) +#define WAITCNT_PHI_OUT_4MHZ (1 << 11) +#define WAITCNT_PHI_OUT_8MHZ (2 << 11) +#define WAITCNT_PHI_OUT_16MHZ (3 << 11) +#define WAITCNT_PHI_OUT_MASK (3 << 11) + +#define WAITCNT_PREFETCH_ENABLE (1 << 14) + +#define WAITCNT_AGB (0 << 15) +#define WAITCNT_CGB (1 << 15) + +#endif // GUARD_GBA_IO_REG_H diff --git a/berry_fix/payload/include/gba/isagbprint.h b/berry_fix/payload/include/gba/isagbprint.h new file mode 100644 index 000000000..c5eb456c3 --- /dev/null +++ b/berry_fix/payload/include/gba/isagbprint.h @@ -0,0 +1,50 @@ +#ifndef GUARD_GBA_ISAGBPRINT_H +#define GUARD_GBA_ISAGBPRINT_H + +#ifdef NDEBUG +#define AGBPrintInit() +#define AGBPutc(cChr) +#define AGBPrint(pBuf) +#define AGBPrintf(pBuf, ...) +#define AGBPrintFlush1Block() +#define AGBPrintFlush() +#define AGBAssert(pFile, nLine, pExpression, nStopProgram) +#else +void AGBPrintInit(void); +void AGBPutc(const char cChr); +void AGBPrint(const char *pBuf); +void AGBPrintf(const char *pBuf, ...); +void AGBPrintFlush1Block(void); +void AGBPrintFlush(void); +void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram); +#endif + +#undef AGB_ASSERT +#ifdef NDEBUG +#define AGB_ASSERT(exp) +#else +#define AGB_ASSERT(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 1); +#endif + +#undef AGB_WARNING +#ifdef NDEBUG +#define AGB_WARNING(exp) +#else +#define AGB_WARNING(exp) (exp) ? ((void*)0) : AGBAssert(__FILE__, __LINE__, #exp, 0); +#endif + +// for matching purposes + +#ifdef NDEBUG +#define AGB_ASSERT_EX(exp, file, line) +#else +#define AGB_ASSERT_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 1); +#endif + +#ifdef NDEBUG +#define AGB_WARNING_EX(exp, file, line) +#else +#define AGB_WARNING_EX(exp, file, line) (exp) ? ((void*)0) : AGBAssert(file, line, #exp, 0); +#endif + +#endif // GUARD_GBA_ISAGBPRINT_H diff --git a/berry_fix/payload/include/gba/m4a_internal.h b/berry_fix/payload/include/gba/m4a_internal.h new file mode 100644 index 000000000..339a0774e --- /dev/null +++ b/berry_fix/payload/include/gba/m4a_internal.h @@ -0,0 +1,467 @@ +#ifndef GUARD_GBA_M4A_INTERNAL_H +#define GUARD_GBA_M4A_INTERNAL_H + +#include "gba/gba.h" + +// ASCII encoding of 'Smsh' in reverse +// This is presumably short for SMASH, the developer of MKS4AGB. +#define ID_NUMBER 0x68736D53 + +#define C_V 0x40 // center value for PAN, BEND, and TUNE + +#define SOUND_MODE_REVERB_VAL 0x0000007F +#define SOUND_MODE_REVERB_SET 0x00000080 +#define SOUND_MODE_MAXCHN 0x00000F00 +#define SOUND_MODE_MAXCHN_SHIFT 8 +#define SOUND_MODE_MASVOL 0x0000F000 +#define SOUND_MODE_MASVOL_SHIFT 12 +#define SOUND_MODE_FREQ_05734 0x00010000 +#define SOUND_MODE_FREQ_07884 0x00020000 +#define SOUND_MODE_FREQ_10512 0x00030000 +#define SOUND_MODE_FREQ_13379 0x00040000 +#define SOUND_MODE_FREQ_15768 0x00050000 +#define SOUND_MODE_FREQ_18157 0x00060000 +#define SOUND_MODE_FREQ_21024 0x00070000 +#define SOUND_MODE_FREQ_26758 0x00080000 +#define SOUND_MODE_FREQ_31536 0x00090000 +#define SOUND_MODE_FREQ_36314 0x000A0000 +#define SOUND_MODE_FREQ_40137 0x000B0000 +#define SOUND_MODE_FREQ_42048 0x000C0000 +#define SOUND_MODE_FREQ 0x000F0000 +#define SOUND_MODE_FREQ_SHIFT 16 +#define SOUND_MODE_DA_BIT_9 0x00800000 +#define SOUND_MODE_DA_BIT_8 0x00900000 +#define SOUND_MODE_DA_BIT_7 0x00A00000 +#define SOUND_MODE_DA_BIT_6 0x00B00000 +#define SOUND_MODE_DA_BIT 0x00B00000 +#define SOUND_MODE_DA_BIT_SHIFT 20 + +struct WaveData +{ + u16 type; + u16 status; + u32 freq; + u32 loopStart; + u32 size; // number of samples + s8 data[1]; // samples +}; + +#define TONEDATA_TYPE_CGB 0x07 +#define TONEDATA_TYPE_FIX 0x08 +#define TONEDATA_TYPE_SPL 0x40 // key split +#define TONEDATA_TYPE_RHY 0x80 // rhythm + +#define TONEDATA_P_S_PAN 0xc0 +#define TONEDATA_P_S_PAM TONEDATA_P_S_PAN + +struct ToneData +{ + u8 type; + u8 key; + u8 length; // sound length (compatible sound) + u8 pan_sweep; // pan or sweep (compatible sound ch. 1) + struct WaveData *wav; + u8 attack; + u8 decay; + u8 sustain; + u8 release; +}; + +struct CgbChannel +{ + u8 sf; + u8 ty; + u8 rightVolume; + u8 leftVolume; + u8 at; + u8 de; + u8 su; + u8 re; + u8 ky; + u8 ev; + u8 eg; + u8 ec; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u8 d5; + u8 sg; + u8 n4; + u8 pan; + u8 panMask; + u8 mo; + u8 le; + u8 sw; + u32 fr; + u32 wp; + u32 cp; + u32 tp; + u32 pp; + u32 np; + u8 d4[8]; +}; + +struct MusicPlayerTrack; + +struct SoundChannel +{ + u8 status; + u8 type; + u8 rightVolume; + u8 leftVolume; + u8 attack; + u8 decay; + u8 sustain; + u8 release; + u8 ky; + u8 ev; + u8 er; + u8 el; + u8 echoVolume; + u8 echoLength; + u8 d1; + u8 d2; + u8 gt; + u8 mk; + u8 ve; + u8 pr; + u8 rp; + u8 d3[3]; + u32 ct; + u32 fw; + u32 freq; + struct WaveData *wav; + u32 cp; + struct MusicPlayerTrack *track; + u32 pp; + u32 np; + u32 d4; + u16 xpi; + u16 xpc; +}; + +#define MAX_DIRECTSOUND_CHANNELS 12 + +#define PCM_DMA_BUF_SIZE 1584 // size of Direct Sound buffer + +struct SoundInfo +{ + // This field is normally equal to ID_NUMBER but it is set to other + // values during sensitive operations for locking purposes. + // This field should be volatile but isn't. This could potentially cause + // race conditions. + u32 ident; + + vu8 pcmDmaCounter; + + // Direct Sound + u8 reverb; + u8 maxChans; + u8 masterVolume; + u8 freq; + + u8 mode; + u8 c15; + u8 pcmDmaPeriod; // number of V-blanks per PCM DMA + u8 maxLines; + u8 gap[3]; + s32 pcmSamplesPerVBlank; + s32 pcmFreq; + s32 divFreq; + struct CgbChannel *cgbChans; + u32 func; + u32 intp; + void (*CgbSound)(void); + void (*CgbOscOff)(u8); + u32 (*MidiKeyToCgbFreq)(u8, u8, u8); + u32 MPlayJumpTable; + u32 plynote; + u32 ExtVolPit; + u8 gap2[16]; + struct SoundChannel chans[MAX_DIRECTSOUND_CHANNELS]; + s8 pcmBuffer[PCM_DMA_BUF_SIZE * 2]; +}; + +struct SongHeader +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[1]; +}; + +struct PokemonCrySong +{ + u8 trackCount; + u8 blockCount; + u8 priority; + u8 reverb; + struct ToneData *tone; + u8 *part[2]; + u8 gap; + u8 part0; // 0x11 + u8 tuneValue; // 0x12 + u8 gotoCmd; // 0x13 + u32 gotoTarget; // 0x14 + u8 part1; // 0x18 + u8 tuneValue2; // 0x19 + u8 cont[2]; // 0x1A + u8 volCmd; // 0x1C + u8 volumeValue; // 0x1D + u8 unkCmd0D[2]; // 0x1E + u32 unkCmd0DParam; // 0x20 + u8 xreleCmd[2]; // 0x24 + u8 releaseValue; // 0x26 + u8 panCmd; + u8 panValue; // 0x28 + u8 tieCmd; // 0x29 + u8 tieKeyValue; // 0x2A + u8 tieVelocityValue; // 0x2B + u8 unkCmd0C[2]; // 0x2C + u16 unkCmd0CParam; // 0x2E + u8 end[2]; // 0x30 +}; + +#define MPT_FLG_VOLSET 0x01 +#define MPT_FLG_VOLCHG 0x03 +#define MPT_FLG_PITSET 0x04 +#define MPT_FLG_PITCHG 0x0C +#define MPT_FLG_START 0x40 +#define MPT_FLG_EXIST 0x80 + +struct MusicPlayerTrack +{ + u8 flags; + u8 wait; + u8 patternLevel; + u8 repN; + u8 gateTime; + u8 key; + u8 velocity; + u8 runningStatus; + u8 keyM; + u8 pitM; + s8 keyShift; + s8 keyShiftX; + s8 tune; + u8 pitX; + s8 bend; + u8 bendRange; + u8 volMR; + u8 volML; + u8 vol; + u8 volX; + s8 pan; + s8 panX; + s8 modM; + u8 mod; + u8 modT; + u8 lfoSpeed; + u8 lfoSpeedC; + u8 lfoDelay; + u8 lfoDelayC; + u8 priority; + u8 echoVolume; + u8 echoLength; + struct SoundChannel *chan; + struct ToneData tone; + u8 gap[10]; + u16 unk_3A; + u32 unk_3C; + u8 *cmdPtr; + u8 *patternStack[3]; +}; + +#define MUSICPLAYER_STATUS_TRACK 0x0000ffff +#define MUSICPLAYER_STATUS_PAUSE 0x80000000 + +#define MAX_MUSICPLAYER_TRACKS 16 + +#define TEMPORARY_FADE 0x0001 +#define FADE_IN 0x0002 +#define FADE_VOL_MAX 64 +#define FADE_VOL_SHIFT 2 + +struct MusicPlayerInfo +{ + struct SongHeader *songHeader; + u32 status; + u8 trackCount; + u8 priority; + u8 cmd; + u8 unk_B; + u32 clock; + u8 gap[8]; + u8 *memAccArea; + u16 tempoD; + u16 tempoU; + u16 tempoI; + u16 tempoC; + u16 fadeOI; + u16 fadeOC; + u16 fadeOV; + struct MusicPlayerTrack *tracks; + struct ToneData *tone; + u32 ident; + u32 func; + u32 intp; +}; + +struct MusicPlayer +{ + struct MusicPlayerInfo *info; + struct MusicPlayerTrack *track; + u8 unk_8; + u16 unk_A; +}; + +struct Song +{ + struct SongHeader *header; + u16 ms; + u16 me; +}; + +extern const struct MusicPlayer gMPlayTable[]; +extern const struct Song gSongTable[]; + + + +extern u8 gMPlayMemAccArea[]; + +//u8 gPokemonCrySong[52]; +//u8 gPokemonCrySongs[52 * MAX_POKEMON_CRIES]; + +#define MAX_POKEMON_CRIES 2 + +extern struct PokemonCrySong gPokemonCrySong; +extern struct PokemonCrySong gPokemonCrySongs[]; + +extern struct MusicPlayerInfo gPokemonCryMusicPlayers[]; +extern struct MusicPlayerTrack gPokemonCryTracks[]; + +extern char SoundMainRAM[]; + +extern void *gMPlayJumpTable[]; + +typedef void (*XcmdFunc)(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +extern const XcmdFunc gXcmdTable[]; + +extern struct CgbChannel gCgbChans[]; + +extern const u8 gScaleTable[]; +extern const u32 gFreqTable[]; +extern const u16 gPcmSamplesPerVBlankTable[]; + +extern const u8 gCgbScaleTable[]; +extern const s16 gCgbFreqTable[]; +extern const u8 gNoiseTable[]; + +extern const struct PokemonCrySong gPokemonCrySongTemplate; + +extern const struct ToneData voicegroup000; + +extern char gNumMusicPlayers[]; +extern char gMaxLines[]; + +#define NUM_MUSIC_PLAYERS ((u16)gNumMusicPlayers) +#define MAX_LINES ((u32)gMaxLines) + +u32 umul3232H32(u32 multiplier, u32 multiplicand); +void SoundMain(void); +void SoundMainBTM(void); +void TrackStop(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayMain(void); +void RealClearChain(void *x); + +void MPlayContinue(struct MusicPlayerInfo *mplayInfo); +void MPlayStart(struct MusicPlayerInfo *mplayInfo, struct SongHeader *songHeader); +void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo); +void FadeOutBody(struct MusicPlayerInfo *mplayInfo); +void TrkVolPitSet(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track); +void MPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed); +void ClearChain(void *x); +void Clear64byte(void *addr); +void SoundInit(struct SoundInfo *soundInfo); +void MPlayExtender(struct CgbChannel *cgbChans); +void m4aSoundMode(u32 mode); +void MPlayOpen(struct MusicPlayerInfo *mplayInfo, struct MusicPlayerTrack *track, u8 a3); +void CgbSound(void); +void CgbOscOff(u8); +u32 MidiKeyToCgbFreq(u8, u8, u8); +void DummyFunc(void); +void MPlayJumpTableCopy(void **mplayJumpTable); +void SampleFreqSet(u32 freq); +void m4aSoundVSyncOn(void); +void m4aSoundVSyncOff(void); + +void m4aMPlayTempoControl(struct MusicPlayerInfo *mplayInfo, u16 tempo); +void m4aMPlayVolumeControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u16 volume); +void m4aMPlayPitchControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s16 pitch); +void m4aMPlayPanpotControl(struct MusicPlayerInfo *mplayInfo, u16 trackBits, s8 pan); +void ClearModM(struct MusicPlayerTrack *track); +void m4aMPlayModDepthSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 modDepth); +void m4aMPlayLFOSpeedSet(struct MusicPlayerInfo *mplayInfo, u16 trackBits, u8 lfoSpeed); + +struct MusicPlayerInfo *SetPokemonCryTone(struct ToneData *tone); +void SetPokemonCryVolume(u8 val); +void SetPokemonCryPanpot(s8 val); +void SetPokemonCryPitch(s16 val); +void SetPokemonCryLength(u16 val); +void SetPokemonCryRelease(u8 val); +void SetPokemonCryProgress(u32 val); +int IsPokemonCryPlaying(struct MusicPlayerInfo *mplayInfo); +void SetPokemonCryChorus(s8 val); +void SetPokemonCryStereo(u32 val); +void SetPokemonCryPriority(u8 val); + +// sound command handler functions +void ply_fine(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_goto(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_patt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_rept(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_memacc(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_prio(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tempo(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_keysh(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_voice(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_vol(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_pan(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bend(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_bendr(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfos(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_lfodl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_mod(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_modt(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_tune(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_port(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_endtie(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_note(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + +// extended sound command handler functions +void ply_xxx(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xwave(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xtype(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xatta(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xdeca(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xsust(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xrele(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecv(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xiecl(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xleng(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xswee(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0C(struct MusicPlayerInfo *, struct MusicPlayerTrack *); +void ply_xcmd_0D(struct MusicPlayerInfo *, struct MusicPlayerTrack *); + +#endif // GUARD_GBA_M4A_INTERNAL_H diff --git a/berry_fix/payload/include/gba/macro.h b/berry_fix/payload/include/gba/macro.h new file mode 100644 index 000000000..6f9c55f2e --- /dev/null +++ b/berry_fix/payload/include/gba/macro.h @@ -0,0 +1,247 @@ +#ifndef GUARD_GBA_MACRO_H +#define GUARD_GBA_MACRO_H + +#define CPU_FILL(value, dest, size, bit) \ +{ \ + vu##bit tmp = (vu##bit)(value); \ + CpuSet((void *)&tmp, \ + dest, \ + CPU_SET_##bit##BIT | CPU_SET_SRC_FIXED | ((size)/(bit/8) & 0x1FFFFF)); \ +} + +#define CpuFill16(value, dest, size) CPU_FILL(value, dest, size, 16) +#define CpuFill32(value, dest, size) CPU_FILL(value, dest, size, 32) + +#define CPU_COPY(src, dest, size, bit) CpuSet(src, dest, CPU_SET_##bit##BIT | ((size)/(bit/8) & 0x1FFFFF)) + +#define CpuCopy16(src, dest, size) CPU_COPY(src, dest, size, 16) +#define CpuCopy32(src, dest, size) CPU_COPY(src, dest, size, 32) + +#define CpuFastFill(value, dest, size) \ +{ \ + vu32 tmp = (vu32)(value); \ + CpuFastSet((void *)&tmp, \ + dest, \ + CPU_FAST_SET_SRC_FIXED | ((size)/(32/8) & 0x1FFFFF)); \ +} + +#define CpuFastFill16(value, dest, size) CpuFastFill(((value) << 16) | (value), (dest), (size)) + +#define CpuFastFill8(value, dest, size) CpuFastFill(((value) << 24) | ((value) << 16) | ((value) << 8) | (value), (dest), (size)) + +#define CpuFastCopy(src, dest, size) CpuFastSet(src, dest, ((size)/(32/8) & 0x1FFFFF)) + +#define DmaSet(dmaNum, src, dest, control) \ +{ \ + vu32 *dmaRegs = (vu32 *)REG_ADDR_DMA##dmaNum; \ + dmaRegs[0] = (vu32)(src); \ + dmaRegs[1] = (vu32)(dest); \ + dmaRegs[2] = (vu32)(control); \ + dmaRegs[2]; \ +} + +#define DMA_FILL(dmaNum, value, dest, size, bit) \ +{ \ + vu##bit tmp = (vu##bit)(value); \ + DmaSet(dmaNum, \ + &tmp, \ + dest, \ + (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_FIXED | DMA_DEST_INC) << 16 \ + | ((size)/(bit/8))); \ +} + +#define DmaFill16(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 16) +#define DmaFill32(dmaNum, value, dest, size) DMA_FILL(dmaNum, value, dest, size, 32) + +// Note that the DMA clear macros cause the DMA control value to be calculated +// at runtime rather than compile time. The size is divided by the DMA transfer +// unit size (2 or 4 bytes) and then combined with the DMA control flags using a +// bitwise OR operation. + +#define DMA_CLEAR(dmaNum, dest, size, bit) \ +{ \ + vu##bit *_dest = (vu##bit *)(dest); \ + u32 _size = size; \ + DmaFill##bit(dmaNum, 0, _dest, _size); \ +} + +#define DmaClear16(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 16) +#define DmaClear32(dmaNum, dest, size) DMA_CLEAR(dmaNum, dest, size, 32) + +#define DMA_COPY(dmaNum, src, dest, size, bit) \ + DmaSet(dmaNum, \ + src, \ + dest, \ + (DMA_ENABLE | DMA_START_NOW | DMA_##bit##BIT | DMA_SRC_INC | DMA_DEST_INC) << 16 \ + | ((size)/(bit/8))) + +#define DmaCopy16(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 16) +#define DmaCopy32(dmaNum, src, dest, size) DMA_COPY(dmaNum, src, dest, size, 32) + +#define DmaCopyLarge(dmaNum, src, dest, size, block, bit) \ +{ \ + const void *_src = src; \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + while (1) \ + { \ + DmaCopy##bit(dmaNum, _src, _dest, (block)); \ + _src += (block); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaCopy##bit(dmaNum, _src, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaCopyLarge16(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 16) + +#define DmaCopyLarge32(dmaNum, src, dest, size, block) DmaCopyLarge(dmaNum, src, dest, size, block, 32) + +#define DmaFillLarge(dmaNum, value, dest, size, block, bit) \ +{ \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + while (1) \ + { \ + DmaFill##bit(dmaNum, value, _dest, (block)); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaFill##bit(dmaNum, value, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaFillLarge16(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 16) + +#define DmaFillLarge32(dmaNum, value, dest, size, block) DmaFillLarge(dmaNum, value, dest, size, block, 32) + +#define DmaClearLarge(dmaNum, dest, size, block, bit) \ +{ \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + while (1) \ + { \ + DmaFill##bit(dmaNum, 0, _dest, (block)); \ + _dest += (block); \ + _size -= (block); \ + if (_size <= (block)) \ + { \ + DmaFill##bit(dmaNum, 0, _dest, _size); \ + break; \ + } \ + } \ +} + +#define DmaClearLarge16(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 16) + +#define DmaClearLarge32(dmaNum, dest, size, block) DmaClearLarge(dmaNum, dest, size, block, 32) + +#define DmaCopyDefvars(dmaNum, src, dest, size, bit) \ +{ \ + const void *_src = src; \ + void *_dest = (void *)(dest); \ + u32 _size = size; \ + DmaCopy##bit(dmaNum, _src, _dest, _size); \ +} + +#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16) +#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32) + +#define DmaFillDefvars(dmaNum, value, dest, size, bit) \ +{ \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + DmaFill##bit(dmaNum, value, _dest, _size); \ +} + +#define DmaFill16Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 16) +#define DmaFill32Defvars(dmaNum, value, dest, size) DmaFillDefvars(dmaNum, value, dest, size, 32) + +#define DmaClearDefvars(dmaNum, dest, size, bit) \ +{ \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + DmaClear##bit(dmaNum, _dest, _size); \ +} + +#define DmaClear16Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 16) +#define DmaClear32Defvars(dmaNum, dest, size) DmaClearDefvars(dmaNum, dest, size, 32) + +#define DmaStop(dmaNum) \ +{ \ + vu16 *dmaRegs = (vu16 *)REG_ADDR_DMA##dmaNum; \ + dmaRegs[5] &= ~(DMA_START_MASK | DMA_DREQ_ON | DMA_REPEAT); \ + dmaRegs[5] &= ~DMA_ENABLE; \ + dmaRegs[5]; \ +} + +#define IntrEnable(flags) \ +{ \ + u16 imeTemp; \ + \ + imeTemp = REG_IME; \ + REG_IME = 0; \ + REG_IE |= flags; \ + REG_IME = imeTemp; \ +} \ +// from pokeemerald +// Maximum amount of data we will transfer in one operation +#define MAX_DMA_BLOCK_SIZE 0x1000 + +#define MAX_DMA_REQUESTS 128 + +#define DMA_REQUEST_COPY32 1 +#define DMA_REQUEST_FILL32 2 +#define DMA_REQUEST_COPY16 3 +#define DMA_REQUEST_FILL16 4 + +#define Dma3CopyLarge_(src, dest, size, bit) \ +{ \ + const void *_src = src; \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaCopy##bit(3, _src, _dest, _size); \ + break; \ + } \ + DmaCopy##bit(3, _src, _dest, MAX_DMA_BLOCK_SIZE); \ + _src += MAX_DMA_BLOCK_SIZE; \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3CopyLarge16_(src, dest, size) Dma3CopyLarge_(src, dest, size, 16) +#define Dma3CopyLarge32_(src, dest, size) Dma3CopyLarge_(src, dest, size, 32) + +#define Dma3FillLarge_(value, dest, size, bit) \ +{ \ + void *_dest = (void *)dest; \ + u32 _size = size; \ + while (1) \ + { \ + if (_size <= MAX_DMA_BLOCK_SIZE) \ + { \ + DmaFill##bit(3, value, _dest, _size); \ + break; \ + } \ + DmaFill##bit(3, value, _dest, MAX_DMA_BLOCK_SIZE); \ + _dest += MAX_DMA_BLOCK_SIZE; \ + _size -= MAX_DMA_BLOCK_SIZE; \ + } \ +} + +#define Dma3FillLarge16_(value, dest, size) Dma3FillLarge_(value, dest, size, 16) +#define Dma3FillLarge32_(value, dest, size) Dma3FillLarge_(value, dest, size, 32) + +#endif // GUARD_GBA_MACRO_H diff --git a/berry_fix/payload/include/gba/multiboot.h b/berry_fix/payload/include/gba/multiboot.h new file mode 100644 index 000000000..14b6594b2 --- /dev/null +++ b/berry_fix/payload/include/gba/multiboot.h @@ -0,0 +1,55 @@ +#ifndef GUARD_GBA_MULTIBOOT_H +#define GUARD_GBA_MULTIBOOT_H + +#define MULTIBOOT_NCHILD 3 // Maximum number of slaves +#define MULTIBOOT_HEADER_SIZE 0xc0 // Header size +#define MULTIBOOT_SEND_SIZE_MIN 0x100 // Minimum transmission size +#define MULTIBOOT_SEND_SIZE_MAX 0x40000 // Maximum transmission size + +struct MultiBootParam +{ + u32 system_work[5]; // 00 + u8 handshake_data; // 14 + u8 padding; // 15 + u16 handshake_timeout; // 16 + u8 probe_count; // 18 + u8 client_data[MULTIBOOT_NCHILD]; // 19 + u8 palette_data; // 1c + u8 response_bit; // 1d + u8 client_bit; // 1e + u8 reserved1; // 1f + const u8 *boot_srcp; // 20 + const u8 *boot_endp; // 24 + const u8 *masterp; + u8 *reserved2[MULTIBOOT_NCHILD]; + u32 system_work2[4]; + u8 sendflag; + u8 probe_target_bit; + u8 check_wait; + u8 server_type; +}; + +#define MULTIBOOT_ERROR_04 0x04 +#define MULTIBOOT_ERROR_08 0x08 +#define MULTIBOOT_ERROR_0c 0x0c +#define MULTIBOOT_ERROR_40 0x40 +#define MULTIBOOT_ERROR_44 0x44 +#define MULTIBOOT_ERROR_48 0x48 +#define MULTIBOOT_ERROR_4c 0x4c +#define MULTIBOOT_ERROR_80 0x80 +#define MULTIBOOT_ERROR_84 0x84 +#define MULTIBOOT_ERROR_88 0x88 +#define MULTIBOOT_ERROR_8c 0x8c +#define MULTIBOOT_ERROR_NO_PROBE_TARGET 0x50 +#define MULTIBOOT_ERROR_NO_DLREADY 0x60 +#define MULTIBOOT_ERROR_BOOT_FAILURE 0x70 +#define MULTIBOOT_ERROR_HANDSHAKE_FAILURE 0x71 + +#define MULTIBOOT_CONNECTION_CHECK_WAIT 15 + +#define MULTIBOOT_SERVER_TYPE_NORMAL 0 +#define MULTIBOOT_SERVER_TYPE_QUICK 1 + +#define MULTIBOOT_HANDSHAKE_TIMEOUT 400 + +#endif // GUARD_GBA_MULTIBOOT_H diff --git a/berry_fix/payload/include/gba/syscall.h b/berry_fix/payload/include/gba/syscall.h new file mode 100644 index 000000000..eb1bd4e20 --- /dev/null +++ b/berry_fix/payload/include/gba/syscall.h @@ -0,0 +1,57 @@ +#ifndef GUARD_GBA_SYSCALL_H +#define GUARD_GBA_SYSCALL_H + +#include "gba/types.h" + +#define RESET_EWRAM 0x01 +#define RESET_IWRAM 0x02 +#define RESET_PALETTE 0x04 +#define RESET_VRAM 0x08 +#define RESET_OAM 0x10 +#define RESET_SIO_REGS 0x20 +#define RESET_SOUND_REGS 0x40 +#define RESET_REGS 0x80 +#define RESET_ALL 0xFF + +void SoftReset(u32 resetFlags); + +void RegisterRamReset(u32 resetFlags); + +void VBlankIntrWait(void); + +u16 Sqrt(u32 num); + +u16 ArcTan2(s16 x, s16 y); + +#define CPU_SET_SRC_FIXED 0x01000000 +#define CPU_SET_16BIT 0x00000000 +#define CPU_SET_32BIT 0x04000000 + +void CpuSet(const void *src, void *dest, u32 control); + +#define CPU_FAST_SET_SRC_FIXED 0x01000000 + +void CpuFastSet(const void *src, void *dest, u32 control); + +void BgAffineSet(struct BgAffineSrcData *src, struct BgAffineDstData *dest, s32 count); + +void ObjAffineSet(struct ObjAffineSrcData *src, void *dest, s32 count, s32 offset); + +void LZ77UnCompWram(const void *src, void *dest); + +void LZ77UnCompVram(const void *src, void *dest); + +void RLUnCompWram(const void *src, void *dest); + +void RLUnCompVram(const void *src, void *dest); + +int MultiBoot(struct MultiBootParam *mp); + +void SoundBiasReset(void); + +void SoundBiasSet(void); + +u32 Div(u32 divisor, u32 dividend); +u32 Mod(u32 divisor, u32 dividend); + +#endif // GUARD_GBA_SYSCALL_H diff --git a/berry_fix/payload/include/gba/types.h b/berry_fix/payload/include/gba/types.h new file mode 100644 index 000000000..e919abc22 --- /dev/null +++ b/berry_fix/payload/include/gba/types.h @@ -0,0 +1,146 @@ +#ifndef GUARD_GBA_TYPES_H +#define GUARD_GBA_TYPES_H + +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; +typedef int8_t s8; +typedef int16_t s16; +typedef int32_t s32; +typedef int64_t s64; + +typedef volatile u8 vu8; +typedef volatile u16 vu16; +typedef volatile u32 vu32; +typedef volatile u64 vu64; +typedef volatile s8 vs8; +typedef volatile s16 vs16; +typedef volatile s32 vs32; +typedef volatile s64 vs64; + +typedef float f32; +typedef double f64; + +typedef u8 bool8; +typedef u16 bool16; +typedef u32 bool32; + +struct BgCnt +{ + u16 priority:2; + u16 charBaseBlock:2; + u16 dummy:2; + u16 mosaic:1; + u16 palettes:1; + u16 screenBaseBlock:5; + u16 areaOverflowMode:1; + u16 screenSize:2; +}; +typedef volatile struct BgCnt vBgCnt; + +struct PlttData +{ + u16 r:5; // red + u16 g:5; // green + u16 b:5; // blue + u16 unused_15:1; +}; + +struct OamData +{ + /*0x00*/ u32 y:8; + /*0x01*/ u32 affineMode:2; // 0x1, 0x2 -> 0x4 + u32 objMode:2; // 0x4, 0x8 -> 0xC + u32 mosaic:1; // 0x10 + u32 bpp:1; // 0x20 + u32 shape:2; // 0x40, 0x80 -> 0xC0 + + /*0x02*/ u32 x:9; + u32 matrixNum:5; // bits 3/4 are h-flip/v-flip if not in affine mode + u32 size:2; + + /*0x04*/ u16 tileNum:10; // 0x3FF + u16 priority:2; // 0x400, 0x800 -> 0xC00 + u16 paletteNum:4; + /*0x06*/ u16 affineParam; +}; + +#define ST_OAM_OBJ_NORMAL 0 +#define ST_OAM_OBJ_BLEND 1 +#define ST_OAM_OBJ_WINDOW 2 + +#define ST_OAM_AFFINE_OFF 0 +#define ST_OAM_AFFINE_NORMAL 1 +#define ST_OAM_AFFINE_ERASE 2 +#define ST_OAM_AFFINE_DOUBLE 3 + +#define ST_OAM_AFFINE_ON_MASK 1 +#define ST_OAM_AFFINE_DOUBLE_MASK 2 + +#define ST_OAM_4BPP 0 +#define ST_OAM_8BPP 1 + +#define ST_OAM_SQUARE 0 +#define ST_OAM_H_RECTANGLE 1 +#define ST_OAM_V_RECTANGLE 2 + +struct BgAffineSrcData +{ + s32 texX; + s32 texY; + s16 scrX; + s16 scrY; + s16 sx; + s16 sy; + u16 alpha; +}; + +struct BgAffineDstData +{ + s16 pa; + s16 pb; + s16 pc; + s16 pd; + s32 dx; + s32 dy; +}; + +struct ObjAffineSrcData +{ + s16 xScale; + s16 yScale; + u16 rotation; +}; + +// Multi-player SIO Control Structure +struct SioMultiCnt +{ + u16 baudRate:2; // baud rate + u16 si:1; // SI terminal + u16 sd:1; // SD terminal + u16 id:2; // ID + u16 error:1; // error flag + u16 enable:1; // SIO enable + u16 unused_11_8:4; + u16 mode:2; // communication mode (should equal 2) + u16 intrEnable:1; // IRQ enable + u16 unused_15:1; + u16 data; // data +}; + +#define ST_SIO_MULTI_MODE 2 // Multi-player communication mode + +// baud rate +#define ST_SIO_9600_BPS 0 // 9600 bps +#define ST_SIO_38400_BPS 1 // 38400 bps +#define ST_SIO_57600_BPS 2 // 57600 bps +#define ST_SIO_115200_BPS 3 // 115200 bps + +typedef void (*MainCallback)(void); +typedef void (*IntrCallback)(void); +typedef void (*IntrFunc)(void); + +#endif // GUARD_GBA_TYPES_H diff --git a/berry_fix/payload/include/global.berry.h b/berry_fix/payload/include/global.berry.h new file mode 100644 index 000000000..8f185c8f9 --- /dev/null +++ b/berry_fix/payload/include/global.berry.h @@ -0,0 +1,62 @@ +#ifndef GUARD_GLOBAL_BERRY_H +#define GUARD_GLOBAL_BERRY_H + +struct Berry +{ + /*0x00*/ u8 name[7]; + /*0x07*/ u8 firmness; + /*0x08*/ u16 size; + /*0x0A*/ u8 maxYield; + /*0x0B*/ u8 minYield; + /*0x0C*/ const u8 *description1; + /*0x10*/ const u8 *description2; + /*0x14*/ u8 stageDuration; + /*0x15*/ u8 spicy; + /*0x16*/ u8 dry; + /*0x17*/ u8 sweet; + /*0x18*/ u8 bitter; + /*0x19*/ u8 sour; + /*0x1A*/ u8 smoothness; +}; + +struct EnigmaBerry +{ + /*0x000*/ struct Berry berry; + /*0x01B*/ u8 pic[(6 * 6) * TILE_SIZE_4BPP]; + /*0x49C*/ u16 palette[16]; + /*0x4BC*/ u8 description1[45]; + /*0x4E9*/ u8 description2[45]; + /*0x516*/ u8 itemEffect[18]; + /*0x528*/ u8 holdEffect; + /*0x529*/ u8 holdEffectParam; + /*0x52C*/ u32 checksum; +}; + +struct BattleEnigmaBerry +{ + /*0x00*/ u8 name[7]; + /*0x07*/ u8 holdEffect; + /*0x08*/ u8 itemEffect[18]; + /*0x1A*/ u8 holdEffectParam; +}; + +struct BerryTree +{ + /*0x00*/ u8 berry; + /*0x01*/ u8 stage:7; + /* + A berry sparkle is a state that a berry tree + can be in after growing within the player's + viewport. + */ + /*0x01*/ bool8 growthSparkle:1; + /*0x02*/ u16 minutesUntilNextStage; + /*0x04*/ u8 berryYield; + /*0x05*/ u8 regrowthCount:4; + /*0x05*/ u8 watered1:1; + /*0x05*/ u8 watered2:1; + /*0x05*/ u8 watered3:1; + /*0x05*/ u8 watered4:1; +}; + +#endif // GUARD_GLOBAL_BERRY_H diff --git a/berry_fix/payload/include/global.fieldmap.h b/berry_fix/payload/include/global.fieldmap.h new file mode 100644 index 000000000..f876e5a56 --- /dev/null +++ b/berry_fix/payload/include/global.fieldmap.h @@ -0,0 +1,317 @@ +#ifndef GUARD_GLOBAL_FIELDMAP_H +#define GUARD_GLOBAL_FIELDMAP_H + +enum +{ + CONNECTION_SOUTH = 1, + CONNECTION_NORTH, + CONNECTION_WEST, + CONNECTION_EAST, + CONNECTION_DIVE, + CONNECTION_EMERGE +}; + +typedef void (*TilesetCB)(void); + +struct Tileset +{ + /*0x00*/ bool8 isCompressed; + /*0x01*/ bool8 isSecondary; + /*0x04*/ void *tiles; + /*0x08*/ void *palettes; + /*0x0c*/ void *metatiles; + /*0x10*/ void *metatileAttributes; + /*0x14*/ TilesetCB callback; +}; + +struct MapLayout +{ + /*0x00*/ s32 width; + /*0x04*/ s32 height; + /*0x08*/ u16 *border; + /*0x0c*/ u16 *map; + /*0x10*/ struct Tileset *primaryTileset; + /*0x14*/ struct Tileset *secondaryTileset; +}; + +struct BackupMapLayout +{ + s32 width; + s32 height; + u16 *map; +}; + +struct EventObjectTemplate +{ + /*0x00*/ u8 localId; + /*0x01*/ u8 graphicsId; + /*0x02*/ u8 unk2; + /*0x04*/ s16 x; + /*0x06*/ s16 y; + /*0x08*/ u8 elevation; + /*0x09*/ u8 movementType; + /*0x0A*/ u8 movementRangeX:4; + u8 movementRangeY:4; + /*0x0C*/ u16 trainerType; + /*0x0E*/ u16 trainerRange_berryTreeId; + /*0x10*/ u8 *script; + /*0x14*/ u16 flagId; +}; + +struct WarpEvent +{ + s16 x, y; + u8 elevation; + u8 warpId; + u8 mapNum; + u8 mapGroup; +}; + +struct CoordEvent +{ + s16 x, y; + u8 elevation; + u16 trigger; + u16 index; + u8 filler_A[0x2]; + u8 *script; +}; + +struct BgEvent +{ + /*0x00*/u16 x; + /*0x02*/u16 y; + /*0x04*/u8 elevation; + /*0x05*/u8 kind; + /*0x08*/union { // carried over from diego's FR/LG work, seems to be the same struct + // in gen 3, "kind" (0x3 in BgEvent struct) determines the method to read the union. + u8 *script; + + // hidden item type + struct { + u16 item; + u16 hiddenItemId; // flag offset to determine flag lookup + } hiddenItem; + + // secret base type + u32 secretBaseId; + + } bgUnion; +}; + +struct MapEvents +{ + u8 eventObjectCount; + u8 warpCount; + u8 coordEventCount; + u8 bgEventCount; + + struct EventObjectTemplate *eventObjects; + struct WarpEvent *warps; + struct CoordEvent *coordEvents; + struct BgEvent *bgEvents; +}; + +struct MapConnection +{ + /*0x00*/ u8 direction; + /*0x01*/ u32 offset; + /*0x05*/ u8 mapGroup; + /*0x06*/ u8 mapNum; +}; + +struct MapConnections +{ + s32 count; + struct MapConnection *connections; +}; + +struct MapHeader +{ + /* 0x00 */ struct MapLayout *mapLayout; + /* 0x04 */ struct MapEvents *events; + /* 0x08 */ u8 *mapScripts; + /* 0x0C */ struct MapConnections *connections; + /* 0x10 */ u16 music; + /* 0x12 */ u16 mapLayoutId; + /* 0x14 */ u8 regionMapSectionId; + /* 0x15 */ u8 cave; + /* 0x16 */ u8 weather; + /* 0x17 */ u8 mapType; + /* 0x18 */ u8 filler_18; + /* 0x19 */ u8 escapeRope; + /* 0x1A */ u8 flags; + /* 0x1B */ u8 battleType; +}; + +struct EventObject +{ + /*0x00*/ u32 active:1; + u32 singleMovementActive:1; + u32 triggerGroundEffectsOnMove:1; + u32 triggerGroundEffectsOnStop:1; + u32 disableCoveringGroundEffects:1; // disables ground effects that cover parts of the object's sprite + u32 landingJump:1; + u32 heldMovementActive:1; + u32 heldMovementFinished:1; + /*0x01*/ u32 frozen:1; + u32 facingDirectionLocked:1; + u32 disableAnim:1; // used to disable forced movement sliding animations (like on ice) + u32 enableAnim:1; + u32 inanimate:1; + u32 invisible:1; + u32 offScreen:1; + u32 trackedByCamera:1; // only set for the player object + /*0x02*/ u32 isPlayer:1; + u32 hasReflection:1; + u32 inShortGrass:1; + u32 inShallowFlowingWater:1; + u32 inSandPile:1; + u32 inHotSprings:1; + u32 hasShadow:1; + u32 spriteAnimPausedBackup:1; + /*0x03*/ u32 spriteAffineAnimPausedBackup:1; + u32 disableJumpLandingGroundEffect:1; + u32 fixedPriority:1; + /*0x04*/ u8 spriteId; + /*0x05*/ u8 graphicsId; + /*0x06*/ u8 movementType; + /*0x07*/ u8 trainerType; + /*0x08*/ u8 localId; + /*0x09*/ u8 mapNum; + /*0x0A*/ u8 mapGroup; + /*0x0B*/ u8 currentElevation:4; + u8 previousElevation:4; + /*0x0C*/ struct Coords16 initialCoords; + /*0x10*/ struct Coords16 currentCoords; + /*0x14*/ struct Coords16 previousCoords; + /*0x18*/ u8 facingDirection:4; + /*0x18*/ u8 movementDirection:4; + /*0x19*/ union __attribute__((packed)) { + u8 as_byte; + struct __attribute__((packed)) { + u16 x:4; + u16 y:4; + } as_nybbles; + } range; + /*0x1A*/ u8 fieldEffectSpriteId; + /*0x1B*/ u8 warpArrowSpriteId; + /*0x1C*/ u8 movementActionId; + /*0x1D*/ u8 trainerRange_berryTreeId; + /*0x1E*/ u8 currentMetatileBehavior; + /*0x1F*/ u8 previousMetatileBehavior; + /*0x20*/ u8 previousMovementDirection; + /*0x21*/ u8 directionSequenceIndex; + /*0x22*/ u8 playerCopyableMovement; // used as an index to gCopyPlayerMovementFuncs for the "copy player" movement types + /*size = 0x24*/ +}; + +struct EventObjectGraphicsInfo +{ + /*0x00*/ u16 tileTag; + /*0x02*/ u16 paletteTag; + /*0x04*/ u16 bridgeReflectionPaletteTag; + /*0x06*/ u16 size; + /*0x08*/ s16 width; + /*0x0A*/ s16 height; + /*0x0C*/ u8 paletteSlot:4; + u8 shadowSize:2; + u8 inanimate:1; + u8 disableReflectionPaletteLoad:1; + /*0x0D*/ u8 tracks; + /*0x10*/ const struct OamData *oam; + /*0x14*/ const struct SubspriteTable *subspriteTables; + /*0x18*/ const union AnimCmd *const *anims; + /*0x1C*/ const struct SpriteFrameImage *images; + /*0x20*/ const union AffineAnimCmd *const *affineAnims; +}; + +#define PLAYER_AVATAR_FLAG_ON_FOOT (1 << 0) +#define PLAYER_AVATAR_FLAG_MACH_BIKE (1 << 1) +#define PLAYER_AVATAR_FLAG_ACRO_BIKE (1 << 2) +#define PLAYER_AVATAR_FLAG_SURFING (1 << 3) +#define PLAYER_AVATAR_FLAG_UNDERWATER (1 << 4) +#define PLAYER_AVATAR_FLAG_5 (1 << 5) +#define PLAYER_AVATAR_FLAG_6 (1 << 6) +#define PLAYER_AVATAR_FLAG_DASH (1 << 7) + +enum +{ + ACRO_BIKE_NORMAL, + ACRO_BIKE_TURNING, + ACRO_BIKE_WHEELIE_STANDING, + ACRO_BIKE_BUNNY_HOP, + ACRO_BIKE_WHEELIE_MOVING, + ACRO_BIKE_STATE5, + ACRO_BIKE_STATE6, +}; + +enum +{ + DIR_NONE, + DIR_SOUTH, + DIR_NORTH, + DIR_WEST, + DIR_EAST, + DIR_SOUTHWEST, + DIR_SOUTHEAST, + DIR_NORTHWEST, + DIR_NORTHEAST, +}; + +enum +{ + COLLISION_LEDGE_JUMP = 6 +}; + +// player running states +enum +{ + NOT_MOVING, + TURN_DIRECTION, // not the same as turning! turns your avatar without moving. also known as a turn frame in some circles + MOVING, +}; + +// player tile transition states +enum +{ + T_NOT_MOVING, + T_TILE_TRANSITION, + T_TILE_CENTER, // player is on a frame in which they are centered on a tile during which the player either stops or keeps their momentum and keeps going, changing direction if necessary. +}; + +struct PlayerAvatar /* 0x202E858 */ +{ + /*0x00*/ u8 flags; + /*0x01*/ u8 unk1; // used to be named bike, but its definitely not that. seems to be some transition flags + /*0x02*/ u8 runningState; // this is a static running state. 00 is not moving, 01 is turn direction, 02 is moving. + /*0x03*/ u8 tileTransitionState; // this is a transition running state: 00 is not moving, 01 is transition between tiles, 02 means you are on the frame in which you have centered on a tile but are about to keep moving, even if changing directions. 2 is also used for a ledge hop, since you are transitioning. + /*0x04*/ u8 spriteId; + /*0x05*/ u8 eventObjectId; + /*0x06*/ bool8 preventStep; + /*0x07*/ u8 gender; + /*0x08*/ u8 acroBikeState; // 00 is normal, 01 is turning, 02 is standing wheelie, 03 is hopping wheelie + /*0x09*/ u8 newDirBackup; // during bike movement, the new direction as opposed to player's direction is backed up here. + /*0x0A*/ u8 bikeFrameCounter; // on the mach bike, when this value is 1, the bike is moving but not accelerating yet for 1 tile. on the acro bike, this acts as a timer for acro bike. + /*0x0B*/ u8 bikeSpeed; + // acro bike only + /*0x0C*/ u32 directionHistory; // up/down/left/right history is stored in each nybble, but using the field directions and not the io inputs. + /*0x10*/ u32 abStartSelectHistory; // same as above but for A + B + start + select only + // these two are timer history arrays which [0] is the active timer for acro bike. every element is backed up to the next element upon update. + /*0x14*/ u8 dirTimerHistory[8]; + /*0x1C*/ u8 abStartSelectTimerHistory[8]; +}; + +struct Camera +{ + bool8 active:1; + s32 x; + s32 y; +}; + +extern struct EventObject gMapObjects[]; +extern u8 gSelectedEventObject; +extern struct MapHeader gMapHeader; +extern struct PlayerAvatar gPlayerAvatar; + +#endif // GUARD_GLOBAL_FIELDMAP_H diff --git a/berry_fix/payload/include/global.h b/berry_fix/payload/include/global.h new file mode 100644 index 000000000..c218b5f4e --- /dev/null +++ b/berry_fix/payload/include/global.h @@ -0,0 +1,875 @@ +#ifndef GUARD_GLOBAL_H +#define GUARD_GLOBAL_H + +#include "gba/gba.h" + +// global.h from pokemon ruby + +// IDE support +#if defined(__APPLE__) || defined(__CYGWIN__) +#define _(x) x +#define __(x) x +#define INCBIN(x) {0} +#define INCBIN_U8 INCBIN +#define INCBIN_U16 INCBIN +#define INCBIN_U32 INCBIN +#define INCBIN_S8 INCBIN +#define INCBIN_S16 INCBIN +#define INCBIN_S32 INCBIN +#endif + +// Prevent cross-jump optimization. +#define BLOCK_CROSS_JUMP asm(""); + +// to help in decompiling +#define asm_comment(x) asm volatile("@ -- " x " -- ") + +#define asm_unified(x) asm(".syntax unified\n" x "\n.syntax divided\n") + +#define ARRAY_COUNT(array) (sizeof(array) / sizeof((array)[0])) + + +#define POKEMON_SLOTS_NUMBER 412 +#define POKEMON_NAME_LENGTH 10 +#define OT_NAME_LENGTH 7 + +#define min(a, b) ((a) < (b) ? (a) : (b)) +#define max(a, b) ((a) >= (b) ? (a) : (b)) + +// why does GF hate 2d arrays +#define MULTI_DIM_ARR(x, dim, y) ((x) * dim + (y)) + +// dim access enums +enum +{ + B_8 = 1, + B_16 = 2, + B_32 = 4 +}; + +// There are many quirks in the source code which have overarching behavioral differences from +// a number of other files. For example, diploma.c seems to declare rodata before each use while +// other files declare out of order and must be at the beginning. There are also a number of +// macros which differ from one file to the next due to the method of obtaining the result, such +// as these below. Because of this, there is a theory (Two Team Theory) that states that these +// programming projects had more than 1 "programming team" which utilized different macros for +// each of the files that were worked on. +#define T1_READ_8(ptr) ((ptr)[0]) +#define T1_READ_16(ptr) ((ptr)[0] | ((ptr)[1] << 8)) +#define T1_READ_32(ptr) ((ptr)[0] | ((ptr)[1] << 8) | ((ptr)[2] << 16) | ((ptr)[3] << 24)) +#define T1_READ_PTR(ptr) (u8*) T1_READ_32(ptr) + +// T2_READ_8 is a duplicate to remain consistent with each group. +#define T2_READ_8(ptr) ((ptr)[0]) +#define T2_READ_16(ptr) ((ptr)[0] + ((ptr)[1] << 8)) +#define T2_READ_32(ptr) ((ptr)[0] + ((ptr)[1] << 8) + ((ptr)[2] << 16) + ((ptr)[3] << 24)) +#define T2_READ_PTR(ptr) (void*) T2_READ_32(ptr) + +// Credits to Made (dolphin emoji) +#define S16TOPOSFLOAT(val) \ +({ \ + s16 v = (val); \ + float f = (float)v; \ + if(v < 0) f += 65536.0f; \ + f; \ +}) + +enum +{ + VERSION_SAPPHIRE = 1, + VERSION_RUBY = 2, + VERSION_EMERALD = 3, +}; + +enum LanguageId +{ + LANGUAGE_JAPANESE = 1, + LANGUAGE_ENGLISH = 2, + LANGUAGE_GERMAN = 5, +}; + +// capacities of various saveblock objects +#define DAYCARE_MON_COUNT 2 +#define POKEBLOCKS_COUNT 40 +#define PARTY_SIZE 6 +#define EVENT_OBJECTS_COUNT 16 +#define BERRY_TREES_COUNT 128 +#define FLAGS_COUNT 288 +#define VARS_COUNT 256 +#define MAIL_COUNT 16 +#define SECRET_BASES_COUNT 20 +#define TV_SHOWS_COUNT 25 +#define POKE_NEWS_COUNT 16 +#define PC_ITEMS_COUNT 50 +#define BAG_ITEMS_COUNT 20 +#define BAG_KEYITEMS_COUNT 20 +#define BAG_POKEBALLS_COUNT 16 +#define BAG_TMHM_COUNT 64 +#define BAG_BERRIES_COUNT 46 + +enum +{ + MALE, + FEMALE +}; + +enum +{ + OPTIONS_BUTTON_MODE_NORMAL, + OPTIONS_BUTTON_MODE_LR, + OPTIONS_BUTTON_MODE_L_EQUALS_A +}; + +enum +{ + OPTIONS_TEXT_SPEED_SLOW, + OPTIONS_TEXT_SPEED_MID, + OPTIONS_TEXT_SPEED_FAST +}; + +enum +{ + OPTIONS_SOUND_MONO, + OPTIONS_SOUND_STEREO +}; + +enum +{ + OPTIONS_BATTLE_STYLE_SHIFT, + OPTIONS_BATTLE_STYLE_SET +}; + +enum +{ + BAG_ITEMS = 1, + BAG_POKEBALLS, + BAG_TMsHMs, + BAG_BERRIES, + BAG_KEYITEMS +}; + +struct Coords16 +{ + s16 x; + s16 y; +}; + +struct UCoords16 +{ + u16 x; + u16 y; +}; + +struct SecretBaseRecord +{ + /*0x1A08*/ u8 secretBaseId; + /*0x1A09*/ u8 sbr_field_1_0:4; + /*0x1A09*/ u8 gender:1; + /*0x1A09*/ u8 sbr_field_1_5:1; + /*0x1A09*/ u8 sbr_field_1_6:2; + /*0x1A0A*/ u8 playerName[OT_NAME_LENGTH]; + /*0x1A11*/ u8 trainerId[4]; // byte 0 is used for determining trainer class + /*0x1A16*/ u16 sbr_field_e; + /*0x1A18*/ u8 sbr_field_10; + /*0x1A19*/ u8 sbr_field_11; + /*0x1A1A*/ u8 decorations[16]; + /*0x1A2A*/ u8 decorationPos[16]; + /*0x1A3C*/ u32 partyPersonality[6]; + /*0x1A54*/ u16 partyMoves[6 * 4]; + /*0x1A84*/ u16 partySpecies[6]; + /*0x1A90*/ u16 partyHeldItems[6]; + /*0x1A9C*/ u8 partyLevels[6]; + /*0x1AA2*/ u8 partyEVs[6]; +}; + +#include "constants/game_stat.h" +#include "global.fieldmap.h" +#include "global.berry.h" +#include "pokemon.h" + +struct WarpData +{ + s8 mapGroup; + s8 mapNum; + s8 warpId; + s16 x, y; +}; + +struct ItemSlot +{ + u16 itemId; + u16 quantity; +}; + +struct Pokeblock +{ + u8 color; + u8 spicy; + u8 dry; + u8 sweet; + u8 bitter; + u8 sour; + u8 feel; +}; + +struct Roamer +{ + /*0x00*/ u32 ivs; + /*0x04*/ u32 personality; + /*0x08*/ u16 species; + /*0x0A*/ u16 hp; + /*0x0C*/ u8 level; + /*0x0D*/ u8 status; + /*0x0E*/ u8 cool; + /*0x0F*/ u8 beauty; + /*0x10*/ u8 cute; + /*0x11*/ u8 smart; + /*0x12*/ u8 tough; + /*0x13*/ bool8 active; + /*0x14*/ u8 filler[0x8]; +}; + +struct RamScriptData +{ + u8 magic; + u8 mapGroup; + u8 mapNum; + u8 objectId; + u8 script[995]; +}; + +struct RamScript +{ + u32 checksum; + struct RamScriptData data; +}; + +struct EasyChatPair +{ + u16 unk0_0:7; + u16 unk0_7:7; + u16 unk1_6:1; + u16 unk2; + u16 words[2]; +}; /*size = 0x8*/ + +struct TVShowCommon +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 pad02[20]; + /*0x16*/ u16 var16[3]; + /*0x1C*/ u8 srcTrainerId3Lo; + /*0x1D*/ u8 srcTrainerId3Hi; + /*0x1E*/ u8 srcTrainerId2Lo; + /*0x1F*/ u8 srcTrainerId2Hi; + /*0x20*/ u8 srcTrainerIdLo; + /*0x21*/ u8 srcTrainerIdHi; + /*0x22*/ u8 trainerIdLo; + /*0x23*/ u8 trainerIdHi; +}; + +struct TVShowFanClubLetter +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 species; + /*0x04*/ u16 pad04[6]; + /*0x10*/ u8 playerName[8]; + /*0x18*/ u8 language; +}; + +struct TVShowRecentHappenings +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 var02; + /*0x04*/ u16 var04[6]; + /*0x10*/ u8 playerName[8]; + /*0x18*/ u8 language; + /*0x19*/ u8 pad19[10]; +}; + +struct TVShowFanclubOpinions +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 var02; + /*0x04*/ u8 var04A:4; + /*0x04*/ u8 var04B:4; + /*0x05*/ u8 playerName[8]; + /*0x0D*/ u8 language; + /*0x0E*/ u8 var0E; + /*0x0F*/ u8 var0F; + /*0x10*/ u8 var10[8]; + /*0x18*/ u16 var18[2]; + /*0x1C*/ u16 var1C[4]; +}; + +struct TVShowUnknownType04 +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 pad02[4]; + /*0x06*/ u16 var06; +}; + +struct TVShowNameRaterShow +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 species; + /*0x04*/ u8 pokemonName[11]; + /*0x0F*/ u8 trainerName[11]; + /*0x1A*/ u8 random; + /*0x1B*/ u8 random2; + /*0x1C*/ u16 var1C; + /*0x1E*/ u8 language; + /*0x1F*/ u8 pokemonNameLanguage; +}; + +struct TVShowBravoTrainerPokemonProfiles +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 species; + /*0x04*/ u16 var04[2]; + /*0x08*/ u8 pokemonNickname[11]; + /*0x13*/ u8 contestCategory:3; + /*0x13*/ u8 contestRank:2; + /*0x13*/ u8 contestResult:2; + /*0x13*/ u8 var13_7:1; + /*0x14*/ u16 var14; + /*0x16*/ u8 playerName[8]; + /*0x1E*/ u8 language; + /*0x1F*/ u8 var1f; +}; + +struct TVShowBravoTrainerBattleTowerSpotlight +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 trainerName[8]; + /*0x0A*/ u16 species; + /*0x0C*/ u8 enemyTrainerName[8]; + /*0x14*/ u16 defeatedSpecies; + /*0x16*/ u16 var16; + /*0x18*/ u16 var18[1]; + /*0x1A*/ u8 btLevel; + /*0x1B*/ u8 var1b; + /*0x1C*/ u8 var1c; + /*0x1D*/ u8 language; +}; + +struct TVShowPokemonToday +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 language; + /*0x03*/ u8 language2; + /*0x04*/ u8 nickname[11]; + /*0x0F*/ u8 ball; + /*0x10*/ u16 species; + /*0x12*/ u8 var12; + /*0x13*/ u8 playerName[8]; +}; + +struct TVShowSmartShopper +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 priceReduced; + /*0x03*/ u8 language; + /*0x04*/ u8 pad04[2]; + /*0x06*/ u16 itemIds[3]; + /*0x0C*/ u16 itemAmounts[3]; + /*0x12*/ u8 shopLocation; + /*0x13*/ u8 playerName[8]; +}; + +struct TVShowPokemonTodayFailed +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 language; + /*0x03*/ u8 pad03[9]; + /*0x0c*/ u16 species; + /*0x0e*/ u16 species2; + /*0x10*/ u8 var10; + /*0x11*/ u8 var11; + /*0x12*/ u8 var12; + /*0x13*/ u8 playerName[8]; +}; + +struct TVShowPokemonAngler +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 var02; + /*0x03*/ u8 var03; + /*0x04*/ u16 var04; + /*0x06*/ u8 language; + u8 pad07[12]; + /*0x13*/ u8 playerName[8]; +}; + +struct TVShowWorldOfMasters +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u16 var02; + /*0x04*/ u16 var04; + /*0x06*/ u16 var06; + /*0x08*/ u16 var08; + /*0x0a*/ u8 var0a; + /*0x0b*/ u8 language; + u8 pad0c[7]; + /*0x13*/ u8 playerName[8]; +}; + +struct TVShowMassOutbreak +{ + /*0x00*/ u8 kind; + /*0x01*/ bool8 active; + /*0x02*/ u8 var02; + /*0x03*/ u8 var03; + /*0x04*/ u16 moves[4]; + /*0x0C*/ u16 species; + /*0x0E*/ u16 var0E; + /*0x10*/ u8 locationMapNum; + /*0x11*/ u8 locationMapGroup; + /*0x12*/ u8 var12; + /*0x13*/ u8 probability; + /*0x14*/ u8 level; + /*0x15*/ u8 var15; + /*0x16*/ u16 daysLeft; + /*0x18*/ u8 language; + u8 pad19[11]; +}; + +typedef union TVShow +{ + struct TVShowCommon common; + struct TVShowFanClubLetter fanclubLetter; + struct TVShowRecentHappenings recentHappenings; + struct TVShowFanclubOpinions fanclubOpinions; + struct TVShowUnknownType04 unkShow04; + struct TVShowNameRaterShow nameRaterShow; + struct TVShowBravoTrainerPokemonProfiles bravoTrainer; + struct TVShowBravoTrainerBattleTowerSpotlight bravoTrainerTower; + struct TVShowPokemonToday pokemonToday; + struct TVShowSmartShopper smartshopperShow; + struct TVShowPokemonTodayFailed pokemonTodayFailed; + struct TVShowPokemonAngler pokemonAngler; + struct TVShowWorldOfMasters worldOfMasters; + struct TVShowMassOutbreak massOutbreak; +} TVShow; + +struct MailStruct +{ + /*0x00*/ u16 words[9]; + /*0x12*/ u8 playerName[8]; + /*0x1A*/ u8 trainerId[4]; + /*0x1E*/ u16 species; + /*0x20*/ u16 itemId; +}; + + +// Mauville Pokemon Center men + +struct MauvilleManCommon +{ + u8 id; +}; + +struct MauvilleManBard +{ + /*0x00*/ u8 id; + /*0x02*/ u16 songLyrics[6]; + /*0x0E*/ u16 temporaryLyrics[6]; + /*0x1A*/ u8 playerName[8]; + /*0x22*/ u8 filler_2DB6[0x3]; + /*0x25*/ u8 playerTrainerId[4]; + /*0x29*/ bool8 hasChangedSong; +}; /*size = 0x2C*/ + +struct MauvilleManHipster +{ + u8 id; + bool8 alreadySpoken; +}; + +struct MauvilleManTrader +{ + u8 id; + u8 unk1[4]; + u8 unk5[4][11]; + bool8 alreadyTraded; +}; + +struct MauvilleManStoryteller +{ + u8 id; + bool8 alreadyRecorded; + u8 filler2[2]; + u8 gameStatIDs[4]; + u8 trainerNames[4][7]; + u8 statValues[4][4]; +}; + +struct MauvilleManGiddy +{ + /*0x00*/ u8 id; + /*0x01*/ u8 taleCounter; + /*0x02*/ u8 questionNum; + /*0x04*/ u16 randomWords[10]; + /*0x18*/ u8 questionList[12]; +}; /*size = 0x2C*/ + + +union MauvilleMan +{ + struct MauvilleManCommon common; + struct MauvilleManBard bard; + struct MauvilleManHipster hipster; + struct MauvilleManTrader trader; + struct MauvilleManStoryteller storyteller; + struct MauvilleManGiddy giddy; + u8 filler[0x40]; // needed to pad out the struct +}; + +struct PokeNews +{ + u8 kind; + u8 state; + u16 days; +}; + +struct GabbyAndTyData +{ + /*2b10*/ u16 mon1; + /*2b12*/ u16 mon2; + /*2b14*/ u16 lastMove; + /*2b16*/ u16 quote; + /*2b18*/ u8 mapnum; + /*2b19*/ u8 battleNum; + /*2b1a*/ u8 valA_0:1; + /*2b1a*/ u8 valA_1:1; + /*2b1a*/ u8 valA_2:1; + /*2b1a*/ u8 valA_3:1; + /*2b1a*/ u8 valA_4:1; + /*2b1a*/ u8 valA_5:3; + /*2b1b*/ u8 valB_0:1; + /*2b1b*/ u8 valB_1:1; + /*2b1b*/ u8 valB_2:1; + /*2b1b*/ u8 valB_3:1; + /*2b1b*/ u8 valB_4:1; + /*2b1b*/ u8 valB_5:3; +}; + +struct DayCareMail +{ + /*0x00*/ struct MailStruct message; + /*0x24*/ u8 names[19]; +}; + +struct DayCareStepCountersEtc { + u32 steps[DAYCARE_MON_COUNT]; + u16 pendingEggPersonality; + u8 eggCycleStepsRemaining; +}; + +struct RecordMixingDayCareMail +{ + struct DayCareMail mail[DAYCARE_MON_COUNT]; + u32 numDaycareMons; + u16 itemsHeld[DAYCARE_MON_COUNT]; // marks whether or not each daycare mon is currently holding an item. +}; + +struct DayCareMisc +{ + struct DayCareMail mail[DAYCARE_MON_COUNT]; + struct DayCareStepCountersEtc countersEtc; +}; + +struct DayCare { + struct BoxPokemon mons[DAYCARE_MON_COUNT]; + struct DayCareMisc misc; +}; + +struct LinkBattleRecord +{ + u8 name[8]; + u16 trainerId; + u16 wins; + u16 losses; + u16 draws; +}; + +struct RecordMixingGiftData +{ + u8 unk0; + u8 quantity; + u16 itemId; + u8 filler4[8]; +}; + +struct RecordMixingGift +{ + int checksum; + struct RecordMixingGiftData data; +}; + +struct ContestWinner +{ + /*0x00*/ u32 personality; // personality + /*0x04*/ u32 otId; // otId + /*0x08*/ u16 species; // species + /*0x0A*/ u8 contestCategory; + /*0x0B*/ u8 nickname[11]; + /*0x16*/ u8 trainerName[8]; +}; + +// there should be enough flags for all 412 slots +// each slot takes up 8 flags +// if the value is not divisible by 8, we need to account for the reminder as well +#define DEX_FLAGS_NO ((POKEMON_SLOTS_NUMBER / 8) + ((POKEMON_SLOTS_NUMBER % 8) ? 1 : 0)) + +struct SaveBlock1 /* 0x02025734 */ +{ + /*0x00*/ struct Coords16 pos; + /*0x04*/ struct WarpData location; + /*0x0C*/ struct WarpData warp1; + /*0x14*/ struct WarpData warp2; + /*0x1C*/ struct WarpData lastHealLocation; + /*0x24*/ struct WarpData warp4; + /*0x2C*/ u16 savedMusic; + /*0x2E*/ u8 weather; + /*0x2F*/ u8 weatherCycleStage; + /*0x30*/ u8 flashLevel; // flash level on current map, 0 being normal and 4 being the darkest + /*0x32*/ u16 mapLayoutId; + /*0x34*/ u16 mapView[0x100]; + /*0x234*/ u8 playerPartyCount; + /*0x238*/ struct Pokemon playerParty[6]; + /*0x490*/ u32 money; + /*0x494*/ u16 coins; + /*0x496*/ u16 registeredItem; // registered for use with SELECT button + /*0x498*/ struct ItemSlot pcItems[PC_ITEMS_COUNT]; + /*0x560*/ struct ItemSlot bagPocket_Items[BAG_ITEMS_COUNT]; + /*0x5B0*/ struct ItemSlot bagPocket_KeyItems[BAG_KEYITEMS_COUNT]; + /*0x600*/ struct ItemSlot bagPocket_PokeBalls[BAG_POKEBALLS_COUNT]; + /*0x640*/ struct ItemSlot bagPocket_TMHM[BAG_TMHM_COUNT]; + /*0x740*/ struct ItemSlot bagPocket_Berries[BAG_BERRIES_COUNT]; + /*0x7F8*/ struct Pokeblock pokeblocks[POKEBLOCKS_COUNT]; + /*0x938*/ u8 dexSeen2[DEX_FLAGS_NO]; + /*0x96C*/ u16 berryBlenderRecords[3]; + /*0x972*/ u8 filler_972[0x6]; + /*0x978*/ u16 trainerRematchStepCounter; + /*0x97A*/ u8 trainerRematches[100]; + /*0x9E0*/ struct EventObject eventObjects[EVENT_OBJECTS_COUNT]; + /*0xC20*/ struct EventObjectTemplate eventObjectTemplates[64]; + /*0x1220*/ u8 flags[FLAGS_COUNT]; + /*0x1340*/ u16 vars[VARS_COUNT]; + /*0x1540*/ u32 gameStats[NUM_GAME_STATS]; + /*0x1608*/ struct BerryTree berryTrees[BERRY_TREES_COUNT]; + /*0x1A08*/ struct SecretBaseRecord secretBases[SECRET_BASES_COUNT]; + /*0x2688*/ u8 playerRoomDecor[12]; + /*0x2694*/ u8 playerRoomDecorPos[12]; + /*0x26A0*/ u8 decorDesk[10]; + /*0x26AA*/ u8 decorChair[10]; + /*0x26B4*/ u8 decorPlant[10]; + /*0x26BE*/ u8 decorOrnament[30]; + /*0x26DC*/ u8 decorMat[30]; + /*0x26FA*/ u8 decorPoster[10]; + /*0x2704*/ u8 decorDoll[40]; + /*0x272C*/ u8 decorCushion[10]; + /*0x2736*/ u8 padding_2736[2]; + /*0x2738*/ TVShow tvShows[TV_SHOWS_COUNT]; + /*0x2ABC*/ struct PokeNews pokeNews[POKE_NEWS_COUNT]; + /*0x2AFC*/ u16 outbreakPokemonSpecies; + /*0x2AFE*/ u8 outbreakLocationMapNum; + /*0x2AFF*/ u8 outbreakLocationMapGroup; + /*0x2B00*/ u8 outbreakPokemonLevel; + /*0x2B01*/ u8 outbreakUnk1; + /*0x2B02*/ u16 outbreakUnk2; + /*0x2B04*/ u16 outbreakPokemonMoves[4]; + /*0x2B0C*/ u8 outbreakUnk4; + /*0x2B0D*/ u8 outbreakPokemonProbability; + /*0x2B0E*/ u16 outbreakUnk5; + /*0x2B10*/ struct GabbyAndTyData gabbyAndTyData; + /*0x2B1C*/ struct { + /*0x2B1C*/ u16 unk2B1C[6]; + /*0x2B28*/ u16 unk2B28[6]; + /*0x2B34*/ u16 unk2B34[6]; + /*0x2B40*/ u16 unk2B40[6]; + } easyChats; + /*0x2B4C*/ struct MailStruct mail[MAIL_COUNT]; + /*0x2D8C*/ u8 unk2D8C[4]; // What is this? Apparently it's supposed to be 64 bytes in size. + /*0x2D90*/ u8 filler_2D90[0x4]; + /*0x2D94*/ union MauvilleMan mauvilleMan; + /*0x2DD4*/ struct EasyChatPair easyChatPairs[5]; //Dewford trend [0] and some other stuff + /*0x2DFC*/ struct ContestWinner contestWinners[8]; + /*0x2EFC*/ struct ContestWinner museumPortraits[5]; + /*0x2F9C*/ struct DayCare daycare; + /*0x30B8*/ struct LinkBattleRecord linkBattleRecords[5]; + struct { + /*0x3108*/ u8 unknown1[8]; + /*0x3110*/ u8 giftRibbons[11]; + /*0x311B*/ u8 unknown2[8]; + /*0x3123*/ u32 currentPokeCoupons; + /*0x3127*/ u32 totalEarnedPokeCoupons; + /*0x312B*/ u8 unknown3[6]; + /*0x3131*/ u8 receivedWishmakerJirachi; + /*0x3132*/ u8 unknown4[18]; + } __attribute__((packed)) externalReservedData; + /*0x3144*/ struct Roamer roamer; + /*0x3160*/ struct EnigmaBerry enigmaBerry; + /*0x3690*/ struct RamScript ramScript; + /*0x3A7C*/ struct RecordMixingGift recordMixingGift; + /*0x3A8C*/ u8 dexSeen3[DEX_FLAGS_NO]; +}; + +extern struct SaveBlock1 gSaveBlock1; + +struct Time +{ + /*0x00*/ s16 days; + /*0x02*/ s8 hours; + /*0x03*/ s8 minutes; + /*0x04*/ s8 seconds; +}; + +struct Pokedex +{ + /*0x00*/ u8 order; + /*0x01*/ u8 unknown1; + /*0x02*/ u8 nationalMagic; // must equal 0xDA in order to have National mode + /*0x03*/ u8 unknown2; + /*0x04*/ u32 unownPersonality; // set when you first see Unown + /*0x08*/ u32 spindaPersonality; // set when you first see Spinda + /*0x0C*/ u32 unknown3; + /*0x10*/ u8 owned[DEX_FLAGS_NO]; + /*0x44*/ u8 seen[DEX_FLAGS_NO]; +}; + +struct BattleTowerTrainer +{ + /*0x00*/ u8 trainerClass; + /*0x01*/ u8 name[8]; + /*0x09*/ u8 teamFlags; + u8 filler0A[2]; + /*0x0C*/ u16 greeting[6]; +}; + +struct BattleTowerRecord // record mixing +{ + /*0x00*/ u8 battleTowerLevelType; // 0 = level 50, 1 = level 100 + /*0x01*/ u8 trainerClass; + /*0x02*/ u16 winStreak; + /*0x04*/ u8 name[8]; + /*0x0C*/ u8 trainerId[4]; + /*0x10*/ u16 greeting[6]; + /*0x1C*/ struct BattleTowerPokemon party[3]; + /*0xA0*/ u32 checksum; +}; + +struct BattleTowerEReaderTrainer +{ + /*0x00*/ u8 unk0; + /*0x01*/ u8 trainerClass; + /*0x02*/ u16 winStreak; + /*0x04*/ u8 name[8]; + /*0x0C*/ u8 trainerId[4]; + /*0x10*/ u16 greeting[6]; + /*0x1C*/ u16 farewellPlayerLost[6]; + /*0x28*/ u16 farewellPlayerWon[6]; + /*0x34*/ struct BattleTowerPokemon party[3]; + /*0xB8*/ u32 checksum; +}; + +struct BattleTowerData +{ + /*0x0000, 0x00A8*/ struct BattleTowerRecord playerRecord; + /*0x00A4, 0x014C*/ struct BattleTowerRecord records[5]; // from record mixing + /*0x03D8, 0x0480*/ u16 firstMonSpecies; // species of the first pokemon in the player's battle tower party + /*0x03DA, 0x0482*/ u16 defeatedBySpecies; // species of the pokemon that defated the player + /*0x03DC, 0x0484*/ u8 defeatedByTrainerName[8]; + /*0x03E4, 0x048C*/ u8 firstMonNickname[POKEMON_NAME_LENGTH]; // nickname of the first pokemon in the player's battle tower party + /*0x03F0, 0x0498*/ struct BattleTowerEReaderTrainer ereaderTrainer; + /*0x04AC, 0x0554*/ u8 battleTowerLevelType:1; // 0 = level 50; 1 = level 100 + /*0x04AC, 0x0554*/ u8 unk_554:1; + /*0x04AD, 0x0555*/ u8 battleOutcome; + /*0x04AE, 0x0556*/ u8 var_4AE[2]; + /*0x04B0, 0x0558*/ u16 curChallengeBattleNum[2]; // 1-based index of battle in the current challenge. (challenges consist of 7 battles) + /*0x04B4, 0x055C*/ u16 curStreakChallengesNum[2]; // 1-based index of the current challenge in the current streak. + /*0x04B8, 0x0560*/ u16 recordWinStreaks[2]; + /*0x04BC, 0x0564*/ u8 battleTowerTrainerId; // index for gBattleTowerTrainers table + /*0x04BD, 0x0565*/ u8 selectedPartyMons[0x3]; // indices of the 3 selected player party mons. + /*0x04C0, 0x0568*/ u16 prizeItem; + /*0x04C2, 0x056A*/ u8 battledTrainerIds[6]; + /*0x04C8, 0x0570*/ u16 totalBattleTowerWins; + /*0x04CA, 0x0572*/ u16 bestBattleTowerWinStreak; + /*0x04CC, 0x0574*/ u16 currentWinStreaks[2]; + /*0x04D0, 0x0578*/ u8 lastStreakLevelType; // 0 = level 50, 1 = level 100. level type of the last streak. Used by tv to report the level mode. + /*0x04D1, 0x0579*/ u8 filler_4D1[0x317]; +}; + +struct SaveBlock2 /* 0x02024EA4 */ +{ + /*0x00*/ u8 playerName[8]; + /*0x08*/ u8 playerGender; // MALE, FEMALE + /*0x09*/ u8 specialSaveWarp; + /*0x0A*/ u8 playerTrainerId[4]; + /*0x0E*/ u16 playTimeHours; + /*0x10*/ u8 playTimeMinutes; + /*0x11*/ u8 playTimeSeconds; + /*0x12*/ u8 playTimeVBlanks; + /*0x13*/ u8 optionsButtonMode; // OPTIONS_BUTTON_MODE_[NORMAL/LR/L_EQUALS_A] + /*0x14*/ u16 optionsTextSpeed:3; // OPTIONS_TEXT_SPEED_[SLOW/MID/FAST] + u16 optionsWindowFrameType:5; // Specifies one of the 20 decorative borders for text boxes + u16 optionsSound:1; // OPTIONS_SOUND_[MONO/STEREO] + u16 optionsBattleStyle:1; // OPTIONS_BATTLE_STYLE_[SHIFT/SET] + u16 optionsBattleSceneOff:1; // whether battle animations are disabled + u16 regionMapZoom:1; // whether the map is zoomed in + /*0x18*/ struct Pokedex pokedex; + /*0x90*/ u8 filler_90[0x8]; + /*0x98*/ struct Time localTimeOffset; + /*0xA0*/ struct Time lastBerryTreeUpdate; + /*0xA8*/ struct BattleTowerData battleTower; +}; + +struct MapPosition +{ + s16 x; + s16 y; + s8 height; +}; + +struct UnkStruct_8054FF8 +{ + u8 a; + u8 b; + u8 c; + u8 d; + struct MapPosition sub; + u16 field_C; +}; + +// wasnt defined so I had to define it +struct HallOfFame +{ + u8 filler[0x1F00]; +}; + +extern struct SaveBlock2 gSaveBlock2; + +#define RomHeaderGameTitle ((const char *)0x080000A0) +#define RomHeaderGameCode ((const char *)0x080000AC) +#define RomHeaderMakerCode ((const char *)0x080000B0) +#define RomHeaderMagic ((const u8 *) 0x080000B2) +#define RomHeaderSoftwareVersion ((const u8 *) 0x080000BC) + +#define LocalTimeOffset ((struct Time *)0x02028098) +#define LastBerryTreeUpdate ((struct Time *)0x020280A0) + +#endif //GUARD_GLOBAL_H diff --git a/berry_fix/payload/include/main.h b/berry_fix/payload/include/main.h new file mode 100644 index 000000000..cb58d5982 --- /dev/null +++ b/berry_fix/payload/include/main.h @@ -0,0 +1,45 @@ +#ifndef GUARD_MAIN_H +#define GUARD_MAIN_H + +#include "gba/gba.h" + +enum RomHeaderValidationResult +{ + SAPPHIRE_UPDATABLE = 2, + RUBY_UPDATABLE, + SAPPHIRE_NONEED, + RUBY_NONEED, + INVALID +}; + +enum MainCallbackState +{ + MAINCB_INIT = 0, + MAINCB_CHECK_RTC, + MAINCB_CHECK_FLASH, + MAINCB_READ_SAVE, + MAINCB_CHECK_TIME, + MAINCB_FIX_DATE, + MAINCB_NO_NEED_TO_FIX, + MAINCB_YEAR_MAKES_NO_SENSE, + MAINCB_FINISHED, + MAINCB_CHECK_PACIFIDLOG_TM, + MAINCB_FIX_PACIFIDLOG_TM, + MAINCB_ERROR +}; + +extern IntrFunc gIntrTable[]; +extern u16 gHeldKeys; +extern u16 gNewKeys; +extern u8 gIntrVector[]; +extern u32 gUpdateSuccessful; +extern u32 gUnknown_3001194; +extern u32 gUnknown_30011A0[]; +extern u32 gMainCallbackState; +extern u32 gGameVersion; + +extern u8 gSharedMem[0x8000]; + +extern const IntrFunc gIntrFuncPointers[]; + +#endif //GUARD_MAIN_H diff --git a/berry_fix/payload/include/pokemon.h b/berry_fix/payload/include/pokemon.h new file mode 100644 index 000000000..d3a14ffff --- /dev/null +++ b/berry_fix/payload/include/pokemon.h @@ -0,0 +1,154 @@ +#ifndef GUARD_POKEMON_H +#define GUARD_POKEMON_H + +struct PokemonSubstruct0 +{ + u16 species; + u16 heldItem; + u32 experience; + u8 ppBonuses; + u8 friendship; +}; + +struct PokemonSubstruct1 +{ + u16 moves[4]; + u8 pp[4]; +}; + +struct PokemonSubstruct2 +{ + u8 hpEV; + u8 attackEV; + u8 defenseEV; + u8 speedEV; + u8 spAttackEV; + u8 spDefenseEV; + u8 cool; + u8 beauty; + u8 cute; + u8 smart; + u8 tough; + u8 sheen; +}; + +struct PokemonSubstruct3 +{ + /*0x00*/ u8 pokerus; + /*0x01*/ u8 metLocation; + + /*0x02*/ u16 metLevel:7; + /*0x02*/ u16 metGame:4; + /*0x03*/ u16 pokeball:4; + /*0x03*/ u16 otGender:1; + + /*0x04*/ u32 hpIV:5; + /*0x04*/ u32 attackIV:5; + /*0x05*/ u32 defenseIV:5; + /*0x05*/ u32 speedIV:5; + /*0x05*/ u32 spAttackIV:5; + /*0x06*/ u32 spDefenseIV:5; + /*0x07*/ u32 isEgg:1; + /*0x07*/ u32 altAbility:1; + + /*0x08*/ u32 coolRibbon:3; + /*0x08*/ u32 beautyRibbon:3; + /*0x08*/ u32 cuteRibbon:3; + /*0x09*/ u32 smartRibbon:3; + /*0x09*/ u32 toughRibbon:3; + /*0x09*/ u32 championRibbon:1; + /*0x0A*/ u32 winningRibbon:1; + /*0x0A*/ u32 victoryRibbon:1; + /*0x0A*/ u32 artistRibbon:1; + /*0x0A*/ u32 effortRibbon:1; + /*0x0A*/ u32 giftRibbon1:1; + /*0x0A*/ u32 giftRibbon2:1; + /*0x0A*/ u32 giftRibbon3:1; + /*0x0A*/ u32 giftRibbon4:1; + /*0x0B*/ u32 giftRibbon5:1; + /*0x0B*/ u32 giftRibbon6:1; + /*0x0B*/ u32 giftRibbon7:1; + /*0x0B*/ u32 fatefulEncounter:5; // unused in Ruby/Sapphire, but the high bit must be set for Mew/Deoxys to obey in FR/LG/Emerald +}; + +union PokemonSubstruct +{ + struct PokemonSubstruct0 type0; + struct PokemonSubstruct1 type1; + struct PokemonSubstruct2 type2; + struct PokemonSubstruct3 type3; + u16 raw[6]; +}; + +struct BoxPokemon +{ + /*0x00*/ u32 personality; + /*0x04*/ u32 otId; + /*0x08*/ u8 nickname[POKEMON_NAME_LENGTH]; + /*0x12*/ u8 language; + /*0x13*/ u8 isBadEgg:1; + u8 hasSpecies:1; + u8 isEgg:1; + /*0x14*/ u8 otName[OT_NAME_LENGTH]; + /*0x1B*/ u8 markings; + /*0x1C*/ u16 checksum; + /*0x1E*/ u16 unknown; + + union + { + u32 raw[12]; + union PokemonSubstruct substructs[4]; + } secure; +}; /*size = 0x50*/ + +struct Pokemon +{ + /*0x00*/ struct BoxPokemon box; + /*0x50*/ u32 status; + /*0x54*/ u8 level; + /*0x55*/ u8 mail; + /*0x56*/ u16 hp; + /*0x58*/ u16 maxHP; + /*0x5A*/ u16 attack; + /*0x5C*/ u16 defense; + /*0x5E*/ u16 speed; + /*0x60*/ u16 spAttack; + /*0x62*/ u16 spDefense; +}; + +struct BattleTowerPokemon +{ + /*0x00*/u16 species; + /*0x02*/u16 heldItem; + /*0x04*/u16 moves[4]; + /*0x0C*/u8 level; + /*0x0D*/u8 ppBonuses; + /*0x0E*/u8 hpEV; + /*0x0F*/u8 attackEV; + /*0x10*/u8 defenseEV; + /*0x11*/u8 speedEV; + /*0x12*/u8 spAttackEV; + /*0x13*/u8 spDefenseEV; + /*0x14*/u32 otId; + /*0x18*/u32 hpIV:5; + /*0x18*/u32 attackIV:5; + /*0x19*/u32 defenseIV:5; + /*0x19*/u32 speedIV:5; + /*0x1A*/u32 spAttackIV:5; + /*0x1A*/u32 spDefenseIV:5; + /*0x1B*/u32 gap:1; + /*0x1B*/u32 altAbility:1; + /*0x1C*/u32 personality; + /*0x20*/u8 nickname[POKEMON_NAME_LENGTH + 1]; + /*0x2B*/u8 friendship; +}; + +struct PokemonStorage +{ + /*0x0000*/ u8 currentBox; + /*0x0004*/ struct BoxPokemon boxes[14][30]; + /*0x8344*/ u8 boxNames[14][9]; + /*0x83c2*/ u8 wallpaper[14]; +}; + +#endif // GUARD_POKEMON_H diff --git a/berry_fix/payload/include/rtc.h b/berry_fix/payload/include/rtc.h new file mode 100644 index 000000000..35654d866 --- /dev/null +++ b/berry_fix/payload/include/rtc.h @@ -0,0 +1,15 @@ +#ifndef GUARD_RTC_H +#define GUARD_RTC_H + +#include "gba/gba.h" +#include "siirtc.h" +#include "global.h" + +extern struct Time gTimeSinceBerryUpdate; +extern struct Time gRtcUTCTime; + +bool32 rtc_maincb_is_rtc_working(void); +bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 *); +void rtc_maincb_fix_date(void); + +#endif //GUARD_RTC_H diff --git a/berry_fix/payload/include/siirtc.h b/berry_fix/payload/include/siirtc.h new file mode 100644 index 000000000..de4fd634d --- /dev/null +++ b/berry_fix/payload/include/siirtc.h @@ -0,0 +1,54 @@ +#ifndef GUARD_RTC_H +#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 + +enum +{ + 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 +}; + +struct SiiRtcInfo +{ + u8 year; + u8 month; + u8 day; + u8 dayOfWeek; + u8 hour; + u8 minute; + u8 second; + u8 status; + u8 alarmHour; + u8 alarmMinute; +}; + +void SiiRtcUnprotect(void); +void SiiRtcProtect(void); +u8 SiiRtcProbe(void); +bool8 SiiRtcReset(void); +bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc); +bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc); +bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc); +bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc); +bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc); +bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc); +bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc); + +#endif // GUARD_RTC_H diff --git a/berry_fix/payload/ld_script.sed b/berry_fix/payload/ld_script.sed new file mode 100644 index 000000000..b91542b6f --- /dev/null +++ b/berry_fix/payload/ld_script.sed @@ -0,0 +1,14 @@ +// { + r sym_ewram.ld + d +} + +// { + r sym_bss.ld + d +} + +// { + r sym_common.ld + d +} diff --git a/berry_fix/payload/ld_script.txt b/berry_fix/payload/ld_script.txt new file mode 100644 index 000000000..d0a0af9ed --- /dev/null +++ b/berry_fix/payload/ld_script.txt @@ -0,0 +1,107 @@ +ENTRY(Init) + +SECTIONS { + . = 0x2010000; + + .text : + ALIGN(4) + { + asm/crt0.o(.text); + src/main.o(.text); + src/rtc.o(.text); + src/flash.o(.text); + } =0 + + lib_text : + ALIGN(4) + { + src/agb_flash.o(.text); + src/agb_flash_1m.o(.text); + src/agb_flash_mx.o(.text); + asm/libagbsyscall.o(.text); + src/siirtc.o(.text); + *libgcc.a:_call_via_rX.o(.text); + *libgcc.a:_modsi3.o(.text); + *libgcc.a:_umodsi3.o(.text); + *libgcc.a:_dvmd_tls.o(.text); + } =0 + + .rodata : + ALIGN(4) + { + src/main.o(.rodata); + src/rtc.o(.rodata); + src/flash.o(.rodata); + } =0 + + lib_rodata : + ALIGN(4) + { + src/agb_flash.o(.rodata); + src/agb_flash_1m.o(.rodata); + src/agb_flash_mx.o(.rodata); + src/agb_flash_le.o(.rodata); + src/siirtc.o(.rodata); + } + + . = 0x2020000; + + ewram (NOLOAD) : + ALIGN(4) + { + + } + + . = 0x3001000; + + iwram (NOLOAD) : + ALIGN(4) + { + + . = 0x40; + + end = .; + } + + . = 0x8000000; + + RS_Rom (NOLOAD) : + ALIGN(4) + { + _start = .; + . += 4; + RomHeaderNintendoLogo = .; + . += 156; + RS_RomHeader = .; + RomHeaderGameTitle = .; + . += 12; + RomHeaderGameCode = .; + . += 4; + RomHeaderMakerCode = .; + . += 2; + RomHeaderMagic = .; + . += 1; + RomHeaderMainUnitCode = .; + . += 1; + RomHeaderDeviceType = .; + . += 1; + RomHeaderReserved1 = .; + . += 7; + RomHeaderSoftwareVersion = .; + . += 1; + RomHeaderChecksum = .; + . += 1; + RomHeaderReserved2 = .; + . += 6; + GPIOPortData = .; + . += 2; + GPIOPortDirection = .; + . += 2; + GPIOPortReadEnable = .; + } =0 + + /DISCARD/ : + { + *(*); + } +} diff --git a/berry_fix/payload/rom.sha1 b/berry_fix/payload/rom.sha1 new file mode 100644 index 000000000..92eee7e87 --- /dev/null +++ b/berry_fix/payload/rom.sha1 @@ -0,0 +1 @@ +866991e2b5a8de02d12f53abe0ee9af03a2b6e01 payload.gba diff --git a/berry_fix/payload/src/agb_flash.c b/berry_fix/payload/src/agb_flash.c new file mode 100644 index 000000000..2c2c96e6e --- /dev/null +++ b/berry_fix/payload/src/agb_flash.c @@ -0,0 +1,296 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static u8 sTimerNum; +static u16 sTimerCount; +static vu16 *sTimerReg; +static u16 sSavedIme; + +u8 gFlashTimeoutFlag; +u8 (*PollFlashStatus)(u8 *); +const struct FlashType *gFlash; +u16 gFlashNumRemainingBytes; +const u16 *gFlashMaxTime; + +u16 (*ProgramFlashByte)(u16, u32, u8); +u16 (*ProgramFlashSector)(u16, void *); +u16 (*EraseFlashChip)(void); +u16 (*EraseFlashSector)(u16); +u16 (*WaitForFlashWrite)(u8, u8 *, u8); + +void SetReadFlash1(u16 *dest); + +void SwitchFlashBank(u8 bankNum) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xB0); + FLASH_WRITE(0x0000, bankNum); +} + +#define DELAY() \ +do { \ + vu16 i; \ + for (i = 20000; i != 0; i--) \ + ; \ +} while (0) + +u16 ReadFlashId(void) +{ + u16 flashId; + u16 readFlash1Buffer[0x20]; + u8 (*readFlash1)(u8 *); + + SetReadFlash1(readFlash1Buffer); + readFlash1 = (u8 (*)(u8 *))((s32)readFlash1Buffer + 1); + + // Enter ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x90); + DELAY(); + + flashId = readFlash1(FLASH_BASE + 1) << 8; + flashId |= readFlash1(FLASH_BASE); + + // Leave ID mode. + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xF0); + FLASH_WRITE(0x5555, 0xF0); + DELAY(); + + return flashId; +} + +void FlashTimerIntr(void) +{ + if (sTimerCount != 0 && --sTimerCount == 0) + gFlashTimeoutFlag = 1; +} + +u16 SetFlashTimerIntr(u8 timerNum, void (**intrFunc)(void)) +{ + if (timerNum >= 4) + return 1; + + sTimerNum = timerNum; + sTimerReg = ®_TMCNT(sTimerNum); + *intrFunc = FlashTimerIntr; + return 0; +} + +void StartFlashTimer(u8 phase) +{ + const u16 *maxTime = &gFlashMaxTime[phase * 3]; + sSavedIme = REG_IME; + REG_IME = 0; + sTimerReg[1] = 0; + REG_IE |= (INTR_FLAG_TIMER0 << sTimerNum); + gFlashTimeoutFlag = 0; + sTimerCount = *maxTime++; + *sTimerReg++ = *maxTime++; + *sTimerReg-- = *maxTime++; + REG_IF = (INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = 1; +} + +void StopFlashTimer(void) +{ + REG_IME = 0; + *sTimerReg++ = 0; + *sTimerReg-- = 0; + REG_IE &= ~(INTR_FLAG_TIMER0 << sTimerNum); + REG_IME = sSavedIme; +} + +u8 ReadFlash1(u8 *addr) +{ + return *addr; +} + +void SetReadFlash1(u16 *dest) +{ + u16 *src; + u16 i; + + PollFlashStatus = (u8 (*)(u8 *))((s32)dest + 1); + + src = (u16 *)ReadFlash1; + src = (u16 *)((s32)src ^ 1); + + i = ((s32)SetReadFlash1 - (s32)ReadFlash1) >> 1; + + while (i != 0) + { + *dest++ = *src++; + i--; + } +} + +void ReadFlash_Core(u8 *src, u8 *dest, u32 size) +{ + while (size-- != 0) + { + *dest++ = *src++; + } +} + +void ReadFlash(u16 sectorNum, u32 offset, void *dest, u32 size) +{ + u8 *src; + u16 i; + u16 readFlash_Core_Buffer[0x40]; + u16 *funcSrc; + u16 *funcDest; + void (*readFlash_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)ReadFlash_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = readFlash_Core_Buffer; + + i = ((s32)ReadFlash - (s32)ReadFlash_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + readFlash_Core = (void (*)(u8 *, u8 *, u32))((s32)readFlash_Core_Buffer + 1); + + src = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + readFlash_Core(src, dest, size); +} + +u32 VerifyFlashSector_Core(u8 *src, u8 *tgt, u32 size) +{ + while (size-- != 0) + { + if (*tgt++ != *src++) + return (u32)(tgt - 1); + } + + return 0; +} + +u32 VerifyFlashSector(u16 sectorNum, u8 *src) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u16 size; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + size = gFlash->sector.size; + + return verifyFlashSector_Core(src, tgt, size); +} + +u32 VerifyFlashSectorNBytes(u16 sectorNum, u8 *src, u32 n) +{ + u16 i; + u16 verifyFlashSector_Core_Buffer[0x80]; + u16 *funcSrc; + u16 *funcDest; + u8 *tgt; + u32 (*verifyFlashSector_Core)(u8 *, u8 *, u32); + + if (gFlash->romSize == FLASH_ROM_SIZE_1M) + { + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + } + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + funcSrc = (u16 *)VerifyFlashSector_Core; + funcSrc = (u16 *)((s32)funcSrc ^ 1); + funcDest = verifyFlashSector_Core_Buffer; + + i = ((s32)VerifyFlashSector - (s32)VerifyFlashSector_Core) >> 1; + + while (i != 0) + { + *funcDest++ = *funcSrc++; + i--; + } + + verifyFlashSector_Core = (u32 (*)(u8 *, u8 *, u32))((s32)verifyFlashSector_Core_Buffer + 1); + + tgt = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + return verifyFlashSector_Core(src, tgt, n); +} + +u32 ProgramFlashSectorAndVerify(u16 sectorNum, u8 *src) +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSector(sectorNum, src); + if (result == 0) + break; + } + + return result; +} + +u32 ProgramFlashSectorAndVerifyNBytes(u16 sectorNum, void *src, u32 n) +{ + u8 i; + u32 result; + + for (i = 0; i < 3; i++) + { + result = ProgramFlashSector(sectorNum, src); + if (result != 0) + continue; + + result = VerifyFlashSectorNBytes(sectorNum, src, n); + if (result == 0) + break; + } + + return result; +} diff --git a/berry_fix/payload/src/agb_flash_1m.c b/berry_fix/payload/src/agb_flash_1m.c new file mode 100644 index 000000000..7f8bdeb5f --- /dev/null +++ b/berry_fix/payload/src/agb_flash_1m.c @@ -0,0 +1,86 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +static const char AgbLibFlashVersion[] = "FLASH1M_V103"; + +const struct FlashSetupInfo * const sSetupInfos[] = +{ + &MX29L010, + &LE26FV10N1TS, + &DefaultFlash +}; + +u32 IdentifyFlash(void) +{ + u16 result; + u16 flashId; + const struct FlashSetupInfo * const *setupInfo; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + flashId = ReadFlashId(); + + setupInfo = sSetupInfos; + result = 1; + + for (;;) + { + if ((*setupInfo)->type.ids.separate.makerId == 0) + break; + + if (flashId == (*setupInfo)->type.ids.joined) + { + result = 0; + break; + } + + setupInfo++; + } + + ProgramFlashByte = (*setupInfo)->programFlashByte; + ProgramFlashSector = (*setupInfo)->programFlashSector; + EraseFlashChip = (*setupInfo)->eraseFlashChip; + EraseFlashSector = (*setupInfo)->eraseFlashSector; + WaitForFlashWrite = (*setupInfo)->WaitForFlashWrite; + gFlashMaxTime = (*setupInfo)->maxTime; + gFlash = &(*setupInfo)->type; + + return result; +} + +u16 WaitForFlashWrite_Common(u8 phase, u8 *addr, u8 lastData) +{ + u16 result = 0; + u8 status; + + StartFlashTimer(phase); + + while ((status = PollFlashStatus(addr)) != lastData) + { + if (status & 0x20) + { + // The write operation exceeded the flash chip's time limit. + + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xA000u; + break; + } + + if (gFlashTimeoutFlag) + { + if (PollFlashStatus(addr) == lastData) + break; + + FLASH_WRITE(0x5555, 0xF0); + result = phase | 0xC000u; + break; + } + } + + StopFlashTimer(); + + return result; +} diff --git a/berry_fix/payload/src/agb_flash_le.c b/berry_fix/payload/src/agb_flash_le.c new file mode 100644 index 000000000..39d956e27 --- /dev/null +++ b/berry_fix/payload/src/agb_flash_le.c @@ -0,0 +1,31 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 leMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo LE26FV10N1TS = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + leMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x62, 0x13 } } // ID + } +}; diff --git a/berry_fix/payload/src/agb_flash_mx.c b/berry_fix/payload/src/agb_flash_mx.c new file mode 100644 index 000000000..68eb00cd8 --- /dev/null +++ b/berry_fix/payload/src/agb_flash_mx.c @@ -0,0 +1,193 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" + +const u16 mxMaxTime[] = +{ + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 10, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, + 2000, 65469, TIMER_ENABLE | TIMER_INTR_ENABLE | TIMER_256CLK, +}; + +const struct FlashSetupInfo MX29L010 = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0xC2, 0x09 } } // ID + } +}; + +const struct FlashSetupInfo DefaultFlash = +{ + ProgramFlashByte_MX, + ProgramFlashSector_MX, + EraseFlashChip_MX, + EraseFlashSector_MX, + WaitForFlashWrite_Common, + mxMaxTime, + { + 131072, // ROM size + { + 4096, // sector size + 12, // bit shift to multiply by sector size (4096 == 1 << 12) + 32, // number of sectors + 0 // appears to be unused + }, + { 3, 1 }, // wait state setup data + { { 0x00, 0x00 } } // ID of 0 + } +}; + +u16 EraseFlashChip_MX(void) +{ + u16 result; + u16 readFlash1Buffer[0x20]; + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x10); + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(3, FLASH_BASE, 0xFF); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 EraseFlashSector_MX(u16 sectorNum) +{ + u16 numTries; + u16 result; + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + numTries = 0; + +try_erase: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0x80); + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + *addr = 0x30; + + SetReadFlash1(readFlash1Buffer); + + result = WaitForFlashWrite(2, addr, 0xFF); + + if (!(result & 0xA000) || numTries > 3) + goto done; + + numTries++; + + goto try_erase; + +done: + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | WAITCNT_SRAM_8; + + return result; +} + +u16 ProgramFlashByte_MX(u16 sectorNum, u32 offset, u8 data) +{ + u8 *addr; + u16 readFlash1Buffer[0x20]; + + if (offset >= gFlash->sector.size) + return 0x8000; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + addr = FLASH_BASE + (sectorNum << gFlash->sector.shift) + offset; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *addr = data; + + return WaitForFlashWrite(1, addr, data); +} + +static u16 ProgramByte(u8 *src, u8 *dest) +{ + FLASH_WRITE(0x5555, 0xAA); + FLASH_WRITE(0x2AAA, 0x55); + FLASH_WRITE(0x5555, 0xA0); + *dest = *src; + + return WaitForFlashWrite(1, dest, *src); +} + +u16 ProgramFlashSector_MX(u16 sectorNum, void *src) +{ + u16 result; + u8 *dest; + u16 readFlash1Buffer[0x20]; + + if (sectorNum >= gFlash->sector.count) + return 0x80FF; + + result = EraseFlashSector_MX(sectorNum); + + if (result != 0) + return result; + + SwitchFlashBank(sectorNum / SECTORS_PER_BANK); + sectorNum %= SECTORS_PER_BANK; + + SetReadFlash1(readFlash1Buffer); + + REG_WAITCNT = (REG_WAITCNT & ~WAITCNT_SRAM_MASK) | gFlash->wait[0]; + + gFlashNumRemainingBytes = gFlash->sector.size; + dest = FLASH_BASE + (sectorNum << gFlash->sector.shift); + + while (gFlashNumRemainingBytes > 0) + { + result = ProgramByte(src, dest); + + if (result != 0) + break; + + gFlashNumRemainingBytes--; + src++; + dest++; + } + + return result; +} diff --git a/berry_fix/payload/src/flash.c b/berry_fix/payload/src/flash.c new file mode 100644 index 000000000..1f09d0b8f --- /dev/null +++ b/berry_fix/payload/src/flash.c @@ -0,0 +1,752 @@ +#include "gba/gba.h" +#include "gba/flash_internal.h" +#include "constants/vars.h" +#include "global.h" +#include "main.h" +#include "flash.h" +#include "rtc.h" + +struct SaveBlockChunk +{ + u8 * data; + u16 size; +}; + +u8 WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1); +u8 WriteSingleChunk(u16 a0, const struct SaveBlockChunk * a1); +u8 TryWriteSector(u8, u8 *); +u8 EraseCurrentChunk(u16 a0, const struct SaveBlockChunk * a1); +u8 TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1); +u8 ReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1); +u8 GetSaveValidStatus(const struct SaveBlockChunk * a1); +u32 DoReadFlashWholeSection(u8 a0, struct SaveSector * a1); +u16 CalculateChecksum(const void *, u16); + +u16 gFirstSaveSector; +u32 gPrevSaveCounter; +u16 gLastKnownGoodSector; +u32 gDamagedSaveSectors; +u32 gSaveCounter; +struct SaveSector * gFastSaveSection; +u16 gCurSaveChunk; +bool32 gFlashIdentIsValid; + +EWRAM_DATA struct SaveBlock2 gSaveBlock2 = {}; +EWRAM_DATA struct SaveBlock1 gSaveBlock1 = {}; +EWRAM_DATA struct PokemonStorage gPokemonStorage = {}; + +// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer +#define SECTOR_DATA_SIZE 3968 +#define SECTOR_FOOTER_SIZE 128 + +#define SAVEBLOCK_CHUNK(structure, chunkNum) \ +{ \ + (u8 *)&structure + chunkNum * SECTOR_DATA_SIZE, \ + min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \ +} \ + +static const struct SaveBlockChunk sSaveBlockChunks[] = +{ + SAVEBLOCK_CHUNK(gSaveBlock2, 0), + + SAVEBLOCK_CHUNK(gSaveBlock1, 0), + SAVEBLOCK_CHUNK(gSaveBlock1, 1), + SAVEBLOCK_CHUNK(gSaveBlock1, 2), + SAVEBLOCK_CHUNK(gSaveBlock1, 3), + + SAVEBLOCK_CHUNK(gPokemonStorage, 0), + SAVEBLOCK_CHUNK(gPokemonStorage, 1), + SAVEBLOCK_CHUNK(gPokemonStorage, 2), + SAVEBLOCK_CHUNK(gPokemonStorage, 3), + SAVEBLOCK_CHUNK(gPokemonStorage, 4), + SAVEBLOCK_CHUNK(gPokemonStorage, 5), + SAVEBLOCK_CHUNK(gPokemonStorage, 6), + SAVEBLOCK_CHUNK(gPokemonStorage, 7), + SAVEBLOCK_CHUNK(gPokemonStorage, 8), +}; + +const u16 gInfoMessagesPal[] = INCBIN_U16("graphics/msg_box.gbapal"); +const u8 gInfoMessagesTilemap[] = INCBIN_U8("graphics/msg_box.tilemap.lz"); +const u8 gInfoMessagesGfx[] = INCBIN_U8("graphics/msg_box.4bpp.lz"); + +bool32 flash_maincb_ident_is_valid(void) +{ + gFlashIdentIsValid = TRUE; + if (!IdentifyFlash()) + { + SetFlashTimerIntr(0, &((IntrFunc *)gIntrFuncPointers)[9]); + return TRUE; + } + gFlashIdentIsValid = FALSE; + return FALSE; +} + +void Call_ReadFlash(u16 sectorNum, ptrdiff_t offset, void * dest, size_t size) +{ + ReadFlash(sectorNum, offset, dest, size); +} + +u8 Call_WriteSaveBlockChunks(u16 a0, const struct SaveBlockChunk * a1) +{ + return WriteSaveBlockChunks(a0, a1); +} + +u8 Call_TryReadAllSaveSectorsCurrentSlot(u16 a0, const struct SaveBlockChunk * a1) +{ + return TryReadAllSaveSectorsCurrentSlot(a0, a1); +} + +u32 * GetDamagedSaveSectorsPtr(void) +{ + return &gDamagedSaveSectors; +} + +s32 flash_write_save_block_chunks(u8 a0) +{ + u8 i; + + switch (a0) + { + case 0: + default: + Call_WriteSaveBlockChunks(0xFFFF, sSaveBlockChunks); + break; + case 1: + for (i = 0; i < 5; i++) + { + Call_WriteSaveBlockChunks(i, sSaveBlockChunks); + } + break; + case 2: + Call_WriteSaveBlockChunks(0, sSaveBlockChunks); + break; + } + + return 0; +} + +u8 flash_write_save_block_chunks_check_damage(u8 a0) +{ + flash_write_save_block_chunks(a0); + if (*GetDamagedSaveSectorsPtr() == 0) + return 1; + return 0xFF; +} + +u8 flash_maincb_read_save(u32 unused) +{ + return Call_TryReadAllSaveSectorsCurrentSlot(0xFFFF, sSaveBlockChunks); +} + +void msg_load_gfx(void) +{ + REG_DISPCNT = 0; + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + REG_BLDCNT = 0; + LZ77UnCompVram(gInfoMessagesGfx, (void *)BG_VRAM); + LZ77UnCompVram(gInfoMessagesTilemap, (void *)BG_SCREEN_ADDR(28)); + CpuCopy16(gInfoMessagesPal, (void *)BG_PLTT, 0x200); + REG_BG0CNT = BGCNT_SCREENBASE(28) | BGCNT_TXT512x512; + REG_DISPCNT = DISPCNT_BG0_ON; +} + +void msg_display(enum MsgBoxUpdateMessage a0) +{ + switch (a0) + { + case MSGBOX_WILL_NOW_UPDATE: + REG_BG0HOFS = 0; + REG_BG0VOFS = 0; + break; + case MSGBOX_HAS_BEEN_UPDATED: + REG_BG0HOFS = 0x100; + REG_BG0VOFS = 0; + break; + case MSGBOX_UNABLE_TO_UPDATE: + REG_BG0HOFS = 0x100; + REG_BG0VOFS = 0xB0; + break; + case MSGBOX_NO_NEED_TO_UPDATE: + REG_BG0HOFS = 0; + REG_BG0VOFS = 0xB0; + break; + case MSGBOX_UPDATING: + REG_BG0HOFS = 0; + REG_BG0VOFS = 0x160; + break; + } +} + +void Save_EraseAllData(void) +{ + u16 i; + for (i = 0; i < 32; i++) + EraseFlashSector(i); +} + +void Save_ResetSaveCounters(void) +{ + gSaveCounter = 0; + gFirstSaveSector = 0; + gDamagedSaveSectors = 0; +} + +bool32 SetSectorDamagedStatus(u8 op, u8 sectorNum) +{ + bool32 retVal = FALSE; + + switch (op) + { + case SECTOR_DAMAGED: + gDamagedSaveSectors |= (1 << sectorNum); + break; + case SECTOR_OK: + gDamagedSaveSectors &= ~(1 << sectorNum); + break; + case SECTOR_CHECK: // unused + if (gDamagedSaveSectors & (1 << sectorNum)) + retVal = TRUE; + break; + } + + return retVal; +} + +u8 WriteSaveBlockChunks(u16 chunkId, const struct SaveBlockChunk *chunks) +{ + u32 retVal; + u16 i; + + gFastSaveSection = eSaveSection; + + if (chunkId != 0xFFFF) // write single chunk + { + retVal = WriteSingleChunk(chunkId, chunks); + } + else // write all chunks + { + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; + gSaveCounter++; + retVal = SAVE_STATUS_OK; + + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) + WriteSingleChunk(i, chunks); + + // Check for any bad sectors + if (gDamagedSaveSectors != 0) // skip the damaged sector. + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + } + + return retVal; +} + +u8 WriteSingleChunk(u16 chunkId, const struct SaveBlockChunk * chunks) +{ + u16 i; + u16 sectorNum; + u8 *chunkData; + u16 chunkSize; + + // select sector number + sectorNum = chunkId + gFirstSaveSector; + sectorNum %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sectorNum += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + chunkData = chunks[chunkId].data; + chunkSize = chunks[chunkId].size; + + // clear save section. + for (i = 0; i < sizeof(struct SaveSector); i++) + ((u8 *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; + gFastSaveSection->counter = gSaveCounter; + for (i = 0; i < chunkSize; i++) + gFastSaveSection->data[i] = chunkData[i]; + gFastSaveSection->checksum = CalculateChecksum(chunkData, chunkSize); + + return TryWriteSector(sectorNum, gFastSaveSection->data); +} + +u8 HandleWriteSectorNBytes(u8 sectorNum, u8 *data, u16 size) +{ + u16 i; + struct SaveSector *section = eSaveSection; + + for (i = 0; i < sizeof(struct SaveSector); i++) + ((char *)section)[i] = 0; + + section->signature = FILE_SIGNATURE; + for (i = 0; i < size; i++) + section->data[i] = data[i]; + section->id = CalculateChecksum(data, size); // though this appears to be incorrect, it might be some sector checksum instead of a whole save checksum and only appears to be relevent to HOF data, if used. + + return TryWriteSector(sectorNum, section->data); +} + +u8 TryWriteSector(u8 sectorNum, u8 *data) +{ + if (ProgramFlashSectorAndVerify(sectorNum, data) != 0) // is damaged? + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sectorNum); // set damaged sector bits. + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sectorNum); // unset damaged sector bits. it's safe now. + return SAVE_STATUS_OK; + } +} + +u32 RestoreSaveBackupVarsAndIncrement(const struct SaveBlockChunk *chunk) // chunk is unused +{ + gFastSaveSection = eSaveSection; + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gFirstSaveSector++; + gFirstSaveSector %= NUM_SECTORS_PER_SAVE_SLOT; + gSaveCounter++; + gCurSaveChunk = 0; + gDamagedSaveSectors = 0; + return 0; +} + +u32 RestoreSaveBackupVars(const struct SaveBlockChunk *chunk) +{ + gFastSaveSection = eSaveSection; + gLastKnownGoodSector = gFirstSaveSector; + gPrevSaveCounter = gSaveCounter; + gCurSaveChunk = 0; + gDamagedSaveSectors = 0; + return 0; +} + +u8 WriteSingleChunkAndIncrement(u16 a1, const struct SaveBlockChunk * chunk) +{ + u8 retVal; + + if (gCurSaveChunk < a1 - 1) + { + retVal = SAVE_STATUS_OK; + WriteSingleChunk(gCurSaveChunk, chunk); + gCurSaveChunk++; + if (gDamagedSaveSectors) + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + } + else + { + retVal = SAVE_STATUS_ERROR; + } + + return retVal; +} + +u8 ErasePreviousChunk(u16 a1, const struct SaveBlockChunk *chunk) +{ + u8 retVal = SAVE_STATUS_OK; + + EraseCurrentChunk(a1 - 1, chunk); + + if (gDamagedSaveSectors) + { + retVal = SAVE_STATUS_ERROR; + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + } + return retVal; +} + +u8 EraseCurrentChunk(u16 chunkId, const struct SaveBlockChunk *chunks) +{ + u16 i; + u16 sector; + u8 *data; + u16 size; + u8 status; + + // select sector number + sector = chunkId + gFirstSaveSector; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + data = chunks[chunkId].data; + size = chunks[chunkId].size; + + // clear temp save section. + for (i = 0; i < sizeof(struct SaveSector); i++) + ((char *)gFastSaveSection)[i] = 0; + + gFastSaveSection->id = chunkId; + gFastSaveSection->signature = FILE_SIGNATURE; + gFastSaveSection->counter = gSaveCounter; + + // set temp section's data. + for (i = 0; i < size; i++) + gFastSaveSection->data[i] = data[i]; + + // calculate checksum. + gFastSaveSection->checksum = CalculateChecksum(data, size); + + EraseFlashSector(sector); + + status = SAVE_STATUS_OK; + + for (i = 0; i < sizeof(struct UnkSaveSection); i++) + { + if (ProgramFlashByte(sector, i, gFastSaveSection->data[i])) + { + status = SAVE_STATUS_ERROR; + break; + } + } + + if (status == SAVE_STATUS_ERROR) + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; + } + else + { + status = SAVE_STATUS_OK; + + for (i = 0; i < 7; i++) + { + if (ProgramFlashByte(sector, 0xFF9 + i, ((u8 *)gFastSaveSection)[0xFF9 + i])) + { + status = SAVE_STATUS_ERROR; + break; + } + } + + if (status == SAVE_STATUS_ERROR) + { + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } + } +} + +u8 WriteSomeFlashByteToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) +{ + u16 sector; + + // select sector number + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + // select save slot + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), ((u8 *)gFastSaveSection)[sizeof(struct UnkSaveSection)])) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } +} + +u8 WriteSomeFlashByte0x25ToPrevSector(u16 a1, const struct SaveBlockChunk *chunk) +{ + u16 sector; + + sector = a1 + gFirstSaveSector - 1; + sector %= NUM_SECTORS_PER_SAVE_SLOT; + sector += NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + + if (ProgramFlashByte(sector, sizeof(struct UnkSaveSection), 0x25)) + { + // sector is damaged, so enable the bit in gDamagedSaveSectors and restore the last written sector and save counter. + SetSectorDamagedStatus(SECTOR_DAMAGED, sector); + gFirstSaveSector = gLastKnownGoodSector; + gSaveCounter = gPrevSaveCounter; + return SAVE_STATUS_ERROR; + } + else + { + SetSectorDamagedStatus(SECTOR_OK, sector); + return SAVE_STATUS_OK; + } +} + +u8 TryReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunk) +{ + u8 retVal; + gFastSaveSection = eSaveSection; + if (a1 != 0xFFFF) + { + retVal = SAVE_STATUS_ERROR; + } + else + { + retVal = GetSaveValidStatus(chunk); + ReadAllSaveSectorsCurrentSlot(0xFFFF, chunk); + } + + return retVal; +} + +u8 ReadAllSaveSectorsCurrentSlot(u16 a1, const struct SaveBlockChunk *chunks) +{ + u16 i; + u16 checksum; + u16 sector = NUM_SECTORS_PER_SAVE_SLOT * (gSaveCounter % 2); + u16 id; + + for (i = 0; i < NUM_SECTORS_PER_SAVE_SLOT; i++) + { + DoReadFlashWholeSection(i + sector, gFastSaveSection); + id = gFastSaveSection->id; + if (id == 0) + gFirstSaveSector = i; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[id].size); + if (gFastSaveSection->signature == FILE_SIGNATURE + && gFastSaveSection->checksum == checksum) + { + u16 j; + for (j = 0; j < chunks[id].size; j++) + chunks[id].data[j] = gFastSaveSection->data[j]; + } + } + + return 1; +} + +u8 GetSaveValidStatus(const struct SaveBlockChunk *chunks) +{ + u16 sector; + bool8 signatureValid; + u16 checksum; + u32 slot1saveCounter = 0; + u32 slot2saveCounter = 0; + u8 slot1Status; + u8 slot2Status; + u32 validSectors; + const u32 ALL_SECTORS = (1 << NUM_SECTORS_PER_SAVE_SLOT) - 1; // bitmask of all saveblock sectors + + // check save slot 1. + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) + { + DoReadFlashWholeSection(sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) + { + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + slot1saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; + } + } + } + + if (signatureValid) + { + if (validSectors == ALL_SECTORS) + slot1Status = SAVE_STATUS_OK; + else + slot1Status = SAVE_STATUS_ERROR; + } + else + { + slot1Status = SAVE_STATUS_EMPTY; + } + + // check save slot 2. + validSectors = 0; + signatureValid = FALSE; + for (sector = 0; sector < NUM_SECTORS_PER_SAVE_SLOT; sector++) + { + DoReadFlashWholeSection(NUM_SECTORS_PER_SAVE_SLOT + sector, gFastSaveSection); + if (gFastSaveSection->signature == FILE_SIGNATURE) + { + signatureValid = TRUE; + checksum = CalculateChecksum(gFastSaveSection->data, chunks[gFastSaveSection->id].size); + if (gFastSaveSection->checksum == checksum) + { + slot2saveCounter = gFastSaveSection->counter; + validSectors |= 1 << gFastSaveSection->id; + } + } + } + + if (signatureValid) + { + if (validSectors == ALL_SECTORS) + slot2Status = SAVE_STATUS_OK; + else + slot2Status = SAVE_STATUS_ERROR; + } + else + { + slot2Status = SAVE_STATUS_EMPTY; + } + + if (slot1Status == SAVE_STATUS_OK && slot2Status == SAVE_STATUS_OK) + { + // Choose counter of the most recent save file + if ((slot1saveCounter == -1 && slot2saveCounter == 0) || (slot1saveCounter == 0 && slot2saveCounter == -1)) + { + if ((unsigned)(slot1saveCounter + 1) < (unsigned)(slot2saveCounter + 1)) + gSaveCounter = slot2saveCounter; + else + gSaveCounter = slot1saveCounter; + } + else + { + if (slot1saveCounter < slot2saveCounter) + gSaveCounter = slot2saveCounter; + else + gSaveCounter = slot1saveCounter; + } + return SAVE_STATUS_OK; + } + + if (slot1Status == SAVE_STATUS_OK) + { + gSaveCounter = slot1saveCounter; + if (slot2Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; + } + + if (slot2Status == SAVE_STATUS_OK) + { + gSaveCounter = slot2saveCounter; + if (slot1Status == SAVE_STATUS_ERROR) + return SAVE_STATUS_ERROR; + else + return SAVE_STATUS_OK; + } + + if (slot1Status == SAVE_STATUS_EMPTY && slot2Status == SAVE_STATUS_EMPTY) + { + gSaveCounter = 0; + gFirstSaveSector = 0; + return SAVE_STATUS_EMPTY; + } + + gSaveCounter = 0; + gFirstSaveSector = 0; + return 2; +} + +u8 ReadSomeUnknownSectorAndVerify(u8 sector, u8 *data, u16 size) +{ + u16 i; + struct SaveSector *section = eSaveSection; + + DoReadFlashWholeSection(sector, section); + if (section->signature == FILE_SIGNATURE) + { + u16 checksum = CalculateChecksum(section->data, size); + if (section->id == checksum) + { + for (i = 0; i < size; i++) + data[i] = section->data[i]; + return SAVE_STATUS_OK; + } + else + { + return 2; + } + } + else + { + return SAVE_STATUS_EMPTY; + } +} + +u32 DoReadFlashWholeSection(u8 sector, struct SaveSector *section) +{ + ReadFlash(sector, 0, section->data, sizeof(struct SaveSector)); + return 1; +} + +u16 CalculateChecksum(const void *data, u16 size) +{ + u16 i; + u32 checksum = 0; + + for (i = 0; i < (size / 4); i++) + { + checksum += *((u32 *)data); + data += sizeof(u32); + } + + return ((checksum >> 16) + checksum); +} + +void nullsub_0201182C() +{ +} + +void nullsub_02011830() +{ +} + +void nullsub_02011834() +{ +} + +u16 * get_var_addr(u16 a0) +{ + if (a0 < VARS_START) + return NULL; + if (a0 < VAR_SPECIAL_0) + return &gSaveBlock1.vars[a0 - VARS_START]; + return NULL; +} + +bool32 flash_maincb_check_need_reset_pacifidlog_tm(void) +{ + u8 sp0; + u16 * data = get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY); + rtc_maincb_is_time_since_last_berry_update_positive(&sp0); + if (*data <= gRtcUTCTime.days) + return TRUE; + else + return FALSE; +} + +bool32 flash_maincb_reset_pacifidlog_tm(void) +{ + u8 sp0; + if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE) + return TRUE; + rtc_maincb_is_time_since_last_berry_update_positive(&sp0); + if (gRtcUTCTime.days < 0) + return FALSE; + *get_var_addr(VAR_PACIFIDLOG_TM_RECEIVED_DAY) = 1; + if (flash_write_save_block_chunks_check_damage(0) != TRUE) + return FALSE; + return TRUE; +} diff --git a/berry_fix/payload/src/main.c b/berry_fix/payload/src/main.c new file mode 100644 index 000000000..325d3830e --- /dev/null +++ b/berry_fix/payload/src/main.c @@ -0,0 +1,289 @@ +#include "gba/gba.h" +#include "global.h" +#include "main.h" +#include "rtc.h" +#include "flash.h" + +static s32 gInitialWaitTimer; +IntrFunc gIntrTable[16]; +u16 gHeldKeys; +u16 gNewKeys; +u8 gIntrVector[0x100]; +u32 gUpdateSuccessful; +u32 gUnknown_3001194; +u32 gUnknown_30011A0[0x19]; +u32 gMainCallbackState; +u32 gGameVersion; + +EWRAM_DATA u8 gSharedMem[0x8000] = {}; + +void IntrMain(void); +void ReadKeys(void); +void dummy_intr_0(void); +void dummy_intr_1(void); +void main_callback(u32 *, void *, void *); + + +const char gBerryFixGameCode[] = "AGBJ"; +const IntrFunc gIntrFuncPointers[] = { + dummy_intr_0, + dummy_intr_1, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + dummy_intr_0, + NULL, + NULL, + NULL +}; +const char gVersionData[][2] = { + {'J', 1}, + {'E', 2}, + {'D', 1}, + {'F', 1}, + {'I', 1}, + {'S', 1} +}; +const char gRubyTitleAndCode[] = "POKEMON RUBYAXV"; +const char gSapphireTitleAndCode[] = "POKEMON SAPPAXP"; +const u16 sDebugPals[20] = { + RGB(00, 00, 00), + RGB(31, 00, 00), + RGB(00, 31, 00), + RGB(00, 00, 31) +}; +const u16 sDebugDigitsGfx[] = INCBIN_U16("graphics/debug_digits.4bpp"); + +void AgbMain(void) +{ + RegisterRamReset(0x1E); + DmaCopy32(3, gIntrFuncPointers, gIntrTable, sizeof gIntrFuncPointers); + DmaCopy32(3, IntrMain, gIntrVector, sizeof(gIntrVector)); + INTR_VECTOR = gIntrVector; + REG_IE = INTR_FLAG_VBLANK; + if (*RomHeaderMagic == 0x96 && *(u32 *)RomHeaderGameCode == *(u32 *)gBerryFixGameCode) + REG_IE |= INTR_FLAG_GAMEPAK; + REG_DISPSTAT = DISPSTAT_VBLANK_INTR; + REG_IME = INTR_FLAG_VBLANK; + msg_load_gfx(); + gMainCallbackState = MAINCB_INIT; + gUnknown_3001194 = 0; + for (;;) + { + VBlankIntrWait(); + ReadKeys(); + main_callback(&gMainCallbackState, gUnknown_30011A0, gSharedMem); + } +} + +void dummy_intr_1(void) +{} + +void dummy_intr_0(void) +{} + +void ReadKeys(void) +{ + u16 keyInput = REG_KEYINPUT ^ KEYS_MASK; + gNewKeys = keyInput & ~gHeldKeys; + gHeldKeys = keyInput; +} + +void fill_palette(const u8 * src, u16 * dest, u8 value) +{ + s32 i; + for (i = 0; src[i] != 0; i++) + dest[i] = src[i] | value << 12; +} + +bool32 berry_fix_memcmp(const char * src1, const char * src2, size_t size) +{ + s32 i; + for (i = 0; i < size; i++) + { + if (src1[i] != src2[i]) + return FALSE; + } + return TRUE; +} + +s32 validate_rom_header_internal(void) +{ + char languageCode = *(RomHeaderGameCode + 3); + s32 softwareVersion = *RomHeaderSoftwareVersion; + s32 shouldUpdate = -1; + s32 i; + for (i = 0; i < ARRAY_COUNT(gVersionData); i++) + { + if (languageCode == gVersionData[i][0]) + { + if (softwareVersion >= gVersionData[i][1]) + { + shouldUpdate = 0; + } + else + { + shouldUpdate = 1; + } + break; + } + } + if (shouldUpdate != -1) + { + if (berry_fix_memcmp(RomHeaderGameTitle, gRubyTitleAndCode, 15) == TRUE) + { + if (shouldUpdate == 0) + return RUBY_NONEED; + else + { + gGameVersion = VERSION_RUBY; + return RUBY_UPDATABLE; + } + } + else if (berry_fix_memcmp(RomHeaderGameTitle, gSapphireTitleAndCode, 15) == TRUE) + { + if (shouldUpdate == 0) + return SAPPHIRE_NONEED; + else + { + gGameVersion = VERSION_SAPPHIRE; + return SAPPHIRE_UPDATABLE; + } + } + } + return INVALID; +} + +s32 validate_rom_header(void) +{ + if (*RomHeaderMakerCode == '0' && *(RomHeaderMakerCode + 1) == '1' && *RomHeaderMagic == 0x96) + return validate_rom_header_internal(); + else + return INVALID; +} + +void main_callback(u32 * state, void * unused1, void * unused2) +{ + u8 year; + switch (*state) + { + case MAINCB_INIT: + msg_display(MSGBOX_WILL_NOW_UPDATE); + if (++gInitialWaitTimer >= 180) + { + gInitialWaitTimer = 0; + gUpdateSuccessful = 0; + switch (validate_rom_header()) + { + case SAPPHIRE_UPDATABLE: + case RUBY_UPDATABLE: // Should Update Ruby + ++(*state); // MAINCB_CHECK_RTC + break; + case INVALID: // Invalid header + *state = MAINCB_ERROR; + break; + case SAPPHIRE_NONEED: // Should not update Sapphire + case RUBY_NONEED: // Should not update Ruby + *state = MAINCB_NO_NEED_TO_FIX; + break; + } + } + break; + case MAINCB_CHECK_RTC: + if (!rtc_maincb_is_rtc_working()) + *state = MAINCB_ERROR; + else + ++(*state); // MAINCB_CHECK_FLASH + break; + case MAINCB_CHECK_FLASH: + if (flash_maincb_ident_is_valid() == TRUE) + ++(*state); // MAINCB_READ_SAVE + else + *state = MAINCB_ERROR; + break; + case MAINCB_READ_SAVE: + if (flash_maincb_read_save(0) == SAVE_STATUS_OK) + ++(*state); // MAINCB_CHECK_TIME + else + *state = MAINCB_ERROR; + break; + case MAINCB_CHECK_TIME: + if (rtc_maincb_is_time_since_last_berry_update_positive(&year) == TRUE) + { + if (year == 0) + ++(*state); // MAINCB_FIX_DATE + else + *state = MAINCB_CHECK_PACIFIDLOG_TM; + } + else + { + if (year != 1) + *state = MAINCB_YEAR_MAKES_NO_SENSE; + else + ++(*state); // MAINCB_FIX_DATE + } + break; + case MAINCB_FIX_DATE: + rtc_maincb_fix_date(); + gUpdateSuccessful |= 1; + *state = MAINCB_CHECK_PACIFIDLOG_TM; + break; + case MAINCB_CHECK_PACIFIDLOG_TM: + if (flash_maincb_check_need_reset_pacifidlog_tm() == TRUE) + *state = MAINCB_FINISHED; + else + *state = MAINCB_FIX_PACIFIDLOG_TM; + break; + case MAINCB_FIX_PACIFIDLOG_TM: + msg_display(MSGBOX_UPDATING); + if (flash_maincb_reset_pacifidlog_tm() == TRUE) + { + gUpdateSuccessful |= 1; + *state = MAINCB_FINISHED; + } + else + *state = MAINCB_ERROR; + break; + case MAINCB_FINISHED: + if (gUpdateSuccessful == 0) + *state = MAINCB_NO_NEED_TO_FIX; + else + msg_display(MSGBOX_HAS_BEEN_UPDATED); + break; + case MAINCB_NO_NEED_TO_FIX: + msg_display(MSGBOX_NO_NEED_TO_UPDATE); + break; + case MAINCB_YEAR_MAKES_NO_SENSE: + msg_display(MSGBOX_UNABLE_TO_UPDATE); + break; + case MAINCB_ERROR: + msg_display(MSGBOX_UNABLE_TO_UPDATE); + break; + } +} + +void DBG_LoadDigitsPal(void) +{ + const u16 * src; + s32 i; + register vu16 * dest asm("r3") = (vu16 *)BG_PLTT + 1; + DmaFill16(3, RGB(31, 31, 31), (vu16 *)BG_PLTT, BG_PLTT_SIZE); + src = sDebugPals; + for (i = 0; i < 4; i++) + { + *dest = *src; + dest += 16; + src++; + } +} + +void DBG_LoadDigits(void) +{ + DmaFill16(3, 0x1111, (void *)VRAM + 0x8420, 0x1800); + DmaCopy32(3, sDebugDigitsGfx, (void *)VRAM + 0x8600, 0x200); + DBG_LoadDigitsPal(); +} diff --git a/berry_fix/payload/src/rtc.c b/berry_fix/payload/src/rtc.c new file mode 100644 index 000000000..e73f522aa --- /dev/null +++ b/berry_fix/payload/src/rtc.c @@ -0,0 +1,346 @@ +#include "gba/gba.h" +#include "siirtc.h" +#include "global.h" +#include "main.h" + +struct Time gTimeSinceBerryUpdate; +struct Time gRtcUTCTime; + +static u16 sRtcProbeStatus; +static struct SiiRtcInfo sRtcInfoBuffer; +static u8 sRtcProbeCode; +static u16 sImeBak; +static struct SiiRtcInfo sRtcInfoWork; + +const struct SiiRtcInfo sDefaultRTC = { + .year = 0, // 2000 + .month = 1, // January + .day = 1, // 01 + .dayOfWeek = 0, + .hour = 0, + .minute = 0, + .second = 0, + .status = 0, + .alarmHour = 0, + .alarmMinute = 0 +}; +const s32 sDaysPerMonth[] = { + 31, + 28, + 31, + 30, + 31, + 30, + 31, + 31, + 30, + 31, + 30, + 31 +}; + +void rtc_get_status_and_datetime(struct SiiRtcInfo *); +u16 rtc_validate_datetime(struct SiiRtcInfo *); + + +void rtc_intr_disable(void) +{ + sImeBak = REG_IME; + REG_IME = 0; +} + +void rtc_intr_enable(void) +{ + REG_IME = sImeBak; +} + +s32 bcd_to_hex(u8 a0) +{ + if (a0 >= 0xa0 || (a0 & 0xF) >= 10) + return 0xFF; + return ((a0 >> 4) & 0xF) * 10 + (a0 & 0xF); +} + +bool8 is_leap_year(u8 year) +{ + if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) + return TRUE; + return FALSE; +} + +u16 rtc_count_days_parameterized(u8 year, u8 month, u8 day) +{ + u16 numDays = 0; + s32 i; + for (i = year - 1; i > 0; i--) + { + numDays += 365; + if (is_leap_year(i) == TRUE) + numDays++; + } + for (i = 0; i < month - 1; i++) + numDays += sDaysPerMonth[i]; + if (month > MONTH_FEB && is_leap_year(year) == TRUE) + numDays++; + numDays += day; + return numDays; +} + +u16 rtc_count_days_from_info(struct SiiRtcInfo *info) +{ + return rtc_count_days_parameterized(bcd_to_hex(info->year), bcd_to_hex(info->month), bcd_to_hex(info->day)); +} + +static void rtc_probe_status(void) +{ + sRtcProbeStatus = 0; + rtc_intr_disable(); + SiiRtcUnprotect(); + sRtcProbeCode = SiiRtcProbe(); + rtc_intr_enable(); + if ((sRtcProbeCode & 0xF) != 1) + sRtcProbeStatus = 1; + else + { + if (sRtcProbeCode & 0xF0) + sRtcProbeStatus = 2; + else + sRtcProbeStatus = 0; + rtc_get_status_and_datetime(&sRtcInfoBuffer); + sRtcProbeStatus = rtc_validate_datetime(&sRtcInfoBuffer); + } +} + +u16 rtc_get_probe_status(void) +{ + return sRtcProbeStatus; +} + +void sub_020106EC(struct SiiRtcInfo * info) +{ + if (sRtcProbeStatus & 0xFF0) + *info = sDefaultRTC; + else + rtc_get_status_and_datetime(info); +} + +void rtc_get_datetime(struct SiiRtcInfo * info) +{ + rtc_intr_disable(); + SiiRtcGetDateTime(info); + rtc_intr_enable(); +} + +void rtc_get_status(struct SiiRtcInfo * info) +{ + rtc_intr_disable(); + SiiRtcGetStatus(info); + rtc_intr_enable(); +} + +void rtc_get_status_and_datetime(struct SiiRtcInfo * info) +{ + rtc_get_status(info); + rtc_get_datetime(info); +} + +u16 rtc_validate_datetime(struct SiiRtcInfo * info) +{ + s32 year, month, day; + u16 r4 = (info->status & SIIRTCINFO_POWER) ? 0x20 : 0; + if (!(info->status & SIIRTCINFO_24HOUR)) + r4 |= 0x10; + year = bcd_to_hex(info->year); + if (year == 0xFF) + r4 |= 0x40; + month = bcd_to_hex(info->month); + if (month == 0xFF || month == 0 || month > 12) + r4 |= 0x80; + day = bcd_to_hex(info->day); + if (day == 0xFF) + r4 |= 0x100; + if (month == MONTH_FEB) + { + if (day > is_leap_year(year) + sDaysPerMonth[1]) + r4 |= 0x100; + } + else + { + if (day > sDaysPerMonth[month - 1]) + r4 |= 0x100; + } + day = bcd_to_hex(info->hour); + if (day > 24) + r4 |= 0x200; + day = bcd_to_hex(info->minute); + if (day > 60) + r4 |= 0x400; + day = bcd_to_hex(info->second); + if (day > 60) + r4 |= 0x800; + return r4; +} + +void rtc_reset(void) +{ + rtc_intr_disable(); + SiiRtcReset(); + rtc_intr_enable(); +} + +void rtc_sub_time_from_datetime(struct SiiRtcInfo * datetime, struct Time * dest, struct Time * timediff) +{ + u16 r4 = rtc_count_days_from_info(datetime); + dest->seconds = bcd_to_hex(datetime->second) - timediff->seconds; + dest->minutes = bcd_to_hex(datetime->minute) - timediff->minutes; + dest->hours = bcd_to_hex(datetime->hour) - timediff->hours; + dest->days = r4 - timediff->days; + if (dest->seconds < 0) + { + dest->seconds += 60; + dest->minutes--; + } + if (dest->minutes < 0) + { + dest->minutes += 60; + dest->hours--; + } + if (dest->hours < 0) + { + dest->hours += 24; + dest->days--; + } +} + +void rtc_sub_time_from_time(struct Time * dest, struct Time * diff, struct Time * src) +{ + dest->seconds = src->seconds - diff->seconds; + dest->minutes = src->minutes - diff->minutes; + dest->hours = src->hours - diff->hours; + dest->days = src->days - diff->days; + if (dest->seconds < 0) + { + dest->seconds += 60; + dest->minutes--; + } + if (dest->minutes < 0) + { + dest->minutes += 60; + dest->hours--; + } + if (dest->hours < 0) + { + dest->hours += 24; + dest->days--; + } +} + +bool32 rtc_maincb_is_rtc_working(void) +{ + rtc_probe_status(); + if (rtc_get_probe_status() & 0xFF0) + return FALSE; + return TRUE; +} + +void rtc_set_datetime(struct SiiRtcInfo * info) +{ + vu16 imeBak = REG_IME; + REG_IME = 0; + SiiRtcSetDateTime(info); + REG_IME = imeBak; +} + +bool32 rtc_maincb_is_time_since_last_berry_update_positive(u8 * a0) +{ + rtc_get_status_and_datetime(&sRtcInfoWork); + *a0 = bcd_to_hex(sRtcInfoWork.year); + rtc_sub_time_from_datetime(&sRtcInfoWork, &gRtcUTCTime, LocalTimeOffset); + rtc_sub_time_from_time(&gTimeSinceBerryUpdate, LastBerryTreeUpdate, &gRtcUTCTime); + if (gTimeSinceBerryUpdate.days * 1440 + gTimeSinceBerryUpdate.hours * 60 + gTimeSinceBerryUpdate.minutes >= 0) + return TRUE; + return FALSE; +} + +u32 hex_to_bcd(u8 a0) +{ + u32 r4; + if (a0 > 99) + return 0xFF; + r4 = Div(a0, 10) << 4; + r4 |= Mod(a0, 10); + return r4; +} + +void sii_rtc_inc(u8 * a0) +{ + *a0 = hex_to_bcd(bcd_to_hex(*a0) + 1); +} + +void sii_rtc_inc_month(struct SiiRtcInfo * a0) +{ + sii_rtc_inc(&a0->month); + if (bcd_to_hex(a0->month) > 12) + { + sii_rtc_inc(&a0->year); + a0->month = MONTH_JAN; + } +} + +void sii_rtc_inc_day(struct SiiRtcInfo * a0) +{ + sii_rtc_inc(&a0->day); + if (bcd_to_hex(a0->day) > sDaysPerMonth[bcd_to_hex(a0->month) - 1]) + { + if (!is_leap_year(bcd_to_hex(a0->year)) || bcd_to_hex(a0->month) != MONTH_FEB || bcd_to_hex(a0->day) != 29) + { + a0->day = 1; + sii_rtc_inc_month(a0); + } + } +} + +bool32 rtc_is_past_feb_28_2000(struct SiiRtcInfo * a0) +{ + if (bcd_to_hex(a0->year) == 0) + { + if (bcd_to_hex(a0->month) == MONTH_JAN) + return FALSE; + if (bcd_to_hex(a0->month) > MONTH_FEB) + return TRUE; + if (bcd_to_hex(a0->day) == 29) + return TRUE; + return FALSE; + } + if (bcd_to_hex(a0->year) == 1) + return TRUE; + return FALSE; +} + +void rtc_maincb_fix_date(void) +{ + rtc_get_status_and_datetime(&sRtcInfoWork); + if (bcd_to_hex(sRtcInfoWork.year) == 0 || bcd_to_hex(sRtcInfoWork.year) == 1) + { + if (bcd_to_hex(sRtcInfoWork.year) == 1) + { + sRtcInfoWork.year = 2; + sRtcInfoWork.month = MONTH_JAN; + sRtcInfoWork.day = 2; + rtc_set_datetime(&sRtcInfoWork); + } + else + { + if (rtc_is_past_feb_28_2000(&sRtcInfoWork) == TRUE) + { + sii_rtc_inc_day(&sRtcInfoWork); + sii_rtc_inc(&sRtcInfoWork.year); + } + else + { + sii_rtc_inc(&sRtcInfoWork.year); + } + rtc_set_datetime(&sRtcInfoWork); + } + } +} diff --git a/berry_fix/payload/src/siirtc.c b/berry_fix/payload/src/siirtc.c new file mode 100644 index 000000000..965a068f1 --- /dev/null +++ b/berry_fix/payload/src/siirtc.c @@ -0,0 +1,432 @@ +// Ruby/Sapphire/Emerald cartridges contain a Seiko Instruments Inc. (SII) +// S-3511A real-time clock (RTC). This library ("SIIRTC_V001") is for +// communicating with the RTC. + +#include "gba/gba.h" +#include "siirtc.h" + +#define STATUS_INTFE 0x02 // frequency interrupt enable +#define STATUS_INTME 0x08 // per-minute interrupt enable +#define STATUS_INTAE 0x20 // alarm interrupt enable +#define STATUS_24HOUR 0x40 // 0: 12-hour mode, 1: 24-hour mode +#define STATUS_POWER 0x80 // power on or power failure occurred + +#define TEST_MODE 0x80 // flag in the "second" byte + +#define ALARM_AM 0x00 +#define ALARM_PM 0x80 + +#define OFFSET_YEAR offsetof(struct SiiRtcInfo, year) +#define OFFSET_MONTH offsetof(struct SiiRtcInfo, month) +#define OFFSET_DAY offsetof(struct SiiRtcInfo, day) +#define OFFSET_DAY_OF_WEEK offsetof(struct SiiRtcInfo, dayOfWeek) +#define OFFSET_HOUR offsetof(struct SiiRtcInfo, hour) +#define OFFSET_MINUTE offsetof(struct SiiRtcInfo, minute) +#define OFFSET_SECOND offsetof(struct SiiRtcInfo, second) +#define OFFSET_STATUS offsetof(struct SiiRtcInfo, status) +#define OFFSET_ALARM_HOUR offsetof(struct SiiRtcInfo, alarmHour) +#define OFFSET_ALARM_MINUTE offsetof(struct SiiRtcInfo, alarmMinute) + +#define INFO_BUF(info, index) (*((u8 *)(info) + (index))) + +#define DATETIME_BUF(info, index) INFO_BUF(info, OFFSET_YEAR + index) +#define DATETIME_BUF_LEN (OFFSET_SECOND - OFFSET_YEAR + 1) + +#define TIME_BUF(info, index) INFO_BUF(info, OFFSET_HOUR + index) +#define TIME_BUF_LEN (OFFSET_SECOND - OFFSET_HOUR + 1) + +#define WR 0 // command for writing data +#define RD 1 // command for reading data + +#define CMD(n) (0x60 | (n << 1)) + +#define CMD_RESET CMD(0) +#define CMD_STATUS CMD(1) +#define CMD_DATETIME CMD(2) +#define CMD_TIME CMD(3) +#define CMD_ALARM CMD(4) + +#define GPIO_PORT_DATA (*(vu16 *)0x80000C4) +#define GPIO_PORT_DIRECTION (*(vu16 *)0x80000C6) +#define GPIO_PORT_READ_ENABLE (*(vu16 *)0x80000C8) + +extern vu16 GPIOPortDirection; + +static u16 sDummy; // unused variable +static bool8 sLocked; + +static int WriteCommand(u8 value); +static int WriteData(u8 value); +static u8 ReadData(); +static void EnableGpioPortRead(); +static void DisableGpioPortRead(); + +static const char AgbLibRtcVersion[] = "SIIRTC_V001"; + +void SiiRtcUnprotect() +{ + EnableGpioPortRead(); + sLocked = FALSE; +} + +void SiiRtcProtect() +{ + DisableGpioPortRead(); + sLocked = TRUE; +} + +u8 SiiRtcProbe() +{ + u8 errorCode; + struct SiiRtcInfo rtc; + + if (!SiiRtcGetStatus(&rtc)) + return 0; + + errorCode = 0; + + if ((rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == SIIRTCINFO_POWER + || (rtc.status & (SIIRTCINFO_POWER | SIIRTCINFO_24HOUR)) == 0) + { + // The RTC is in 12-hour mode. Reset it and switch to 24-hour mode. + + // Note that the conditions are redundant and equivalent to simply + // "(rtc.status & SIIRTCINFO_24HOUR) == 0". It's possible that this + // was also intended to handle resetting the clock after power failure + // but a mistake was made. + + if (!SiiRtcReset()) + return 0; + + errorCode++; + } + + SiiRtcGetTime(&rtc); + + if (rtc.second & TEST_MODE) + { + // The RTC is in test mode. Reset it to leave test mode. + + if (!SiiRtcReset()) + return (errorCode << 4) & 0xF0; + + errorCode++; + } + + return (errorCode << 4) | 1; +} + +bool8 SiiRtcReset() +{ + u8 result; + struct SiiRtcInfo rtc; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_RESET | WR); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + rtc.status = SIIRTCINFO_24HOUR; + + result = SiiRtcSetStatus(&rtc); + + return result; +} + +bool8 SiiRtcGetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | RD); + + GPIO_PORT_DIRECTION = 5; + + statusData = ReadData(); + + rtc->status = (statusData & (STATUS_POWER | STATUS_24HOUR)) + | ((statusData & STATUS_INTAE) >> 3) + | ((statusData & STATUS_INTME) >> 2) + | ((statusData & STATUS_INTFE) >> 1); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetStatus(struct SiiRtcInfo *rtc) +{ + u8 statusData; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + statusData = STATUS_24HOUR + | ((rtc->status & SIIRTCINFO_INTAE) << 3) + | ((rtc->status & SIIRTCINFO_INTME) << 2) + | ((rtc->status & SIIRTCINFO_INTFE) << 1); + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_STATUS | WR); + + WriteData(statusData); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < DATETIME_BUF_LEN; i++) + DATETIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetDateTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_DATETIME | WR); + + for (i = 0; i < DATETIME_BUF_LEN; i++) + WriteData(DATETIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcGetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | RD); + + GPIO_PORT_DIRECTION = 5; + + for (i = 0; i < TIME_BUF_LEN; i++) + TIME_BUF(rtc, i) = ReadData(); + + INFO_BUF(rtc, OFFSET_HOUR) &= 0x7F; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetTime(struct SiiRtcInfo *rtc) +{ + u8 i; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIO_PORT_DIRECTION = 7; + + WriteCommand(CMD_TIME | WR); + + for (i = 0; i < TIME_BUF_LEN; i++) + WriteData(TIME_BUF(rtc, i)); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +bool8 SiiRtcSetAlarm(struct SiiRtcInfo *rtc) +{ + u8 i; + u8 alarmData[2]; + + if (sLocked == TRUE) + return FALSE; + + sLocked = TRUE; + + // Decode BCD. + alarmData[0] = (rtc->alarmHour & 0xF) + 10 * ((rtc->alarmHour >> 4) & 0xF); + + // The AM/PM flag must be set correctly even in 24-hour mode. + + if (alarmData[0] < 12) + alarmData[0] = rtc->alarmHour | ALARM_AM; + else + alarmData[0] = rtc->alarmHour | ALARM_PM; + + alarmData[1] = rtc->alarmMinute; + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 5; + + GPIOPortDirection = 7; // Why is this the only instance that uses a symbol? + + WriteCommand(CMD_ALARM | WR); + + for (i = 0; i < 2; i++) + WriteData(alarmData[i]); + + GPIO_PORT_DATA = 1; + GPIO_PORT_DATA = 1; + + sLocked = FALSE; + + return TRUE; +} + +static int WriteCommand(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> (7 - i)) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static int WriteData(u8 value) +{ + u8 i; + u8 temp; + + for (i = 0; i < 8; i++) + { + temp = ((value >> i) & 1); + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 4; + GPIO_PORT_DATA = (temp << 1) | 5; + } + + // control reaches end of non-void function +} + +static u8 ReadData() +{ + u8 i; + u8 temp; + u8 value; + + for (i = 0; i < 8; i++) + { + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 4; + GPIO_PORT_DATA = 5; + + temp = ((GPIO_PORT_DATA & 2) >> 1); + value = (value >> 1) | (temp << 7); // UB: accessing uninitialized var + } + + return value; +} + +static void EnableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 1; +} + +static void DisableGpioPortRead() +{ + GPIO_PORT_READ_ENABLE = 0; +} diff --git a/berry_fix/payload/sym_bss.txt b/berry_fix/payload/sym_bss.txt new file mode 100644 index 000000000..3b1c62ae9 --- /dev/null +++ b/berry_fix/payload/sym_bss.txt @@ -0,0 +1,5 @@ + .include "src/main.o" + .include "src/rtc.o" + .include "src/flash.o" + .include "src/agb_flash.o" + .include "src/siirtc.o" diff --git a/berry_fix/payload/sym_common.txt b/berry_fix/payload/sym_common.txt new file mode 100644 index 000000000..28b47f52e --- /dev/null +++ b/berry_fix/payload/sym_common.txt @@ -0,0 +1,29 @@ + .include "main.o" + .include "rtc.o" + + .align 4 +gFirstSaveSector: @ 0x03001220 + .space 0x4 + +gPrevSaveCounter: @ 0x03001224 + .space 0x4 + +gLastKnownGoodSector: @ 0x03001228 + .space 0x4 + +gDamagedSaveSectors: @ 0x0300122C + .space 0x4 + +gSaveCounter: @ 0x03001230 + .space 0x4 + +gFastSaveSection: @ 0x03001234 + .space 0x4 + +gCurSaveChunk: + .space 0x4 + +gFlashIdentIsValid: @ 0x0300123C + .space 0x4 + + .include "agb_flash.o" diff --git a/berry_fix/payload/sym_ewram.txt b/berry_fix/payload/sym_ewram.txt new file mode 100644 index 000000000..2c61f5e7e --- /dev/null +++ b/berry_fix/payload/sym_ewram.txt @@ -0,0 +1,3 @@ + .include "src/main.o" + .include "src/rtc.o" + .include "src/flash.o" diff --git a/berry_fix/rom.sha1 b/berry_fix/rom.sha1 new file mode 100644 index 000000000..145b083b2 --- /dev/null +++ b/berry_fix/rom.sha1 @@ -0,0 +1 @@ +2eb0a94a913bebfb4cb59ceb57f3f965da55ef6d berry_fix.gba diff --git a/data/berry_fix.mb b/data/berry_fix.mb deleted file mode 100644 index 0afff07f5..000000000 Binary files a/data/berry_fix.mb and /dev/null differ diff --git a/data/multiboot_berry_glitch_fix.s b/data/multiboot_berry_glitch_fix.s index c77fc2c5e..57757090a 100644 --- a/data/multiboot_berry_glitch_fix.s +++ b/data/multiboot_berry_glitch_fix.s @@ -1,5 +1,5 @@ .section .rodata gMultiBootProgram_BerryGlitchFix_Start:: @ 89A6550 - .incbin "data/berry_fix.mb" + .incbin "berry_fix/berry_fix.gba" gMultiBootProgram_BerryGlitchFix_End:: @ 89AA144 diff --git a/tools/gbagfx/Makefile b/tools/gbagfx/Makefile index d9c219587..f0638414d 100644 --- a/tools/gbagfx/Makefile +++ b/tools/gbagfx/Makefile @@ -1,16 +1,19 @@ -CC ?= gcc +CC = gcc -CFLAGS = -Wall -Wextra -Werror -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK +CFLAGS = -Wall -Wextra -Werror -Wno-sign-compare -std=c11 -O2 -DPNG_SKIP_SETJMP_CHECK LIBS = -lpng -lz -SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c +SRCS = main.c convert_png.c gfx.c jasc_pal.c lz.c rl.c util.c font.c huff.c .PHONY: all clean all: gbagfx @: +gbagfx-debug: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h + $(CC) $(CFLAGS) -DDEBUG $(SRCS) -o $@ $(LDFLAGS) $(LIBS) + gbagfx: $(SRCS) convert_png.h gfx.h global.h jasc_pal.h lz.h rl.h util.h font.h $(CC) $(CFLAGS) $(SRCS) -o $@ $(LDFLAGS) $(LIBS) diff --git a/tools/gbagfx/huff.c b/tools/gbagfx/huff.c new file mode 100644 index 000000000..143ed79be --- /dev/null +++ b/tools/gbagfx/huff.c @@ -0,0 +1,398 @@ +#include +#include +#include +#include +#include +#include "global.h" +#include "huff.h" + +static int cmp_tree(const void * a0, const void * b0) { + return ((struct HuffData *)a0)->value - ((struct HuffData *)b0)->value; +} + +typedef int (*cmpfun)(const void *, const void *); + +int msort_r(void * data, size_t count, size_t size, cmpfun cmp, void * buffer) { + /* + * Out-of-place mergesort (stable sort) + * Returns 1 on success, 0 on failure + */ + void * leftPtr; + void * rightPtr; + void * leftEnd; + void * rightEnd; + int i; + + switch (count) { + case 0: + // Should never be here + return 0; + + case 1: + // Nothing to do here + break; + + case 2: + // Swap the two entries if the right one compares higher. + if (cmp(data, data + size) > 0) { + memcpy(buffer, data, size); + memcpy(data, data + size, size); + memcpy(data + size, buffer, size); + } + break; + default: + // Merge sort out-of-place. + leftPtr = data; + leftEnd = rightPtr = data + count / 2 * size; + rightEnd = data + count * size; + + // Sort the left half + if (!msort_r(leftPtr, count / 2, size, cmp, buffer)) + return 0; + + // Sort the right half + if (!msort_r(rightPtr, count / 2 + (count & 1), size, cmp, buffer)) + return 0; + + // Merge the sorted halves out of place + i = 0; + do { + if (cmp(leftPtr, rightPtr) <= 0) { + memcpy(buffer + i * size, leftPtr, size); + leftPtr += size; + } else { + memcpy(buffer + i * size, rightPtr, size); + rightPtr += size; + } + + } while (++i < count && leftPtr < leftEnd && rightPtr < rightEnd); + + // Copy the remainder + if (i < count) { + if (leftPtr < leftEnd) { + memcpy(buffer + i * size, leftPtr, leftEnd - leftPtr); + } + else { + memcpy(buffer + i * size, rightPtr, rightEnd - rightPtr); + } + } + + // Copy the merged data back + memcpy(data, buffer, count * size); + break; + } + + return 1; +} + +int msort(void * data, size_t count, size_t size, cmpfun cmp) { + void * buffer = malloc(count * size); + if (buffer == NULL) return 0; + int result = msort_r(data, count, size, cmp, buffer); + free(buffer); + return result; +} + +static void write_tree(unsigned char * dest, HuffNode_t * tree, int nitems, struct BitEncoding * encoding) { + /* + * The example used to guide this function encodes the tree in a + * breadth-first manner. We attempt to emulate that here. + */ + + int i, j, k; + + // There are (2 * nitems - 1) nodes in the binary tree. Allocate that. + HuffNode_t * traversal = calloc(2 * nitems - 1, sizeof(HuffNode_t)); + if (traversal == NULL) + FATAL_ERROR("Fatal error while compressing Huff file.\n"); + + // The first node is the root of the tree. + traversal[0] = *tree; + i = 1; + + // Copy the tree into a breadth-first ordering using brute force. + for (int depth = 1; i < 2 * nitems - 1; depth++) { + // Consider every possible path up to the current depth. + for (j = 0; i < 2 * nitems - 1 && j < 1 << depth; j++) { + // The index of the path is used to encode the path itself. + // Start from the most significant relevant bit and work our way down. + // Keep track of the current and previous nodes. + HuffNode_t * currNode = traversal; + HuffNode_t * parent = NULL; + for (k = 0; k < depth; k++) { + if (currNode->header.isLeaf) + break; + parent = currNode; + if ((j >> (depth - k - 1)) & 1) + currNode = currNode->branch.right; + else + currNode = currNode->branch.left; + } + // Check that the length of the current path equals the current depth. + if (k == depth) { + // Make sure we can encode the current branch. + // Bail here if we cannot. + // This is only applicable for 8-bit encodings. + if (traversal + i - parent > 128) + FATAL_ERROR("Fatal error while compressing Huff file: unable to encode binary tree.\n"); + // Copy the current node, and update its parent. + traversal[i] = *currNode; + if (parent != NULL) { + if ((j & 1) == 1) + parent->branch.right = traversal + i; + else + parent->branch.left = traversal + i; + } + // Encode the path through the tree in the lookup table + if (traversal[i].header.isLeaf) { + encoding[traversal[i].leaf.key].nbits = depth; + encoding[traversal[i].leaf.key].bitstring = j; + } + i++; + } + } + } + + // Encode the size of the tree. + // This is used by the decompressor to skip the tree. + dest[4] = nitems - 1; + + // Encode each node in the tree. + for (i = 0; i < 2 * nitems - 1; i++) { + HuffNode_t * currNode = traversal + i; + if (currNode->header.isLeaf) { + dest[5 + i] = traversal[i].leaf.key; + } else { + dest[5 + i] = (((currNode->branch.right - traversal - i) / 2) - 1); + if (currNode->branch.left->header.isLeaf) + dest[5 + i] |= 0x80; + if (currNode->branch.right->header.isLeaf) + dest[5 + i] |= 0x40; + } + } + + free(traversal); +} + +static inline void write_32_le(unsigned char * dest, int * destPos, uint32_t * buff, int * buffPos) { + dest[*destPos] = *buff; + dest[*destPos + 1] = *buff >> 8; + dest[*destPos + 2] = *buff >> 16; + dest[*destPos + 3] = *buff >> 24; + *destPos += 4; + *buff = 0; + *buffPos = 0; +} + +static inline void read_32_le(unsigned char * src, int * srcPos, uint32_t * buff) { + uint32_t tmp = src[*srcPos]; + tmp |= src[*srcPos + 1] << 8; + tmp |= src[*srcPos + 2] << 16; + tmp |= src[*srcPos + 3] << 24; + *srcPos += 4; + *buff = tmp; +} + +static void write_bits(unsigned char * dest, int * destPos, struct BitEncoding * encoding, int value, uint32_t * buff, int * buffBits) { + int nbits = encoding[value].nbits; + uint32_t bitstring = encoding[value].bitstring; + + if (*buffBits + nbits >= 32) { + int diff = *buffBits + nbits - 32; + *buff <<= nbits - diff; + *buff |= bitstring >> diff; + bitstring &= ~(1 << diff); + nbits = diff; + write_32_le(dest, destPos, buff, buffBits); + } + if (nbits != 0) { + *buff <<= nbits; + *buff |= bitstring; + *buffBits += nbits; + } +} + +/* +======================================= +MAIN COMPRESSION/DECOMPRESSION ROUTINES +======================================= + */ + +unsigned char * HuffCompress(unsigned char * src, int srcSize, int * compressedSize_p, int bitDepth) { + if (srcSize <= 0) + goto fail; + + int worstCaseDestSize = 4 + (2 << bitDepth) + srcSize * 3; + + unsigned char *dest = malloc(worstCaseDestSize); + if (dest == NULL) + goto fail; + + int nitems = 1 << bitDepth; + + HuffNode_t * freqs = calloc(nitems, sizeof(HuffNode_t)); + if (freqs == NULL) + goto fail; + + struct BitEncoding * encoding = calloc(nitems, sizeof(struct BitEncoding)); + if (encoding == NULL) + goto fail; + + // Set up the frequencies table. This will inform the tree. + for (int i = 0; i < nitems; i++) { + freqs[i].header.isLeaf = 1; + freqs[i].header.value = 0; + freqs[i].leaf.key = i; + } + + // Count each nybble or byte. + for (int i = 0; i < srcSize; i++) { + if (bitDepth == 8) { + freqs[src[i]].header.value++; + } else { + freqs[src[i] >> 4].header.value++; + freqs[src[i] & 0xF].header.value++; + } + } + +#ifdef DEBUG + for (int i = 0; i < nitems; i++) { + fprintf(stderr, "%d: %d\n", i, freqs[i].header.value); + } +#endif // DEBUG + + // Sort the frequency table. + if (!msort(freqs, nitems, sizeof(HuffNode_t), cmp_tree)) + goto fail; + + // Prune zero-frequency values. + for (int i = 0; i < nitems; i++) { + if (freqs[i].header.value != 0) { + if (i > 0) { + for (int j = i; j < nitems; j++) { + freqs[j - i] = freqs[j]; + } + nitems -= i; + } + break; + } + // This should never happen: + if (i == nitems - 1) + goto fail; + } + + HuffNode_t * tree = calloc(nitems * 2 - 1, sizeof(HuffNode_t)); + if (tree == NULL) + goto fail; + + // Iteratively collapse the two least frequent nodes. + HuffNode_t * endptr = freqs + nitems - 2; + + for (int i = 0; i < nitems - 1; i++) { + HuffNode_t * left = freqs; + HuffNode_t * right = freqs + 1; + tree[i * 2] = *right; + tree[i * 2 + 1] = *left; + for (int j = 0; j < nitems - i - 2; j++) + freqs[j] = freqs[j + 2]; + endptr->header.isLeaf = 0; + endptr->header.value = tree[i * 2].header.value + tree[i * 2 + 1].header.value; + endptr->branch.left = tree + i * 2; + endptr->branch.right = tree + i * 2 + 1; + endptr--; + if (i < nitems - 2 && !msort(freqs, nitems - i - 1, sizeof(HuffNode_t), cmp_tree)) + goto fail; + } + + // Write the tree breadth-first, and create the path lookup table. + write_tree(dest, freqs, nitems, encoding); + + free(tree); + free(freqs); + + // Encode the data itself. + int destPos = 4 + nitems * 2; + uint32_t destBuf = 0; + uint32_t srcBuf = 0; + int destBitPos = 0; + + for (int srcPos = 0; srcPos < srcSize;) { + read_32_le(src, &srcPos, &srcBuf); + for (int i = 0; i < 32 / bitDepth; i++) { + write_bits(dest, &destPos, encoding, srcBuf & (0xFF >> (8 - bitDepth)), &destBuf, &destBitPos); + srcBuf >>= bitDepth; + } + } + + if (destBitPos != 0) { + write_32_le(dest, &destPos, &destBuf, &destBitPos); + } + + free(encoding); + + // Write the header. + dest[0] = bitDepth | 0x20; + dest[1] = srcSize; + dest[2] = srcSize >> 8; + dest[3] = srcSize >> 16; + *compressedSize_p = (destPos + 3) & ~3; + return dest; + +fail: + FATAL_ERROR("Fatal error while compressing Huff file.\n"); +} + +unsigned char * HuffDecompress(unsigned char * src, int srcSize, int * uncompressedSize_p) { + if (srcSize < 4) + goto fail; + + int bitDepth = *src & 15; + if (bitDepth != 4 && bitDepth != 8) + goto fail; + + int destSize = (src[3] << 16) | (src[2] << 8) | src[1]; + + unsigned char *dest = malloc(destSize); + + if (dest == NULL) + goto fail; + + int treePos = 5; + int treeSize = (src[4] + 1) * 2; + int srcPos = 4 + treeSize; + int destPos = 0; + int curValPos = 0; + uint32_t destTmp = 0; + uint32_t window; + + for (;;) + { + if (srcPos >= srcSize) + goto fail; + read_32_le(src, &srcPos, &window); + for (int i = 0; i < 32; i++) { + int curBit = (window >> 31) & 1; + unsigned char treeView = src[treePos]; + bool isLeaf = ((treeView << curBit) & 0x80) != 0; + treePos &= ~1; // align + treePos += ((treeView & 0x3F) + 1) * 2 + curBit; + if (isLeaf) { + destTmp >>= bitDepth; + destTmp |= (src[treePos] << (32 - bitDepth)); + curValPos++; + if (curValPos == 32 / bitDepth) { + write_32_le(dest, &destPos, &destTmp, &curValPos); + if (destPos == destSize) { + *uncompressedSize_p = destSize; + return dest; + } + } + treePos = 5; + } + window <<= 1; + } + } + +fail: + FATAL_ERROR("Fatal error while decompressing Huff file.\n"); +} diff --git a/tools/gbagfx/huff.h b/tools/gbagfx/huff.h new file mode 100644 index 000000000..6002fe954 --- /dev/null +++ b/tools/gbagfx/huff.h @@ -0,0 +1,38 @@ +#ifndef HUFF_H +#define HUFF_H + +union HuffNode; + +struct HuffData { + unsigned value:31; + unsigned isLeaf:1; +}; + +struct HuffLeaf { + struct HuffData header; + unsigned char key; +}; + +struct HuffBranch { + struct HuffData header; + union HuffNode * left; + union HuffNode * right; +}; + +union HuffNode { + struct HuffData header; + struct HuffLeaf leaf; + struct HuffBranch branch; +}; + +typedef union HuffNode HuffNode_t; + +struct BitEncoding { + unsigned long long nbits:6; + unsigned long long bitstring:58; +}; + +unsigned char * HuffCompress(unsigned char * buffer, int srcSize, int * compressedSize_p, int bitDepth); +unsigned char * HuffDecompress(unsigned char * buffer, int srcSize, int * uncompressedSize_p); + +#endif //HUFF_H diff --git a/tools/gbagfx/lz.c b/tools/gbagfx/lz.c index c2ba3e327..97434ce50 100644 --- a/tools/gbagfx/lz.c +++ b/tools/gbagfx/lz.c @@ -69,10 +69,8 @@ fail: FATAL_ERROR("Fatal error while decompressing LZ file.\n"); } -unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize) +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance) { - const int minDistance = 2; // for compatibility with LZ77UnCompVram() - if (srcSize <= 0) goto fail; diff --git a/tools/gbagfx/lz.h b/tools/gbagfx/lz.h index 164d62279..90f56b643 100644 --- a/tools/gbagfx/lz.h +++ b/tools/gbagfx/lz.h @@ -4,6 +4,6 @@ #define LZ_H unsigned char *LZDecompress(unsigned char *src, int srcSize, int *uncompressedSize); -unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize); +unsigned char *LZCompress(unsigned char *src, int srcSize, int *compressedSize, const int minDistance); #endif // LZ_H diff --git a/tools/gbagfx/main.c b/tools/gbagfx/main.c index 86b0afa53..aa0681fb6 100644 --- a/tools/gbagfx/main.c +++ b/tools/gbagfx/main.c @@ -12,6 +12,7 @@ #include "lz.h" #include "rl.h" #include "font.h" +#include "huff.h" struct CommandHandler { @@ -319,6 +320,7 @@ void HandlePngToFullwidthJapaneseFontCommand(char *inputPath, char *outputPath, void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) { int overflowSize = 0; + int minDistance = 2; // default, for compatibility with LZ77UnCompVram() for (int i = 3; i < argc; i++) { @@ -337,6 +339,19 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char * if (overflowSize < 1) FATAL_ERROR("Overflow size must be positive.\n"); } + else if (strcmp(option, "-search") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No size following \"-overflow\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &minDistance)) + FATAL_ERROR("Failed to parse LZ min search distance.\n"); + + if (minDistance < 1) + FATAL_ERROR("LZ min search distance must be positive.\n"); + } else { FATAL_ERROR("Unrecognized option \"%s\".\n", option); @@ -353,7 +368,7 @@ void HandleLZCompressCommand(char *inputPath, char *outputPath, int argc, char * unsigned char *buffer = ReadWholeFileZeroPadded(inputPath, &fileSize, overflowSize); int compressedSize; - unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize); + unsigned char *compressedData = LZCompress(buffer, fileSize + overflowSize, &compressedSize, minDistance); compressedData[1] = (unsigned char)fileSize; compressedData[2] = (unsigned char)(fileSize >> 8); @@ -411,6 +426,61 @@ void HandleRLDecompressCommand(char *inputPath, char *outputPath, int argc UNUSE free(uncompressedData); } +void HandleHuffCompressCommand(char *inputPath, char *outputPath, int argc, char **argv) +{ + int fileSize; + int bitDepth = 4; + + for (int i = 3; i < argc; i++) + { + char *option = argv[i]; + + if (strcmp(option, "-depth") == 0) + { + if (i + 1 >= argc) + FATAL_ERROR("No size following \"-depth\".\n"); + + i++; + + if (!ParseNumber(argv[i], NULL, 10, &bitDepth)) + FATAL_ERROR("Failed to parse bit depth.\n"); + + if (bitDepth != 4 && bitDepth != 8) + FATAL_ERROR("GBA only supports bit depth of 4 or 8.\n"); + } + else + { + FATAL_ERROR("Unrecognized option \"%s\".\n", option); + } + } + + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int compressedSize; + unsigned char *compressedData = HuffCompress(buffer, fileSize, &compressedSize, bitDepth); + + free(buffer); + + WriteWholeFile(outputPath, compressedData, compressedSize); + + free(compressedData); +} + +void HandleHuffDecompressCommand(char *inputPath, char *outputPath, int argc UNUSED, char **argv UNUSED) +{ + int fileSize; + unsigned char *buffer = ReadWholeFile(inputPath, &fileSize); + + int uncompressedSize; + unsigned char *uncompressedData = HuffDecompress(buffer, fileSize, &uncompressedSize); + + free(buffer); + + WriteWholeFile(outputPath, uncompressedData, uncompressedSize); + + free(uncompressedData); +} + int main(int argc, char **argv) { if (argc < 3) @@ -433,7 +503,9 @@ int main(int argc, char **argv) { "png", "hwjpnfont", HandlePngToHalfwidthJapaneseFontCommand }, { "fwjpnfont", "png", HandleFullwidthJapaneseFontToPngCommand }, { "png", "fwjpnfont", HandlePngToFullwidthJapaneseFontCommand }, + { NULL, "huff", HandleHuffCompressCommand }, { NULL, "lz", HandleLZCompressCommand }, + { "huff", NULL, HandleHuffDecompressCommand }, { "lz", NULL, HandleLZDecompressCommand }, { NULL, "rl", HandleRLCompressCommand }, { "rl", NULL, HandleRLDecompressCommand }, diff --git a/tools/ramscrgen/elf.cpp b/tools/ramscrgen/elf.cpp index 7599fe0bb..7e78704b8 100644 --- a/tools/ramscrgen/elf.cpp +++ b/tools/ramscrgen/elf.cpp @@ -10,6 +10,8 @@ #define SHN_COMMON 0xFFF2 static std::string s_elfPath; +static std::string s_archiveFilePath; +static std::string s_archiveObjectPath; static FILE *s_file; @@ -22,6 +24,7 @@ static std::uint32_t s_symtabOffset; static std::uint32_t s_strtabOffset; static std::uint32_t s_symbolCount; +static std::uint32_t s_elfFileOffset; struct Symbol { @@ -31,7 +34,7 @@ struct Symbol static void Seek(long offset) { - if (std::fseek(s_file, offset, SEEK_SET) != 0) + if (std::fseek(s_file, s_elfFileOffset + offset, SEEK_SET) != 0) FATAL_ERROR("error: failed to seek to %ld in \"%s\"", offset, s_elfPath.c_str()); } @@ -98,6 +101,18 @@ static void VerifyElfIdent() FATAL_ERROR("error: \"%s\" not little-endian ELF\n", s_elfPath.c_str()); } +static void VerifyAr() +{ + char expectedMagic[8] = {'!', '<', 'a', 'r', 'c', 'h', '>', '\n'}; + char magic[8]; + + if (std::fread(magic, 8, 1, s_file) != 1) + FATAL_ERROR("error: failed to read AR magic from \"%s\"\n", s_archiveFilePath.c_str()); + + if (std::memcmp(magic, expectedMagic, 8) != 0) + FATAL_ERROR("error: AR magic did not match in \"%s\"\n", s_archiveFilePath.c_str()); +} + static void ReadElfHeader() { Seek(0x20); @@ -108,6 +123,40 @@ static void ReadElfHeader() s_shstrtabIndex = ReadInt16(); } +static void FindArObj() +{ + char file_ident[17] = {0}; + char filesize_s[11] = {0}; + char expectedEndMagic[2] = { 0x60, 0x0a }; + char end_magic[2]; + std::size_t filesize; + + Seek(8); + while (!std::feof(s_file)) { + if (std::fread(file_ident, 16, 1, s_file) != 1) + FATAL_ERROR("error: failed to read file ident in \"%s\"\n", s_archiveFilePath.c_str()); + Skip(32); + if (std::fread(filesize_s, 10, 1, s_file) != 1) + FATAL_ERROR("error: failed to read filesize in \"%s\"\n", s_archiveFilePath.c_str()); + if (std::fread(end_magic, 2, 1, s_file) != 1) + FATAL_ERROR("error: failed to read end sentinel in \"%s\"\n", s_archiveFilePath.c_str()); + if (std::memcmp(end_magic, expectedEndMagic, 2) != 0) + FATAL_ERROR("error: corrupted archive header in \"%s\" at \"%s\"\n", s_archiveFilePath.c_str(), file_ident); + + char * ptr = std::strchr(file_ident, '/'); + if (ptr != nullptr) + *ptr = 0; + filesize = std::strtoul(filesize_s, nullptr, 10); + if (std::strncmp(s_archiveObjectPath.c_str(), file_ident, 16) == 0) { + s_elfFileOffset = std::ftell(s_file); + return; + } + Skip(filesize); + } + + FATAL_ERROR("error: could not find object \"%s\" in archive \"%s\"\n", s_archiveObjectPath.c_str(), s_archiveFilePath.c_str()); +} + static std::string GetSectionName(std::uint32_t shstrtabOffset, int index) { Seek(s_sectionHeaderOffset + s_sectionHeaderEntrySize * index); @@ -153,21 +202,14 @@ static void FindTableOffsets() FATAL_ERROR("error: couldn't find .strtab section in \"%s\"\n", s_elfPath.c_str()); } -std::map GetCommonSymbols(std::string path) +static std::map GetCommonSymbols_Shared() { - s_elfPath = path; - - std::map commonSymbols; - - s_file = std::fopen(s_elfPath.c_str(), "rb"); - - if (s_file == NULL) - FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str()); - VerifyElfIdent(); ReadElfHeader(); FindTableOffsets(); - + + std::map commonSymbols; + std::vector commonSymbolVec; Seek(s_symtabOffset); @@ -193,3 +235,38 @@ std::map GetCommonSymbols(std::string path) return commonSymbols; } + +std::map GetCommonSymbolsFromLib(std::string sourcePath, std::string libpath) +{ + std::size_t colonPos = libpath.find(':'); + if (colonPos == std::string::npos) + FATAL_ERROR("error: missing colon separator in libfile \"%s\"\n", s_elfPath.c_str()); + + s_archiveObjectPath = libpath.substr(colonPos + 1); + s_archiveFilePath = sourcePath + "/" + libpath.substr(1, colonPos - 1); + s_elfPath = sourcePath + "/" + libpath.substr(1); + + s_file = std::fopen(s_archiveFilePath.c_str(), "rb"); + + if (s_file == NULL) + FATAL_ERROR("error: failed to open \"%s\" for reading\n", s_archiveFilePath.c_str()); + + VerifyAr(); + FindArObj(); + return GetCommonSymbols_Shared(); +} + +std::map GetCommonSymbols(std::string sourcePath, std::string path) +{ + s_elfFileOffset = 0; + if (path[0] == '*') + return GetCommonSymbolsFromLib(sourcePath, path); + + s_elfPath = sourcePath + "/" + path; + s_file = std::fopen(s_elfPath.c_str(), "rb"); + + if (s_file == NULL) + FATAL_ERROR("error: failed to open \"%s\" for reading\n", path.c_str()); + + return GetCommonSymbols_Shared(); +} diff --git a/tools/ramscrgen/elf.h b/tools/ramscrgen/elf.h index 0bfdd696f..3704860c0 100644 --- a/tools/ramscrgen/elf.h +++ b/tools/ramscrgen/elf.h @@ -25,6 +25,6 @@ #include #include -std::map GetCommonSymbols(std::string path); +std::map GetCommonSymbols(std::string sourcePath, std::string path); #endif // ELF_H diff --git a/tools/ramscrgen/main.cpp b/tools/ramscrgen/main.cpp index 6c4f4bbd7..5e5894f47 100644 --- a/tools/ramscrgen/main.cpp +++ b/tools/ramscrgen/main.cpp @@ -27,9 +27,15 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::string symOrderPath, std::string lang) { - auto commonSymbols = GetCommonSymbols(sourcePath + "/" + filename); + auto commonSymbols = GetCommonSymbols(sourcePath, filename); + std::size_t dotIndex; - std::size_t dotIndex = filename.find_last_of('.'); + if (filename[0] == '*') { + dotIndex = filename.find_last_of(':'); + filename = filename.substr(dotIndex + 1); + } + + dotIndex = filename.find_last_of('.'); if (dotIndex == std::string::npos) FATAL_ERROR("error: \"%s\" doesn't have a file extension\n", filename.c_str()); @@ -73,7 +79,7 @@ void HandleCommonInclude(std::string filename, std::string sourcePath, std::stri } } -void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath) +void ConvertSymFile(std::string filename, std::string sectionName, std::string lang, bool common, std::string sourcePath, std::string commonSymPath, std::string libSourcePath) { SymFile symFile(filename); @@ -91,7 +97,7 @@ void ConvertSymFile(std::string filename, std::string sectionName, std::string l symFile.ExpectEmptyRestOfLine(); printf(". = ALIGN(4);\n"); if (common) - HandleCommonInclude(incFilename, sourcePath, commonSymPath, lang); + HandleCommonInclude(incFilename, incFilename[0] == '*' ? libSourcePath : sourcePath, commonSymPath, lang); else printf("%s(%s);\n", incFilename.c_str(), sectionName.c_str()); break; @@ -148,6 +154,7 @@ int main(int argc, char **argv) std::string lang = std::string(argv[3]); std::string sourcePath; std::string commonSymPath; + std::string libSourcePath; if (argc > 4) { @@ -166,8 +173,15 @@ int main(int argc, char **argv) sourcePath = paths.substr(0, commaPos); commonSymPath = paths.substr(commaPos + 1); + commaPos = commonSymPath.find(','); + if (commaPos == std::string::npos) { + libSourcePath = "tools/agbcc/lib"; + } else { + libSourcePath = commonSymPath.substr(commaPos + 1); + commonSymPath = commonSymPath.substr(0, commaPos); + } } - ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath); + ConvertSymFile(symFileName, sectionName, lang, common, sourcePath, commonSymPath, libSourcePath); return 0; } -- cgit v1.2.3